Есть задача вывести содержимое нод в диве. Как я вижу решение в лоб:
В файле 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>';
Но решение не ахти из-за правки ядра. Как правильно решить данную задачу без правки ядра?
Комментарии
Создайте в папке со своей темой node-type.tpl.php и там правьте вывод как душе угодно...
type - машинное название типа материала
Создавать шаблон для ноды это понятно, но это влечет за собой ужасное увеличение по времени и не стандартизовано - для каждого проекта по своему раскладывается
<?php print $content; ?>
. Да и во многих случаях шаблон ноды вообще не нужно раскладывать на составляющие. Только для того, чтобы обернуть body в div делать этого не хотелось бы. Нельзя ли как-то по другому решить?Решайте препроцессом
А вы собственно о чем или что курите?
Я вас жутко обрадую что node.php.tpl, существует всегда. А вот насколько больше тактов процессора нужно чтобы проверить file_exist в теме я вам не скажу, но думаю это наименьшая проблема в производительности друпала.
2 RxB
Раньше еще не сталкивался с препроцессами. Я правильно понял, что необходимо менять данную функцию:
function template_preprocess_node(&$variables) { } из theme.inc переписав ее с изменениями в свой template.php в виде function THEME_template_preprocess_node(&$variables) { }?
2 enemis
Я о том, что поле боди находится внутри стандартной переменной $content и чтобы обвернуть боди в див надо раскладывать контент на составляющие. Если Вам нечего делать - можете за сигареткой-другой в каждом проекте разделывать $content чтобы вынуть оттуда поле боди и обвернуть его в див. Мне на это тратить время жаль и я хочу стандартизировать решение для всех своих проектов. Стандартизировать - это означает в моем понимании сделать решение единым для всех проектов. Например в виде модуля или хука темы или еще чего-то. Но не прописывая див вручную во всех файлах шаблона с раскладыванием переменной контент.
Нужда понятна, но как по моим наблюдениям все равно приходиться разбирать $content от проекта к проекту, проекты то не однотипные.
Сделайте как сказал RxB и все, ваш вопрос решен.
Ээ вобщето есть шаблон поля body
покажи мне его в шестёрке
Зато есть hook_preprocess и hook_theme через которые если я не ошибаюсь можно добавить функцию без preprocess
Сам-то понял что написал?
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>";
} ?>
Молодец. Дорога тебе на International Obfuscated C Code Contest. Не вижу смысла усложнять простые строки:
$variables['node']->body = '<div>'.$variables['node']->body.'</div>'
}
Бритва Оккама в действии, так сказать. Тем более, что препроцесс почти сто процентов будет в template.php
Автор отписался что такое решение нужно не в конкретном шаблоне а во всех его проектах.
<?php$element['content']?>
- Правильнее ибо перед этим другие модули будут обрабатывать содержимое ноды.<?php$tr['node']['preprocess functions'][] ?>
Позволяет назначить сразу несколько обработчиков... а не спихивать всю логику в один.
Никто не запрещает разместить preprocess-хук в модуле.
Размещаю код
$variables['node']->body = '<div class="nodebody">'.$variables['node']->body.'</div>';
}
в файле template.php
Ошибок не выдает никаких, но и результата никакого нет, в див содержимое поле боди не оборачивается. Пробовал див без класса добавлять
$variables['node']->body = '<div>'.$variables['node']->body.'</div>';
То же самое. Никакого эффекта нет. Кеш чистил.
Для теста добавил в файл другую функцию:
return '';
}
Она работает отлично - подсказки убираются под форматами ввода.
дальше проверил еще такой функцией:
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>';
Можете подсказать что в ней не так?
вам с print_r виднее, может индексы не угадал