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
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
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!
node.preprocess.inc
, hier mache ich so etwas:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
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 die node.preprocess.inc
Datei eingefügt haben, außer dass die Vorverarbeitungsfunktion nicht erneut aufgerufen wird:
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
Sie können dies im Grunde mit so vielen Dateien tun, wie Sie möchten, und sogar mehrere Switches #view_mode
hintereinander full
schalten, zteaser
Ich hoffe, das hilft, sollte jemand jemals wieder über diese Frage stolpern (:
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.