Я начинающий друпаллер, поэтому у меня есть может быть простой вопрос...
Я хочу удалить аннотацию из тела ноды перед ее отображением, и так, чтобы она была в отдельной переменной.
Мне это нужно чтобы применить один стиль отображения для аннотации и другой стиль отображения для тела ноды.
Если выделить аннотацию в отдельную переменную у меня получилось благодаря фунции tеmplate_preprocess_node. То удалить аннотацию из тела ноды красиво и безболезненно не получается.
Вот собственно код:
<?php
if ($variables['page'] == TRUE) {
$node = node_load($variables['nid']);
$pos = strpos($node->body, '
<!--break-->
');
if ($pos !== 0) {
$body_wo_teaser = substr($node->body,$pos+12);
$variables['my_teaser'] = check_markup($node->teaser, $node->format, FALSE);
$variables['content'] = $body_wo_teaser;
}
?>
Выполнение этого кода $variables['content'] = $body_wo_teaser; перетирает темизированный уже вывод, исзечает картинка (поле ноды), которая уже включена (не знаю где). Таким образом анонс из тела ноды надо исключать где-то до темизации, где не знаю. Помогите кто знает!
p.s. Может надо какие-то уточнения или я что-то упустил чтобы точнее выразить что мне необходим?
Комментарии
На кой хрен там node_load когда нода уже есть в $variables['node'] ?
в $variables['node'] - темизированная нода, а в ноде полученной с помощью node_load не темизированная.
нет, уточняю, создан тип ноды в которой имеется поле для картинки (модуль imagefield), так вот, эта картинка уже включена в $variables['node'] и ее нет еще в ноде загруженной с помощью node_load.
еще одно уточнение.. в $variables['node'] уже отутствует разделитель анонса
<!--break-->
Итак я нашел решение, не знаю насколько удачное, но все работает как я и хотел...
1. Пришлось делать свой простейший модуль и переопределить функцию modulename_nodeapi:
<?php
function body_wo_teaser_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL){
if ($op=='load') {
$delimiter = '<!--break-->';
$delimiter_pos = strpos($node->body,$delimiter);
if ($delimiter_pos !== 0) {
$body_pos = $delimiter_pos + strlen($delimiter) + 2; // +2 поправка на \r\n...
$body_only = substr($node->body,$body_pos); // получили только тело документа без анонса...
$node->teaser_only = $node->teaser; // создали аннонс в отдельной переменной...
$node->body = $body_only; // установили тело документа без анонса.
}
}
}
?>2. В своей теме в файл template.php я переопределил функцию template_preprocess_node следующим образом:
<?php
function template_preprocess_node(&$variables) {
if ($variables['page'] == TRUE) {
$node = node_load($variables['nid']);
$variables['teaser_only'] = check_markup($node->teaser_only, $node->format, FALSE);
}
else $variables['teaser_only'] = '';
}
?>3. В своей теме в файле node.tpl.php добавить строку:
<div class="art-teaser"><?php echo $teaser_only; ?></div>
<?php echo $content; ?>
4. В файле stylus.css вставить класс стиля:
{
font-weight: bold;
margin: 10px 0;
}
p.s. Собственно чего я этим добился:
1. При выводе документа, я могу кастомизировать с помощью стилей вывод анонса (мне необходимо было его выделять жирным шрифтом);
2. И я его хотел разместить в моем случае в следующем порядке: заголовок, дата создания и автор, анонс, картинка и собственно тело документа.
Вся проблема решилась еще проще (пункт 1(см. выше) можно вычеркнуть), следующим образом:
<?php
function template_preprocess_node(&$variables) {
if ($variables['page'] == TRUE) {
$node = node_load($variables['nid']);
$teaser_only = check_markup($node->teaser, $node->format, FALSE);
$variables['teaser_only'] = $teaser_only;
$content_wo_teaser = str_replace($teaser_only,'',$variables['content']);
$variables['content'] = $content_wo_teaser;
}
else {
$variables['teaser_only'] = '';
}
}
?>
Никакого модуля писать не надо :-))).
Есть модуль Content Templates (Contemplate) для темезации содержимого (нод).
alex_ros, молоток!