JavaScript で描画する
JSON を encode_js でエスケープして JavaScript に渡し、ブラウザ側でカレンダーや表を組み立てる方法を説明します。
ブラウザ側で表示を切り替えたい場合は、JSON をそのまま JavaScript に渡します。
JSON を JavaScript に渡す
<mt:ContentField content_field="営業日">
<mt:ContentFieldValue setvar="schedule_json" />
</mt:ContentField>
<div id="schedule"></div>
<script>
const schedule = JSON.parse('<mt:Var name="schedule_json" encode_js="1" />');
console.log(schedule.year, schedule.month, schedule.items);
</script>
encode_js="1" は Movable Type 標準のモディファイアで、引用符や改行を JavaScript の文字列に埋め込める形にエスケープします。シングルクォートで囲んだうえで JSON.parse() に渡してください。
表を組み立てる
<mt:ContentField content_field="営業日">
<mt:ContentFieldValue setvar="schedule_json" />
</mt:ContentField>
<table id="schedule">
<thead>
<tr><th>日付</th><th>営業</th><th>開店</th><th>備考</th></tr>
</thead>
<tbody></tbody>
</table>
<script>
const schedule = JSON.parse('<mt:Var name="schedule_json" encode_js="1" />');
const tbody = document.querySelector('#schedule tbody');
(schedule.items || []).forEach((item) => {
const tr = document.createElement('tr');
const cells = [
item.date + '日(' + item.day + ')',
item.open || '',
item.openTime || '',
item.note || ''
];
cells.forEach((text) => {
const td = document.createElement('td');
td.textContent = text;
tr.appendChild(td);
});
tbody.appendChild(tr);
});
</script>
入力された値をそのまま innerHTML に渡すと、意図しない HTML が挿入される可能性があります。上の例のように textContent を使うか、エスケープ処理を行ってください。
値の有無に注意する
一度も入力されていない項目はキーが存在しない場合があります。item.note || '' のように既定値を用意してください。
チェックボックスの値は配列です。
const plans = Array.isArray(item.plans) ? item.plans.join('、') : (item.plans || '');
年月の扱い
year は 4 桁、month は 2 桁ゼロ埋めの文字列です。Date オブジェクトを作る場合は、月が 0 始まりであることに注意してください。
const firstDay = new Date(Number(schedule.year), Number(schedule.month) - 1, 1);