Отделение представления от кода

Опубликовано 2012.07.04

Зачастую в Drupal 7 при написании собственных модулей необходимо отделить логику от представления. Перейдем сразу к практике и напишем простой модуль, который будет выводить три фиктивные ссылки на странице /mymodule. В CMS Drupal логика работы скриптов очень хорошо отделена от представления. Повсеместно используются .tpl.php шаблоны. Например для тех же страниц,блоков,нод и т.д. Создать свой шаблон совсем нетрудно. Если вы уже умеете писать модули-то легко освоите материал, а если нет, то можете почитать о создании модуля для Drupal тут и тут и там же скачать исходник. А также более углублённо почитать об использовании Drupal API. Я же сразу приведу пример с использованием своего шаблона. Создадим модуль tema_module. В tema_module.module пишем
  1. function tema_module_menu() {
  2. $items = array();
  3. $items['tema_module'] = array(
  4. 'title' => 'Заголовок тестовой страницы',
  5. 'page callback' => 'tema_module_info',
  6. 'access callback' => TRUE,
  7. 'type' => MENU_CALLBACK,
  8. );
  9. return $items;
  10. }
  11.  
  12. function tema_module_info() {
  13. $links = array(
  14. 'link_1' => '/node/1',
  15. 'link_2' => '/node/2',
  16. 'link_3' => '/node/3',
  17. );
  18. return theme('tema_module_menu', array('links' => $links));
  19.  
  20. }
  21.  
  22. function tema_module_theme() {
  23. return array(
  24. 'tema_module_menu' => array(
  25. 'variables' => array(
  26. 'links' => NULL),
  27. 'template' => 'tema_module',)
  28. );
  29. }
В главной калбэчной функции были задействованы функции theme() и хук hook_theme(). Функция theme($hook, $variables = array()) принимает два аргумента(название используемого хука и переменная в виде массива, значения который будут использоваться в tpl шаблоне нашего представления. В hook_theme обязательно нужно передать созданные переменные.Они будут доступны в шаблоне. Значение переменной template - это и есть имя будущего шаблона. Его мы создаем в папке модуля. В tema_module_menu.tpl.php напишем следующий код.
  1. <div id = "tema_module-menu-pager">
  2. <?php
  3. foreach ($links as $k => $v){
  4. ?>
  5. <p><a href="<?php echo $v; ?>"><?php echo $k; ?></?php></a></p>
  6. <?php
  7. }
  8. ?>
  9. </?php></?php></div>
Вот и всё.