Existe uma maneira de substituir a saída de uma página de um módulo contribuído e emitir seu próprio html.tpl.php, efetivamente assumindo o controle da saída do tema?
Quero fazer isso com esforço para criar uma experiência única de logon / registro, mas apenas parece substituir o modelo no nível da página, não no modelo no nível html. Vejo que o módulo de impressão faz isso, mas é essa a maneira de abordá-lo?
hook_menu_alter()
para alterar odelivery callback
caminho do usuário / login para sua própria versão dodrupal_deliver_html_page()
. Isso deve lhe dar controle absoluto sobre o que é renderizado na tela, embora signifique definir os cabeçalhos apropriadosajax_deliver()
função, que fica igual$page_callback_result
,drupal_html_deliver_page()
mas a processa de maneira diferente. Não tenho certeza se você pode interromper o processo de maneira significativa antes que o mecanismo do tema seja envolvidousing_views_api_mode
estiver desativado.Respostas:
De acordo com esta resposta , você pode simplesmente imprimir o conteúdo da página no retorno de chamada da página de menu, em vez de retorná-lo.
Acho que o módulo Imprimir implementou a página de impressão dessa maneira. A seguir está o trecho de código do módulo.
De acordo com isso, o módulo usa o modelo HTML personalizado
print.tpl.php
. É um modelo no nível HTML. O módulo obtém o HTML chamandotheme('print',...)
e o renderiza diretamente no navegador usandoprint $html;
.Aqui está uma ideia geral para seu objetivo: mymodule.module
Predefinição: mylogin.tpl.php
Espero que isso personalize sua página de login conforme necessário.
fonte
Tanto o @Sithu quanto o @Ayesh K forneceram ótimas respostas. Neste exemplo, combinarei o método do @ Ayesh e partes do código do @ Sithu para obter uma solução completa.
As funções hooks_menu ou hook_menu_alter fornecem a
delivery callback
, que instrui o Drupal sobre como você deseja que seu código seja agrupado . Por padrão, o Drupal definedelivery callback
como drupal_deliver_html_page () , que aproximadamente informa ao Drupal para agrupar sua páginahtml.tpl.php
epage.tpl.php
.Para modificar a maneira como o Drupal agrupa sua página, copie a função
drupal_deliver_html_page()
no seu módulo e modifique-a. Em seguida, chame sua nova funçãodelivery callback
. O Drupal usará essa função para quebrar sua página.Exemplo
Aqui está um módulo de trabalho. Coloque o seguinte código em seu
/sites/all/modules/MYMODULE
diretório e ative o módulo.Opcionalmente, para substituir um caminho existente, substitua
hook_menu
porhook_menu_alter
.MYMODULE.module
MYMODULE.info
MYMODULE.tpl.php
MYMODULE.css
fonte
Eu acho que você precisa investir algum tempo para encontrar o gancho mais apropriado para isso. Podes tentar
hook_page_alter para alterar "o que será processado",
use hook_menu_alter para alterar o retorno de chamada de entrega para fazer login e registrar roteadores de menu,
use uma página - arquivo user-login.tpl.php para assumir o modelo de página da página de login,
adicione algumas sugestões de modelos em template.php para usar um arquivo html.tpl.php diferente apenas para os caminhos de login,
ou, finalmente, hook_theme_regitry_alter , para alterar o registro do tema e fazer o que você queria fazer (a alteração html.tpl.php)
fonte
hook_theme_registry_alter()
pode não funcionar, pois provavelmente mudará o modelo para todas as páginas, masdelivery callback
definitivamente funcionará. Além disso, eu explorei esse método na minha resposta aqui.