Ich habe einige Inhaltstypen, die ich auf unterschiedliche Weise vorverarbeiten muss. Also template.php
in meinem Theme foo
sieht das aktuell so aus:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Ich möchte in der Lage sein, eine Drupal-spezifische Vorverarbeitungsfunktion anzugeben, die sich auf den Computernamen des Inhaltstyps bezieht. Ich habe versucht mit, foo_preprocess_news
aber es wird nie aufgerufen.
Gibt es einen besseren Weg?
foo_preprocess_node
indem ich es wiecall_user_func('_preprocess_' . $vars['type'], $vars);
folgt implementiere , um das Wiederholen der ifs zu vermeiden, aber es ist wahrscheinlich am besten, einfach zu bleiben.hook_preprocess_node()
ein benutzerdefiniertes Modul implementiert und gehofft, dass dies den Aufruf des Hooks einschränken würde, aber nicht. Wie kann man einschränken, wann der Hook nach Inhaltstyp aufgerufen wird?if ($vars['node']->type == 'foo') { ...
erzielen den gewünschten Effekthook_block_view_MODULE_DELTA_alter()
. Ich mache momentan, was du sagst, aber ich wünschte, es gäbe eine Möglichkeit zu beschränken, wann der Haken getroffen wird.Das Zen-Subthema erreicht dies, indem es dies zu seiner theme_preprocess_node-Funktion hinzufügt:
Wenn Sie einen Inhaltstyp namens 'news' haben, können Sie in Ihrer template.php-Datei eine Funktion namens foo_preprocess_node_news erstellen.
quelle
Ich hatte gerade ein ähnliches Problem , weshalb mich Google auf diese Seite brachte: Meine Node Preprocess-Funktion wuchs so enorm, dass ich die Funktion lieber in mehrere Dateien aufteilen würde.
Ich habe in meiner template.php-Datei bereits einen ähnlichen Ansatz verfolgt, der alle Änderungsfunktionen enthält, und da die gleiche Methode hier einwandfrei funktioniert, dachte ich, ich würde meinen Ansatz teilen:
Dateieinrichtung im Ordner
MYTHEME/preprocess
:Sie sollten bereits
node.preprocess.inc
die anderen haben , die Sie selbst erstellen können. Wie Sie sie wirklich nennen, ist eher willkürlich, aber geben Sie ihnen besser Namen, die sie gut identifizieren und zum gesamten Drupal-Benennungssystem passen.weiter zum Inhalt dieser Dateien!
Wir wechseln grundsätzlich durch den Typ des aktuellen Knotens. was du durchschaltest, liegt bei dir;
#id
,#view_mode
Alle abhängig, auf Ihre genauen Bedürfnisse.Sobald eine Übereinstimmung vorliegt, wird die angegebene Datei geladen und auf ihren Inhalt angewendet, als ob sie direkt in diese Funktion geschrieben worden wäre.
Der Inhalt dieser
included
Dateien sieht genauso aus, wie Sie ihn in dienode.preprocess.inc
Datei eingefügt haben, außer dass die Vorverarbeitungsfunktion nicht erneut aufgerufen wird:Sie können dies im Grunde mit so vielen Dateien tun, wie Sie möchten, und sogar mehrere Switches
#view_mode
hintereinanderfull
schalten, zteaser
Ich hoffe, das hilft, sollte jemand jemals wieder über diese Frage stolpern (:
quelle
call_user_func()
Übergibt keine Parameter als Referenz. Im Falle$variables
Ihrerpreprocess_foo()
Funktionen können Sie also nur Kopien des ursprünglichen Arrays bearbeiten. Änderungen an Nicht-Objekten werden während des verbleibenden Rendervorgangs nicht übernommen.quelle
Implementieren Sie in Ihrem main hook_preprocess_node den folgenden Code am Ende
Sie müssten also jetzt nach Knotentyp vorverarbeiten
quelle