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

ср, 02.07.2008 02:18 :: olk

Начинаем приводить вывод нод и комментариев к более приемлемому виду.
Я пока не буду говорить о стилях оформления (точнее о включенных в тему файлах 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
/*
* Переопределение вывода 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
<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.'&nbsp;'.$hotel_node_read_more;} ?>
  </div>
  <?php if ($links): ?>
    <div class="links">
      <?php print $links; ?>
    </div>
  <?php endif; ?>
</div> <!-- /node -->


comment.tpl.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
# это определение того, какие функции, поддерживает тема (т.е. какие флажки у вас будут доступны #в секции настройки темы (Название сайта, Аватары в сообщениях и т.д.))

Файлик template.php - в нем переопределяем ряд функций, целью которых служит сформировть переменные для вывод контента, так как нам нужно:
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 - это просто шаблоны где мы используем наши переменные.

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

Добавить комментарий
« Добавить комментарий
» Добавить комментарий