[英]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.