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

После создания info-файла, в принципе, тема уже определена. Это значит, что вы можете зайди в раздел управлением темами http://mysite.ru/admin/build/themes и включить там свою тему. Естестественно, после включения её никакого дизайна вы не увидете - страница приобретёт стиль "чёрное на белом" - на белом фоне чёрный текст.

Однако хочу отметить, что не смотря на то, что в нашей теме никаких файлов кроме mytheme.info не лежит, сайт будет работать так как же как и раньше - выводить весь контент, добавлять блоки в регионы (http://mysite.ru/admin/build/block) и прочее. Это объясняется тем, что в ядро друпала включены обязательные модули, которые даже при полном отсутствии каких либо файлов в вашей теме (за исключением info-файла) позволяют продолжать работу с друпалом.

Впринципе, всё создание шаблона сводится к перекрытию файлов-шаблонов (они имеют расширение .tpl.php) стандартных модулей нашей CMS.

Самый важный tpl-файл (tpl - сокращение от template, шаблон) это page.tpl.php. Он отвечает за построение каждой страницы сайта. Давайте разберёмся, из чего же состоит файл шаблона:

  • html код
  • php код
  • javascript код (необязательно)

В каждый файл шаблона друпал передаёт данные сайта в виде стандартных переменных. Для каждого файла шаблона существуют 2 вида переменных:

  • переменные, которые передаются только в этот файл
  • переменные, которые передаются во все файлы

Вот список всех переменных для page.tpl.php:

Общие переменные (для всех файлов):

  • $base_path - базовый путь, куда был установлен друпал
  • $css - массив css-файлов, подключенных к текущему файлу шаблона
  • $directory - путь к папке, в которую установлена тема
  • $is_front - возвращает значение ИСТИНА если вы находитесь на главной странице
  • $logged_in - возвращает значение ИСТИНА если вы залогинились
  • $is_admin - возвращает значение ИСТИНА если вы имеете доступ в админку

Метаданные страницы

  • $language - (объект) Текущий язык, который отображается на сайте
  • $language->language - содержит его текстовое представление
  • $language->dir - содержит направление языка. Это или будет 'ltr'(left-to-right) или 'rtl'(right-to-left)
  • $head_title - модифицированная версия заголовка страницы, для использования между тэгами <title> </title>
  • $head - вставляется между тэгами <head> </head>. Содержит мета тэги, ключевые слова и т.д.
  • $styles - служит для загрузки всех css-файлов в текущую страницу
  • $scripts - служит для загрузки всех javascript'ов в текущую страницу
  • $body_classes - набор классов css для тэга <body> </body>. Содержит в себе информацию о текущем расположении колонок на сайте, их количестве, текущем url'e и т.д.

Информация о сайте

  • $front_page - адресс главной страницы сайта. Лучше использовать эту переменную для ссылки на главную страницу, т.к. она включает в себя язык домена и преффикс
  • $logo - путь к логотипу сайта, если он включен на сайте
  • $site_name - имя сайта. Может быть пустым, если отключить его в фичах в info-файле. Настраивается в mysite.ru/admin/settings/site-information
  • $site_slogan - слоган сайта. Может быть пустым, если отключить его в фичах в info-файле. Настраивается в mysite.ru/admin/settings/site-information
  • $mission - миссия сайта. Может быть пустой, если отключить её в фичах в info-файле. Настраивается в mysite.ru/admin/settings/site-information

Навигация

  • $search_box - содержит в себе html код, отображающий строку поиска. Может быть пустым если выключить его в info-файле
  • $primary_links - массив, содержащий в себе навигационные ссылки для сайта, если они разрешены в фичах инфо-файла
  • $secondary_links - массив, содержащий в себе навигационные ссылки для сайта, если они разрешены в фичах инфо-файла

Содержимое страницы по умолчанию

  • $left - регион. Содержит в себе html код для левой колонки. Если в инфо-файле задать любые регионы, то он пропадает
  • $breadcrumb - "хлебные крошки" для текущей страницы
  • $title - заголовок страницы
  • $help - динамические подсказки, в основном показываются в админке
  • $messages - выводит сообщения об ошибках и предупреждениях на сайте
  • $tabs - ссылки (табы), связывающие текущую страницу с её подстраницами (к примеру для статьи - с её страницей редактирования)
  • $content - содержимое текущей страницы
  • $right - регион. Содержит в себе html код для правой колонки. Если в инфо-файле задать любые регионы, то он пропадает

Нижняя область/закрывающие данные

  • $feed_icon - строка со всеми иконками обратной связи для текущей страницы
  • $footer_message - сообщение внизу страницы. Настраивается в mysite.ru/admin/settings/site-information
  • $footer - регион. Содержит в себе html код для нижней части страницы. Если в инфо-файле задать любые регионы, то он пропадает
  • $closure - закрывающая метка для всех модулей, которые изменяли страницу. Эту переменну обязательно надо выводить после всего динамического содержимого. Лучше всего перед закрытием тэга BODY

Тут перечислены все стандартные переменные. Но вы можете добавлять сюда свои переменные либо в роли регионов через info-файл, либо в любой другой роли через файл template.php (о нём чуть позже).

Теперь я покажу какой код должен находиться в page.tpl.php и в какой код он потом интерпретируется браузерами. Перед вами кусок кода из page.tpl.php:

<?php if (!empty($title)): ?>
   <h1 class="title" id="page-title">
      <?php print $title; ?>
   </h1>
<?php endif; ?>

В первой строке идёт проверка, есть ли вообще заголовок у текущей страницы. Если его нет - то отладчик просто пропустит этот код, и не будет заходить внурть его. Если же заголовок существует, то в html код страницы добавятся тэг <h1 class="title" id="page-title">, после него будет напечатан заголовок страницы, и всё это закроется тэгом </h1>. Если смотреть код этой страницы в браузере, то он выглядел бы так:

<h1 class="title" id="page-title">
    Урок 4. Необходимые файлы для создания шаблона. Page.tpl.php
</h1>

Таким образом оборачиваются почти все переменные сайта. Это делается для того, чтобы мы могли прописывать стили для контента, заранее не зная, какой он будет.

Вот таким образом выглядит стандартный файл page.tpl.php, который идёт вместе с друпалом. Меняйте название классов, переставляйте местами переменные - и смотрите что из этого получается. Это надо для того, чтобы "пощупать" как оно работает и что выводится в результате.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language ?>" lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">
 
<head>
  <?php print $head; ?>
  <title><?php print $head_title; ?></title>
  <?php print $styles; ?>
  <?php print $scripts; ?>
  <script type="text/javascript"><?php /* Needed to avoid Flash of Unstyled Content in IE */ ?> </script>
</head>
<body class="<?php print $body_classes; ?>">
  <div id="page">
    <div id="header">
      <div id="logo-title">
 
        <?php if (!empty($logo)): ?>
          <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home" id="logo">
            <img src="<?php print $logo; ?>" alt="<?php print t('Home'); ?>" />
          </a>
        <?php endif; ?>
 
        <div id="name-and-slogan">
          <?php if (!empty($site_name)): ?>
            <h1 id="site-name">
              <a href="<?php print $front_page ?>" title="<?php print t('Home'); ?>" rel="home"><span><?php print $site_name; ?></span></a>
            </h1>
          <?php endif; ?>
 
          <?php if (!empty($site_slogan)): ?>
            <div id="site-slogan"><?php print $site_slogan; ?></div>
          <?php endif; ?>
        </div> <!-- /name-and-slogan -->
      </div> <!-- /logo-title -->
 
      <?php if (!empty($search_box)): ?>
        <div id="search-box"><?php print $search_box; ?></div>
      <?php endif; ?>
 
      <?php if (!empty($header)): ?>
        <div id="header-region">
          <?php print $header; ?>
        </div>
      <?php endif; ?>
 
    </div> <!-- /header -->
 
    <div id="container" class="clear-block">
 
      <div id="navigation" class="menu <?php if (!empty($primary_links)) { print "withprimary"; } if (!empty($secondary_links)) { print " withsecondary"; } ?> ">
        <?php if (!empty($primary_links)): ?>
          <div id="primary" class="clear-block">
            <?php print theme('links', $primary_links, array('class' => 'links primary-links')); ?>
          </div>
        <?php endif; ?>
 
        <?php if (!empty($secondary_links)): ?>
          <div id="secondary" class="clear-block">
            <?php print theme('links', $secondary_links, array('class' => 'links secondary-links')); ?>
          </div>
        <?php endif; ?>
      </div> <!-- /navigation -->
 
      <?php if (!empty($left)): ?>
        <div id="sidebar-left" class="column sidebar">
          <?php print $left; ?>
        </div> <!-- /sidebar-left -->
      <?php endif; ?>
 
      <div id="main" class="column"><div id="main-squeeze">
        <?php if (!empty($breadcrumb)): ?><div id="breadcrumb"><?php print $breadcrumb; ?></div><?php endif; ?>
        <?php if (!empty($mission)): ?><div id="mission"><?php print $mission; ?></div><?php endif; ?>
 
        <div id="content">
          <?php if (!empty($title)): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>
          <?php if (!empty($tabs)): ?><div class="tabs"><?php print $tabs; ?></div><?php endif; ?>
          <?php if (!empty($messages)): print $messages; endif; ?>
          <?php if (!empty($help)): print $help; endif; ?>
          <div id="content-content" class="clear-block">
            <?php print $content; ?>
          </div> <!-- /content-content -->
          <?php print $feed_icons; ?>
        </div> <!-- /content -->
 
      </div></div> <!-- /main-squeeze /main -->
 
      <?php if (!empty($right)): ?>
        <div id="sidebar-right" class="column sidebar">
          <?php print $right; ?>
        </div> <!-- /sidebar-right -->
      <?php endif; ?>
 
    </div> <!-- /container -->
 
    <div id="footer-wrapper">
      <div id="footer">
        <?php print $footer_message; ?>
        <?php if (!empty($footer)): print $footer; endif; ?>
      </div> <!-- /footer -->
    </div> <!-- /footer-wrapper -->
 
    <?php print $closure; ?>
 
  </div> <!-- /page -->
 
</body>
</html>

Комментарии

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

Скачать исходный файл page.tpl.php, предлагаемый друпалом, можно тут - данная страница (архив) отсутствует . если можно , то разместите рабочею ссылку , хотелось бы посмотреть на этот файл )))

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

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

