PowerCMS™

12月12日東京、12月19日大阪にて PowerCMS X 製品発表会を開催いたします。大阪会場はお席に余裕がございます。

PowerCMS ブログ

ホーム > PowerCMS ブログ > カスタムフォームのテンプレートでフォームの情報を取得する

2018年02月16日

カスタムフォームのテンプレートでフォームの情報を取得する

今回は PowerCMS のカスタムフォーム機能 (Contact Form アドオン) で、フォームやフォーム項目の情報を利用して HTML フォームを作成するテンプレートのヒントを紹介します。

ウェブページのアーカイブテンプレートでフォームの設定値を利用する

ウェブページに対して種類がフォームのカスタムフィールドを作成して紐付け、そのカスタムフィールドの名前を「ウェブページのフォーム」、テンプレートタグを「<$MTPageForm$>」とします。また、ウェブページやフォームの HTML はウェブページのアーカイブテンプレートで出力します。

このとき、ウェブページの編集画面で [ウェブページのフォーム] フィールドに選択されたフォームの名前を、ウェブページやフォームの HTML に出力するためのテンプレートについて考えてみます。

<MTIf tag="PageForm">
  <h1><$MTContactFormName encode_html="1"$></h1>
  <$MTPageForm$>
</MTIf>
これは不正なテンプレートです

フォームの名前を2行目のテンプレートタグ <$MTContactFormName$> で得ようとしましたが、ウェブページのアーカイブテンプレートで、フォームのブロックタグ内部ではなく、有効なコンテキストはウェブページのみなので、このタグは使用できず、再構築エラーになってしまいます。

テンプレートのコンテキストと使用できるテンプレートタグについては、Movable Type Q&A『「MTEntryTitleをコンテキスト外で利用しようとしています」とエラーが出て再構築できない。』を参照してください。

「フォームのブロックタグ」と前述しましたが、作成したフォームのカスタムフィールドのテンプレートタグ (<$MTPageForm$>) は、基本的にファンクションタグとして機能するもので、ブロックタグとして記述してもフォームのコンテキストを得ることはできません。ウェブページのアーカイブテンプレートでフォームのコンテキストを得たうえで、フォームの名前を出力するテンプレートは次のようになります。

<MTIf tag="PageForm">
  <MTPageCustomFields include="ウェブページのフォーム">
    <$MTPageCustomFieldValue setvar="page_form_id"$>
    <MTIf name="page_form_id">
      <MTContactForms id="$page_form_id">
        <MTIf name="__first__">
          <h1><$MTContactFormName encode_html="1"$></h1>
        </MTIf>
      </MTContactForms>
    </MTIf>
  </MTPageCustomFields>
  <$MTPageForm$>
</MTIf>

ブロックタグ <MTPageCustomFields> で ID の数値が得られるので、これをブロックタグ <MTContactForms> に渡し特定することで「フォームのブロックタグ」を実現することができました。

7行目のフォーム名を出力するところ (<$MTContactFormName$>) では、次のテンプレートタグを利用することができます。

フォームから情報を取得するテンプレートタグの一部
テンプレートタグモディファイアモディファイアの値出力の説明
<$MTContactFormName$>名前。
<$MTContactFormID$>ID 数値。
<$MTContactFormColumn$>columnblog_idブログの ID 数値。
author_id作成ユーザーの ID 数値。
created_on作成日時。
modified_on更新日時。
cms_tmplテンプレートの ID 数値。
mail_sender_tmpl送信者への通知用テンプレートの ID 数値。
mail_admin_tmplメール通知用テンプレートの ID 数値。
mail_sender送信者へメール通知するときは1
mail_admin通知メールを送信するときは1
send_mailtoメール送信先のメールアドレス。
send_mailfrom送信者宛てメール送信元のメールアドレス。
send_mailcc送信者宛てメール送信先 (Cc) のメールアドレス。
send_mailbcc送信者宛てメール送信先 (Bcc) のメールアドレス。
send_notifyfromメール送信元のメールアドレス。
send_notifyccメール送信先 (Cc) のメールアドレス。
send_notifybccメール送信先 (Bcc) のメールアドレス。
return_url遷移先 URL。
notify_subject通知の件名。
sender_subject送信者宛て通知の件名。
requires_login投稿にログインを必要とするときは1
post_limit投稿を受け付ける最大投稿数。
set_limit投稿数を制限するときは1、しないときは2
publishing_on公開期間の開始日時。
period_on公開期間の終了日時。
statusステータスが下書きのときは1、公開のときは2、日時指定のときは4、公開終了のときは5
set_period公開期間を指定するときは1、しないときは2
single_post1人1投稿通に限定しているときは1
not_save投稿をデータベースに保存しないときは1
<$MTFeedbackInformationMessage$>インフォメーションのメッセージ。
<$MTFeedbackThanksMessage$>完了メッセージ。
<$MTFeedbackConfirmMessage$>確認画面メッセージ。
<$MTFeedbackErrorMessage$>エラーメッセージ。
<$MTFeedbackPreOpenMessage$>期間終了後メッセージ。
<$MTFeedbackClosedMessage$>受付前期間メッセージ。
<MTIfContactFormIsOpen></MTIfContactFormIsOpen>フォームのステータスが公開。
<MTIfContactFormIsClosed></MTIfContactFormIsClosed>フォームのステータスが非公開。
<MTIfContactFormIsPreOpen></MTIfContactFormIsPreOpen>フォームの公開期間が指定されていて、公開開始前。
<MTIfFeedbackAlreadyPosted></MTIfFeedbackAlreadyPosted>form_idフォームの ID 数値。モディファイアの条件に一致する投稿がある。
email投稿のメールアドレス。
<$MTFeedbackCount$>form_idフォームの ID 数値。モディファイアの条件に一致する投稿の数。
modelフォームに紐づく CMS オブジェクトのクラス名。記事なら「entry」ウェブページなら「page」。
object_idフォームに紐づく CMS オブジェクトの ID 数値。
blog_idブログの ID 数値。

