Как реализовать собственный шаблон tpl.php и вызывать его с помощью функции theme()

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

Аватар пользователя rashaverak rashaverak 17 августа 2010 в 13:33

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

Сразу должен сказать, что поймут, пожалуй, только программисты drupal.

Есть некий модуль kontragent.module, реализующий работу с контрагентами (показ контрагента, добавление, изменение и пр.)
Задача: реализовать показ контрагента с помощью шаблона kontragent.tpl.php. В данном случае контрагент - это не тип материала, поэтому стандартные шаблоны типа node.tpl.php не подойдут.

Реализация по следующим пунктам:

  1. Регистрация функции темизации, которая будет использовать шаблон
  2. Создание шаблона kontragent.tpl.php
  3. Определение функции для показа контрагента kontragent_page($kon), $kon - переменная с данными контрагента

1. Ниже представлен код функции, которая регистрирует функцию темизации kontragent_view

Обратите внимание на элемент массива 'template', если его не указывать, тогда темизация перестоится на вызов функции, а в модуле придется написать функцию kontragent_kontragent_view($kon)

<?php
/**
 * Регистрация функции темизации
 * return unknown_type
 */
function kontragent_theme() {
    return array(
        
// название функции темизации
        
'kontragent_view' => array(
            
// указываем единственный аргумент с данными контрагента (укажите больше, если необходимо)
            
'arguments' => array('kontragent' => NULL), 
            
// имя файла шаблона без .tpl.php
            
'template' => 'kontragent' 
         
)
    );
}
?>

2. В каталоге нашего модуля создадим шаблон kontragent.tpl.php

Например, с таким содержанием:


<?php 
    
// эта функция распечатывает все переменные, доступные в шаблоне
    // drupal_set_message("<pre>".print_r(array_keys(get_defined_vars()), 1).'</pre>'); 
    
$kon $variables['kontragent'];
?>
<div id="kontragent-code">
    <strong>КОД</strong>:<span><?php print $kon['CODE'?></span>
        <strong>Наименование</strong>:<span><?php print $kon['DESCR'?></span>
</div>?>

3. А теперь вызовем нашу функцию темизации, передав ей в качестве параметра данные контрагента.

<?php
/**
 * Выдает страницу контрагента
 * $kon - параметр с данными контрагента
 * return string
 */
function kontragent_page($kon) {    
    
drupal_set_title($kon['DESCR']);
    return 
theme('kontragent_view'$kon );
}
?>

Мой недавно созданный личный блог http://kudesa.org

Комментарии

Аватар пользователя robo robo 17 августа 2010 в 16:24

Если модуль создает новый тип контента то drupal будет искать его как: node-kontragent.tpl.php. Т.е. для типов контента следует придерживаться именно этой схемы (node-blog.tpl.php, node-forum.tpl.php и т.п.).

Аватар пользователя mr_kuzmich mr_kuzmich 21 июля 2011 в 19:28

А разве

<?php
            
// имя файла шаблона без .tpl.php
            
'template' => 'flagman_kontragent' 
?>

и имя файла шаблона не должны совпадать?