Эволюция Шаблонизации в Drupal

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

Аватар пользователя beliy_snow beliy_snow 29 августа 2007 в 13:45

В общем, из-за таймаута сессии вы не увидите красочного, полного примеров текста статьи "Эволюция Шаблонизации в Друпал". Вместо этого...

Ступень 0. Друпал до начала извращений.
page.tpl.php
node.tpl.php
block.tpl.php
comment.tpl.php

Ступень 1. Скрытые возможности.
node-nodetype.tpl.php

Ступень 2. Атака Нодов.
Стандартная возможность друпала заключается в возможности создания шаблона под конкретную ноду. Минусом этого метода является жесткое привязывание шаблона к идентификатору ноды. В какой-то документации я прямо так и читал, что друпал не поддерживает символьные шаблоны. Ну-ну... В общем в итоге мы получим папку темы с кучей файлов вида page-node-XXX.tpl.php или block-block-XXX.tpl.php для блоков.

Ступень 3. Месть хуков.
Любой уважающий себя модуль имеет в своем распоряжении мощное оружие - hook_menu(). Мы себя уважаем, поэтому достанем свой световой меч и вспорем брюхо беззащитному друпалу. Сделаем это с особой жестокостью и будет нам за это только счастье.
<?php
function viagra_menu($may_cache) {
$items = array();
if (!$may_cache) {
// посмотрим что мы загружаем, нам нужна только нода, хотя для таксономии и прочей шляпы тоже можно сделать
if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == '' && $node = node_load(arg(1))) {
// т.к. хук меню отрабатывает раньше - некоторые nodeapi не успевают запихнуть в ноду нужные нам данные...
// в нашем случае модуль path этого сделать не успел, поэтому подгрузим алиас ноды вручную
$path = "node/$node->nid";
$result = db_query("SELECT dst FROM {url_alias} WHERE src = '%s'", $path);
if (db_num_rows($result)) {
$node->path = db_result($result);
}
// добавим в меню новый элемент, который:
$items[] = array(
// будет отрабатывать алиас ноды
'path' => $node->path,
// будет устанавливать заголовок из титла ноды
'title' => t($node->title),
// будет вызывать функцию theme
'callback' => 'theme',
// с параметрами viagra и node, чтобы в итоге мы получили theme_viagra($node)
'callback arguments' => array('viagra', array($node)),
// ну тут можно было поставить user_access('access content'), ну да похер
'access' => 1,
// будет вызывать от имени друпала нужную нам функцию
'type' => MENU_CALLBACK,
);
}
}
return $items;
}

function theme_viagra($node)
{
// тут наш меч нежно входит в плоть друпала вызывая нужный нам шаблон с нужными параметрами
return _phptemplate_callback($node->path, array('node' => $node));
}
?>

Ступень 4. Рождение модуля.
Модуль позволяет добавлять к любому алиасу любой шаблон для любого типа контента.

Ступень 5. Как это будет
Вообще, те, кто знаком с модулем Views, в принципе понимают, что для отображения нужного контента не обязательно создавать ноду, прикручивать к ней алиас, чтобы потом прикрутить шаблон. Все гораздо проще, но я пока это не реализовал, т.к. не было никакой необходимости. Просто опишу это как направление дальнейшего движения, если кому-то это нужно будет.
Те, кто посмотрел модуль уже наверное поняли о чем речь. В ту же самую таблицу мы засовываем алиас и тимплейт, идентификатор ноды нам не нужен, как и сама нода. Это, так называемые, виртуальные страницы. Вся админка построена на виртуальных страницах. Их нет, пока вы на них не зайдете. Вся разница в том, что они жестко закреплены в коде модулей в хуке меню и в 90% случаев являются результатом вызова функции drupal_get_form() с параметрами специфичными для каждого модуля.
Нет такого механизма в друпале, который бы имел интерфейс задания соответствия алиаса, вызываемой функции и параметров этой функции. В примере выше и в модуле - был задан интерфейс соответствия алиаса, функции "theme" и параметров этой функции. Теперь вы сами можете решать как его использовать. Будет ли это функция theme, drupal_get_form, print, ещё что-нибудь.

ВложениеРазмер
Иконка пакета ps_page_template.zip2.37 КБ

Комментарии

Аватар пользователя Valeratal Valeratal 29 августа 2007 в 14:12

в чем проблема залить модуль на любой бесплатный сервис - рапидшара и тд

А вообще я ничего не понял, в шаге 2 и 3 (особенно в третьем, в хуке)

Аватар пользователя beliy_snow beliy_snow 29 августа 2007 в 18:36

спасибо, пойду добавлю файлы

UPD:
Выбранный файл ps_page_template.install не может быть прикреплен к материалу, поскольку прикреплять можно только файлы с расширениями: xcf svg jpg jpeg gif tiff png mng txt sxw sxc tex ps pdf djvu odt ods odp tgz tar.gz bz2 tar.bz2 tbz2 zip rar psd po pot info xpi.

Аватар пользователя sas@drupal.org sas@drupal.org 29 августа 2007 в 18:58

Ну прав тот у кого больше прав - как у PVasili :), поэтому у него и ...
А если по "чесноку", если приоритет "поделиться" то можно и в zip, а если другой - то "принципиально ... "

Аватар пользователя Rysja Rysja 5 сентября 2007 в 13:57

Здарова парни вот установил движок друпал5.2 все пашет только русифицировать его как подскажите?И еще есть по друпалу инструкция для работы с ним? Заранее благодарен

Аватар пользователя Алешка Алешка (не проверено) 17 сентября 2007 в 17:31

Приятно читать слова "доделайте сами". Мозги шевелит. Однако имеет смысл все-же до конца доделывать (или я не прав?)!. Все тут кричат (именно - кричат!) об универсальности и законченности Drupal. Но пока не видел от вас ни одного поста с собственным универсальным и закончнным модулем, переводом и маленькой инструкцией "по применению".
Жалко тех "Rysja", которые стучатся головой об "знания", а усатые мужики пивом отмахиваются.
Я не приветствую Оффтоп от Rysja.
Я извиняюсь за свой Оффтоп.

Аватар пользователя Алешка Алешка (не проверено) 19 сентября 2007 в 9:52

Соображения хватило. Видел. Знаю. Сам предпочитаю сперва найти, потом спросить.... Просто себя в детстве вспомнил.... Русю решил не калечить своими нападками, а защитить.... Хотя как это получилось - вам судить.
Спасибо, что не обиделись. Smile