2018年02月16日
カスタムフォームのテンプレートでフォームの情報を取得する
今回は PowerCMS のカスタムフォーム機能 (Contact Form アドオン) で、フォームやフォーム項目の情報を利用して HTML フォームを作成するテンプレートのヒントを紹介します。
ウェブページのアーカイブテンプレートでフォームの設定値を利用する
ウェブページに対して種類がフォームのカスタムフィールドを作成して紐付け、そのカスタムフィールドの名前を「ウェブページのフォーム」、テンプレートタグを「<$MTPageForm$>
」とします。また、ウェブページやフォームの HTML はウェブページのアーカイブテンプレートで出力します。
このとき、ウェブページの編集画面で [ウェブページのフォーム] フィールドに選択されたフォームの名前を、ウェブページやフォームの HTML に出力するためのテンプレートについて考えてみます。
フォームの名前を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$> | column | blog_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_post | 1人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$> | column | id | ID 数値。 |
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