Использую единый шаблон html.tpl.php для всех типов материала. Появилась необходимость выводить туда произвольный код в секцию head для новостей. Для этого добавил поле в тип материала, куда вставляю нужный мне код скрипта (поле field_head_code).
В шаблоне html.tpl.php для вывод использую следующий код:
<?php if ($node = menu_get_object()) {
if ($node->type == 'news') {
$head_code = field_view_field('node', $node, "field_head_code", array('label' => 'hidden'));
if (!empty($head_code)) {
echo render($head_code);
}
}
} ?>
Т.е. проверяю является ли страница нодой, далее проверяю ноду на тип материала и вывожу нужное мне поле, если оно не пустое. Решение не работает, ошибок не получаю, подскажите корректно ли обращаться к menu_get_object() для проверки того, является ли страница нодой? (https://stackoverflow.com/questions/40226373/add-a-field-from-a-node-int...). Также подскажите как правильно в данном случае проверить на тип материала?
Нашёл старое решение на Drupal.org, но оно также не сработало у меня: https://www.drupal.org/forum/support/theme-development/2012-03-16/printi...
P.S. Решение для Drupal 8: https://drupal.ru/node/143623
Комментарии
Почему не в page.tpl.php?
Скрипт пикселя рекламы vk рекомендовано вставлять в секцию head, то же самое относится и ко всяким другим аналогичным штукам вроде чатов и тп. Также для страницы новостей планируем сделать обложку для соцсетей как в примере для Drupal 8.
В нашем случае используется шаблон html.tpl.php, т.к. сайт имеет много шаблонов типа page.
На текущий момент пытаюсь использовать такой код, но пока не работает:
<?php if(arg(1) && is_numeric(arg(1))){
$node = node_load(arg(1));
$type = $node->type;
if ($type == 'news') {
$head_code = field_view_field('node', $node, "field_head_code", array('label' => 'hidden'));
if (!empty($head_code)) {
echo render($head_code);
}
}
} ?>
Дак надо скрипт вставить или что?
Да, у меня стоит тип поля "Длинный текст", скрипт вставляю через формат текста HTML
А, я понял, нужно вывести код только для определенного типа материала?
Для определённой конкретной ноды, чтобы отследить переходы. На тип материала я проверяю, т.к. это поле есть только в типе материала "Новости". Заморочился полем, т.к. такая задача сейчас возникает все чаще и не хочется каждый раз создавать шаблон вида html--node--nid.tpl, чтобы добавить нужный мне код.
В общем, тут можно сделать проще. Во первых, скрипты необязательно вставлять в секцию head, наоборот скрипты сейчас принято в самый конец сайта вставлять.
Создаем новый блок в админке, пишем туда нужный код, вставляем блок в футер сайта. И делаем отображение только для нужного типа материала.
Profit
В этом случае мне проще создать шаблон для этой конкретной ноды с названием html--node--[nid].tpl, где nid. Хочется найти все-таки решение с полем, т.к. это упростит жизнь и избавит от беспорядка в шаблонах.
Решение следующее, в секции head шаблона html.tpl.php выводим поле:
<?php if(arg(0) == 'node' && !empty(arg(1))) {
$node = node_load(arg(1));
$type = $node->type;
if ($type == 'news') {
$head_code = field_view_field('node', $node, "field_head_code", array('label' => 'hidden'));
if (!empty($head_code)) {
echo render($head_code);
}
}
} ?>
В моём случае поле называется "field_head_code" (текстовая область), оно создано в типе материала "news". Кодом я проверяю является ли страница нодой, если да - загружаю её массив данных, далее делаю проверку на тип материала и вывожу нужное мне поле, если оно не пустое.
Важно также переопределить шаблон вашего поля, чтобы у него не было обёртки, для этого создаём файл с именем вашего поля (в моём случае field--field_head_code.tpl.php), который переопределит шаблон поля.
В шаблоне поля должен остаться код:
<?php foreach ($items as $delta => $item): ?><?php print render($item); ?><?php endforeach; ?>
Если не переопределите шаблон, ваше поле будет автоматически попадать из head в секцию body.
Таким образом мы можем подключать любые скрипты для конкретной ноды в head. В моём случае я смог подключить скрипты пикселей вк и отслеживать переходы на страницу новости.
Другим способом решить подобную задачу можно через создание шаблона для конкретной ноды. Чтобы переопределить шаблон html для конкретной ноды, можно создать шаблон вида html--node--[nid].tpl, где nid это id нужной ноды.