07.12.2010 15:14
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

спасибо , быстро, оперативно , и качественно !

07.12.2010 16:04
Аватар пользователя Денис
Денис написал:

Класс! Все очень подробно и понятно! Сейчас на друпал.ру повешу ссылку на твой сайт!!! А то там на мой вопрос - так как же сверстать тему - накидал всякой фигни.

18.02.2011 17:35
Аватар пользователя Влад
Влад написал:

Огромное спасибо за вашу работу! Но вы могли бы всё-таки написать подробно, как вставлять (определять) регионы на странице именно в нужном месте.
Например, я создал регион Banner. Как сделать так, чтобы он был помещен в шапку сайта, или в слева-справа, посередение, внизу. Как это делается? Что куда прописывается?
Большое вам спасибо за просветительство!

04.03.2011 12:16
Аватар пользователя [ABiBas]_Б@шКа
[ABiBas]_Б@шКа написал:

А чтобы определить положение Вашего региона, нужно лезть в файл со стилями и там настраивать позицию.CSS батенька изучайте:WINKING:

05.03.2011 16:14
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Не написано самое важное, где, собственно, должен быть расположен page.tpl.php файл?

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

В корне темы

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

D 7, пытаюсь создать свой шаблон с нуля.
Создал файл name_template.info в [/www/sites/all/themes/my_template]
Включил в админке Шалнон включился, Блан&Вайт
Создаю файл page.tpl.php в [/www/sites/all/themes/my_template]
И ничего остаемся в режине Блан&Вайт, так как друп все равно юзает page.tpl.php из [www/modules/system].
Что делать ? как заставить юзать page.tpl.php из [/www/sites/all/themes/my_template]