例えばフォームの投稿数を得るには5行目から9行目を次のように置き換えます。

<MTIf tag="PageForm">
  <MTPageCustomFields include="ウェブページのフォーム">
    <$MTPageCustomFieldValue setvar="page_form_id"$>
    <MTIf name="page_form_id">
      <$MTPageID setvar="object_id"$>
      <$MTBlogID setvar="blog_id"$>
      <$MTFeedbackCount form_id="$page_form_id" model="page" object_id="$object_id"
                        blog_id="$blog_id" _default="0"$>
    </MTIf>
  </MTPageCustomFields>
  <$MTPageForm$>
</MTIf>

ちなみに通知メールのテンプレートでは暗黙でいくつかのテンプレート変数が定義されているので、次のようなテンプレートで投稿数を出力できます。

<$MTContactFormID setvar="form_id"$>
<$MTFeedbackCount form_id="$form_id" model="page" object_id="$object_id" blog_id="$blog_id"$>

フォームのみに一元管理すべき情報がウェブページのアーカイブテンプレートで利用可能となることで、「フォームにもウェブページにも同じ情報の2重入力を強いる設計」を防ぐとか、「1つのフォームが複数のウェブページから参照されている状況」でフォームの情報を有効活用するとかいった可能性が期待できます。

フォーム項目のテンプレートでフォーム項目の設定値を利用する

フォーム項目のテンプレートでは暗黙でいくつかのテンプレート変数が定義されています。

フォーム項目のテンプレートで定義されているテンプレート変数の一部
テンプレート変数名変数値の説明
field_name名前。
field_description説明。
field_basenameベースネーム。
field_required必須のとき1

また、利用可能なテンプレートタグの一部は次の通りです。

フォーム項目から情報を取得するテンプレートタグの一部
テンプレートタグモディファイアモディファイアの値出力の説明
<$MTFormElementName$>名前。テンプレート変数「field_name」と同じ。
<$MTFormElementDescription$>説明。テンプレート変数「field_description」と同じ。
<$MTFormElementBasename$>ベースネーム。テンプレート変数「field_basename」と同じ。
<$MTFormElementType$>種類の識別子。「text」や「checkbox」、「email」など。
<$MTFormElementColumn$>columnidID 数値。
blog_idブログの ID 数値。
author_id作成ユーザーの ID 数値。
mtmlテンプレート。
optionsオプション。
default既定値。
normalize正規化するときは1
created_on作成日時。
modified_on更新日時。
max_length制限文字数。
check_length文字数制限するときは1
count_multibyte全角文字数でカウントするときは1
<MTIfFormElementRequired></MTIfFormElementRequired>必須である。テンプレート変数「field_required」とほぼ同じ。
<MTIfFormElementValidate></MTIfFormElementValidate>入力チェックを行うとき。
<MTIfFormElementColumn></MTIfFormElementColumn>column<$MTFormElementColumn$> と同様のモディファイアで条件分岐。

暗黙で定義されていない設定値が必要なときは、テンプレートタグ <$MTFormElementColumn$> で取得することができます。よく使いそうな例として、フォーム項目の設定を利用して <input> 要素に maxlength 属性値や required 属性の出し分けをするテンプレートは次のようになります。

<$MTFormElementColumn column="check_length"    setvar="field_check_length"$>
<$MTFormElementColumn column="max_length"      setvar="field_max_length"$>
<$MTFormElementColumn column="count_multibyte" setvar="field_count_multibyte"$>
<p><$MTVar name="field_name" encode_html="1"$>:
<input
  name=<$MTVar name="field_basename"$>
  type=<$MTFormElementType setvar="field_type" _default="text"$>
<MTIfFormElementRequired>
  required
</MTIfFormElementRequired>
<MTIf name="field_check_length">
  <MTIf name="field_max_length" like="/\A[1-9]\d*\z/">
  maxlength=<$MTVar name="field_max_length"$>
  </MTIf>
</MTIf>
>

さあ帰ろう。


カテゴリー
テンプレート作成Tips