Имею тип данных с ССК-полями. Задача -- убрать из отображения ноды отображение $node->body. Ищу корректное решение уже несколько дней.
Из некорректных решений нашёл/придумал одно: в node.tpl.php написать типа
<?php $content = preg_replace('`^<p>.+?</p>`','',$content, 1);?>
<?php print $content ?>
Понятно, что подобное решение работоспособно лишь в тепличных условиях.
Также посмотрел в сторону модуля Contemplate. Этот модуль, к сожалению, вынуждает почти всю логику темизации писать в шаблоне самому. Я же ищу возможность прописать в каком-либо хуке до начала формирования переменной $content строчки вида
<?php
$node->body_backup=$node->body;
unset($node->body);
?>
и позволить друпалу дальше нормально формировать $content. Такое вообще возможно?
Комментарии
А не проще body просто отключить?
а) Я не знаю, как в типе материала вообще убрать body в том числе из редактора. Вернее, знаю, как это сделать, если тип данных создавать своим модулем. Если это можно сделать через интерфейс или дополнительным модулем -- буду рад подсказке.
б) $node->body сам по себе используется при темизации некоторых полей -- иногда к ним подклеивается (задача так поставлена была, извините). То есть не нужно именно вхождение в отображение самого по себе $node->body.
в) Если решить пункт а), то мне будет не влом пробежаться по созданным материалам и перенести body в некое CCK-поле, после чего отключить body -- мешается только.
Идёте сюда:
admin/content/node-type/blog
Удаляете значение из Body field label (прошу прощения, у меня не локализованный интерфейс)
Сохраняете и радуетесь жизни
Поможет Content Templates (Contemplate)
Я писал про него в исходном сообщении. Он всем хорош, кроме того, что сложную темизацию (с использованием вкладок, например) вынуждает делать полностью руками. Например, для темизации с модулем CCK Fieldset Tabs это сильно нетривиально.
В свойствах типа контента нужно оставить пустую строку в поле с названием поля "body", тогда оно не будет отображаться в форме редактирования материала.
Смотрите в сторону функции template_preprocess_node.
В template_preprocess_node в $node->body лежит уже сформированный текст ноды, вместе с участием в нём исходного $node->view (простите за тавтологию). Тут, скорее, помогло бы перекрытие функции node_view, стоящей в начале формирования $content -- но как?
За совет с отключением поля body в админке спасибо!
А у меня после удаления значения из Body field label не сохраняются никакие изменения в материале! Подскажите, в чем может быть дело?
drupal 6.22