2017-05-03 4 views
1

ich Erfolg mit Vorprozess Seite Haken wie gehabt haben:Vorprozess Haken an bestimmten Knotentyp in Drupal 8

function mytheme_preprocess_page__node_front(&$variables) { 
    ... 
} 

und

function mytheme_preprocess_page__node_12(&$variables) { 
    ... 
} 

, die mit benutzerdefinierten Vorlagen namens Seite korrelieren - Front .html.twig bzw. page - 12.html.twig.

Ich versuche, das gleiche Hook und Template Pairing für einen Inhaltstyp namens Video zu implementieren. Ich verstehe, dass es einen Unterschied darin gibt, dass meine Beispiele benutzerdefinierte Vorlagen für bestimmte Seiten sind, während mein Ziel eine benutzerdefinierte Vorlage für einen gesamten Inhaltstyp ist, aber ich habe eine benutzerdefinierte Vorlage namens node - video.html.twig, die als funktioniert Vorlage für alle Videoseiten. Wenn ich jedoch versuche, einen Haken basierend auf diesem Vorlagennamen zu schreiben:

function mytheme_preprocess_node__video(&$variables) { 
    ... 
} 

dies funktioniert nicht. Ich denke, dass ich einen solchen Haken nicht definieren kann, oder ich nenne ihn nur falsch. Ich habe ein paar Threads gefunden, die etwas damit zu tun haben, wie this, die zu implizieren scheinen, dass ich einen Hook für alle Knoten definieren und dann eine if-Anweisung schreiben muss, die jeden Typ separat behandelt. So .......

letzte Frage: Kann ich einen Haken für einen ganzen Inhaltstyp definieren, und wenn ja, was mache ich falsch?

Antwort

1

Verwenden Sie eine Bedingung innerhalb des Präprozessors, um den Knotentyp abzurufen, und führen Sie dann entweder Ihre Logik durch oder rufen Sie eine andere Funktion auf.

function mytheme_preprocess_node(&$variables) { 
    switch ($variables['node']->getType()) { 
    case "video": 
     // ... 
    break; 
    case "something_else": 
     // ... 
    break; 
    } 
} 

Sie könnte theoretisch emulieren, was Sie mytheme_preprocess_node__" . $variables['node']->getType() indem sie versuchen, wenn es vorhanden ist, aber es ist zu viel Aufhebens ohne einen klaren Vorteil genannt, eine Funktion aufzurufen versuchen zu erreichen.

+0

Funktioniert perfekt, danke! – ConorBaumgart

0

In Drupal 7 von Zen-Vorlage habe ich diese generische Lösung verwendet. Ich denke, es ist immer noch eine tragfähige Lösung auf Drupal 8:

function mytheme_preprocess_node(&$variables) { 
    ... 
    // Add global modification that works for all node type 
    $function = __FUNCTION__ . '__' . $variables['node']->getType(); 
    // Each node type can have its own specific function 
    if (function_exists($function)) { 
    $function($variables, $hook); 
    } 
    ... 
} 

können Sie dann jetzt Vorprozess Funktion hinzufügen, wird nur für Sie Knotentyp arbeitet.

function mytheme_preprocess_node__video(&$variables) { 
    ... 
} 

Statt eine große Funktion hat, die jeweils Vorprozess Logik des Knotentyp hat seine eigene Funktion. Es ist besser für die Wartbarkeit.