簡體   English   中英

在Drupal 8中使用特定節點類型的預處理掛鈎

[英]Using preprocess hook on specific node type in Drupal 8

我已成功使用預處理頁面掛鈎,例如:

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

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

它與分別名為page - front.html.twig和page - 12.html.twig的自定義模板相關聯。

我正在嘗試為名為Video的內容類型實現相同的掛鈎和模板配對。 我的理解是,我的示例是針對特定頁面的自定義模板,而我的目標是整個內容類型的自定義模板,但我得到了一個名為node的自定義模板 - video.html.twig可用作所有視頻頁面的模板。 但是,當我嘗試根據此模板名稱編寫一個鈎子時:

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

這不起作用。 我認為我要么不能定義這樣的鈎子,要么我只是錯誤地命名它。 我找到了一些與此相關的線程,例如似乎意味着我需要為所有節點定義一個鈎子,然后編寫一個if語句來分別處理每個類型。 所以.......

最后的問題 :我可以為整個內容類型定義一個鈎子,如果是這樣,我做錯了什么?

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

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

理論上,您可以通過嘗試調用名為mytheme_preprocess_node__" . $variables['node']->getType()的函數來模擬您要實現的目標,如果它存在,但是如果沒有明顯的好處則太過於煩惱。

在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) {
    ...
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM