stepブロックを知ろう

基本のブロック構成

テンプレートを上から順に読むと、大きく分けて下のようなブロック構成になっていることが分かります。フォームが、どのステップにいるかに合わせて、それぞれのブロックの中身が表示されます。表示中のステップ以外の内容は一切表示されません。

はじめの入力画面( step )で、エラーがあれば再入力画面( step#reapply )に遷移し、エラーがなければ確認画面( step#confirm )が遷移します。そして、確認画面から送信したあとに、完了画面( step#result )へ遷移します。

Formモジュールにおけるstepブロックの構成

<!-- BEGIN_MODULE Form -->

<!-- BEGIN step -->
(中略:はじめの入力画面)
<!-- END step -->

<!-- BEGIN step#reapply -->
(中略:エラーがあったときの再入力画面)
<!-- END step#reapply -->

<!-- BEGIN step#confirm -->
(中略:送信前の内容確認)
<!-- END step#confirm -->

<!-- BEGIN step#result -->
(中略:送信後の完了通知)
<!-- END step#result -->

<!-- END_MODULE Form -->

次に表示するステップ操作の仕組み

基本的に、サンプルテンプレートを元に編集を加えるだけで利用することができます。そのため、以下の内容について編集する事はあまり多くはありませんが、どこでその記述をしているかについて説明します。


再入力画面( step#reapply )のHTMLソース

再入力画面( step#reapply )のHTMLソース


エラー時に表示されるstepの指定

GET, POSTの2通りの方法で指定が可能です。

  • form要素のaction属性に?step=reapplyを指定(GET)
  • input要素のname属性にerror、value属性にreapplyを指定(POST)

どちらか一方の指定だけで大丈夫です。エラーなどがあった場合は、ここで指定されたstepが表示されます。

次に表示したいstepの指定

HTMLのinput要素のname属性にstepvalue属性にconfirmと記述しています。ここに次に表示したいstepの名前を入力します。エラーなどがなければ、ここで指定されたstepが表示されます。

例の場合では再入力の内容にエラーがあれば再入力画面( step#reapply )に戻ってきて、エラーがなければ確認画面( step#confirm )に遷移するという記述になります。

SMTPでのメール送信時のBCCに不具合が見つかりました

メール設定にてSMTPを使用しているサイトにて、BCCを利用している場合に不具合が見つかりました。

現象

受け取ったメールには本来、BCCのメールアドレス見えないものです。SMTPを使ったメール送信時にBCCのアドレスが見えている状態になっていました。

対応方法

下記の修正ファイルを適応してください。
/php/Mail.php をバックアップを取った後に、上書き保存をしてください。
ver1.5.1〜ver2.0.1.1までの修正バッチになります。ver2.1以降は既に修正済みですので不要です。


SMTPを利用されていない場合(デフォルトはsendmailを使用する設定になっています。コンフィグ>メール設定で確認頂けます)や、BCCを利用されていない場合には、本件の不具合による直接的な影響はございません。

Ver. 2.6.0.1 の フォームで不具合が発見されました。

Ver. 2.6.0.1のフォームで1ページに複数のフォームがあると
送信ができない場合がある不具合が発見されました。

対象

  • a-blog cms Ver. 2.6.0.1
  • 一つのページの複数のFormモジュールがある
  • CSRF対策のオプションがON(デフォルト: ON)config.system.yaml : form_csrf_enable

対策

/php/ACMS/GET/Form.php の35行目付近の csrf_tokenメソッド を以下のように修正ください。

/**
 * CSRF Token埋め込み
 * 
 * @param string & $tpl
 */
function csrf_token(& $tpl)
{
    $Session = ACMS_Session::singleton();

    if ( $Session->get('formToken') ) {
        $token  = $Session->get('formToken');
    } else {
        $token  = sha1(uniqueString().'acms'.session_id());
        $Session->set('formToken', $token);
        $Session->save();
    }

    // token の埋め込み
    $tpl = preg_replace('@(?=<\s*/\s*form[^\w]*>)@i', '<input type="hidden" name="formToken" value="'.$token.'" />'."\n", $tpl);
}

この度はご迷惑をおかけしてしまい申し訳ございません。

今後ともa-blog cmsをお願い致します。

お問い合わせフォームの設定を最適化する

目標


お問い合わせなどのフォームが入力された時、お問い合わせした人や管理者へ送信する確認メールをカスタマイズしましょう。


解説使用テーマbeginner

Before

After

目次

  1. フォームの仕組み
  2. テンプレートの形式でメールを受け取る
  3. オリジナルの件名・本文を入力してメールを受け取る

フォームの仕組み


初期設定のサイトマップでは、フォームの機能を体験するためのお問い合わせページ( http://example.com/contact/ )を用意しています。まずはこのページでフォームの仕組みについて学んでいきましょう。


お問い合わせページでは、入力する項目を下図のように設定しています。


お問い合わせフォーム

通常このフォームから送信された内容は、サイト管理者のメールアドレスに届くようにしなければなりません。また、入力されたアドレス宛へ確認メールが必要な場合もあります。まずはフォーム管理画面から、それらのアドレスを設定しましょう。


  1. 管理ボックスから [管理ページ] ボタンをクリックする
  2. サイドメニュー内 [フォーム] をクリックする
  3. リスト内「お問い合わせフォーム」右側の [変更] ボタンをクリックする


フォームの管理画面では、「基本設定」「入力チェック・変換」「一般メール設定」「管理者宛メール設定」を編集することができます。


基本設定



基本設定では、最初にフォームIDとフォーム名を定めています。


フォームID
制作するサイトによっては、お問い合わせフォームや募集フォームなど複数のフォームを設置することがあります。それらを区別する任意の英数字がフォームIDです。モジュールIDと同じくフォームIDはテンプレートと管理画面で合わせて設定されており、これによってフォームの設定や投稿データを管理できます。

テーマ「beginner2020」では、お問い合わせフォームのフォームIDはテンプレート側で contactForm と指定されているため、基本設定画面からも同じIDを使用しています。


入力チェック・変換



フォームの任意の項目に対して、「入力必須」や「最大文字数」などの条件を指定することができます。テンプレートを編集する必要があります。

しかし今回のチュートリアルでは管理画面のみでできることを学習するため、この機能について作業することはありません。


一般メール設定


一般メール設定では、フォームに入力した方へ送信するメールを管理することができます。



基本的には、メールの件名、本文について管理画面から直接入力し、通常のメールフォームと同様に「To」で送信先のメールアドレスを、「From」で送信元のメールアドレスを指定します。その他にも、通常のメールの設定と同じようにCc・Bcc・Reply-To の設定ができます。

「一般メール設定」の「From」は概ねサイト管理者になるので、自分のメールアドレスを入力しておくと良いでしょう。


From(自分のメールアドレス)

また件名、本文を入力していない場合は、a-blog cms 側で用意しているテンプレートの形式が採用されます。上図の件名ファイル、本文ファイルの項目に記入されている「/contact/form/subject.txt」「/contact/from/body.html」などは、そのテンプレートが置いてある場所へのパスになっています。


管理者宛メール設定


管理者宛メール設定では、フォームの管理者宛へ送信されるメールを管理することができます。



構成は一般メール設定と同じです。メールの件名、本文について管理画面から直接入力し、通常のメールフォームと同様に「AdminTo」で送信先のメールアドレスを、「AdminFrom」で送信元のメールアドレスを指定できるようになっています。

こちらでは送信先をサイト管理者にする必要があるので、「AdminTo」へ自分のメールアドレスを入力しておきましょう。


AdminTo(自分のメールアドレス)

一般メール設定のFrom・管理者宛メール設定のAdminToに自分のメールアドレスを入れたら、フォームの設定を保存してください。


テンプレートの形式でメールを受け取る


まずは a-blog cms が用意しているテンプレートの形式でメールを受け取ってみましょう。

お問い合わせページを開き、各項目に入力してください。入力する内容は自由ですが、内容確認メールも同時に受け取るために「お客様情報」のメールアドレス欄には自分のメールアドレスを設定してください。



フォーム送信後、設定/入力した自分のメールアドレス宛に確認メールが届きます。メール内容を見てみしましょう。


管理者宛メール内容

管理者宛メール内容


一般メール内容

一般メール内容


フォーム設定で指定されているメールのテンプレートファイルに沿って、フォームから入力された情報が表示されました。


以上がフォームを送信した時の流れになります。これらを踏まえて、次はフォーム設定から件名と本文を変更してみましょう。


オリジナルの件名・本文を入力してメールを受け取る


一般メール設定


まずは一般メール設定について、以下のように件名・本文を入力しましょう。


件名(優先)


【株式会社▲▲】お問い合わせありがとうございます

本文(優先)


この度はお問い合わせいただき、ありがとうございました。
以下の内容で送信しました。

+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-+:-+:-+:-+:-+

受付日時:%{Y}年%{n}月%{j}日 %{H}:%{i}:%{s}
通番 : {serialNumber}

■お問い合わせ情報

ご用件    : {description}[raw]
お問い合わせ内容:
{inquiry}[raw]


■お客様情報

会社名    : {organization}[raw]
お名前    : {family-name}[raw] {given-name}[raw]
メールアドレス: {email}
お電話番号  : {tel}
ご住所    : 〒{postal-code} {address-level1} {address1} {address2}


+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-+:-+:-+:-+:-+

今後とも株式会社▲▲をよろしくお願いいたします。

この本文について、{変数} で示されている部分には実際にメールで入力された内容が表示されます。この変数の値についてはテンプレート側で指定しているものになるので、ブラウザ上での変更はできません。したがって、フォームから入力された内容を本文中に表示したい場合は、該当の値を上記のソースから直接コピー&ペーストしてお使いください。

少し踏み込んで学習をすると、こちらでは %{変数} の形で「グローバル変数」が、{変数}[オプション] の形で「校正オプション」が利用されています。それぞれの機能の詳細については、以下のリンクの解説をご覧ください。

管理者宛メール設定

管理者宛メール設定については、以下のように入力します。


件名(優先)


お問い合わせを受信しました

本文(優先)


弊社公式HPよりお問い合わせを受信しました。
担当者は迅速な対応をお願いします。

+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-+:-+:-+:-+:-+

受付日時:%{Y}年%{n}月%{j}日 %{H}:%{i}:%{s}
通番 : {serialNumber}

■お問い合わせ情報

ご用件    : {description}[raw]
お問い合わせ内容:
{inquiry}[raw]


■お客様情報

会社名    : {organization}[raw]
お名前    : {family-name}[raw] {given-name}[raw]
メールアドレス: {email}
お電話番号  : {tel}
ご住所    : 〒{postal-code} {address-level1} {address1} {address2}

+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-:+:-+:-+:-+:-+:-+

入力内容を保存したら再度お問い合わせを送信し、自分のメールフォームより受信したメールの内容を確認しましょう。


管理者宛メール内容

管理者宛メール内容


送信者宛メール内容

送信者宛メール内容


入力した件名や本文が表示され、また変数で記入した部分にフォームの入力内容が反映されていればチュートリアルの目標は達成です。

フォームに項目を追加する

目標

お問い合わせフォームに「年齢」という項目を追加しましょう。

解説使用テーマbeginner

Before

After

目次

  1. カスタムフィールドメーカーを使って入力欄を作成する
  2. 追加した項目を入力内容確認画面で表示する
  3. 送信するメールの本文に追加した項目を表示する
  4. 補足:JavaScriptによるバリデート

カスタムフィールドメーカーを使って入力欄を作成する

レベル7「フィールドの入力項目をカスタマイズする①テキストのみ」や、レベル8「フィールドの入力項目をカスタマイズする②テキスト+画像」ではカスタムフィールドメーカーを使ってテキストや画像の入力欄をカスタマイズしてきましたが、a-blog cms では複雑な条件付けが必要なフォームの入力項目についても、カスタムフィールドメーカーを利用して作成することができます。

今回は入力欄の種類について、セレクトボックスで実装していきましょう。作成モードはデフォルトの「カスタムフィールド」のまま、以下のように入力してソースを生成します。

入力欄の種類セレクトボックス
タイトル年齢
フィールドage
選択項目10歳未満10歳未満
10代10代
20代20代
30代30代
40代40代
50代50代
60歳以上60歳以上


<table class="acms-admin-table-admin-edit">
  <tr>
    <th>年齢</th>
    <td><select name="age" class="acms-admin-form-width-full">
        <option value=""></option>
        <option value="10歳未満" {age:selected#10歳未満}>10歳未満</option>
        <option value="10代" {age:selected#10代}>10代</option>
        <option value="20代" {age:selected#20代}>20代</option>
        <option value="30代" {age:selected#30代}>30代</option>
        <option value="40代" {age:selected#40代}>40代</option>
        <option value="50代" {age:selected#50代}>50代</option>
        <option value="60歳以上" {age:selected#60歳以上}>60歳以上</option>
      </select>
      <input type="hidden" name="field[]" value="age"></td>
  </tr>
</table>

この作業で生成された入力用ソースは上記になります。

一般的なカスタムフィールドを設置する際はソースの生成は以上になりますが、フォームを作成する場合はこの限りではありません。場合によっては、入力を必須にしたい項目や最大文字数などを設定したい項目が出てくるかと思います。そのような時は、オプション機能を利用することで入力情報を精査することができます。



「選択項目」の下部に表示されている「オプション」をクリックすると、入力チェック項目について指定するボックスが表示されます。今回は試しに「必須(required)」を指定してみましょう。

入力チェック必須(required)
メッセージ年齢を選択してください

「値」の項目は、入力チェックを「最大文字数」などと設定した際に、その文字数(例:400 など)を指定するためのものです。今回は入力チェックに「必須」を設定したので空欄にしておきます。

オプションを指定して再度 [生成] をクリックすると、下記のようなソースが表示されます。

<table class="acms-admin-table-admin-edit">
  <!-- 先ほど生成したソースコードの下に生成されます -->
  <tr>
    <th>年齢</th>
    <td><select name="age" class="acms-admin-form-width-full">
        <option value=""></option>
        <option value="10歳未満" {age:selected#10歳未満}>10歳未満</option>
        <option value="10代" {age:selected#10代}>10代</option>
        <option value="20代" {age:selected#20代}>20代</option>
        <option value="30代" {age:selected#30代}>30代</option>
        <option value="40代" {age:selected#40代}>40代</option>
        <option value="50代" {age:selected#50代}>50代</option>
        <option value="60歳以上" {age:selected#60歳以上}>60歳以上</option>
      </select>
      <input type="hidden" name="field[]" value="age">
      <input type="hidden" name="age:v#required" id="age-v-required" value="">
      <!-- BEGIN age:validator#required -->
      <p class="acms-admin-text-error">年齢を選択してください。</p>
      <!-- END age:validator#required -->
    </td>
  </tr>
</table>

先ほど生成したソースと見比べてみると、td タグ内末尾に下記のバリデーターが追記されていることがわかりますね。このバリデーターによって入力チェックが行われます。

<input type="hidden" name="age:v#required" id="age-v-required" value="">
<!-- BEGIN age:validator#required -->
<p class="acms-admin-text-error">年齢を選択してください</p>
<!-- END age:validator#required -->

では、生成した入力用ソースをテンプレートに追記していきましょう。お問い合わせページに関するテンプレートは contact フォルダにまとめられており、その中でもフォームに関わるものは form フォルダで管理されています。以下はそれぞれのテンプレートの説明です。

/contact/form

step.htmlページの表示状況に合わせて、フォームの上部に「1.内容の入力」「2.内容の確認」「3.送信完了」の見出しを表示するためのテンプレートです。

1.入力の内容 2.内容の確認 3.送信完了

ページの表示状況


input.htmlページの表示状況が「1.内容の入力」の時に表示するテンプレートです。新規項目の入力ソースについてはこのテンプレートに追記します。
confirm.htmlページの表示状況が「2.内容の確認」の時に表示するテンプレートです。新規項目の出力ソースについてはこのテンプレートに追記します。
main.htmlstep.html input.html confirm.html を総括するテンプレートです。

カスタムフィールド メーカーで生成したフォームの入力用ソースを記述するテンプレートは input.html になります。では早速、該当のファイルを開いて先ほどの入力用ソースを追記しましょう。テンプレート内の一番最後にコピー&ペーストしてください。

/contact/form/input.html

省略
</ul>

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>年齢</th>
    <td><select name="age" class="acms-admin-form-width-full">
        <option value=""></option>
        <option value="10歳未満" {age:selected#10歳未満}>10歳未満</option>
        <option value="10代" {age:selected#10代}>10代</option>
        <option value="20代" {age:selected#20代}>20代</option>
        <option value="30代" {age:selected#30代}>30代</option>
        <option value="40代" {age:selected#40代}>40代</option>
        <option value="50代" {age:selected#50代}>50代</option>
        <option value="60歳以上" {age:selected#60歳以上}>60歳以上</option>
      </select>
      <input type="hidden" name="field[]" value="age">
      <input type="hidden" name="age:v#required" id="age-v-required" value="">
      <!-- BEGIN age:validator#required -->
      <p class="acms-admin-text-error">年齢を選択してください。</p>
      <!-- END age:validator#required -->
    </td>
  </tr>
</table>

お問い合わせフォームに年齢の項目が追加されました。



またセレクトボックスで何も選択しないまま [送信内容の確認へ] のボタンをクリックすると、バリデーターの挙動を確認することができます。先ほどカスタムフィールドメーカーで入力した「年齢を選択してください」が注意文として表示されたら成功です。



最後に仕上げとして既存のフォームに習ってスタイルを整えていきましょう。

構造や変数などは保持したまま、タグやクラスを書き換えると以下のようになります。また場所についても、フォーム全体を含む ul タグ内に移動してください。

<li class="contact-form-group">
	<p class="contact-form-label"><label for="age">年齢</label><span class="label-required">必須</span></p>
	<div class="contact-form-control">
		<select name="age" class="form-select" name="age">
			<option value="" selected="selected">選択してください</option>
			<option value="10歳未満" {age:selected#10歳未満}>10歳未満</option>
			<option value="10代" {age:selected#10代}>10代</option>
			<option value="20代" {age:selected#20代}>20代</option>
			<option value="30代" {age:selected#30代}>30代</option>
			<option value="40代" {age:selected#40代}>40代</option>
			<option value="50代" {age:selected#50代}>50代</option>
			<option value="60歳以上" {age:selected#60歳以上}>60歳以上</option>
		</select>
			<input type="hidden" name="field[]" value="age">
			<input type="hidden" name="age:v#required" id="age-v-required" value="">
			<!-- BEGIN age:validator#required -->
			<p class="error-text"><span class="acms-icon acms-icon-attention"></span>年齢を選択してください</p>
			<!-- END age:validator#required -->
	</div> 
</li>


以上で入力欄の作成は完了です。

追加した項目を入力内容確認画面に表示する

さて、年齢の入力欄を設置したところで、一度フォームから記入事項を送信してみましょう。

「必須」と表記のある全ての項目について入力し、[送信内容の確認へ] ボタンをクリックすると、入力内容の確認画面が表示されます。しかし現状では、新規追加項目の「年齢」は表示されていません。



確認画面で年齢を表示させるには、テンプレート confirm.html に出力用ソースを記述する必要があります。

/contact/form/confirm.html

<tr class="contact-form-group">
	<th class="contact-form-label">ご用件</th>
	<td class="contact-form-control">{description}</td>
</tr>

該当テンプレートを開くと、上記の方式でそれぞれの項目の入力事項を出力していることがわかります。記述自体が短く編集しやすい形になっているので、今回はこのソースを型としてコピー&ペーストし、年齢の出力用ソースを作成していきましょう。変更は2箇所です。

  • 「ご用件」を「年齢」へ変更
  • {description} を {age} へ変更

場所については「お客様情報」table 内の一番下に設置します。

<table class="contact-form">
   省略
	<tr class="contact-form-group">
		<th class="contact-form-label">年齢</th>
		<td class="contact-form-control">{age}</td>
	</tr>
</table>

保存をしたら再度フォームから記入事項を送信してみましょう。セレクトボックスで選択した項目が確認画面に表示されていれば成功です。



送信するメールの本文に追加した項目を表示する

サイト内に新設するカスタムフィールドならば以上で作業は終了ですが、フォームのカスタマイズでは送信するメールへの記載も必要になります。現状では、送信されるメールには年齢は表示されていません。


管理者宛メール内容

管理者宛メール内容


一般メール内容

一般メール内容


レベル5「お問い合わせフォームの設定を最適化する」でも記載した通り、フォームのメールの管理はフォーム設定画面で行います。

  1. 管理ボックスから [管理ページ] ボタンをクリックする
  2. サイドメニュー内 [フォーム] をクリックする
  3. リスト内「お問い合わせフォーム」右側の [変更] ボタンをクリックする

下図のようにそれぞれの件名・本文について管理画面で設定していれば、画面内より「一般メール設定」と「管理者宛メール設定」の2箇所を編集します。それらが空欄の場合は a-blog cms のテンプレートを使用することになりますので、作業は該当テンプレート /contact/form/body.html , /contact/form/adminbody.html 内になります。なお、編集場所がどちらの場合でも追記する内容は変わりません。




メール内で「ご住所」を表示している下に「年齢」の記述を追加しましょう。全体像は以下です。

会社名    : {organization}[raw]
お名前    : {family-name}[raw] {given-name}[raw]
メールアドレス: {email}
お電話番号  : {tel}
ご住所    : 〒{postal-code} {address-level1} {address1} {address2}
年齢     : {age}[raw]

設定を保存したら、再びフォームよりメールを送信しましょう。以下のように年齢について表示されていれば、チュートリアルの課題は達成です。


一般メール内容

一般メール内容


管理者宛メール内容

管理者宛メール内容


補足:JavaScriptによるバリデート

今回フォームの入力欄を新設するにあたりバリデータを利用しましたが、a-blog cms ではカスタムフィールドのオプションから指定する方法の他に、JavaScript を使用する方法を用意しています。



双方の主な違いは処理タイミングです。オプションから指定する場合は、サーバー側でエラー検出しているため「送信内容の確認へ」ボタンをクリックした後にエラー判定をしています。一方、JavaScriptを利用したバリデーター機能を使うとブラウザ側で処理できるため、入力していたテキストボックスからカーソルが外れたタイミングでエラー判定することができます。さらに、サーバーにかかる負荷を軽減することもできます。 JavaScriptを利用したバリデーターについては少々発展的な内容になるため、詳しくはJavaScriptによるバリデート | フォーム | ドキュメント | a-blog cms developerをご覧ください。