2017-05-03 29 views
1

我使用預處理頁面掛鉤,如過成功:在Drupal上的特定節點類型使用預處理鉤8

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

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

與自定義模板命名頁面關聯 - 前.html.twig和page - 12.html.twig分別。

我正在試圖爲稱爲視頻的內容類型實現相同的掛鉤和模板配對。我明白,我的例子是特定頁面的自定義模板,而我的目標是整個內容類型的自定義模板,但我得到了一個名爲node - video.html.twig的自定義模板,它可以作爲所有視頻頁面的模板。但是,當我嘗試編寫基於此模板名稱的掛鉤時:

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

這不起作用。我認爲我不能像這樣定義一個鉤子,或者我只是錯誤地命名它。我發現一些與此有關的線程,比如this,這似乎暗示我需要爲所有節點定義一個鉤子,然後編寫一個分別處理每種類型的if語句。 所以.......

最後一個問題:我可以定義一個鉤的整個內容類型,如果是這樣我究竟做錯了什麼?

回答

1

使用預處理器中的條件來獲取節點類型,然後執行內部的邏輯或調用另一個函數。

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

理論上你可以模仿你想什麼,試圖如果存在調用一個名爲mytheme_preprocess_node__" . $variables['node']->getType()功能來實現,但沒有一個明確的利益太過計較。

+0

完美的作品,謝謝! – ConorBaumgart

0

在zen模板的drupal 7中,我曾經使用過這個通用的解決方案。我認爲它仍然是在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); 
    } 
    ... 
} 

然後,您可以現在添加預處理功能,將僅適用於您節點類型。

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

每個節點類型的預處理邏輯都有自己的功能,而不是有一個大功能。可維護性更好。

相關問題