Вывод содержимого поля body, завернутого в div друпал-методом

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

Аватар пользователя liland liland 15 марта 2012 в 22:04

Есть задача вывести содержимое нод в диве. Как я вижу решение в лоб:
В файле modules/node/node.module
node->body = check_markup($node->body, $node->format, FALSE);
оборачиваю в див :
$node->body = '<div class="body">' . check_markup($node->body, $node->format, FALSE). '</div>';

Но решение не ахти из-за правки ядра. Как правильно решить данную задачу без правки ядра?

Комментарии

Аватар пользователя Alamir Alamir 15 марта 2012 в 22:23

Создайте в папке со своей темой node-type.tpl.php и там правьте вывод как душе угодно...

type - машинное название типа материала

Аватар пользователя liland liland 15 марта 2012 в 22:52

Создавать шаблон для ноды это понятно, но это влечет за собой ужасное увеличение по времени и не стандартизовано - для каждого проекта по своему раскладывается <?php print $content; ?>. Да и во многих случаях шаблон ноды вообще не нужно раскладывать на составляющие. Только для того, чтобы обернуть body в div делать этого не хотелось бы. Нельзя ли как-то по другому решить?

Аватар пользователя enemis enemis 16 марта 2012 в 3:55

"liland" wrote:
но это влечет за собой ужасное увеличение по времени и не стандартизовано - для каждого проекта по своему раскладывается <?php print $content; ?>. Да и во многих случаях шаблон ноды вообще не нужно раскладывать на составляющие. Только для того, чтобы обернуть body в div делать этого не хотелось бы. Нельзя ли как-то по другому решить?

А вы собственно о чем или что курите?
Я вас жутко обрадую что node.php.tpl, существует всегда. А вот насколько больше тактов процессора нужно чтобы проверить file_exist в теме я вам не скажу, но думаю это наименьшая проблема в производительности друпала.

Аватар пользователя liland liland 16 марта 2012 в 4:16

2 RxB
Раньше еще не сталкивался с препроцессами. Я правильно понял, что необходимо менять данную функцию:
function template_preprocess_node(&$variables) { } из theme.inc переписав ее с изменениями в свой template.php в виде function THEME_template_preprocess_node(&$variables) { }?

2 enemis
Я о том, что поле боди находится внутри стандартной переменной $content и чтобы обвернуть боди в див надо раскладывать контент на составляющие. Если Вам нечего делать - можете за сигареткой-другой в каждом проекте разделывать $content чтобы вынуть оттуда поле боди и обвернуть его в див. Мне на это тратить время жаль и я хочу стандартизировать решение для всех своих проектов. Стандартизировать - это означает в моем понимании сделать решение единым для всех проектов. Например в виде модуля или хука темы или еще чего-то. Но не прописывая див вручную во всех файлах шаблона с раскладыванием переменной контент.

Аватар пользователя Alamir Alamir 16 марта 2012 в 9:00

Нужда понятна, но как по моим наблюдениям все равно приходиться разбирать $content от проекта к проекту, проекты то не однотипные.

Сделайте как сказал RxB и все, ваш вопрос решен.

Аватар пользователя Shok211 Shok211 16 марта 2012 в 13:52

Updated***

<?php

mymodule_theme_registry_alter

(&$tr)
{
   
$tr['node']['preprocess functions'][] = 'mymodule_add_body';
}

mymodule_add_body(&$element)

  
/* $element['node']->body */ 
  
$element['content'] = "<div class = 'body'>{$element['content']}</div>";
}

?>
Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 16 марта 2012 в 14:44

"Shok211" wrote:
Updated***

Молодец. Дорога тебе на International Obfuscated C Code Contest. Не вижу смысла усложнять простые строки:

function phptemplate_preprocess_node(&$variables) {
$variables['node']->body = '<div>'.$variables['node']->body.'</div>'
}

Бритва Оккама в действии, так сказать. Тем более, что препроцесс почти сто процентов будет в template.php

Аватар пользователя Shok211 Shok211 16 марта 2012 в 14:48

Автор отписался что такое решение нужно не в конкретном шаблоне а во всех его проектах.
<?php$element['content']?> - Правильнее ибо перед этим другие модули будут обрабатывать содержимое ноды.
<?php$tr['node']['preprocess functions'][] ?>
Позволяет назначить сразу несколько обработчиков... а не спихивать всю логику в один.

Аватар пользователя liland liland 16 марта 2012 в 16:23

Размещаю код

function phptemplate_preprocess_node(&$variables) {
$variables['node']->body = '<div class="nodebody">'.$variables['node']->body.'</div>';
}

в файле template.php
Ошибок не выдает никаких, но и результата никакого нет, в див содержимое поле боди не оборачивается. Пробовал див без класса добавлять
$variables['node']->body = '<div>'.$variables['node']->body.'</div>';
То же самое. Никакого эффекта нет. Кеш чистил.

Для теста добавил в файл другую функцию:

 function phptemplate_filter_tips($tips, $long = FALSE, $extra = '') {
 return '';
 }

Она работает отлично - подсказки убираются под форматами ввода.

дальше проверил еще такой функцией:

function phptemplate_preprocess_node(&$variables,$hook) {
drupal_set_message('<pre>'.print_r($variables,1).'</pre>');
$variables['node']->body = '<div class="nodebody">'.$variables['node']->body.'</div>';
}

drupal_set_message тоже отработал отлично, информация вывелась в сообщении.

Я так понимаю - ошибка в строке
$variables['node']->body = '<div class="nodebody">'.$variables['node']->body.'</div>';
Можете подсказать что в ней не так?