Drupal 6. Работаем над выводом контента. Часть первая.

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

Аватар пользователя olk olk 2 июля 2008 в 12:25

Оригинал статьи Здесь

Начинаем приводить вывод нод и комментариев к более приемлемому виду.
Я пока не буду говорить о стилях оформления (точнее о включенных в тему файлах CSS), сейчас мы будем разбираться в структуре вывода контекста, используемых при выводе переменных, и как и где их можно менять и использовать.
Для дальнейшего понимания приводимых исходных кодов, оговорюсь, что свою тему, не мудрствуя лукаво я назвал «hotel». т.е. в каталоге sites/www.hotel-prog.ru/themes создал директорию hotel, в которой разместил следующие файлы:

hotel.info

name = Hotel
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']==&& 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.х версии параметры

name = Hotel
description = Div-based multi-column theme
version = 6.1.0.1

так и ряд новых

core = 6.x //- показывает, что тема относится к 6.x версии ядра Drupal-а
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 - это просто шаблоны где мы используем наши переменные.

Продолжение следует ... Smile

Комментарии

Аватар пользователя olk olk 2 июля 2008 в 14:01

Smile Привычка, кстати а разве в обратную сторону это не будет работать ? т.е. если я в translate помещу файлики ru.po и en.po переведет ли он в обраьную сторону ?
или базовым должен быть строго английский ?

Аватар пользователя olk olk 2 июля 2008 в 21:45

Ну ладно Smile в данном случае это не принципиально Smile ... кстати функция t() кроме всего прочего, позволяет переопределить значение через интерфейс друпала (так как значение все же попадает в таблицу {locales_sourse}.

Еще немного пояснений , в данном случае показана просто принципиальная возможность манипулирования переменных ,
и например предобработка submitted лишняя, так как в ноде можно просто
использовать переменные $date и $name, а в коментариях соответственно $date и $autor...

Аватар пользователя olk olk 3 июля 2008 в 10:08

Вообще то это не перевод офицального материала Smile ,а так, "мысли вслух" (при освоении D6 (в том числе и темизации)), короче авторский материал Lol но все равно пожалуйста .

Аватар пользователя olk olk 6 июля 2008 в 9:55

Маленькое исправление в node.tpl.php и comment.tpl.php, вставлена проверка на if($submitted) ...,
В предыдущем варианте , юзер и дата публикации выводились во всех материалах (нодах и комментах)
(в не зависимости от настройки в теме, т.е. даже когда в теме явно указывалось не выводить submitted для какого либо типа материала) ...

Аватар пользователя olk olk 9 июля 2008 в 10:39

Дословно "путь по хлебным крошкам", в контексте сайтов обычно строка указывающая путь достижение текущего материала,
например
Главная » Блог » Блог пользователя тру-ля-ля !

Аватар пользователя sergej-serov sergej-serov 6 декабря 2008 в 18:50

olk, доброго дня!
взял часть Вашего кода, но у меня не работает...
Можете подсказать, в чём дело?
Заранее спасибо!

function orange_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']);
        }
}
$variables['links']=theme('links',$variables['node']->links);