Drupal. Вывод страницы минуя стандартные шаблоны темы оформления.

DrupalDrupal 6Темизация

Задача: в Drupal 6 есть модуль, для которого надо написать обработчик меню, выводящий контент таким образом, что загружены все системные CSS и JS, но при этом от между тэгами и находится только контент хандлера меню.

Данная задача нужна, например когда необходимо вывести определенный контент без  оформления в iframe или в отдельном окне, но при этом сохранить полную работоспобность Javascript.

Решение оказалось на поверхности.(далее код для drupal 6)

Пусть модуль называется mymod. 

Возьмем стандартный page.tpl.php из phpengine от Drupal. Положим в папку модуля под именем empty.page.tpl.php. И приведем к следующему виду:

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
http://www.w3.org/1999/xhtml" lang="<?php print $language->language ?>" xml:lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">


<?php print $head_title ?>
<?php print $head ?>
<?php print $styles ?>
<?php print $scripts ?>





<?php print $content; ?>
<?php print $closure ?>

Фактически мы оставили в теле документа только вывод переменных $content и $closure.

А дальше, если взглянуть, как Drupal выводит страницу, минуя шаблонизатор, можно понять, что он делает это через template_preprocess(),   template_preprocess_page() и theme_render_template() - основной минимум для вывода страницы. Нам остается задействовав функцию theme_render_template() сделать все то же, что делает Drupal и завершить выполнение скрипта.

Вот примерный код такого хандлера меню:

function mymodule_menuhandler() {
  drupal_set_title('Заголовок');
  $out = 'Какой-то контент, который выводится модулем';
  // тут начинается наше колдунство :)
  init_theme();
  $vars = array('content' => $out);
  template_preprocess($vars, 'page');
  template_preprocess_page($vars);
  $out = theme_render_template(drupal_get_path('module', 'mymodule') . '/empty.page.tpl.php', $vars);
  print $out;
  // завершаем скрипт
  exit();
}

Проблема решена. Плюс такого решения - не надо перекрывать такого рода ситуации в основной теме оформления. Для некоторых административных элементов сайта это может быть просто необходимо(не менять же тему оформления ради 10 страниц модуля, для которых задача требует быть такими в обязательном порядке? :) ).

Tweet Widget Facebook Like