Gibt es eine Möglichkeit, die Ausgabe einer Seite aus einem bereitgestellten Modul zu überschreiben und Ihre eigene html.tpl.php auszugeben, um effektiv die Kontrolle über die Ausgabe des Themas zu übernehmen?
Ich möchte dies tun, um eine einzigartige Anmelde- / Registrierungserfahrung zu schaffen, kann aber nur die Vorlage auf Seitenebene überschreiben, nicht die Vorlage auf HTML-Ebene. Ich sehe, dass das Druckmodul dies tut, aber ist das der Weg, sich dem anzunähern?
hook_menu_alter()
, um dendelivery callback
Pfad für den Benutzer / Login in Ihre eigene Version von zu änderndrupal_deliver_html_page()
. Das sollte Ihnen die absolute Kontrolle darüber geben, was auf dem Bildschirm gerendert wird, obwohl dies bedeutet, dass Sie selbst die entsprechenden Überschriften festlegenajax_deliver()
Funktion, die gleich wird$page_callback_result
,drupal_html_deliver_page()
aber anders verarbeitet wird. Ich bin mir nicht sicher, ob Sie den Prozess weiter unten auf sinnvolle Weise unterbrechen können, bevor die Theme-Engine aktiviert wirdusing_views_api_mode
ist.Antworten:
Entsprechend dieser Antwort können Sie den Seiteninhalt einfach im Menüseitenrückruf drucken, anstatt ihn zurückzugeben.
Ich denke , das Druckmodul die druckerfreundliche Seite auf diese Weise umgesetzt. Das Folgende ist das Code-Snippet aus dem Modul.
Demnach verwendet das Modul die benutzerdefinierte HTML-Vorlage
print.tpl.php
. Es ist eine Vorlage auf HTML-Ebene. Das Modul ruft dann den HTML-Code ab, indem es ihn aufrufttheme('print',...)
und direkt im Browser mit rendertprint $html;
.Hier ist eine allgemeine Idee für Ihren Zweck: mymodule.module
Vorlage: mylogin.tpl.php
Ich hoffe, dies wird Ihre Anmeldeseite nach Bedarf anpassen.
quelle
Sowohl @Sithu als auch @Ayesh K haben großartige Antworten geliefert. In diesem Beispiel werde ich die Methode von @ Ayesh und Teile des Codes von @ Sithu für eine vollständige Lösung kombinieren.
Die Funktionen hooks_menu oder hook_menu_alter bieten beide eine
delivery callback
, die Drupal anweist, wie Ihr Code verpackt werden soll. Standardmäßig setzt Drupaldelivery callback
auf drupal_deliver_html_page () , wodurch Drupal grob angewiesen wird , Ihre Seite inhtml.tpl.php
und einzuschließenpage.tpl.php
.Um die Art und Weise zu ändern, wie Drupal Ihre Seite umschließt, kopieren Sie die Funktion
drupal_deliver_html_page()
in Ihr Modul und ändern Sie sie. Rufen Sie dann Ihre neue Funktion in aufdelivery callback
. Drupal verwendet diese Funktion dann, um Ihre Seite zu verpacken.Beispiel
Hier ist ein Arbeitsmodul. Fügen Sie den folgenden Code in Ihr
/sites/all/modules/MYMODULE
Verzeichnis ein und aktivieren Sie das Modul.Um einen vorhandenen Pfad zu überschreiben, ersetzen Sie ihn optional
hook_menu
durchhook_menu_alter
.MYMODULE.module
MYMODULE.info
MYMODULE.tpl.php
MYMODULE.css
quelle
Ich denke, Sie müssen einige Zeit investieren, um den am besten geeigneten Haken dafür zu finden. Du kannst es versuchen
hook_page_alter, um zu ändern, "was gerendert werden soll",
Verwenden Sie hook_menu_alter , um den Übermittlungsrückruf für Anmelde- und Registrierungsmenürouter zu ändern.
Verwenden Sie eine Seite - user-login.tpl.php , um die Seitenvorlage der Anmeldeseite zu übernehmen.
Fügen Sie einige Vorlagenvorschläge in template.php hinzu, um eine andere html.tpl.php-Datei nur für die Anmeldepfade zu verwenden.
oder schließlich hook_theme_regitry_alter , um die Theme-Registrierung zu ändern und das zu tun, was Sie tun wollten (die Änderung html.tpl.php)
quelle
hook_theme_registry_alter()
funktioniert möglicherweise nicht, da es höchstwahrscheinlich die Vorlage für alle Seiten ändert, aberdelivery callback
definitiv funktioniert. Ich habe diese Methode in meiner Antwort hier zusätzlich untersucht.