УрокНеобходимые файлы для создания шаблона. Node.tpl.php

Теперь мы поговорим о таком файле как node.tpl.php. Очень полезный файлик. Он является шаблоном для вывода всех типов материалов. Полезен для каждого сайта, так как всегда надо переписать стандартный вывод статей - иногда ссылки убрать, или, например, показывать тэги только в полной версии материала, а в сокращённой(тизере) не выводить.

Вот как строится материал по стандартному шаблону:

<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?> clear-block">
 
    <?php print $picture ?>
 
    <?php if (!$page): ?>
        <h2>
            <a href="<?php print $node_url ?>" title="<?php print $title ?>">
                <?php print $title ?>
            </a>
        </h2>
    <?php endif; ?>
 
    <div class="meta">
        <?php if ($submitted): ?>
          <span class="submitted">
              <?php print $submitted ?>
          </span>
        <?php endif; ?>
 
        <?php if ($terms): ?>
            <div class="terms terms-inline"><?php print $terms ?></div>
        <?php endif;?>
    </div>
 
    <div class="content">
        <?php print $content ?>
    </div>
 
    <?php print $links; ?>
 
</div>

Теперь, как всегда, остановимся на каждой из частей подробнее:

<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?> clear-block">

Здесь создаётся хтмл-контейнер для ноды (материала). В id записывается node- и её уникальный номер nid. В class запишется sticky, если при создании материала был отмечен галочкой поле "Закреплять вверху(sticky at top)". Также, если было отмечено поле "Не публиковать (not publish)", в класс материала будет добавлен текст node-unpublished.

Едем дальше:

<?php print $picture ?>
 
    <?php if (!$page): ?>
        <h2>
            <a href="<?php print $node_url ?>" title="<?php print $title ?>">
                <?php print $title ?>
            </a>
        </h2>
    <?php endif; ?>

Первая строка понятна всем я думаю - выводится аватарка пользователя, создавшего материал. А вот дальше происходит следущее: если мы просматриваем анонс материала, но нам выводится его заголовок со ссылкой на полную версию материала. А если мы на полной версии, то заголовок не показывается (т.к. в page.tpl.php переменной $title он уже выводится).

<div class="meta">
        <?php if ($submitted): ?>
          <span class="submitted">
              <?php print $submitted ?>
          </span>
        <?php endif; ?>

Вот тут в класс meta выводится одной строкой имя автора и дата создания материала.

<?php if ($terms): ?>
    <div class="terms terms-inline"><?php print $terms ?></div>
<?php endif;?>

Тут таким же образом, как и в предыдущем куске кода, выводятся тэги материала.

После чего следует вывод контента:

<div class="content">
    <?php print $content ?>
</div>

И, наконец, выводятся ссылки материала (читать далее, количество комментариев, ссылка на комментарии, количество просмотров и т.п.):

<?php print $links; ?>

Как всегда по традиции, в завершении материала список доступных переменных файла node.tpl.php

Стандартные переменные

  • $title - заголовок материала
  • $content - содержимое материала. Может быть полным или сокращённым, в зависимости от переменной $teaser (она определяет, анонс это или нет)
  • $picture - аватарка пользователя, написавшего материал
  • $date - дата создания материала
  • $links - ссылки, такие как "Читать далее", "Добавить комментарий" и т.п.
  • $name - имя пользователя, создавшего материал
  • $node_url - прямой путь к текущему материалу
  • $terms - список тэгов, формирующихся через таксономию (модуль taxonomy)
  • $submitted - вывод автора и даты создания материала одной строкой

Другие переменные:

  • $node - полный объект материала
  • $type - тип материала. Например, blog, page и т.д.
  • $comment_count - количество комментариев к статье
  • $uid - уникальный идентификатор пользователя, написавшего статью
  • $created - дата опубликования статьи. Выводится в таком виде: date('Y - G:i',$node->created), где вместо Y - G:i можно вставить любой php формат даты
  • $zebra - принимает значение 'odd' или 'even' в зависимости от чётности материала
  • $id - уникальный идентификатор статьи. При создании новой статьи всегда увеличивается на единицу

