(phptemplate) Использование разных шаблонов в зависимости от текущего пути

Аватар пользователя marazmus marazmus 20 января 2007 в 10:52

Начиная с 5 версии Друпала, движок PHPTemplate поддерживает возможность использования различных шаблонов страницы - в пределах одной темы. Этот механизм использует текущий путь страницы для определения того, какой именно шаблон следует загружать.

Механизм работает следующим образом:

К примеру, мы открываем ссылку http://www.example.com/node/1/edit . PHPTemplate будет просматривать наличие следующих шаблонов страницы (в нисходящем порядке) и загружать первый подходящий шаблон. В нашем случае движок шаблонов будет искать следующие файлы:

* page-node-edit.tpl.php
* page-node-1.tpl.php
* page-node.tpl.php
* page.tpl.php

Файл, существующий и найденный первым, и будет использован для отображения страницы http://www.example.com/node/1/edit.

Другой пример: ссылка http://www.example.com/tracker . Здесь движок шаблонов будет искать файлы

* page-tracker.tpl.php
* page.tpl.php

Примечания:
Этот способ работает только с оригинальными путями, заданными в движке Друпала. Даже если установлены модули path и pathauto, механизм шаблонов все равно будет ориентироваться на оригинальные пути (в т.ч. id ноды).

Комментарии

Аватар пользователя dyp@drupal.org dyp@drupal.org 22 января 2007 в 16:37

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

Аватар пользователя jason32 jason32 26 февраля 2007 в 13:32

а что значит - только с оригинальными путями? Путь главной если менять, то будет работать или нет? Это же вроде не Path и не Pathauto?

Аватар пользователя marazmus marazmus 10 марта 2007 в 9:58

Имеется в виду пути типа node/1

Если у тебя node/1 отзывается через path или pathauto на /statya-nomer-tri, то создание файла statya-nomer-tri.tpl.php не прокатит - phptemplate будет искать файл page-node-1.tpl.php.

Аватар пользователя cwer cwer 10 марта 2007 в 14:53

Найдено на друпал.орг
Можно записать в template.php

<?php
function _phptemplate_variables($hook$vars = array()) {
  switch (
$hook) {
    case 
'node':
      
// this example creates custom node templates, but
      // it is very similar for page templates
     
      // proceed only if the path module is enabled
      
if (!module_exists('path')) {
        break;
      }
     
      
$url_alias drupal_get_path_alias('node/' $vars['node']->nid);
   
      
// if there is no URL alias defined, stop processing
      
if ($url_alias == ('node/' $vars['node']->nid)) {
        break;
      }
     
      
// Finally, build suggestions array. More generic paths should go first,
      // more specific last.
      // The templates filenames pattern is node_<something>_<something>
      
$suggestions = array();
      
$path_parts explode('/'$url_alias);
      
$template_filename "node";
      foreach (
$path_parts as $path_part) {
        
$template_filename $template_filename '_' $path_part;
        
$suggestions[] = $template_filename;
      }
     
      
$vars['template_files'] = $suggestions;
      break;
  }
 
  return 
$vars;
}
?>

