Drupal 7 предоставляет достаточно возможностей для темизации любого блока, региона и элемента с помощью CSS, но это не всегда удобно, особенно если речь идет о сложной структуре вывода информации на сайте. Допустим, если стоит задача вывести результат работы каких-нибудь модулей или содержимого CCK поля внутри tabs. Эту задачу будет достаточно проблематично реализовать только с помощью CSS, без кастомного вывода содержимого того или иного элемента непосредственно в файле темы (в нашем случае)внутри разметки самих табов.
В 7-ке результат работы всех стандартных и дополнительных моделей пишется в массив $content

$content: An array of node items. Use render($content) to print them all, or print a subset such as render($content['field_example']). Use hide($content['field_example']) to temporarily suppress the printing of a given element.

Согласно определению в API Drupal, массив $content - это массив, содержащий в себе все элементы ноды. Соотвественно, мы имеем возможность выводить весь массив сразу:

<?php print render($content); ?>

или обратиться к любому элементу находящемуся внутри этого массива

<?php print render($content['field_example']); ?>

и вывести его содержимое в нужном вам месте.

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

Если хотите разложить массив прямо в теме, добавьте в node.tpl.php (или node--product.tpl.php, если необходимо узнать имена элементов в Ubercart)

<?php print krumo($content); ?>

Абсолютно аналогичную информацию выводит

<?php print dsm($content); ?>

но в области $messages отвечающей за вывод системных сообщений.

Без модуля Devel можно разложить массив ноды на составные элементы таким образом:

<?php print '<pre>'. check_plain(print_r($node, 1)) .'</pre>'; ?>

Пример кастомной темизации страницы товара Ubercart в node--product.tpl.php

<?php // teaser content
if($page == 0) { ?>
<div>Содержимое анонса(тизера)</div>
<?php // full node content
} else { ?>
<div><!-- Выводим содержимое описания товара -->
<?php print render($content['body']); ?>
</div>

<div><!-- Выводим цену -->
<?php print render($content['display_price']); ?>
</div>

<div><!-- Выводим кнопку Добавить в корзину -->
<?php print render($content['add_to_cart']); ?>
</div>

<div><!-- Выводим рейтинг формируемый модулем http://drupal.org/project/rate --> 
<?php print render($content['rate_store_vote']); ?>
</div>
<?php } ?>
Данная публикация старше 4-х лет. Возможно существуют более рациональные способы решения рассматриваемой задачи или вопроса.

Выразить благодарность

Если эта публикация оказалась для Вас полезной и вы хотите выразить свою благодарность, сделайте пожалуйста её репост в социальных сетях или на своём сайте.

Так же, Вы можете перевести любую сумму, которую посчитаете нужной на наш счёт, что сильно мотивирует к написанию новых полезных статей.

Комментарии: