Если написать в шаблоне материала (Content Template) что-нибудь вроде:
то это срабатывает сразу и в ноде выводится вместо соответствующей ссылки - 'ПРИМЕР'.
А в node.tpl.php - это уже не работает.
В node.tpl.php работает только такая конструкция:
$node->links['ИМЯ-ССЫЛКИ']= '<a href="' . $переменная_ссылки . '">ПРИМЕР</a>';
$links = theme_links($node->links);
echo ' <div class="links">»' . $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 сделать справа.
Комментарии
Почему так?
Потому что по структуре друпала в шаблон должен приходить уже сгенеренный html в каждой переменной, т.е. если это $сontent то это строка html, если $links то это строка html и т.д. вы в своем примере просто не выводите уже сгенеренный в строку массив $links а прямо в шаблоне пересобираете его по новой и генерите новый html функцией theme_links и затем выводите свой пересобранный массив.
Почему в con_template достаточно одной строки надеюсь понятно? На всякий случай, этот модуль работает и вносит изменения в переменную node на hook_nodeapi т.е. до процесса генерации html из переменной $node.
Зачем пересобирать контент?
<?php echo $node->field_имяССК_поля[0]['view]; ?>
<?php echo $node->field_имяССК_поля_1[0]['view]; ?>
Заворачивайте в дивы каждое поле и размещайте как душе угодно.
ЗЫ. http://api.drupal.org/api/function/hook_link_alter/6 это для ссылок.
можно еще вот так в шаблоне
<?php
// выводит поле согласно настройкам
print theme('content_field', $node->content['имя_поля']['field']); // для текстовых полей, без html
print $node->имя_поля[0]['safe'];
?>
В шаблоне не должно быть динамики. Друпал позволяет переносить всю динамику в препроцессинговую функцию шаблона. Например, для node.tpl.php это будет выглядеть так:
$vars['links']['ИМЯ-ССЫЛКИ'] = '<a href="' . $переменная_ссылки . '">ПРИМЕР</a>';
//или еще лучше
$vars['links']['ИМЯ-ССЫЛКИ'] = l('ПРИМЕР', $переменная_ссылки);
}
Согласен, но иногда случаются ситуации когда динамики в шаблоне не избежать, особенно в 5-й ветке.
С 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?
neochief
В template.php у меня почему-то не работает ни одна функция. Кеш сбрасывал даже при помощи devel - ничего не помогает.
Если phptemplate_preprocess_node вписать в node.tpl.php то пишет что ошибка редекларирования
Выведите весь нужный материал полями и вообще убейте переменную $content в шаблоне, я не могу понять чего вы мучаетесь.
В принципе можно и так, но тогда будет бессмысленно нагружаться сервер стандартной генерацией строки $content, - если я ее буду собирать вручную.
И потом при добавлении любых полей сборку нужно будет подправлять.
По сути ручная сборка будет дублированием действий какой-то стандартной функции...
И вообще - зачем тогда ноды если они такие негибкие. Чем дальше тем больше приходится "опускаться". Все чаще и чаще до уровня абстракции запросов к базе.
Исключите поля из показа в настройках типа контента.
Мдя.
Я пытался это делать - ставил hidden, а нужно было поставить Exclude (убрать из контента но не из шаблона).
Вообщем всё работает :). Спасибо
И все-таки интересно как перехватить сборку $content.
Сборка перехватывается только модулем в хуке hook_nodeapi() ($op=='view')
С чего начинали к тому и пришли :)я про hook_nodeapi();