Есть ли способ переопределить вывод страницы из добавленного модуля и создать собственный html.tpl.php, эффективно контролируя вывод из темы?
Я хочу сделать это в попытке создать уникальный опыт входа / регистрации, но может показаться, что он переопределяет только шаблон уровня страницы, а не шаблон уровня html. Я вижу, что модуль печати делает это, но так ли это?
hook_menu_alter()
чтобы изменитьdelivery callback
путь для пользователя / входа в систему к вашей собственной версииdrupal_deliver_html_page()
. Это должно дать вам полный контроль над тем, что визуализируется на экране, хотя это будет означать , устанавливая соответствующие заголовки самиajax_deliver()
функция, которая получает такой же ,$page_callback_result
как ,drupal_html_deliver_page()
но процессы по- другому. Я не уверен, что вы сможете еще более существенно прервать процесс до того, как включится движок темusing_views_api_mode
выключено.Ответы:
Согласно этому ответу , вы можете просто напечатать содержимое страницы в обратном вызове страницы меню, а не возвращать его.
Я предполагаю, что модуль Print реализовал страницу для печати таким образом. Ниже приведен фрагмент кода из модуля.
В соответствии с этим модуль использует пользовательский шаблон HTML
print.tpl.php
. Это шаблон уровня HTML. Затем модуль получает HTML-код, вызывая его,theme('print',...)
и отображает его непосредственно в браузере с помощьюprint $html;
.Вот общая идея для вашей цели: mymodule.module
Шаблон: mylogin.tpl.php
Я надеюсь, что это настроит вашу страницу входа в систему, как вам нужно.
источник
И @Sithu, и @Ayesh K дали отличные ответы. В этом примере я объединю метод @ Ayesh и части кода @ Sithu для полного решения.
Функции hooks_menu или hook_menu_alter предоставляют функции
delivery callback
, которые инструктируют Drupal о том, как вы хотите, чтобы ваш код был упакован. По умолчанию Drupal устанавливаетdelivery callback
значение drupal_deliver_html_page () , что примерно говорит Drupal обернуть вашу страницу вhtml.tpl.php
иpage.tpl.php
.Чтобы изменить способ, которым Drupal оборачивает вашу страницу, скопируйте функцию
drupal_deliver_html_page()
в свой модуль и измените ее. Затем вызовите вашу новую функцию вdelivery callback
. Drupal будет использовать эту функцию для переноса вашей страницы.пример
Вот рабочий модуль. Поместите следующий код в свой
/sites/all/modules/MYMODULE
каталог и включите модуль.Необязательно, чтобы переопределить существующий путь, заменитель
hook_menu
сhook_menu_alter
.MYMODULE.module
MYMODULE.info
MYMODULE.tpl.php
MYMODULE.css
источник
Я думаю, вам нужно потратить некоторое время на поиск наиболее подходящего крючка для этого. Ты можешь попробовать
hook_page_alter для изменения «что будет отображено»,
используйте hook_menu_alter для изменения обратного вызова доставки для входа в систему и регистрации меню маршрутизаторов,
используйте страницу - файл user-login.tpl.php, чтобы взять шаблон страницы на странице входа,
добавьте несколько предложений шаблонов в template.php, чтобы использовать другой файл html.tpl.php только для путей входа в систему,
или, наконец, hook_theme_regitry_alter , чтобы изменить реестр тем и сделать то, что вы хотели сделать (изменение html.tpl.php)
источник
hook_theme_registry_alter()
может не сработать, так как это, скорее всего, изменит шаблон для всех страниц, ноdelivery callback
определенно сработает. Я дополнительно исследовал этот метод в своем ответе здесь.