夏からHTML/CSS/JavaScriptの設計をして改めて感じたのですが、テンプレートエンジン「Pug」を利用してHTMLを制作するとPowerCMS Xのテンプレートはある程度設計が完了した状態になります。
例えばこのような下層ページのPugがあったとします。
extend /_template/_default
include /_partial/_variable
append variables
- var pageTitle = '会社概要'
- var pageDescription = '説明を入れる'
- var isHomePage = false
append css
link(rel="stylesheet", href=jsDir + "slick/slick.css")
block content
main
.l-content
.l-content__inner
nav(aria-label="現在の位置").p-breadcrumb
ol.p-breadcrumb__list
li: a(href="/") ホーム
li: span(aria-current="true") #{pageTitle}
.l-content.l-content--col2.l-content--withNav
.l-content__inner
.l-content__contentColumn.c-content
h1 #{pageTitle}
.p-editorContent
p 会社概要のコンテンツが入ります。
- var category = ['CMS','UX','アクセシビリティ','HTML/CSS','JavaScript']
each item, index in category
input(type="checkbox", name="category", id="category_" + index, value=item)
label(for="category_" + index) #{item}
include /_partial/_share_sns
.l-content__scanColumn.c-content
// 掲載省略
extend /_template/_default
はPowerCMS Xのテンプレートだと<mt:includeblock module="基本レイアウト"></mt:includeblock>
に置き換えます。Pugの/_template/_default
は以下のような内容ですが、
block variables
doctype html
html(lang="ja")
head
include /_partial/_meta
body
include /_partial/_header
block content
include /_partial/_footer
include /_partial/_foot_script
PowerCMS Xのテンプレートにすると以下のようになります。完全一致しないもののPugのinclude
はそのままPowerCMS Xのmt:include
に置き換えています。
<mt:if name="page_is_english">
<mt:include workspace_id="1" module="ヘッダー_英語">
<mt:else>
<mt:include workspace_id="1" module="ヘッダー">
</mt:if>
<main>
<mt:var name="contents">
</main>
<mt:if name="page_is_english">
<mt:include workspace_id="1" module="フッター_英語">
<mt:else>
<mt:include workspace_id="1" module="フッター">
</mt:if>
Pugのvar pageTitle
でページタイトルを変数に代入していますが、これはPowerCMS Xだとmt:setvar
とかmt:setvarblock
になるでしょう。また、Pugでappend css
を利用して追加のCSSを指定していますが、これもPowerCMS Xだとmt:setvarblock
でCSS(link要素)を変数に追加、ヘッダーテンプレートモジュールで<mt:var name="page_additional_meta_html" />
等と書いてhead
内に出力することにより同じ機能が実現できます。
また、Pugのeach item, index in category
でラジオボタンを生成していますが、
- var category = ['CMS','UX','アクセシビリティ','HTML/CSS','JavaScript']
each item, index in category
input(type="checkbox", name="category", id="category_" + index, value=item)
label(for="category_" + index) #{item}
これは前の記事で紹介したmt:columnproperty
を利用してモデルに設定した選択項目を呼び出すテンプレートタグに置き換えれば済みます。
<mt:ignore>オプション項目を表示する</mt:ignore>
<mt:loop name="option_categories">
<input type="radio" name="_custom_filter_categories" id="category_<mt:var name="__key__" />" value="<mt:var name="__key__" escape />"<mt:if name="category_param" eq="$__key__"> checked</mt:if>>
<label for="category_<mt:var name="__key__" />"><mt:if name="page_is_english"><mt:var name="__value__" escape /><mt:else><mt:var name="__value__" translate escape /></mt:if></label>
</mt:loop>
Pugのinclude /_partial/_share_sns
でSNS共有ボタンをインクルードしていますが、これは各ページで共通の部品を読み込んでいるのだなと解釈でき、PowerCMS Xのテンプレートモジュールを呼び出せば良いと考えることができます。
Pugで上手くテンプレート化することができていれば、PowerCMS Xのテンプレートも自ずと良いものができる・効率よく制作ができる、そのように感じます。