Drupal 6 и 7 - программный вывод блоков, views, меню

Категория: Drupal
Дата публикации: 18 июля, 2013 - 10:55
Последнее изменение: 23 октября, 2019 - 21:35

Порой возникает необходимость программного вывода блоков, меню или вьюсов в темплейте темы Друпала. К чести движка - это можно сделать сразу несколькими способами (в разных ситуациях могут пригодиться разные варианты вывода).

Drupal 6

Вывод блоков.

<?php
$block
= module_invoke('block', 'block', 'view', 1);
print
$block['content'];
?>

Вместо 1 нужно подставить номерв блока, который выводим. Чтобы узнать его нужно навести на ссылку "настроить" рядом с блоком (/admin/build/block/list).
Ссылка имеет вот такой вид domain.ru/admin/build/block/configure/block/1

Недостатки такого вывода блоков -

  • выводится только контент блока, без оберточных классов, так что для темизации их придется дописать самостоятельно
  • не выводится титл (заголовок) блока
  • не работают "контекстные ссылки" - ссылки для быстрого редактирования блоков, которые появляются при наведении на него курсора (эта возможность зависит от темы оформления и есть не во всех них).

Вывод меню

Вывод "стандартных" меню Друпала:

<?php
$block
= module_invoke('menu', 'block', 'view', 'primary-links');
print
$block['content'];
?>

       
<?php
$block
= module_invoke('menu', 'block', 'view', 'secondary-links');
print
$block['content'];
?>

Чтобы вывести любое другое меню, которое было создано дополнительно, нужно просто заменить в коде имя:

<?php
$block
= module_invoke('menu', 'block', 'view', 'menu-newmenu');
print
$block['content'];
?>

Чтобы узнать имя - заходим на страницу /admin/build/menu/list, при нажатии на нужное меню, его имя берем из пути, он выглядит так /admin/build/menu-customize/menu-newmenu.

Вывод Views. Вариант 1.

Имя нужного блока views нужно взять со страницы обзора блоков /admin/build/block/list, наводим мышку на "настроить" и берем имя.

<?php
$block
= module_invoke('views', 'block', 'view', 'test-block_1');
print
$block['content'];
?>

Вывод Views. Вариант 2.

#Шаблон
<?php
print views_embed_view($name, $display_id = 'default');
?>

#Рабочий пример
<?php
print views_embed_view(test, $display_id = 'block_1');
?>

В этом варианте нужно указать имя вьюса, и имя блока/страницы во вьюсе.

Вывод Views. Вариант 3.

Этот вариант похож на предыдущий, но на практике он мне пригодился, когда нужно было вывести блок слайдшоу. Все прочие варианты приводили к неработоспособности слайдера.

а). В template.php помещаем код

<?php
function THEMENAME_preprocess_page(&$variables) {  
 
$variables['testblock'] = views_embed_view('test', $display_id = 'block_1');    
}
?>

Важно! В template.php уже может быть задействованным preprocess_page, и второе добавление вызовет белый экран и ошибку php, тогда нужно найти его в коде и вставить $variables['testblock'] = views_embed_view('test', $display_id = 'block_1'); туда.
Важно 2! В теме возможно другое обозначение переменных - например, в теме Zen - это $vars. Соответственно, нужно будет адаптировать код.

б) Выводим блок в шаблоне

<?php
   
print $testblock;    
?>

Drupal 7

Вывод блоков. Вариант 1.

<?php
$block
= module_invoke('block','block_view','1');
print
render($block['content']);
?>

Цифра - номер блока, меняем на нужный. Вывод блока без окружающих div, без заголовка блока и без контекстных ссылок.

Вывод блоков. Вариант 2.

<?php
$block
= block_load('block', '1');
$content = _block_get_renderable_array(_block_render_blocks(array($block)));
$output = drupal_render($content);
print
$output;
?>

Это уже полноценный блок - с заголовком, со слоями, классами и контекстными ссылками.

Вывод блока с локализацией

<?php
$block_id
= 2;
$block = block_block_view($block_id);
$block['content'] = i18n_string(array('blocks', 'block', $block_id, 'body'), $block['content']);
print
render($block['content']);
?>

Вывод Меню.

Вывод "стандартных" меню.

<?php print theme('links', array('links' => menu_navigation_links('main-menu'), 'attributes' => array('class'=> array('links', 'main-menu')) ));?>

<?php print theme('links', array('links' => menu_navigation_links('user-menu'), 'attributes' => array('class'=> array('links', 'user-menu')) ));?>

<?php print theme('links', array('links' => menu_navigation_links('navigation'), 'attributes' => array('class'=> array('links', 'navigation')) ));?>

Суть, думаю, ясна. Все названия берутся со страницы обзора меню - /admin/structure/menu.

И вывод своего созданного меню:

<?php
 
print theme('links', array('links' => menu_navigation_links('menu-testmenu'), 'attributes' => array('class'=> array('links', 'menu-testmenu')) ));
?>

Еще вариант вывода меню:

drupal_render(menu_tree_output(menu_tree_all_data('menu-some-menu')));

Вывод Views. Вариант 1.

<?php
$block
= module_invoke('views','block_view','test-block');
print
render($block);
?>

Простой вывод блока Views - без контекстных ссылок. Имя блока можно узнать на странице /admin/structure/block, ссылка "настроить" рядом с нужным блоком. Она имеет вид - domain/admin/structure/block/manage/views/test-block/configure.

Вывод Views. Вариант 2.

<?php
$block
= block_load('views', 'test-block');
$content = _block_get_renderable_array(_block_render_blocks(array($block)));
$output = drupal_render($content);
print
$output;
?>

Полный вывод вьюхи - с контекстными ссылками, с заголовком блока.

Вывод Views. Варианты 3 и 4.

<?php
$view
= views_get_view('test');
print
$view->preview('block');
?>

<?php
print views_embed_view('test', 'block');
?>

Комментарии

Спасибо за статью. Вроде в

Спасибо за статью. Вроде в нете полно инфы на эту тему, но у Вас реально доступно. Пол дня промаялся с этими гре**ми блоками, не хотели выводится. Только после Вашей статьи вывелись в нужном вьюсе. Спасибо!

Добавить комментарий