05.04.2011 12:48
Аватар пользователя Spleshka
Spleshka написал:

вам надо лишь почистить кэш на сайте :)

05.04.2011 13:07
Аватар пользователя гость
гость написал:

в D7 изменена структура, читайте об html.tpl.php

19.10.2011 19:24
Аватар пользователя Stepashka
Stepashka написал:

Спасибо. Мне очень помогла Ваша статья

20.07.2011 12:53
Аватар пользователя bq
bq написал:

Оличная подача, все четко, не чего лишнего.
Смею заметить, что это пожалуй самое лучшее описание по данной теме которое мне удалось найти на данный момент, а я ведь не первый день роюсь, далеко не первый :)

Сударь, вы молодец.

14.11.2011 17:11
Аватар пользователя Сергей
Сергей написал:

Пытаюсь натянуть свой шаблон на друпал 7, вставил хтмл код в page.tpl.php страница выводится, пытаюсь войти сайт.ру/user но страница входа не появляется (в админке наверно откючена) и зайти в админу не могу, подскажите что делать ?

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

Код выше - для Drupal 6. Код для Drupal 7 вы можете взять из ядра Друпала - файл modules/system/page.tpl.php.

02.02.2012 16:32
Аватар пользователя Лиса
Лиса написал:

А как создать главную страницу входа на сайт с иным дизайном, отличным от основной темы?

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