Статусные переменные (флаги):

  • $teaser - возвращает значение ИСТИНА, если выводится анонс статьи
  • $page - возвращает значение ИСТИНА, если выводится полная статья
  • $promote - возвращает значение ИСТИНА, если стоит галочка напротив "Помещать на главную (promote on front page)"
  • $sticky - возвращает значение ИСТИНА, если стоит галочка напротив "Закрепить статью сверху"
  • $status - возвращает значение ИСТИНА, если статья опубликована
  • $comment - возвращает значение ИСТИНА, если комментарии к статье разрешены
  • $readmore - возвращает значение ИСТИНА, если статья непомещается полностью в её анонс
  • $is_front - возвращает значение ИСТИНА, если статья находится на главной странице
  • $logged_in - возвращает значение ИСТИНА, если пользователь авторизирован
  • $is_admin - возвращает значение ИСТИНА, если пользователь имеет права администранора

Мы практически закончили основные файлы шаблонов. Остался последний - box.tpl.php. А потом мы наконец доберёмся до крутых фишек друпала :)

Комментарии

Аватар пользователя powerscin
powerscin написал:

Спасибо за материал, про большинство переменных даже и не знал

11.08.2010 00:46
Аватар пользователя Spleshka
Spleshka написал:

без проблем, всегда рад помочь :)

11.08.2010 00:49
Аватар пользователя Vardi
Vardi написал:

Спасибо за интересный блог, давно хотел научиться делать шаблоны для drupal`а, подписался :)

11.08.2010 00:57
Аватар пользователя Spleshka
Spleshka написал:

:) спасибо. Можешь в закладки добавить, я тут буду выкладывать очень много мощных фишек для создания тем. И всегда вопрос задать можно :)

11.08.2010 01:02
Аватар пользователя Дима
Дима написал:

Спасибо) а можешь подсказать на примере как вставлять в tpl.php картинку автора ноды только обработанную в imagecache.

13.08.2010 16:44
Аватар пользователя Дима
Дима написал:

подскажи пожалуйста как вставлять в тпл.пхп аваторку автора ноды, только уже обработанную в imagecache))) спасибо)

13.08.2010 16:45
Аватар пользователя Spleshka
Spleshka написал:

смотри, в файле node.tpl.php аватарка пользователя выводится таким образом:

<?php print $picture; ?>

Вместо этого напиши следущий код:

<?php echo(theme('imagecache','имя_правила_в_имэджкэше' ,$node->picture)); ?>
13.08.2010 21:41
Аватар пользователя tolyan15
tolyan15 написал:

Такой вот вопрос вскочил: "В шаблоне материала переменная $title только один раз может выводиться?" :-)

06.02.2011 12:36
Аватар пользователя powerscin
powerscin написал:

Нет, можно выводить ее столько сколько хочется, на это нет ограничения, ведь в переменной $title, если вы посмотрите, хранится только текст, даже не ссылка, а вы ведь в ноде можете любое количество текста выводить ;)

06.02.2011 12:57
Аватар пользователя tolyan15
tolyan15 написал:

Тогда продолжим :-)
Сделал панели там вот такой код

    <?php if ($title): ?>
    <h2 class="pane-title"><?php print $title; ?></h2>
    <?php endif; ?>
[/code]
И в node.tpl тоже есть вывод 
[code]
    <?php if ($page == 0): ?>
	<h2 class="title"><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php  print $title; ?></a></h2>
    <?php endif; ?>

В итоге получаеться

<h2 class="pane-title">Барсетка №2</h2>
   <div class="pane-content">
    <div id="node-59" class="node">
		<div class="node-top"><div class="top-right"><div class="top-middle"></div></div></div>
		<div class="node-body">
		<div class="node-title clear-block">
		<h2 class="title"><a href="" title=""></a></h2>
		  	</div>

Т.е. второй раз переменная $title не выводиться, пробовал подставлять другие переменные, которых здесь нет, они выводяться
Вот такой курьез получаеться :-)

06.02.2011 15:06
Аватар пользователя Spleshka
Spleshka написал:
    <?php if ($page == 0): ?>
	<h2 class="title"><a href="<?php print $node_url ?>" title="<?php print $node->title ?>"><?php  print $node->title; ?></a></h2>
    <?php endif; ?>
06.02.2011 16:20
Аватар пользователя tolyan15
tolyan15 написал:

Попробовал Ваш вариант в node.tpl
Результат тот же
[code]

Барсетка №2

[/code]

06.02.2011 20:51
Аватар пользователя Spleshka
Spleshka написал:

Где-то ошибка) У меня всё работает. Может, изза того что ты используешь это в панели? А вообще, сделай

<?php
  var_dump($node);
?>

и посмотри как выводится заголовок

06.02.2011 23:19
Аватар пользователя tolyan15
tolyan15 написал:

Вывело примерно это
[code]object(stdClass)#193 (42) { ["nid"]=> string(2) "35" ["type"]=> string(5) "karta" ["language"]=> string(2) "ru" ["uid"]=> string(1) "1" ["status"]=> string(1) "1" ["created"]=> string(10) "1296373682" ["changed"]=> string(10) "1296373682" ["comment"]=> string(1) "0" ["promote"]=> string(1) "0" ["moderate"]=> string(1) "0" ["sticky"]=> string(1) "0" ["tnid"]=> string(1) "0" ["translate"]=> string(1) "0" ["vid"]=> string(2) "35" ["revision_uid"]=> string(1) "1" ["title"]=> NULL ["teaser"]=> string(5679) "
[/code]
К сожалению для меня это темный лес пока

07.02.2011 13:59
Аватар пользователя Spleshka
Spleshka написал:

Забавно.. Видишь в строке есть следующее: ["title"]=> NULL - это значит что $node->title существует, но там ничего нет. А вот чтобы заголовок вообще не выводился - я такое впервые вижу. Надо разбираться уже "на месте", т.е. хотя бы шаблон твой посмотреть, если есть возможность

07.02.2011 15:07
Аватар пользователя tolyan15
tolyan15 написал:

Шаблон называеться Deco скачать можешь по ссылке

07.02.2011 16:33
Аватар пользователя Spleshka
Spleshka написал:

Не нашёл в теме ничего блокирующее тайтл. У тебя ещё всё та же проблема осталась?

09.02.2011 15:28
Аватар пользователя tolyan15
tolyan15 написал:

Привет! Я нашел в панелях есть флажки для вывода тайтла, но тогда он выводиться дважды.
Придеться первый тайтл убирать из шаблона ручками :-)

10.02.2011 10:23
Аватар пользователя Spleshka
Spleshka написал:

Ну да,в этом и заключается темизация =)

10.02.2011 16:30
Аватар пользователя tolyan15
tolyan15 написал:

Еще одна проблема вылезла :-(
На локалке вроде все нормально, а на сервере при активации любой другой темы, кроме стандартной, появляется море строчек с нехорошим не руским словом Warning примерно такого содержания
[code]
Warning: MySQL server has gone away query: INSERT INTO dogwatchdog (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (1, 'php', '%message in %file on line %line.', 'a:4:{s:6:\"%error\";s:12:\"user warning\";s:8:\"%message\";s:473817:\"MySQL server has gone away\nquery: UPDATE dogcache_update SET data = 'a:25:{s:10:\\"admin_menu\\";a:10:{s:5:\\"title\\";s:19:\\"Administration menu\\";s:10:\\"short_name\\";s:10:\\"admin_menu\\";s:10:\\"dc:creator\\";s:3:\\"sun\\";s:11:\\"api_version\\";s:3:\\"6.x\\";s:17:\\"recommended_major\\";s:1:\\"1\\";s:16:\\"supported_majors\\";s:3:\\"1,3\\";s:13:\\"default_major\\";s:1:\\"1\\";s:14:\\&qu in /home/ooostekl/public_html/vitrag/includes/database.mysqli.inc on line 135
[/code]
Таких строчек очень много. Что бы это значило?

10.02.2011 21:25
Аватар пользователя Spleshka
Spleshka написал:

Сначала почисти кэш. Потом запусти крон. Потом апдейт. Это мой любимый круг, после которого многие проблемы такого рода исчезают

10.02.2011 22:52
Аватар пользователя tolyan15
tolyan15 написал:

Крон не хочет запускаться :-(
Пишет
[code]
Ошибка запуска Cron.
[/code]

11.02.2011 09:58
Аватар пользователя Spleshka
Spleshka написал:

Вот тебе и ошибка) Почитай на друпал.ру о ошибках запуска крона. Там может быть огромное количество причин. Скорее всего, какой-то модуль ложит его. Может, самописный) Отключай модули по одному и запускай крон, так и добирёшься до истины. Либо, как я уже говорил - почитай друпал.ру, там много у кого были похожие ошибки

11.02.2011 20:58
Аватар пользователя tolyan15
tolyan15 написал:

Вы правы, поотключал модули пока не добился стабильной работы, потом включил по одному только самые необходимые. Пока вроде все работает нормально. :-)
P.S. Но после Joomla такое поведение Drupala меня озадачило :-( , там такого не наблюдалось

12.02.2011 09:33
Аватар пользователя Spleshka
Spleshka написал:

Просто Друпал требует чуть больших знаний в программировании, чем Джумла. В пример можно привести винду и линукс - переход на вторую ось требует более продвинутых знаний, чем у обычного "виндопользователя" :)

12.02.2011 13:24
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

спасибо! мне прикодилось!

16.03.2011 20:32
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Подскажите пожалуйста у меня стоит тема acquia marina с сайта drupal.org. в ней нет файла Node.tpl.php
т.е. мне неоткуда убрать этот код:
if ($terms):
print $terms
endif;

Тут таким же образом, как и в предыдущем куске кода, выводятся тэги материала.

т.е. я хочу чтобы у меня не отображались тэги. а они отображаются. А файла то нет такого... Что делать подскажите пожалуйста?

24.03.2011 18:44
Аватар пользователя Spleshka
Spleshka написал:

взять файл node.tpl.php из темы Garland. Положить к себе в корень темы, удалить лишнюю переменную, почистить кэш. Вот и всё

02.04.2011 13:27
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

тут вообще есть кто живой?

01.04.2011 17:00
Аватар пользователя tolyan15
tolyan15 написал:

Есть :)

11.09.2011 17:21
Аватар пользователя styleroom
styleroom написал:

не совсем въехал с настройкой ноды в 7-м друпале...
суть в том, что надо сделать свой вариант вывода ноды
а затыка происходит на разборе на составляющие переменной $content

сможете что-нибудь подсказать?

09.07.2012 16:00
Аватар пользователя sergeybelya
sergeybelya написал:

Используйте переменную $node в файле node--машинное_имя_типа_материала.tpl.php

09.07.2012 16:05
Аватар пользователя styleroom
styleroom написал:

с вариантом node--машинное_имя_типа_материала.tpl.php более-менее разобрался
но теперь не понятно - как управлять анонсом к своему типу материала...
нужно создавать отдельный файл?

10.07.2012 08:09
Аватар пользователя styleroom
styleroom написал:

спасибо!
я нащупал эту тему когда использовал конструкцию print debug($content)

10.07.2012 08:25
Аватар пользователя styleroom
styleroom написал:

а можно ли управлять взаиморасположением элементов ноды: тэгами и их содержанием на уровне хуков или препроцессов?
чтобы не делать шаблоны под каждый тип своего материала...

10.07.2012 08:11
Аватар пользователя sergeybelya
sergeybelya написал:

Все можно, вообще попробуйте еще просто настройки отображения в админке для типов материалов, зачем все так усложнять.

10.07.2012 12:34
Аватар пользователя styleroom
styleroom написал:

так ведь в админке нельзя управлять вложенностью дивов друг в друга...

10.07.2012 12:38
Аватар пользователя styleroom
styleroom написал:

и еще = нарыл вот такой образец

function THEMENAME_preprocess_node(&$vars) {
  $vars['submitted'] = 'Опубликовано в ' . $vars['date'];
}

есть ли где список всех доступных переменных? типа date

10.07.2012 12:44
Аватар пользователя sergeybelya
sergeybelya написал:

установите модуль Devel и изучайте подобные переменные, используя функцию dpm()

10.07.2012 14:13
Аватар пользователя styleroom
styleroom написал:

спасибо за подсказку

11.07.2012 14:08

Комментировать