¿Hay alguna forma de anular el resultado de una página desde un módulo contribuido y emitir su propio html.tpl.php, tomando efectivamente el control del resultado del tema?
Quiero hacer esto en un esfuerzo por crear una experiencia única de inicio de sesión / registro, pero parece que solo puede anular la plantilla de nivel de página, no la plantilla de nivel html. Veo que el módulo de impresión hace esto, pero ¿es esa la forma de abordarlo?
hook_menu_alter()
para cambiar ladelivery callback
ruta del usuario / inicio de sesión a su propia versión dedrupal_deliver_html_page()
. Eso debería darle un control absoluto sobre lo que se muestra en la pantalla, aunque significará configurar los encabezados apropiados usted mismoajax_deliver()
función, que recibe el mismo$page_callback_result
comodrupal_html_deliver_page()
pero los procesos de manera diferente. No estoy seguro de si puede interrumpir el proceso más adelante de manera significativa antes de que el motor del tema se involucreusing_views_api_mode
está APAGADO.Respuestas:
Según esta respuesta , puede simplemente imprimir el contenido de la página en la devolución de llamada de la página del menú en lugar de devolverlo.
Supongo que el módulo Imprimir implementó la página para imprimir de esta manera. El siguiente es el fragmento de código del módulo.
De acuerdo con esto, el módulo utiliza la plantilla HTML personalizada
print.tpl.php
. Es una plantilla de nivel HTML. Luego, el módulo obtiene el HTML mediante una llamadatheme('print',...)
y lo procesa directamente en el navegador medianteprint $html;
.Aquí hay una idea general para su propósito: mymodule.module
Plantilla: mylogin.tpl.php
Espero que esto personalice su página de inicio de sesión según lo necesite.
fuente
Tanto @Sithu como @Ayesh K han proporcionado excelentes respuestas. En este ejemplo, combinaré el método de @ Ayesh y partes del código de @ Sithu para obtener una solución completa.
Las funciones hooks_menu o hook_menu_alter proporcionan una
delivery callback
, que instruye a Drupal sobre cómo desea que se envuelva su código. Por defecto, Drupal se establecedelivery callback
en drupal_deliver_html_page () , lo que le dice a Drupal que ajuste su páginahtml.tpl.php
ypage.tpl.php
.Para modificar la forma en que Drupal envuelve su página, copie la función
drupal_deliver_html_page()
en su módulo y modifíquela. Luego llame a su nueva función endelivery callback
. Drupal luego usará esa función para ajustar su página.Ejemplo
Aquí hay un módulo de trabajo. Coloque el siguiente código en su
/sites/all/modules/MYMODULE
directorio y habilite el módulo.Opcionalmente, para anular una ruta existente, sustituir
hook_menu
conhook_menu_alter
.MYMODULE.module
MYMODULE.info
MYMODULE.tpl.php
MYMODULE.css
fuente
Creo que necesitas invertir algo de tiempo para encontrar el gancho más apropiado para esto. Puedes probar
hook_page_alter para cambiar "lo que se va a representar",
use hook_menu_alter para cambiar la devolución de llamada de entrega para iniciar sesión y registrar enrutadores de menú,
use una página - archivo user-login.tpl.php para hacerse cargo de la plantilla de página de la página de inicio de sesión,
agregue algunas sugerencias de plantillas en template.php para usar un archivo html.tpl.php diferente solo para las rutas de inicio de sesión,
o finalmente, hook_theme_regitry_alter , para alterar el registro de temas y hacer lo que quería hacer (el cambio html.tpl.php)
fuente
hook_theme_registry_alter()
es posible que no funcione, ya que lo más probable es que cambie la plantilla para todas las páginas, perodelivery callback
definitivamente funcionará. También he explorado este método en mi respuesta, aquí.