[Решено] Content Template vs темизация в node.tpl.php

Главные вкладки

Аватар пользователя Tankha Tankha 4 июня 2009 в 13:33

Если написать в шаблоне материала (Content Template) что-нибудь вроде:

$node->links['ИМЯ-ССЫЛКИ']= '<a href="' . $переменная_ссылки . '">ПРИМЕР</a>';

то это срабатывает сразу и в ноде выводится вместо соответствующей ссылки - 'ПРИМЕР'.

А в node.tpl.php - это уже не работает.

В node.tpl.php работает только такая конструкция:

        if ($links) {
        $node->links['ИМЯ-ССЫЛКИ']= '<a href="' . $переменная_ссылки . '">ПРИМЕР</a>';
        $links = theme_links($node->links);
        echo '    <div class="links">&raquo;' . $links . '</div>';
        }

Почему так?

Точно так же в node.tpl.php: $node->content и $content - не одно и тоже. $node->content - это массив, $content - это строка с отформатированными данными.
Любые изменения в $node->content уже не отражаются в $content.
Если для $links существует функкция позволяющая пересобрать строку, то для $content я такой функции не нашел.

Можно ли пересобрать $content аналогично $links в примере выше?

P.S.
Мне нужно тем же способом изменить вывод CCK (в node.tpl.php). Например поле User Reference сделать справа.

Комментарии

Аватар пользователя glu2006 glu2006 4 июня 2009 в 14:01

Почему так?
Потому что по структуре друпала в шаблон должен приходить уже сгенеренный html в каждой переменной, т.е. если это $сontent то это строка html, если $links то это строка html и т.д. вы в своем примере просто не выводите уже сгенеренный в строку массив $links а прямо в шаблоне пересобираете его по новой и генерите новый html функцией theme_links и затем выводите свой пересобранный массив.

Почему в con_template достаточно одной строки надеюсь понятно? На всякий случай, этот модуль работает и вносит изменения в переменную node на hook_nodeapi т.е. до процесса генерации html из переменной $node.

Зачем пересобирать контент?

<?php echo $node->field_имяССК_поля_3[0]['view]; ?>
<?php echo $node->field_имяССК_поля[0]['view]; ?>
<?php echo $node->field_имяССК_поля_1[0]['view]; ?>

Заворачивайте в дивы каждое поле и размещайте как душе угодно.

ЗЫ. http://api.drupal.org/api/function/hook_link_alter/6 это для ссылок.

Аватар пользователя penexe penexe 4 июня 2009 в 14:39

можно еще вот так в шаблоне


<?php
// выводит поле согласно настройкам
print theme('content_field'$node->content['имя_поля']['field']); 

// для текстовых полей, без html
print $node->имя_поля[0]['safe'];
?> 
Аватар пользователя neochief neochief 4 июня 2009 в 16:17

В шаблоне не должно быть динамики. Друпал позволяет переносить всю динамику в препроцессинговую функцию шаблона. Например, для node.tpl.php это будет выглядеть так:

function phptemplate_preprocess_node(&$vars) {
  $vars['links']['ИМЯ-ССЫЛКИ'] = '<a href="' . $переменная_ссылки . '">ПРИМЕР</a>';
  //или еще лучше
  $vars['links']['ИМЯ-ССЫЛКИ'] = l('ПРИМЕР', $переменная_ссылки);
}
Аватар пользователя glu2006 glu2006 5 июня 2009 в 11:30

neochief wrote:
В шаблоне не должно быть динамики. Друпал позволяет переносить всю динамику в препроцессинговую функцию шаблона. Например, для node.tpl.php это будет выглядеть так:

function phptemplate_preprocess_node(&$vars) {
  $vars['links']['ИМЯ-ССЫЛКИ'] = '<a href="' . $переменная_ссылки . '">ПРИМЕР</a>';
  //или еще лучше
  $vars['links']['ИМЯ-ССЫЛКИ'] = l('ПРИМЕР', $переменная_ссылки);
}

Согласен, но иногда случаются ситуации когда динамики в шаблоне не избежать, особенно в 5-й ветке.

Аватар пользователя Tankha Tankha 5 июня 2009 в 13:53

С links вроде бы всё ясно.
У меня не получается темизировать CCK User Reference.
Вытащить отформатированную строку - без проблем. Продублировать ее там где мне нужно - тоже достаточно просто.
Как ее ПОСЛЕ ЭТОГО убить в $content ? Собственно пересборка нужна была именно для этого. Иначе у меня получается список User Reference два раза.

P.S.
Что интересно - фокус подобный $links с User Reference уже не проходит даже в Content Template. Т.е. поле уничтожается только в массиве, а в $content все равно остается.
Выходит так, что в даже Content Template перехватить сборку строки $content не получается. (а вот сборку $links - получается)

Т.е. в Content Template:

unset($node->links); - работает (линки исчезают)
unset($node->content); - НЕ работает (контент не исчезает, не говоря уже о полях CCK)

Где и как перехватить сборку строки $content?

Аватар пользователя Tankha Tankha 5 июня 2009 в 12:51

neochief
В template.php у меня почему-то не работает ни одна функция. Sad Кеш сбрасывал даже при помощи devel - ничего не помогает.
Если phptemplate_preprocess_node вписать в node.tpl.php то пишет что ошибка редекларирования

Аватар пользователя glu2006 glu2006 5 июня 2009 в 15:13

Выведите весь нужный материал полями и вообще убейте переменную $content в шаблоне, я не могу понять чего вы мучаетесь.

Аватар пользователя Tankha Tankha 6 июня 2009 в 0:05

В принципе можно и так, но тогда будет бессмысленно нагружаться сервер стандартной генерацией строки $content, - если я ее буду собирать вручную.
И потом при добавлении любых полей сборку нужно будет подправлять.
По сути ручная сборка будет дублированием действий какой-то стандартной функции...

Аватар пользователя Tankha Tankha 6 июня 2009 в 0:06

И вообще - зачем тогда ноды если они такие негибкие. Чем дальше тем больше приходится "опускаться". Все чаще и чаще до уровня абстракции запросов к базе.

Аватар пользователя Tankha Tankha 6 июня 2009 в 1:07

Мдя.
Я пытался это делать - ставил hidden, а нужно было поставить Exclude (убрать из контента но не из шаблона).
Вообщем всё работает :). Спасибо

И все-таки интересно как перехватить сборку $content. Smile