По умолчанию в region.tpl.php
приходит уже отрендеренный html всех блоков, доступный в переменной $content
. Вывести отдельные блоки можно (они лежат в $elements
), но нельзя поступить как в node.tpl.php
— сначала вывести нужное, а потом просто сделать echo render($content);
для вывода всего остального.
Поколдуем немножко:
/**
* Implements hook_page_alter().
*/
function THEMENAME_page_alter(&$page) {
foreach (element_children($page) as $region_name) {
if ($page[$region_name] && isset($page[$region_name]['#region'])) {
$page[$region_name]['#theme'] = 'region';
unset($page[$region_name]['#theme_wrappers']);
}
}
}
/**
* Preprocess function for region.tpl.php.
*/
function THEMENAME_preprocess_region(&$vars) {
$vars['content'] = array();
foreach (element_children($vars['elements']) as $block_key) {
$vars['content'][$block_key] = $vars['elements'][$block_key];
}
if ($suggestions = theme_get_suggestions(arg(), 'region__' . $vars['region'])) {
$vars['theme_hook_suggestions'] = array_merge($vars['theme_hook_suggestions'], $suggestions);
}
}
/**
* Override region.tpl.php.
*/
function THEMENAME_region($vars) {
if ($vars['content']) {
return '
<div class="' . $vars['classes'] . '">
' . render($vars['content']) . '
</div>
';
}
}
Теперь в region.tpl.php
или в THEMENAME_region()
можно рендерить отдельные блоки, плюс добавляется возможность переопределять регионы на основе текущего пути, как в page.tpl.php
.
Пример переопределения региона content
на главной странице (файл region--content--front.tpl.php
):
<div class="<?php echo $classes; ?>">
<div class="section-one">
<?php echo render($content['block_1']); ?>
<?php echo render($content['block_2']); ?>
</div>
<div class="section-two">
<?php echo render($content['block_3']); ?>
</div>
<div class="section-three">
<?php echo render($content); ?>
</div>
</div>
P.S: чего только не придумаешь, чтобы не использовать Panels :)
Написанное актуально для
Drupal 7
Комментарии
А почему не нравится Panels?
Добавить комментарий