Имеется ввиду вообще другой дизайн, или похожий, но с отличиями? Разница принципиальна.

11.02.2012 14:56
Аватар пользователя Лиса
Лиса написал:

Нужен вход в торговый центр как бы изображение навигации по центу, таблица красивая с отделами сайта (главными). И после как пользователь на сайте оказывается, уже внутри, при клике на логотип центра, чтоб не улететь обратно на стенд с разделами сайта.

13.02.2012 11:30
Аватар пользователя Spleshka
Spleshka написал:

Это не другая тема, а другая начальная страница. При заходе на сайт у вас должна отображаться именно она, а потом в качестве главной вам надо будет прописать другую страницу, и указать все ссылки (лого, ссылка "Главная" и т.д.) на неё.

13.02.2012 15:58
Аватар пользователя Дмитрий
Дмитрий написал:

Что нужно переписать в page.tpl.php, чтобы название сайта и слоган выводились только на первой странице? Насколько ли я понимаю, что править нужно что-то вот в этом куске кода:

<?php if ($linked_site_logo): ?>
      <div id="logo"><?php print $linked_site_logo; ?></div>
    <?php endif; ?>
 
    <?php if ($site_name || $site_slogan): ?>
      <hgroup<?php if (!$site_slogan && $hide_site_name): ?> class="<?php print $visibility; ?>"<?php endif; ?>>
        <?php if ($site_name): ?>
 
          <h1 id="site-name"<?php if ($hide_site_name): ?> class="<?php print $visibility; ?>"<?php endif; ?>><?php print $site_name; ?></h1>
        <?php endif; ?>
        <?php if ($site_slogan): ?>
          <h2 id="site-slogan"><?php print $site_slogan; ?></h2>
        <?php endif; ?>
      </hgroup>
    <?php endif; ?>
10.04.2012 13:59
Аватар пользователя Дмитрий
Дмитрий написал:

Сижу над этим кодом с вечера, уже стал путаться в словах:) Хотел написать "правильно ли я понимаю..."

10.04.2012 14:06
Аватар пользователя Дмитрий
Дмитрий написал:

Попробую так код вставить. Осваиваю редактор:)

 <?php if ($linked_site_logo): ?>
      <div id="logo"><?php print $linked_site_logo; ?></div>
    <?php endif; ?>
 
 
 
    <?php if ($site_name || $site_slogan): ?>
      <hgroup<?php if (!$site_slogan && $hide_site_name): ?> class="<?php print $visibility; ?>"<?php endif; ?>>
        <?php if ($site_name): ?>
 
 
 
          <h1 id="site-name"<?php if ($hide_site_name): ?> class="<?php print $visibility; ?>"<?php endif; ?>><?php print $site_name; ?></h1>
        <?php endif; ?>
        <?php if ($site_slogan): ?>
          <h2 id="site-slogan"><?php print $site_slogan; ?></h2>
        <?php endif; ?>
      </hgroup>
    <?php endif; ?>
