PowerCMS™
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[ブログ] PowerCMS サポートの実績 (2024年6月) を追加しました。
[よくあるご質問] PowerCMS・PowerCMS X をつかった構築やカスタマイズを手伝ってもらえますか を追加しました。
[よくあるご質問] PowerCMSクラウドでオプションプラグインを使うことができますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > PowerCMS 5 > 「コンテキスト」を理解する

2021年11月12日

「コンテキスト」を理解する

先日公開しております記事「「テンプレートタグ」を使って、出力し、分岐し、加工する」では、テンプレートタグとは何なのか、どう使うのかについて解説いたしました。今回は、もう一歩踏み込んで、テンプレートタグを使うときに重要な「コンテキスト」について説明してみたいと思います。

コンテキストとは

テンプレートを組む作業をしておられる方は、こんなエラーに遭遇したことがあるかもしれません。

ウェブページのコンテキストエラー画面

「赤い帯のエラー画面」などと呼ばれる画面に、下記のようなエラーメッセージが出力されています。

再構築エラー: テンプレート「MTPageTitle」の再構築中にエラーが発生しました: <mtPageTitle>タグでエラーがありました: mtPageTitleをPageのコンテキスト外で利用しようとしました。MTPagesコンテナの外部に配置していませんか? 

新しくインデックステンプレートを作成し、テンプレートとして <$MTPageTitle$> とだけ記述してプレビューボタンを押すと、このエラーが表示されます。<$MTPageTitle$> は、「ウェブページのタイトルを出力する」テンプレートタグですが、これだけではどのウェブページのタイトルを出力すればよいか不明であるため、エラーになります。

ここでいう「どのウェブページのタイトルを出力すればよいか」が「コンテキスト」です。また、このエラーが発生している状態を、「ウェブページのコンテキストがない」と表現します。

コンテキストは、直訳すると「文脈」という意味になります。エラーメッセージは、文脈がないのでタイトルを出せと言われてもどれのことかわかりません、と言っています。

コンテキストがある状態

<$MTPageTitle$> だけではエラーになってしまうことがわかりました。では、インデックステンプレートに <$MTWebsiteName$> だけを記述してプレビューするとどうなるでしょうか。

この場合は、エラーになることなくウェブサイトの名前が出力されます。インデックステンプレートが属するウェブサイトが明確なので、テンプレートタグはウェブサイトの名前を出力することができます。この状態を「ウェブサイトのコンテキストがある」と表現します。

コンテキストをセットする

では、<$MTPageTitle$> に、どのウェブページのタイトルを出力すればよいかわかるようにしてあげましょう。

<MTPages folder="製品情報">
<$MTPageTitle$>
</MTPages>

ここでは、フォルダ「製品情報」に属するウェブページをループ出力するよう、ブロックタグ <MTPages> で囲みました。<MTPages> はフォルダ「製品情報」に属するウェブページを1件ずつループ処理していくので、<$MTPageTitle$> は、その都度処理されているウェブページのタイトルを出力するようになります。これで、どのウェブページのタイトルを出力すればよいか明確になりました。

このように、コンテキストを明確にすることを、「コンテキストをセットする」といいます。

アーカイブテンプレートでのコンテキスト

<$MTPageTitle$> を単独で使った場合、インデックステンプレートではどのウェブページを対象にすればよいか不明ですが、ウェブページアーカイブテンプレートは、その内容にウェブページを1件ずつ適用して出力することが前提となっており、対象のウェブページが明らかなので、タイトルを出力することができます。

ウェブページアーカイブテンプレートでは、「ウェブページのコンテキストがある」といえます。

変化するコンテキスト

少し複雑なテンプレートタグで構成してみましょう。

<MTBlogs blog_ids="2">
  <h1><$MTBlogName$></h1>
  <ul>
    <MTPages blog_ids="5">
      <li>
        <h2>[<$MTBlogName$>] <$MTPageTitle$></h2>
      </li>
    </MTPages>
  </ul>
</MTBlogs>

ブロックタグ MTBlogs は、ID が 2 のブログを対象としているので、h1 要素の MTBlogName は、ID が 2 のブログの名前を出力します。これに対して、MTPages は ID が 5 のブログに属するウェブページをループ処理するよう指定されています。この状態で、h2 要素内の MTBlogName は、ID が 2 か、5 か、どちらのブログの名前を出力するでしょうか。

この場合、ID が 5 のブログの名前を出力します。コンテキストに着目して表現するなら、「ウェブページが属しているブログのコンテキストを反映して出力される」という言い方になります。このように、入れ子になったテンプレートタグ構造では、ブロックタグの内側と外側でコンテキストが異なることがあります。


カテゴリー
PowerCMS 5

Recent Entries