Темизация вывода модуля [Решено]

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

Аватар пользователя bob bob 2 октября 2011 в 18:26

Помогите разобраться.

Пишу свой первый модуль. Модуль выполняет выбор информации из БД, форматирует ее и отображает на странице.
Реализовал hook_menu в котором указал функцию, которая делает выборку данных из БД и возвращает ее в виде массива. Добавлять разметку к полученным данным прямо в этой функции - моветон.

Что нужно для того чтобы отформатировать эти данные и выдать их на страницу так, чтобы эти данные можно было переформатировать в шаблоне кастомной темы?
Что нужно реализовать, какие хуки?

Комментарии

Аватар пользователя Wscript Wscript 3 октября 2011 в 9:33

Краткое изложение принципа темизации при написании модуля.
1. У нас есть выходные данные которые ты выводишь на экран путем return $result в конце некоторой функции.

Пишем вместо этого
return theme('page_template', $result, $result_count);

где page_template - название массива с переменными которые нужно темезировать
(название придумывем сами по смыслу для модуля или функции которая будет выводить)
$result - массив с выходными данными или переменная, не суть
$result_count - дополнительные данные или массив для вывода

к слову кол-во переменный которые мы можем отправить в шаблон неограниченно,
их указываем через запятую. Также в одном модуле может быть несоклько функций темизации theme()
главное необходим по разному называть (page_template) в нашем случае.

2. Создаем функцию которая будет непосредственно определять в какой файл нужно затемизировать и где он может храниться

 function catalog_theme () { // советую более подробно ознакомисться с данной функцией в api

      return array(
        'page_template' => array( // название шаблона , который мы написали выше

         // еще раз перечисляем список переменных которые нужно отправить на темизацию, указав им новые названия при необходимости
         // переменные назваем в том же порядке в котором мы их перечисляли в theme() ЭТО ОЧЕНЬ ВАЖНО
          'arguments' => array('arResult' => null, 'count' => null),
         
         /*
         / к примеру  
         / arResult это $result
         / coun это $result_count      
         */

         /* название файла шаблона куда будут передваться переменные,
         /  по умочанию будет присвоен адрес где храниться сам модуль,
         /  при необходимости можно задать свой путь опять же читай api hook_theme ()
         /  В нашем случае файл будет находиться в тойже папке что и модуль page_templ.tpl.php (Расширение друпал подставит сам!!!)*/

         */

          'template' => 'page_templ',
        ),

        // другой шаблон вывода переменных (для примера, когда необходимо темизировать разные выводы)
        'page_template_block' => array(
          'arguments' => array('arResult' => null, 'category' => null, 'result_count' => null),
          'template' => 'block',
        ),
      );
    }

3. Ну вот и добрались к самому файлу page_templ.tpl.php

Пример вывода

 
 <div><?=$arResult?></div> <!-- Если $arResult был массивом , он и будет передан в шаблон в качестве массива -->
 <div><?=$count?></div>

4. Вот и все, ничего сложного нет.

Надеюсь это поможет тебе

Аватар пользователя bob bob 7 октября 2011 в 11:00

Не зря, не зря! Просто я не заходил в эту тему несколько дней. Спасибо большущее! Сам бы я не скоро разобрался.

Аватар пользователя Wscript Wscript 7 октября 2011 в 16:36

Постораюсь к конференции написать цикл статей по созданию своего модуля, каталога продукции + принцип интеграции с 1с

Аватар пользователя bob bob 10 октября 2011 в 14:51

У меня теперь другой вопрос возник. Если можно подскажите как правильно действовать
Я сделал вывод в темплейт модуля, но теперь не могу сообразить как перехватить его в теме и оформить в соответствии с темой. Точнее, у моего модуля темплейт mymodule.tpl.php в него вывожу

<div class='synopsis'>
    <?php
       foreach ($articles as $key)
       {
           print "<h3>" . l($key['title'], 'node/' . $key['nid']) . "</h3>";
        }?>
</div>

Мне не хочется, чтоб и в теме выводился заголовок h3. Попробовал в папку темы положить mymodule.tpl.php и заменить в нем тег заголовка на h5, но из этого ни чего не вышло. Переименовал mymodule.tpl.php в node-mymodule.tpl.php, ни какого эфекта. Обнулил кэш, заголовки по прежнему h3.
Что я делаю не так?

Аватар пользователя Wscript Wscript 10 октября 2011 в 18:47

1. По поводу того кудать записывать файлы шаблона я писал
/ при необходимости можно задать свой путь опять же читай api hook_theme ()

2. Замените в своем шаблоне h3 на h5 в чем проблема?

3. Не совсем понимаю

но теперь не могу сообразить как перехватить его в теме и оформить в соответствии с темой.

Пропишите стили в файле шаблона модуля. В чем проблема.

Аватар пользователя bob bob 10 октября 2011 в 23:37

"Wscript" wrote:
2. Замените в своем шаблоне h3 на h5 в чем проблема?
Пропишите стили в файле шаблона модуля. В чем проблема.

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