10.04.2012 14:25
Аватар пользователя Дмитрий
Дмитрий написал:

Извините за неудачные попытки. Формулирую вопрос заново и целиком.

Что нужно переписать в page.tpl.php, чтобы название и слоган сайта выводились только на первой странице? Сейчас они выводятся на всех страницах.

Тема на основе adaptivetheme.

Правильно ли я понимаю, что править нужно что-то вот в этом куске кода:

 <?php if ($linked_site_logo): ?>
      <div id="logo"><?php print $linked_site_logo; ?></div>
    <?php endif; ?>
 
    <?php if ($site_name || $site_slogan): ?>
      <hgroup<?php if (!$site_slogan && $hide_site_name): ?> class="<?php print $visibility; ?>"<?php endif; ?>>
        <?php if ($site_name): ?>
 
          <h1 id="site-name"<?php if ($hide_site_name): ?> class="<?php print $visibility; ?>"<?php endif; ?>><?php print $site_name; ?></h1>
        <?php endif; ?>
        <?php if ($site_slogan): ?>
          <h2 id="site-slogan"><?php print $site_slogan; ?></h2>
        <?php endif; ?>
      </hgroup>
    <?php endif; ?>
10.04.2012 14:32
Аватар пользователя pantey
pantey написал:

обзови page.tpl.php в page-front.tpl.php (если у тебя drupal 6), пропиши в макете html кодом всё что тебе нужно вывести...а page.tpl.php оставь для других страниц! и будет тебе счатье!

10.04.2012 17:50
Аватар пользователя Дмитрий
Дмитрий написал:

У меня drupal 7. Куда в этом случае прописать?

То есть мы берём тот же код, который и есть сейчас, но переносим его в документ, который описывает только главную страницу, так?

Чувствую, счастье близко, но пока что не видно его.

10.04.2012 21:09
Аватар пользователя Дмитрий
Дмитрий написал:

Да, всё верно. Большое спасибо, добрый человек! Счастье - вот оно.

11.04.2012 12:42
Аватар пользователя mixartemev
mixartemev написал:

у меня 7.12, есть страница mysite.ru/news, не могу подобрать для нее название шаблона, пробовал и page--news.tpl и page-news.tpl.
если не назначать странице альтернативный адрес, шаблон page--node--32.tpl работает без проблем. Но как вывести шаблон для страницы с альтернативным адресом?

21.05.2012 12:48
Аватар пользователя Spleshka
Spleshka написал:

page--news.tpl.php должен цепляться. Просто после его создания сбросьте кэш.

22.05.2012 10:42
Аватар пользователя Zubat
Zubat написал:

Извиняюсь за вообще нубский вопрос,осваиваю с нуля,не понимаю следующее)
Создал свой шаблон. Сейчас хочу с нуля довести его до ума. Создал файл инфо с описаниями.
Такой вопрос,вот в этом коде
if (!empty($title)):

print $title;

endif;
Откуда drupal берет значение переменной $title ? И как его поменять на свое)

09.08.2012 16:18
Аватар пользователя Zubat
Zubat написал:

Извиняюсь за вообще нубский вопрос,осваиваю с нуля,не понимаю следующее)
Создал свой шаблон. Сейчас хочу с нуля довести его до ума. Создал файл инфо с описаниями.
Такой вопрос,вот в этом коде
if (!empty($title)):

print $title;

endif;
Откуда drupal берет значение переменной $title ? И как его поменять на свое)

09.08.2012 17:11
Аватар пользователя Eugen
Eugen написал:

Спа-си-бо! Пребольшое! То, что не хватало, чтобы все понять и найти.

14.12.2012 16:48

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