Login_Subscribe モジュール【~ Ver. 3.0】

この機能は Ver. 3.1 で廃止されました。新しい会員機能についてのドキュメントは以下をご覧ください。

ログイン・会員機能の基本

Login_Subscribe モジュールとは、外部申請によるユーザー登録を行うためのPOSTモジュールです。

Login_Subscribe モジュールを使うことで、サイト閲覧者自身でユーザー登録を行うことができます。これにより、サイト閲覧者に会員登録をしてもらうことを想定した会員制サイトを構築することが可能です。

また、Login_Subscribe モジュールでは、メールアドレスや名前などのユーザーの基本設定だけでなく、ユーザーのカスタムフィールドも登録することが可能です。また、コンフィグ > ログイン設定 > 読者登録機能から登録するユーザーのステータスや権限の設定や、メールアドレスの有効性認証を行うかどうかをカスタマイズできます。

Login_Subscribe モジュールを使ったユーザー登録フォームのカスタマイズについては、以下のドキュメントで詳しく紹介されています。


有効なフィールド(項目)

Login_Subscribe モジュールではユーザーの基本設定のフィールド(項目)とカスタムフィールドのデータを送信できます。基本設定のフィールド(項目)を送信する場合は、 name 属性に `user[]` を、 value 属性に 送信したいフィールド(項目)名を指定した input タグを一緒に記述する必要があります。

<input type="text" name="name" value="{name}" class="acms-form-large validator-result-{name:validator#required}" placeholder="" />
<input type="hidden" name="user[]" value="name" />

<!-- ↓カスタムフィールドも追加できます -->
<input type="text" name="company" value="{company}" class="acms-form-large" />
<input type="hidden" name="field[]" value="company" />


フィールド名(項目) 概要 入力例
name(必須) 登録するユーザーの名前です。 アップルップル
mail(必須) 登録するユーザーのメールアドレスです。 info@example.com
pass(必須) 登録するユーザーのパスワードです。 password
retype_pass(必須) 登録するユーザーのパスワード(確認用)です。 password
code 登録するユーザーのユーザーコードです。 ablogcms
url 登録するユーザーのURLです。 https://example.com
mail_magazine 登録するユーザーがメールマガジンを受信するかどうか(on | off)です。 off

上記のユーザー基本設定に加えて、ユーザーのカスタムフィールドを登録することも可能です。

Login_Subscribe モジュールのサンプルコード

