GRAV CMS に、Twig Extension の追加を試してみる

Yossy
2024-02-26
2024-02-26
最近、お気に入りの GRAV CMS
https://getgrav.org/

Twig テンプレートが書けて、Twig Extension も追加できるので、今回、追加してみようと思います。

公式のドキュメントを参考に、GRAV に、Hello World を出力するプラグインを書いてみたいと思います。
https://learn.getgrav.org/17/cookbook/twig-recipes

1.GRAV CMS インストール


https://getgrav.org/ からダウンロードして、Document Root に解凍したら終了。驚くほど簡単です。
※ちなみに、Document Root 直下じゃなくても、フォルダ作って解凍しても動きます。

2.プラグイン用の環境を作成


以下、Grav を解凍したフォルダで実行します。GRAV CMS の開発用ツールがインストールされます。

> php bin/gpm install devtools

3.プラグインのひな型作成


以下のコマンド実行してプラグインに関する、いくつか質問に回答します。
※公式サイトには、bin/plugin devtools newplugin と書いてあるのですが、new-plugin が正解のようです。

 


>php bin/plugin devtools new-plugin

 Enter Plugin Name:
 > hello

 Enter Plugin Description:
 > output hello world

 Enter Developer Name:
 > yossy

 Enter GitHub ID (can be blank):
 > (任意の GitHub ID ※未入力も可能)

 Enter Developer Email:
 > (任意のメールアドレス)


SUCCESS plugin hello -> Created Successfully
これで、雛形作成完成です。

Plugin Name を Hello としたので、\user\plugins\hello フォルダ以下に、作成されたプラグインの雛形保存されています。

フォルダに移動して、

composer update を実行しておきます。Composer によって、Plugin 用に、Autoloader やライブラリなどが読み込まれますので、実行しておかないとエラーになります。

4.コードを書いていきます。


\user\plugins\hello\hello.php に、以下のコードを追記します。


    public function onPluginsInitialized(): void
    {
        // Don't proceed if we are in the admin plugin
        if ($this->isAdmin()) {
            return;
        }

        // Enable the main events we are interested in
        $this->enable([
            'onTwigInitialized' => ['onTwigInitialized', 0]
        ]);
    }

    public function onTwigInitialized()
    {
        $this->grav['twig']->twig()->addFunction(
            new \Twig_SimpleFunction('hello', [$this, 'hello'], array('is_safe' => array('html')))
        );
    }
    public function hello() {
        return 'Hello World.';
    }

GRAV で動作するときの、おおまかな流れとしては、onPluginsInitialized() が呼び出され plugin の初期化処理の登録を求められますので、onTwigInitialized() を登録します。
初期化処理 onTwigInitialized() で、Twig Extension を登録します。
これで、ページを表示するとき、hello() が呼び出されて、その return 値の内容が表示されます。

今回は、HTML エスケープ不要なので、Extension 登録時に、array('is_safe' => array('html')) を入れています。

Extension の登録は、Twig の機能なので、Twig のドキュメントを参照すると、より理解が深まります。
https://twig.symfony.com/doc/2.x/advanced.html#functions

これで、Hello World. が出力されるプラグイン完成したので、動作テストを行います。

4.動作前に、コンテンツに twig が書けるように設定します。


\user\config\system.yaml の以下の twig の部分を true にします。これで、markdown に加えて、Twig 構文を本部内に書けるようになります。


pages:
  theme: quark
  markdown:
    extra: false
  process:
    markdown: true
    twig: true <---- ここを、true に設定

これで、ページファイルの default.md などに、Twig のお作法に従って書いてみます。




{{ hello() }}


出力結果
 20220428


正しく表示されています。こちら参考に、便利関数を作ってみてください。他えば、  みたいな関数を作って、商品マスタ情報が表示されるとか、色々使い道はあるんじゃないかなと思います。

なお、キャッシュをクリアしないと、プログラムの修正内容が反映されない時があるので、php bin/grav cacheでキャッシュクリアしてみてください。\user\config\system.yaml でキャッシュを無効化してもいいかもですね。