Как вывести поле ноды в шаблон html.tpl.php для определенного типа материалов?

Аватар пользователя chelwolf chelwolf 2 августа в 15:06
2

Использую единый шаблон 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

Лучший ответ

Аватар пользователя chelwolf chelwolf 2 августа в 17:07

Решение следующее, в секции 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 нужной ноды.

Комментарии

Аватар пользователя chelwolf chelwolf 2 августа в 15:46

Скрипт пикселя рекламы 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);
                }
            }
        } 
?>
Аватар пользователя chelwolf chelwolf 2 августа в 15:57

Да, у меня стоит тип поля "Длинный текст", скрипт вставляю через формат текста HTML

Аватар пользователя ivnish ivnish 2 августа в 16:04

А, я понял, нужно вывести код только для определенного типа материала?

Аватар пользователя chelwolf chelwolf 2 августа в 16:15

Для определённой конкретной ноды, чтобы отследить переходы. На тип материала я проверяю, т.к. это поле есть только в типе материала "Новости". Заморочился полем, т.к. такая задача сейчас возникает все чаще и не хочется каждый раз создавать шаблон вида html--node--nid.tpl, чтобы добавить нужный мне код.

Аватар пользователя ivnish ivnish 2 августа в 16:06

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

Создаем новый блок в админке, пишем туда нужный код, вставляем блок в футер сайта. И делаем отображение только для нужного типа материала.

Profit

Аватар пользователя chelwolf chelwolf 2 августа в 16:20

В этом случае мне проще создать шаблон для этой конкретной ноды с названием html--node--[nid].tpl, где nid. Хочется найти все-таки решение с полем, т.к. это упростит жизнь и избавит от беспорядка в шаблонах.

Аватар пользователя chelwolf chelwolf 2 августа в 17:07

Решение следующее, в секции 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 нужной ноды.