Craft CMS のテンプレートを管理画面で管理できるか?を試してみた #craftcms
で考えていた、エントリというか管理画面側でテンプレート管理をできるかどうか?を試してみた。
なにか必要性があるか?と言われると特にはないのだけど、なんとなく興味本位で。
まずはセクションを作る。

こんな感じでストラクチャの testtemplate というセクションを作る。
フィールドはとりあえず textarea だけのシンプルな形で。

ここに必要なテンプレートを書いてみる。
テンプレート側
このセクションで管理しているコードを出力するテンプレートはこんな感じにした。
{% set template %}
{{ entry.c_textarea01 | raw }}
{% endset %}
{{ include(template_from_string(template)) }}
最初、テンプレートは
{% set template %}
{{ entry.c_textarea01 | raw }}
{% endset %}
{{ template }}
こんな感じでやってたんだけど、処理されずに、コードがそのままでてしまってた。
そしたら @tinybeans が Twig にテンプレートとして処理する方法があるよ、ということを教えてくれたのでそれを試してみたのが最初のコード。
template_from_string - Documentation - Twig - The flexible, fast, and secure PHP template engine
https://twig.symfony.com/doc/2…
いやー、 Slack に投げてみてよかった(笑
これ知らないと絶対解決できなかったなー。感謝感謝。
とりあえずMTのインデックステンプレートやWPの固定ページをテンプレートでやるようなイメージを想定して、ストラクチャのエントリ側でURLを自由に設定出来る想定にしたうえで、出力内容はテンプレートをそのまま出す感じで。
こんな感じのとりあえずエントリを取り出すだけのコードは
{{ entry.title }}

ちゃんとエントリーのタイトルも取れる

テンプレートで管理してたような内容のコードをエントリに書くと

{% extends '_layout' %}
{% block mainContent %}
<section class="l-container">
<div class="l-block-full">
{% set logo = craft.assets({ id: 462 }).one() %}
{% set sampleimage = craft.assets({ id: 463 }).one() %}
{% set watermarkedImage = craft.imager.transformImage(sampleimage, {
width: 800,
watermark: { image: logo, width: 303, height: 84, position: { right: 30, bottom: 30 }, opacity: 0.3, blendMode: 'multiply' }
}) %}
<div>
<h2>デフォルト</h2>
<img src="{{ craft.assets({ id: 463 }).one().url}}" alt="">
</div>
<div>
<h2>Imager 加工済み</h2>
<img src="{{ watermarkedImage.url}}" alt="">
</div>
</section>
{% endblock %}
こんなかんじでちゃんとその内容も表示される。

へー。
問題なく動いてそうな感じ。何かうまく行かないところとかあるかもしれないけど。
もちろんこれは1エントリ1ページという感じになるので、コレをアーカイブっぽい使い方しようとするなら、ルートの設定とかも合わせてやらないと難しい気はするけど、それでいけるかもしれない。
今すぐなにか使いみちがあるわけではないし、サーバにテンプレートをアップするとかそういうことはできなくなる。
ただ、エントリで管理してるということはテンプレート自体に予約公開や予約非公開といった公開制御を入れるみたいなこともできるし、ワークフローに乗せる、みたいなことも出来るってことだろうな。
意外と使い方はあるのかもしれない。