Оригинал статьи Здесь
Начинаем приводить вывод нод и комментариев к более приемлемому виду.
Я пока не буду говорить о стилях оформления (точнее о включенных в тему файлах CSS), сейчас мы будем разбираться в структуре вывода контекста, используемых при выводе переменных, и как и где их можно менять и использовать.
Для дальнейшего понимания приводимых исходных кодов, оговорюсь, что свою тему, не мудрствуя лукаво я назвал «hotel». т.е. в каталоге sites/www.hotel-prog.ru/themes создал директорию hotel, в которой разместил следующие файлы:
hotel.info
description = Div-based multi-column theme
version = 6.1.0.1
core = 6.x
engine = phptemplate
stylesheets[all][] = layout.css
stylesheets[all][] = color.css
stylesheets[all][] = metrics.css
stylesheets[print][] = print.css
regions[header] = header
regions[content_top] = content top
regions[content_right] = content right
regions[content] = content
regions[content_bottom] = content bottom
regions[footer] = footer
regions[search_box_zone] = search box zone
regions[login_box_zone] = login box zone
features[] = name
features[] = node_user_picture
features[] = comment_user_picture
features[] = search
features[] = favicon
features[] = primary_links
features[] = secondary_links
template.php
<?php
/*
* Переопределение вывода breadcrumb
*/
function hotel_breadcrumb($breadcrumb) {
/*
* Вместо ссылки на Нome , подставим наименование нашего сайта
*/
global $base_url;
$br=l(variable_get('site_name',''),$base_url,array('html'=>TRUE,'attributes'=>array('title'=>t('Перейти на главную страницу сайта'))));
array_shift($breadcrumb);
if (!empty($breadcrumb)) {
$br='<div class="breadcrumb">'.(!empty($br)?$br.' » ':''). implode(' » ', $breadcrumb)."</div>";
}
return $br;
}
/*
* Переопределение переменных для вывода материала (ноды)
*/
function hotel_preprocess_node(&$variables,$hook) {
//drupal_set_message('<pre>'.print_r($variables,1).'</pre>');
/*
* Если это не вывод ноды и материал не помещается полностью в вывод,
* то убираем ссылку на добавление комментария, так как
* не прочитав материал целиком, не логично давать коментировать :)
*/
if($variables['page']==0 && isset($variables['node']->links['node_read_more'])) {
unset($variables['node']->links['comment_add']);
}
/*
* Если это тизер и есть линк на node_read_more
* то формируем свою ссылку hotel_node_read_more
*/
if(isset($variables['node']->links['node_read_more']) && $variables['teaser']==1){
$variables['hotel_node_read_more']=l(
' » '.$variables['node']->links['node_read_more']['title'],
$variables['node']->links['node_read_more']['href'],
array('attributes'=>array(
'title'=>$variables['node']->links['node_read_more']['attributes']['title'],
'class'=>'node-more-read')
)
);
/*
* Убираем лишнии параграф (теги <p> </p> из тизера)
*/
$variables['content']=preg_replace('#\<p\>\s*(.*?)\s*\<\/p\>#si','\\1',$variables['node']->teaser);
/*
* Убираем из links ссылку на node_read_more
*/
unset($variables['node']->links['node_read_more']);
}
/*
* формируем переменную links по новой, с учетом наших изменений
*/
$variables['links']=theme('links',$variables['node']->links);
/*
* Формируем дополнительные переменные hotel_submitted_date и hotel_submitted_user
* которые мы будем использовать в node.tpl.php вместо переменной submitted
*/
$variables['hotel_submitted_date']=$variables['date'];
$variables['hotel_submitted_user']=$variables['name'];
}
/*
* Переопределение переменных для вывода комментария
*/
function hotel_preprocess_comment(&$variables,$hook) {
//drupal_set_message('<pre>'.print_r( $variables,1).'</pre>');
/*
* Формируем дополнительные переменные hotel_submitted_date и hotel_submitted_user
* которые мы будем использовать в comment.tpl.php вместо переменной submitted
*/
$variables['hotel_submitted_date']=$variables['date'];
$variables['hotel_submitted_user']=$variables['author'];
}
?>
node.tpl.php
<?php
<div class="node" id="node-<?php print $node->nid; ?>">
<?php if($submitted): ?>
<div class="node-user<?php if ($picture) {print ' picture';}?>">
<?php if ($picture) print $picture;?>
<?php if ($hotel_submitted_user) print $hotel_submitted_user;?>
</div>
<?php endif; ?>
<?php if ($page == 0): ?>
<h2 class="title"><a href="<?php print $node_url; ?>" class="title"><?php print $title;?>/a></h2>
<?php endif; ?>
<?php if ($unpublished): ?>
<div class="unpublished"><?php print t('Unpublished'); ?></div>
<?php endif; ?>
<?php if ($hotel_submitted_date && $submitted): ?>
<div class="submitted-node">
<?php print $hotel_submitted_date; ?>
</div>
<?php endif; ?>
<div class="content">
<?php print $content.$hotel_node_read_more;} ?>
</div>
<?php if ($links): ?>
<div class="links">
<?php print $links; ?>
</div>
<?php endif; ?>
</div> <!-- /node -->
?>
comment.tpl.php
<?php
<div class="comment">
<?php if($submitted): ?>
<div class="comment-user<?php if ($picture) {print ' picture';}?>">
<?php if ($picture) print $picture;?>
<?php if ($hotel_submitted_user) print $hotel_submitted_user;?>
</div>
<?php endif; ?>
<?php if ($hotel_submitted_date && $submitted): ?>
<div class="submitted-comment">
<?php print $hotel_submitted_date; ?>
</div>
<?php endif; ?>
<?php if ($unpublished): ?>
<div class="unpublished"><?php print t('Unpublished'); ?></div>
<?php endif; ?>
<div class="content">
<?php print $content; ?>
</div>
<?php if ($links): ?>
<div class="links">
<?php print $links; ?>
</div>
<?php endif; ?>
</div>
?>
Ну и конечно page.tpl.php и файлики стилей (.css)- содержание которых, нам пока не интересено.
Разберем первый файл hotel.info, он включает в себя как уже известные по 5.х версии параметры
так и ряд новых
stylesheets[all][] = layout.css //- какие файлы (находящиеся в каталоге нашей темы) подключать
regions[header] = header //- определяем возможные регионы (то что в пятой версии определялось через хук theme_regions() в файле template.php)
features[] = name //- это определение того, какие функции, поддерживает тема (т.е. какие флажки у вас будут доступны в секции настройки темы (Название сайта, Аватары в сообщениях и т.д.))
Файлик [b]template.php[/b] - в нем переопределяем ряд функций, целью которых служит сформировть переменные для вывод контента, так как нам нужно:
1. Переопределение вывода breadcrumb, Вместо ссылки на Нome , подставим наименование нашего сайта
2. Вывод материала (ноды), во первых я хочу вместо стандартного вывода submitted, сделать вывод пользователя под аватаром (если он есть) и под заголовком ноды отдельно вывести время создания ноды. Во вторых для тизера, перенести ссылку читать далее из под ноды в конец тизера.Ну и в третих убрать надпись "Добавить комментарий", если нода не показана полность.
4. Для вывода комментариев заменить вывод submitted по аналогии с выводом ноды.
Как это сделано, можно посмотреть в комментариях в тексте template.php
В итоге мы получаем, переопределенный content для тизера ноды (очищенный от тэгов <p></p>),
три дополнительные переменные:
переменную hotel_node_read_more c ссылкой "Читать далее",
hotel_submitted_user и hotel_submitted_date (которые мы выведем в шаблонах в нужные места).
Убираем ссылки "Читать далее" и "Добавить комментарий" там где они нам не нужны из links.
Ну и файлики node.tpl.php и comment.tpl.php - это просто шаблоны где мы используем наши переменные.
Продолжение следует ...
Комментарии
в закладки
через t() надо пропускать надписи на английском!
Привычка, кстати а разве в обратную сторону это не будет работать ? т.е. если я в translate помещу файлики ru.po и en.po переведет ли он в обраьную сторону ?
или базовым должен быть строго английский ?
Базовый только английский. К счастью.
Ну ладно в данном случае это не принципиально ... кстати функция t() кроме всего прочего, позволяет переопределить значение через интерфейс друпала (так как значение все же попадает в таблицу {locales_sourse}.
Еще немного пояснений , в данном случае показана просто принципиальная возможность манипулирования переменных ,
и например предобработка submitted лишняя, так как в ноде можно просто
использовать переменные $date и $name, а в коментариях соответственно $date и $autor...
gfg
в закладки, спасибо за перевод
Вообще то это не перевод офицального материала ,а так, "мысли вслух" (при освоении D6 (в том числе и темизации)), короче авторский материал но все равно пожалуйста .
Маленькое исправление в node.tpl.php и comment.tpl.php, вставлена проверка на if($submitted) ...,
В предыдущем варианте , юзер и дата публикации выводились во всех материалах (нодах и комментах)
(в не зависимости от настройки в теме, т.е. даже когда в теме явно указывалось не выводить submitted для какого либо типа материала) ...
какое-то слово новое появилось - preprocess - это в 6-м друпале так надо?
Прошу прощения, а что такое breadcrumb trail?
Это если на пальцах...
Дословно "путь по хлебным крошкам", в контексте сайтов обычно строка указывающая путь достижение текущего материала,
например
Главная » Блог » Блог пользователя тру-ля-ля !
спасибо
первый раз сталкиваюсь с таким
Я такую штуку "строкой навигации" называю, где-то слышал. Вроде, менее сленгово получается, и вполне адекватно.
Спасибо, пригодиться.
olk, доброго дня!
взял часть Вашего кода, но у меня не работает...
Можете подсказать, в чём дело?
Заранее спасибо!
{
drupal_set_message('<pre>'.print_r($variables,1).'</pre>');
if($variables['page']==0 && isset($variables['node']->links['node_read_more']))
{
unset($variables['node']->links['comment_add']);
}
}
$variables['links']=theme('links',$variables['node']->links);
Вопрос снят!
разобрался.
как формируется переменная $content в comment.tpl.php
Блин, уже 2010 год, а я только что увидел эту статью, сколько бы нервов она мне сохранила.)
Спасибо даже в 2010 очень полезно очень помогает