После этого для неоригинальных путей можно создавать
node_video_list.tpl.php (для http://site.ru/video/list )
Насчет page - не знаю будет ли обрабатываться Smile

Аватар пользователя kiev1 kiev1 28 апреля 2007 в 7:24

а вот как назвать файл шаблона

для такой странички http://сайт/user/1/subscriptions/taxa ,

и для такой http://сайт/user/любой_юзер/subscriptions/taxa

это уж точно сейчас неизвестно

Аватар пользователя VictorL VictorL 28 июня 2007 в 16:04

Заменил функцию _phptemplate_variables в файле template.php и все заработало для page Smile

function _phptemplate_variables($hook, $vars = array()) {
  if ($hook=='node' or $hook=='page') {
      if (!module_exists('path')) {
        break;
      }
      $url_alias = drupal_get_path_alias('node/' . $vars['node']->nid);
      if ($url_alias == ('node/' . $vars['node']->nid)) {
        break;
      }
      $suggestions = array();
      $path_parts = explode('/', $url_alias);
      $template_filename = $hook;
      foreach ($path_parts as $path_part) {
        $template_filename = $template_filename . '_' . $path_part;
        $suggestions[] = $template_filename;
      }
      $vars['template_files'] = $suggestions;
  }
  return $vars;
}
Аватар пользователя Gedler Gedler 12 сентября 2007 в 13:23

я правильно понимаю, можно сделать page-forum.tpl.php и причесать форум?
пошел пробовать...

Аватар пользователя Nerian Nerian 17 марта 2008 в 11:55

В Drupal6 изменения в API, поэтому теперь делать можно так:

[u93585@be89 ~/lockdot.ru/www/site/themes/bluemarine-test]$ cat template.php
<?php
// $Id: template.php,v 1.16 2007/10/11 09:51:29 goba Exp $

/**
 * Override or insert PHPTemplate variables into the templates.
 */

function phptemplate_preprocess_page(&$vars) {
  if (!module_exists('path')) {
        return;
  }
  $url_alias = drupal_get_path_alias('node/' . $vars['node']->nid);
  if ($url_alias == ('node/' . $vars['node']->nid)) {
        return;
  }
  $suggestions = array();
  $path_parts = explode('/', $url_alias);
  $template_filename = 'page';
  foreach ($path_parts as $path_part) {
        $template_filename = $template_filename . '_' . $path_part;
        $suggestions[] = $template_filename;
  }
  $vars['template_files'] = $suggestions;
  var_dump($suggestions);
}

а так же:

http://naukastudio.com.ua/diary/14

Аватар пользователя war_hol war_hol 12 марта 2009 в 10:43

Nerian wrote:
В Drupal6 изменения в API, поэтому теперь делать можно так:

[u93585@be89 ~/lockdot.ru/www/site/themes/bluemarine-test]$ cat template.php
<?php
// $Id: template.php,v 1.16 2007/10/11 09:51:29 goba Exp $

/**
 * Override or insert PHPTemplate variables into the templates.
 */

function phptemplate_preprocess_page(&$vars) {
  if (!module_exists('path')) {
        return;
  }
  $url_alias = drupal_get_path_alias('node/' . $vars['node']->nid);
  if ($url_alias == ('node/' . $vars['node']->nid)) {
        return;
  }
  $suggestions = array();
  $path_parts = explode('/', $url_alias);
  $template_filename = 'page';
  foreach ($path_parts as $path_part) {
        $template_filename = $template_filename . '_' . $path_part;
        $suggestions[] = $template_filename;
  }
  $vars['template_files'] = $suggestions;
  var_dump($suggestions);
}

а так же:

http://naukastudio.com.ua/diary/14


Делаю всё как указанно у Вас, все работает только сверху каждой страницы выводится код "array(2) { [0]=> string(12) "page_catalog" [1]=> string(14) "page_catalog_1" }", не подскажете в чем проблема?

Аватар пользователя kiev1 kiev1 1 июня 2008 в 17:57

я правильно понимаю, можно сделать page-forum.tpl.php и причесать форум?
нет не правильно - форум это по сути просто статья с коментариями - его причесывать очень сложно

Аватар пользователя stakh stakh 6 октября 2009 в 11:42

А не могли бы Вы, как пример, показать для меня, как нужно оформить все, если путь начинается с "rezults", а тема называется "tema-shab". Поясните что и куда добавить.

Пробовал все, что сдесь описано настроить под себя, но никак не получается.
Помогите, пожалуйста.
Заранее благодарен.

Аватар пользователя jason32 jason32 7 октября 2009 в 12:32

"stakh" wrote:
А не могли бы Вы, как пример, показать для меня, как нужно оформить все, если путь начинается с "rezults", а тема называется "tema-shab".

Не важно, как называется тема. Создаешь в ней файл page-rezults.tpl.php - в нём и будет вывод. Только надо понимать,что никакие алиасы тут не подходят, адрес реально должен быть "rezults", а не синонимом "node/[id]"