<!-- BEGIN_MODULE Login -->
<form action="" method="post" enctype="multipart/form-data">
  <!-- BEGIN subscribe -->
  <div class="acms-admin-loginBox">
      <div class="acms-admin-siteImageText">新規ユーザー登録</div>

      <!-- BEGIN sendMsg#before -->
      <p class="acms-admin-login-text">登録いただくと指定されたメールアドレスに確認メールが送信されます。メールの内容に従って登録を完了してください。</p>
      <!-- END sendMsg#before -->
      <!-- BEGIN sendMsg#after -->
      <p class="acms-admin-alert acms-admin-alert-info">入力されたメールアドレス宛に、確認用メールを送信しました。</p>
      <!-- END sendMsg#after -->

      <!-- BEGIN_IF [{name:validator#required}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">名前が入力されていません。</p>
      <!-- END_IF -->
      <!-- BEGIN_IF [{mail:validator#required}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">メールアドレスが入力されていません。</p>
      <!-- END_IF -->

      <!-- BEGIN_IF [{mail:validator#email}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">不正なメールアドレスです。</p>
      <!-- END_IF -->
      <!-- BEGIN_IF [{mail:validator#doubleMail}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">すでに登録されているメールアドレスです。</p>
      <!-- END_IF -->
      <!-- BEGIN_IF [{mail:validator#send}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">メールの送信に失敗しました。システムの設定に問題があります。システムの管理者にお問い合わせください。</p>
      <!-- END_IF -->
      <!-- BEGIN_IF [{pass:validator#required}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">パスワードが入力されていません。</p>
      <!-- END_IF -->
      <!-- BEGIN_IF [{pass:validator#password}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">不正なパスワードです。別のパスワードを入力ください。</p>
      <!-- END_IF -->
      <!-- BEGIN_IF [{retype_pass:validator#equalTo}/eq/0] -->
      <p class="validator-result-0 acms-admin-alert acms-admin-alert-danger">パスワードが一致しません。</p>
      <!-- END_IF -->

      <div class="acms-admin-form">
        <label class="acms-admin-form-block acms-admin-clear">名前</label>
        <input type="text" name="name" value="{name}" class="acms-admin-form-large  validator-result-{name:validator#required}" placeholder="" />
        <input type="hidden" name="user[]" value="name" />

        <label class="acms-admin-form-block acms-admin-clear">メールアドレス</label>
        <input type="text" name="mail" value="{mail}" class="acms-admin-form-large  validator-result-{mail:validator#required} validator-result-{mail:validator#email} validator-result-{mail:validator#doubleMail} validator-result-{mail:validator#send}" placeholder="" />
        <input type="hidden" name="user[]" value="mail" />

        <label class="acms-admin-form-block acms-admin-clear">パスワード</label>
        <div class="js-password_strength">
          <input type="password" name="pass" value="{pass}" class="js-input acms-admin-form-large validator-result-{pass:validator#required} validator-result-{pass:validator#password}" autocomplete="off" />
          <input type="hidden" name="user[]" value="pass" />
          <div>
            <div class="js-meter acms-admin-password-strength-meter acms-admin-form-width-full"></div>
          </div>
          <span class="js-label acms-admin-password-strength-label" aria-live="assertive"></span>
        </div>

        <label class="acms-admin-form-block acms-admin-clear">パスワード(確認)</label>
        <input type="password" name="retype_pass" value="{retype_pass}" class="acms-admin-form-large validator-result-{retype_pass:validator#equalTo}" autocomplete="off" />
        <input type="hidden" name="user[]" value="retype_pass" />
      </div>
      <!-- BEGIN passwordPolicyMessage:veil -->
      <p class="acms-admin-text-danger">{passwordPolicyMessage}</p>
      <!-- END passwordPolicyMessage:veil -->
      <!-- BEGIN submit -->
      <p class="loginAction">
        <button type="submit" class="acms-admin-btn-admin acms-admin-btn-admin-primary acms-admin-btn-block acms-admin-btn-large" name="ACMS_POST_Login_Subscribe"><!--T-->読者登録<!--/T--></button>
      </p>
     <!-- END submit -->
    </div>
  <!-- END subscribe -->
</form>
<!-- END_MODULE Login -->

エラー時の表示

Login_Subscribe モジュールで何らかのエラーが起きた場合には以下のフィールド(項目)がバリデーションエラーとして表示されます。



フィールド(項目)名 オプション名 概要
name required ユーザーの名前が入力されていない場合に発生するエラー
mail required ユーザーのメールアドレスが入力されていない場合に発生するエラー
mail email ユーザーのメールアドレスの形式が間違っている場合に発生するエラー
mail doubleMail 入力されたメールアドレスで登録されたユーザーが既に存在する場合に発生するエラー
mail send 読者登録メールの送信に失敗した場合に発生するエラー
pass required ユーザーのパスワードが入力されていない場合に発生するエラー
pass password ユーザーのパスワードがコンフィグで設定したパスワードポリシーに違反している場合に発生するエラー
retype_pass equalTo ユーザーのパスワード(確認用)が入力されたパスワードと一致しない場合に発生するエラー
code regex ユーザーコードが不正な形式である場合に発生するエラー
code doubleCode 入力されたコードで登録されたユーザーが既に存在する場合に発生するエラー
url url ユーザーのURLの形式が間違っている場合に発生するエラー
login isOperable コンフィグ > ログイン設定 > 読者登録機能のユーザー登録の外部申請が無効になっている場合に発生するエラー

自動送信メールで使用できる変数

Login_Subscribe モジュールで送信された自動送信メールでは以下の変数が利用できます。



変数名 概要
uid 作成されたユーザーのユーザーIDです。
name 作成されたユーザーの名前です。
mail 作成されたユーザーのメールアドレスです。
code 作成されたユーザーのユーザーコードです。
url 作成されたユーザーのURLです。
subscribeUrl メールアドレスの有効性認証ための認証URLです。

Login_Tfa_Recovery モジュール【~ Ver. 3.0】

この機能は Ver. 3.1 で廃止されました。新しい会員機能についてのドキュメントは以下をご覧ください。

ログイン・会員機能の基本

Login_Tfa_Recovery モジュールとは、リカバリーコードを活用して2段階認証を無効にするための POST モジュールです。

このページは Login_Tfa_Recovery モジュールについてのドキュメントです。2段階認証の設定方法については以下をご確認ください。


有効なフィールド(項目)

Login_Tfa_Recovery モジュールで有効なフィールド(項目)について説明します。以下のフィールド(項目)が送信できます。

また、Login_Tfa_Recovery モジュールで送信するフィールド(項目)は name 属性に login[] を、 value 属性に 送信したいフィールド(項目)名を指定した input タグを一緒に記述する必要があります。

<input type="password" name="recovery" value="{recovery}"  class="acms-admin-form-large  validator-result-{recovery:validator#auth}" autocomplete="off" />
<input type="hidden" name="login[]" value="recovery" />


フィールド名(項目) 概要 入力例
mail 2段階認証を無効化するユーザーのメールアドレス info@example.com
pass 2段階認証を無効化するユーザーのパスワード password
recovery リカバリコード aaaaaaaa

Login_Tfa_Recovery モジュールのサンプルコード

<!-- BEGIN_MODULE Login -->
<form action="" method="post" enctype="multipart/form-data">
  <!-- BEGIN recovery -->
  <div class="acms-admin-loginBox clearfix">
      <div class="acms-admin-siteImageText">ログイン</div>
      <div class="acms-admin-form">
        <p class="validator-result-{pass:validator#auth} acms-admin-alert acms-admin-alert-danger">ユーザーIDまたはパスワードが違います。</label>
        <p class="validator-result-{recovery:validator#auth} acms-admin-alert acms-admin-alert-danger">正しいリカバリーコードを入力してください。</label>
        <p class="validator-result-{mail:validator#lock} acms-admin-alert acms-admin-alert-danger">{trialNumber}回ログインに失敗したため、アカウントがロックされました。{lockTime}分後にもう一度試してください。</p>

        <label class="acms-admin-form-block acms-admin-clear">ユーザーID / メールアドレス</label>
        <input type="text" name="mail" value="{mail}" class="acms-admin-form-large validator-result-{pass:validator#auth}” id="input-text-mail" placeholder="" />
        <input type="hidden" name="login[]" value="mail" />

        <label class="acms-admin-form-block">パスワード</label>
        <input type="password" name="pass" value="{pass}"  class="acms-admin-form-large  validator-result-{pass:validator#auth}" placeholder="" />
        <input type="hidden" name="login[]" value="pass" />

        <label class="acms-admin-form-block">リカバリーコード</label>
        <input type="password" name="recovery" value="{recovery}"  class="acms-admin-form-large validator-result-{recovery:validator#auth}" placeholder="" />
        <input type="hidden" name="login[]" value="recovery" />
      </div>
      <p class="loginAction">
        <button type="submit" class="acms-admin-btn-admin" name="ACMS_POST_Login_Tfa_Recovery">2段階認証を無効化</button>
      </p>
    </div>
  <!-- END recovery -->
</form>
<!-- END_MODULE Login -->

2段階認証の無効化に成功すると Login モジュールの auth ブロック内で tfaRecovery という変数が利用できます。以下のようにテンプレートを記述することで2段階認証の無効化に成功したことを表示できます。

<!-- BEGIN_IF [{tfaRecovery}/eq/on] -->
<p class="validator-result-0 acms-admin-alert acms-admin-alert-info">2段階認証を無効化しました</p>
<!-- END_IF -->

エラー時の表示

Login_Tfa_Recovery モジュールで何らかのエラーが起きた場合には以下のフィールド(項目)がバリデーションエラーとして表示されます。



フィールド(項目)名 オプション名 概要
pass auth コンフィグ > アクセス設定 > ログイン制限で設定した制限に引っかかった場合に発生するエラー
mail lock コンフィグ > ログイン設定 > アカウントロックで設定した、パスワード認証の再試行制限に引っかかった場合に発生するエラー
recovery auth 間違ったリカバリーコードを送信した場合に発生するエラー

GIF画像をアップロードできない

メディア機能などで、PNGやJPEGはアップロードできるが、GIF画像がアップロードできない現象が起こる場合があります。

これは、画像エンジンに GD を使用していて、WebP画像 をサポートしている場合に、サーバー環境によって、GIF画像からWebP画像が生成できずにエラーが出てしまうためとなります。

対策1: GDではなく、ImageMagick に変更する

対策の1つとして、画像エンジンを GD ではなく、ImageMagick に変更する方法があります。(デフォルトは ImageMagick
private/config.system.yaml に以下の記述をすることで、画像エンジンを GDからImageMagickに変更できます。

image_magick : on

注意点として、サーバー環境によっては、ImageMagickを利用できない環境もあります。利用できない環境では、上記設定をしても画像エンジンは GD のままとなります。

対策2:WebP画像サポートをやめる

もう一つの対策は、WebP画像サポートをやめることです。 private/config.system.yaml に以下記述をすることで、WebP画像の生成をやめることができます。

webp_support: off

エントリーなどの編集作業を行なっても、古い情報が表示される場合がある

キャッシュの影響が考えられます。キャッシュドライバーに「APCu」を選択している場合、サーバー環境によってはPHPプロセス毎にキャッシュが確保されてしまい、古いキャッシュが返ってきてしまう問題を確認しています。たとえば、XSERVERの「Xアクセラレーター Ver. 1」や「Xアクセラレータオフ」 を選択している場合(Xアクセラレーター Ver. 2 は大丈夫です)、この環境となります。

このような環境の場合、「.env」ファイルを修正して「APCu」ドライバーを使わないように修正をお願いします。

# テンプレートのキャッシュをするドライバーを選択します
CACHE_TEMPLATE_DRIVER=file
CACHE_TEMPLATE_NAMESPACE=template
CACHE_TEMPLATE_LIFETIME=2678400

# フィールド情報のキャッシュをするドライバーを選択します
CACHE_FIELD_DRIVER=file
CACHE_FIELD_NAMESPACE=field
CACHE_FIELD_LIFETIME=86400

# 一時キャッシュで利用するドライバーを選択します
CACHE_TEMP_DRIVER=memory
CACHE_TEMP_NAMESPACE=temp
CACHE_TEMP_LIFETIME=10800

静的HTMLサイトからCMSのテーマを作ってみよう 4「子ブログ編」


はじめに

「静的HTMLサイトからCMSのテーマを作ってみよう」では、静的HTMLファイルをa-blog cmsで利用できるようなテンプレートファイルに編集し、最終的には1つのオリジナルテーマを作成していきます。

このコンテンツについては

を完了した後にご覧ください。

またチュートリアルの実践環境として、本編ではローカルサーバー http://localhost を使用して説明しておりますが、以下のフォームから実際に作業をするサーバーのURLを入れていただく事で、文中のテキストを希望のURLに書き換えることができます。ぜひご活用ください。

子ブログとは

a-blog cms のブログは、階層化されたブログシステムになり、親は子のブログを管理する権限を持たせる事ができ、子は親にアクセスする権限はありません。

子ブログと書くことが多いですが、子の下階層である孫ブログのように、さらに下階層や、その下にもブログを作ることは可能です。

http://localhost/ko-blog/mago-blog/cagegory/ko-cagtegory/entry.html

このように URL は表現されます。

サイトの設計側はブログなのか、カテゴリーなのか分かっていますが、サイトを閲覧している人は、どちらもディレクトリーであり、区別がつくものではありません。

カテゴリーを子ブログに変更する

まずは「お知らせ」の子ブログを作成していきます。現在 news というコードはお知らせカテゴリーで使われており、新しく作成する子ブログのコードには使用することができません。そのため、まずはお知らせのカテゴリーコード news を変更します。

管理ページより カテゴリー設定画面 にアクセスして、「news」を「news-delete」と変更してください。 エントリーを移設後は削除予定です。



次に ブログ管理の画面 より、右上にある緑色の 子ブログを作成 ボタンをクリックして、新規ブログ作成画面を表示させます。



名前を「お知らせ」とし、コードネームを「news」に設定ください。



以上でお知らせブログが作成できました。URLは http://localhost/news/ になります。 ブログ管理の画面でブログ間の移動は可能ですが、管理画面の左上にあるブログ名をクリックすると、親ブログと子ブログを切り替えることも可能です。



継承したテーマを作成&設定する

新しく作成した「お知らせ」の子ブログには、初期設定として blog テーマが設定されています。このテーマを変更して、親ブログで利用されている sample のような、お知らせブログ専用のテーマを作成し設定します。



この場合、sample と似たデザインや機能を持つテーマを作ることになり、その事を「テーマの継承」と呼びます。今回、お知らせの子ブログのテーマは、sample を継承した子テーマ news@sample という名前で用意します。

この継承機能を利用すると、 news@sample に無いファイルは sample を利用することになり、お知らせ子ブログ側のテーマのテンプレート数を減らし、メンテナンス時も1つ修正すればいいことになります。

/themes/news@sample を作成してください。



その後、お知らせブログのテーマ設定 より、テーマディレクトリ名を「news@sample」を選択し、テンプレート設定の テンプレート選択ファイル(template.yaml)の値を優先する のチェックを外します。

template.yaml が利用されないので、下部のテンプレートファイル指定が有効になりますので、以下のように設定します。 今回の子ブログ「お知らせ」では、特別なトップページを用意せず、一覧ページと同様のトップページとしますので、_top.html ではなく index.html をトップページのテンプレートとして指定しています。

種類ファイル名今回の作業
トップページindex.html修正
一覧ページindex.html
詳細ページ_entry.html修正
エラーページ(404 Not Found)404.html
管理ページadmin.html
エントリー編集ページ_entry.html修正
ユニット追加ページ_entry.html修正
ログインページlogin.html


エントリーを移行する

親ブログ内にある「お知らせ」のエントリーをまとめて子ブログ側に移動します。親ブログのエントリー管理画面から絞り込み機能を利用して、「お知らせ」エントリーを一覧表示してください。

  1. カテゴリーを選択
  2. 検索ボタンをクリック
  3. 一番上のチェックボックスをクリック
  4. チェックボックスの上のプルダウンを「ブログ」に設定
  5. 横にプルダウンが表示されるので「お知らせ」を選択
  6. 変更ボタンをクリック


以上でエントリーの移行は完了です。「お知らせ」の子ブログに移動すると、エントリーの情報が表示されているのが確認できます。

トップページに子ブログの情報を表示させる

この段階でトップページにアクセスすると、お知らせのカテゴリーを表示させる設定になっていたモジュールID の設定では表示ができなくなります。



管理ページ / モジュールID を開き、モジュールID top_headline の条件設定を開きます。



引数のカテゴリーIDの「お知らせ」を削除し、ブログの「お知らせ」を選択します。これで再度、トップページを開くと「お知らせ」の一覧が表示されるようになります。

親ブログのモジュールIDを子ブログでも利用する

ナビゲーション

お知らせの一覧や詳細ページにアクセスすると、ヘッダーやナビゲーション、フッターの情報が消えていることが確認できます。a-blog cms の情報は、上層のブログは下層のブログのデータを利用することはできますが、下層のブログ(子ブログ)は親のモジュールIDが見えません。



お知らせ」の子ブログのモジュールIDの一覧にアクセスしてみると、何もないことが確認できます。



次に、親ブログのモジュールIDの一覧にアクセス、グローバルナビゲーション id="nav_global" の条件設定を開いて、グローバル「下の階層のブログが利用することを許可する」にチェックをつけ保存します。



こうすることで、親のモジュールID は子での利用が許可され、表示されるようになります。



トピックパス

トピックパスには「お知らせ」しか表示されておらず、本来は HOME > お知らせ という表示でいて欲しいところです。グローバルナビゲーション id="nav_global と同様にグローバルのチェックだけつけても、今回は思ったように表示してくれません。

条件設定

カテゴリーの階層設定について「下層のカテゴリーも含める」という設定を以前行なっていますが、ブログも階層構造になっていますので、同様に「下層のブログも含める」設定に変更してください。



表示設定

階層設定に 1 が設定されていることから、親ブログしか表示できていません。表示できる階層数を増やすか、空にして全階層を表示させる設定にします。



これで、 ブログ名 > 子ブログ名 > エントリー名と表示できるようになりました。



試しに、子ブログ内に、カテゴリーと子カテゴリーを作成し、エントリーを用意して階層が表示されるかもテストしておいた方がいいかもしれません。



このようにブログの階層構造と、カテゴリーの階層構造を自動的にリンクを生成します。

ブログフィールドをモジュールIDを設定する

親ブログのページと比べて、残り表示ができていないのは、ヘッダーとフッターのカスタムフィールドが表示できていません。



カスタムフィールドの表示は、ブログフィールドで表示させていますが、これにモジュールIDを設定し、グローバルの設定を行います。 ここで大事なのは、ブログID に親ブログを設定しておくことです。



<!-- BEGIN_MODULE Blog_Field id="global" -->
<div class="header-logo">
  <div>
    <h1 class="site-name"><a href="index.html">
        <img src="%{MEDIA_ARCHIVES_DIR}{site-icon@path}" alt="{site-name}" class="site-logo"><span
          class="siteNameText">{site-name}</span></a>
    </h1>
  </div>
</div>
<!-- END_MODULE Blog_Field -->

フッターにあるブログフィールドモジュールにも同様に id="global" を設定します。

シークレットブログについて

ブログのステータスとして、公開(利用する)・非公開(利用を停止する)以外に、シークレットという設定が存在します。この設定にすることでログインしていないと閲覧できない会員制コンテンツを作ることができます。



会員は、シークレットブログ上に作成し、権限を読者に設定することでエントリーを作ることはできない閲覧専用のユーザーとして運用が可能です。また、読者ユーザーはライセンスのユーザー数に含まれず、読者登録の機能も標準で用意されています。設定は、コンフィグのログイン設定をご覧ください。



グローバルカテゴリーについて

今回は「お知らせ」の子ブログということで、設定しませんでしたが、例えば多店舗展開のウェブサイトを作る際には、店舗ブログ毎にカテゴリーを作るのではなく、親ブログ側のカテゴリーをモジュールIDのようにグローバル化することが可能です。



これで、親ブログ側で各店舗の特定のカテゴリーの新着を簡単に表示するモジュールIDを作ることができるようになります。

コンフィグセットについて

コンフィグの管理画面にアクセスすると、毎回「このブログの初期コンフィグ」を選択していましたが、このコンフィグは増やしたり、再利用が可能になっています。



(コンフィグセットの作成)で、名前をつけたコンフィグセットを作ることができ、これもグローバル化することで、子ブログでコンフィグを共有できるようになります。



子ブログ「お知らせ」のブログ管理の画面で選択できるようになりました。あまり「お知らせ」では使うことはないかもしれませんが、多店舗ブログのような店舗ブログを作るたびに各設定を細かくすることなく、このコンフィグセットを選択するだけで他の店舗と同じ設定にすることができます。



さらに、カテゴリーにもコンフィグセットの設定は存在しています。 こちらも、うまく活用すると便利なこともあります。



最後に

今回は、ブログの階層化をメインに、他のブログで設定を再利用するグローバル化について紹介しました。これで、カテゴリーであった「お知らせ」を、子ブログで管理できるようにし、子ブログ用の子テーマ news@sample の実装が完了したことになります。

Twitterで「子ブログ編」完了をシェアする