Skip to main content

Twig教學 - 透過preprocess操作輸入變數

Submitted by admin on Wed, 02/05/2020 - 07:34

在Drupal的twig template中,我們經常看到以下語法

<div> {{ content }} </div>

我們當然可以透過修改twig template,將div轉變成其他標籤,或是為標籤新增一個CSS class,例如

< div class="whatever"> {{ content }} </div>

 

但如果我們需要修改{{ content }}變數內容,或是新增一個變數輸入到這個twig template的話,就需要使用Drupal中的hook_preprocess_HOOK,使用步驟如下

 

  1. 假設所套用主題的machine name為mytheme
  2. 在所使用主題的資料夾下修改(不存在的話就新增)mytheme.theme,別忘了最一開始的<?php
  3. 打開twig debug mode,找到要修改變數的twig檔案名稱
  4. 在mytheme.theme中新增hook_preprocess_HOOK(&$variables),其中小寫hook改為主題machine name,也就是mytheme。大寫HOOK改為對應的twig檔案名稱,"-"由"_"取代。

 

關於twig檔案名稱變換的部分,舉兩個例子如下

如果twig檔案名稱為page.html.twig,函數名稱應該叫做mytheme_preprocess_page

如果twig檔案名稱為node--article.html.twig,函數名稱應該叫做mytheme_preprocess_node__article

 

清除快取後,重新整理網頁應該能看到改變後的輸出結果。下面提供幾個範例preprocess範例供參考。

 

下面這段code可以把未完文章結尾的「Read More」字樣改成「(閱覽全文)」。

function mytheme_preprocess_links__inline(&$variables) {
  $variables['links']['node-readmore']['link']['#title'] = t('(閱覽全文)');
}

 

下面這段可以讓特定的twig file知道當前頁面是不是首頁

function hook_preprocess_HOOK(&$variables) {
  try {
    $variables['is_front'] = \Drupal::service('path.matcher')->isFrontPage();
  }
  catch (Exception $e) {
    $variables['is_front'] = FALSE;
  }
}

 

Tags