Existe-t-il un moyen de remplacer la sortie d'une page d'un module contribué et d'émettre votre propre html.tpl.php, en prenant effectivement le contrôle de la sortie du thème?
Je veux le faire dans le but de créer une expérience de connexion / d'enregistrement unique, mais ne semble que remplacer le modèle de niveau de page, pas le modèle de niveau html. Je vois que le module d'impression fait cela, mais est-ce la façon de l'aborder?
hook_menu_alter()
pour changer ledelivery callback
chemin d'accès utilisateur / connexion à votre propre version dedrupal_deliver_html_page()
. Cela devrait vous donner un contrôle absolu sur ce qui est rendu à l'écran, même si cela signifie que vous devez définir vous-même les en-têtes appropriésajax_deliver()
fonction, qui obtient la même$page_callback_result
quedrupal_html_deliver_page()
mais les processus différemment. Je ne sais pas si vous pouvez interrompre le processus de manière significative avant que le moteur de thème ne s'impliqueusing_views_api_mode
est désactivé.Réponses:
Selon cette réponse , vous pouvez simplement imprimer le contenu de la page dans le rappel de la page de menu plutôt que de le renvoyer.
Je suppose que le module d' impression a implémenté la page imprimable de cette façon. Voici l'extrait de code du module.
Selon cela, le module utilise le modèle HTML personnalisé
print.tpl.php
. Il s'agit d'un modèle de niveau HTML. Le module récupère ensuite le code HTML en appelanttheme('print',...)
et le restitue directement au navigateur à l'aideprint $html;
.Voici une idée générale pour votre objectif: mymodule.module
Modèle: mylogin.tpl.php
J'espère que cela personnalisera votre page de connexion selon vos besoins.
la source
Les deux @Sithu et @Ayesh K ont fourni de grandes réponses. Dans cet exemple, je combinerai la méthode de @ Ayesh et des parties du code de @ Sithu pour une solution complète.
Les fonctions hooks_menu ou hook_menu_alter fournissent toutes deux un
delivery callback
, qui indique à Drupal comment vous voulez que votre code soit encapsulé . Par défaut, Drupal metdelivery callback
à drupal_deliver_html_page () , qui dit à peu près Drupal pour envelopper votre pagehtml.tpl.php
etpage.tpl.php
.Pour modifier la façon dont Drupal enveloppe votre page, copiez la fonction
drupal_deliver_html_page()
dans votre module et modifiez-la. Appelez ensuite votre nouvelle fonction dansdelivery callback
. Drupal utilisera alors cette fonction pour envelopper votre page.Exemple
Voici un module de travail. Placez le code suivant dans votre
/sites/all/modules/MYMODULE
répertoire et activez le module.Facultativement, pour remplacer un chemin existant, remplacez
hook_menu
parhook_menu_alter
.MYMODULE.module
MYMODULE.info
MYMODULE.tpl.php
MYMODULE.css
la source
Je pense que vous devez investir un peu de temps pour trouver le crochet le plus approprié pour cela. Tu peux essayer
hook_page_alter pour changer "ce qui va être rendu",
utilisez hook_menu_alter pour modifier le rappel de livraison pour les routeurs de menu de connexion et d'enregistrement,
utiliser un fichier page - user-login.tpl.php pour reprendre le modèle de page de la page de connexion,
ajoutez quelques suggestions de modèles dans template.php pour utiliser un fichier html.tpl.php différent juste pour les chemins de connexion,
ou enfin, hook_theme_regitry_alter , pour modifier le registre des thèmes et faire ce que vous vouliez faire (le changement html.tpl.php)
la source
hook_theme_registry_alter()
pourrait ne pas fonctionner car cela changera très probablement le modèle pour toutes les pages, maisdelivery callback
cela fonctionnera certainement. J'ai également exploré cette méthode dans ma réponse, ici.