DrupalのテンプレートエンジンとしてDrupal8からTwigが使われていますが、Twig自体はView機能のみなのでPHP関数を記述する事が出来ません。
Smartyというテンプレートエンジンでは、テンプレート内にPHP関数を書く事が出来ます。便利なのですが、同じ様にTwig内でPHP関数を使用するとエラーになってしまいます。
Smartyに慣れている開発者は不便に感じるかも知れませんが、テンプレートは単純にView機能のみ担当させて簡単な処理でもバックエンドで行った方が良いという考え方もあります。
カスタムモジュール等の作成が必要になるのでTwig内でPHP関数や独自処理を実行させる方法として以下の方法があります。
1.Twig Tweakモジュールをインストールする。
Twig Tweakモジュールをインストールした後でphpを有効にします。
settings.phpに以下の1行を追加する。
$settings['twig_tweak_enable_php_filter'] = TRUE;
Twigでの使用例
{{ 'return date("Y-m-d");'|php }} ⇒ 現在日時表示
※但し、非推奨なのであまり使わない方が良い事と一部使用出来ない関数があります。
2.Extension
を実装する。
独自のカスタムExtensionモジュールを作成して実装することが出来ます。
■ Extensionモジュール
※以下のディレクトリ配下にExtensionモジュールを実装する。(ディレクトリが無い場合は作成する。)
/sites/all/modules/twig_extension
src(ディレクトリ)
|- TwigExtension.php
|- twig_extension.info.yml
|- twig_extension.services.yml
◎twig_extension.info.yml
記載例)
name: Twig Extension Module
description: Twig extension.
package: "Custom"
type: module
core: 8.x
◎twig_extension.services.yml
記載例)
services:
twig_extension.twig_extension: # 任意の識別子
class: Drupal\twig_extension\TwigExtension # Twig拡張を提供するクラス
tags:
- { name: twig.extension }
◎TwigExtension.php
記載例)
<?php
namespace Drupal\twig_extension;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
/**
* Twig PHP Extension
*/
class TwigExtension extends AbstractExtension {
public function getFunctions() {
return [
new TwigFunction('getDate', [$this, 'getDate']), ⇒ getDate:ファンクション名(任意)
new TwigFunction('AAAAAA', [$this, 'AAAAAA']), ⇒ 複数のファンクションを追加する場合
new TwigFunction('BBBBBB', [$this, 'BBBBBB']),
];
}
public function getDate() {
return date("Y-m-d");
}
public function AAAAAA() {
何らかの処理
}
}
◎TwigからPHP処理を呼び出す場合
{{ gatDate() }} ⇒ 結果:2020-12-24
【作成したExtensionモジュールの有効化】
Extensionモジュールを作成しただけでは、Drupalが認識していないので動作しません。
以下の手順でモジュールを有効化させて下さい。
1.管理者権限でログインする。
2.管理メニュー ⇒ 「拡張機能」をクリックする。
3.機能一覧から今回作成した「Twig Extension Module」を探してチェックを入れる。
4.一番下にある「インストール」ボタンをクリックしてインストールする。
今回はTwigで簡単なPHPの処理を実行して結果を取得する方法をご紹介しました。
Extensionモジュールは一度作成した後は、TwigExtension.phpに必要に応じて処理を追加して行けるので一度作成してしまえば、便利で再利用が可能なので機会があったら作成して見て下さい!