Validatorの拡張

拡張アプリでのValidatorの拡張の仕方を見ていきます。名前空間・クラス名に気をつけましょう。

ファイル名は任意ですが、わかりやすくする為、Validator.php とします。

例: extension/plugins/SamplePlugin/Validator.php

<?php

namespace Acms\Plugins\SamplePlugin;

class Validator
{
    /**
     * sample
     * バリデーターのサンプルメソッド
     *
     * @param  string $val - その変数の値
     * @param  string $arg - <input type="hidden" name="var:v#sample" value="ここの値">
     * @return boolean     - 入力が正しい場合は "true" そうでない場合は "false" を返す
     */
    function sample($val, $arg)
    {
        /**
         * 例:
         * <input type="text" name="var" value="{var}">
         * <input type="hidden" name="field[]" value="var">
         * <input type="hidden" name="var:v#sample" value="cms">
         *
         * <!-- BEGIN var:validator#sample -->
         *   <p class="acms-admin-text-error">cmsという文字列を含めてください。</p>
         * <!-- END var:validator#sample -->
         *
         * {var}の中は,'a-blogcms' とする
         */

        // name="var:v#sample" value="cms" で指定した
        // 文字列が含まれていなかったらエラーを出す
        return (strpos($val, $arg) !== false);
    }
}

ServiceProviderの設定

これだけでは、通常の拡張方法と違い動作しません。動作させるためには、このクラスのオブジェクトをa-blog cmsに登録する必要があります。

ServiceProviderでValidator実装クラスを登録する

拡張アプリの基本で作成した ServiceProviderに少し手を加えます。

<?php

namespace Acms\Plugins\SamplePlugin;

use ACMS_App;
use Acms\Services\Common\ValidatorFactory;

class ServiceProvider extends ACMS_App
{
    /* 省略... */

    /**
     * サービスの初期処理
     */
    public function init()
    {
        $validator = ValidatorFactory::singleton();
        $validator->attach('SampleValidator', new Validator);
    }

    /* 省略... */
}

ポイント

Acms\Services\Common\ValidatorFactory のオブジェクトを

ValidatorFactory::singleton();

で取得して 先ほど作成した Acms\Plugins\SamplePlugin\Validatorattach します。

  • 第一引数: 被らないような任意の文字列
  • 第2引数: 実装クラスのオブジェクト

これで拡張アプリをインストールすれば、Validator.php で実装したValidatorが利用できるようになります。

Ver. 3.0.24 フィックスバージョンリリースのお知らせ


2023年04月19日にリリースした Ver. 3.0.24 の修正内容についてご紹介いたします。

現在お困りの問題に該当する項目がありましたら、お早めにバージョンアップのご検討をお願いいたします。

Ver. 3.0.24 リリースノート

変更点

  • CMS-6348 モジュール用のキャッシュを追加
  • CMS-6331 メールライブラリを変更 swiftmailer -> symfony/mailer & メールのISO-2022-JP文字コードを廃止

不具合修正

  • CMS-6332 変数表に {date#j} (先頭にゼロをつけない日)がない問題を修正
  • CMS-6334 デフォルトのキャッシュ設定で、APCuを除外
  • CMS-6337 IPアドレスによる権限制限している場合、許可IP以外からだとプレビュー共有URLによるプレビューができない問題を修正
  • CMS-6338 フォームで、UTF-8設定でも文字によっては、文字化けしてしまう問題を修正
  • CMS-6339 コンフィグセットがグローバルだと保存できない場合がある問題を修正
  • CMS-6342 http以外へのリダイレクトで必ずポート番号前のコロンが入った形でリダイレクトされる問題を修正
  • CMS-6344 各種エクスポート機能利用時にメモリ不足によりダウンロードできない場合がある問題の修正
  • CMS-6346 .htaccess のアセットのキャッシュ・セキュリティ設定がデフォルトだと動作しないサーバーがある問題を修正
  • CMS-6349 PHP8.1 の環境で、メイン画像に設定した画像ユニットの配置を非表示に設定した場合、メイン画像を表示するモジュールでPHPエラーが発生する問題の修正
  • CMS-6350 Entry_Calendar モジュールの foreSpacer ブロック及び、rearSpacer ブロックにY-m-d形式の日付 を表示する変数を追加(prevDate, nextDate)
  • CMS-6351 .htaccessの css, jsの圧縮設定のタイプミスを修正 DEFLAT -> DEFLATE
  • CMS-6341 CKEditorのアップデート(v4.8.0 -> v4.21.0)

主なリリースノート内容

CMS-6348 モジュール用のキャッシュを追加

今まではモジュール関係のキャッシュも一時キャッシュを利用していましたが、今回モジュール専用のキャッシュを用意いたしました。
モジュールID化してキャッシュを設定した場合 や、Feed_ExListモジュールやJson_2Tplなどの外部アクセスが必要なモジュールでも利用されます。特にカスタマイズや操作で意識する必要はございません。

キャッシュのドキュメント

https://developer.a-blogcms.jp/document/cache/

CMS-6331 メールライブラリを変更 swiftmailer -> symfony/mailer & メールのISO-2022-JP文字コードを廃止

メールライブラリを変更

使用していたメールライブラリの「swiftmailer」の開発が終わっているため、代替として「symfony/mailer」に切り替えを行いました。

メールのISO-2022-JP文字コードを廃止

メールライブラリが変更になったタイミングにより「ISO-2022-JP」文字コードでのメール送信を廃止し「UTF-8」のみに変更しました。 現在はUTF-8が見れないメーラーソフトもほぼなくなり、「ISO-2022-JP」では表示できない文字も多くあるため、この変更となりました。

CMS-6334 デフォルトのキャッシュ設定で、APCuを除外

デフォルトの「テンプレート」「フィールド」「一時」キャッシュでは、「APCuキャッシュドライバ」を利用するようになっておりました。 ただし、一部レンタルサーバーによっては、このAPCuのキャッシュが古いキャッシュを返すことがあることが判明したため、デフォルトのキャッシュを「ファイルキャッシュドライバ」もしくは「メモリキャッシュドライバ」に変更しました。

変更前

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

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

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

変更後

# テンプレートのキャッシュをするドライバーを選択します
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

参考リンク

XSERVERでエントリーを編集したのに古い情報が表示される(a-blog cms Ver. 3.0系)

CMS-6341 CKEditorのアップデート(v4.8.0 -> v4.21.0)

wysiwygエディタのライブラリであるCKEditorを、セキュリティ上の理由から「v4.8.0」から「v.4.21.0」にアップデートしました。 CKEditorをご利用の場合は、お手数ですがバージョンアップをご検討ください。


最後に

該当する問題がありましたら、お早めにバージョンアップのご検討をお願いいたします。また、迅速にご報告いただいたユーザーの皆さま、誠にありがとうございました。

今後もご報告いただいた内容に対して真摯に受け止め修正と改善を行ってまいります。 今後ともどうぞよろしくお願いいたします。

テンプレートの挿入

拡張アプリで様々な拡張をする場合、プログラムだけではなく管理ページを拡張したい場合があると思います。例えば、モジュールID化したいため、モジュール選択肢のテンプレートを拡張したい、拡張アプリ用の管理画面ページ(コンフィグページ)を作りたいなどです。

テンプレートの挿入方法

テンプレートを挿入するためには、ServiceProviderの initメソッド で 挿入処理を書く必要があります。

例: extension/plugins/SamplePlugin/ServiceProvider.php

<?php

namespace Acms\Plugins\SamplePlugin;

use ACMS_App;
use Acms\Services\Common\InjectTemplate;

class ServiceProvider extends ACMS_App
{
    /* 省略... */

    /**
     * サービスの初期処理
     */
    public function init()
    {
        $inject = InjectTemplate::singleton();
        $inject->add('admin-module-select', PLUGIN_DIR . 'SamplePlugin/template/module-select.html');
    }

    /* 省略... */
}

ポイント

Acms\Services\Common\InjectTemplate のオブジェクトを

$inject = InjectTemplate::singleton();

で取得して addメソッド でテンプレートを挿入します。

$inject->add('挿入先', 'テンプレートのパス');
  • 第一引数: 挿入先の識別子
  • 第2引数: 挿入するテンプレートパス(PLUGIN_DIR定数 を使うと便利です)

挿入先の仕込み

テンプレートはどこでも挿入できるわけではなく、挿入先に仕込みがされています。

例えば、モジュールIDのセレクトの選択肢のテンプレート(themes/system/admin/module/select.html)を見ると以下のような記述があります。

<!-- BEGIN_MODULE Admin_InjectTemplate id="admin-module-select" --><!-- END_MODULE Admin_InjectTemplate -->

この Admin_InjectTemplateモジュールid に指定されている識別子が、テンプレートを挿入するときに使う Acms\Services\Common\InjectTemplateaddメソッド の第一引数に指定されます。

挿入先一覧


識別子 挿入先パス 説明
admin-main themes/system/admin.html 管理ページのメインHTMLを追加
admin-action themes/system/admin/action.html アクションボックスに追加
admin-topicpath themes/system/admin/topicpath-list.html 管理画面のトピックパスを追加
admin-module-select themes/system/admin/module/select.html モジュールIDの選択肢を追加
admin-module-config-%{MODULE_NAME} themes/system/admin/module/edit.html モジュール編集ページに追加。%{MODULE_NAME} はモジュール名に変更する。
例: Sampleモジュール -> admin-module-config-Sample
admin-form themes/system/admin/form/edit.html フォームID編集ページに追加
admin-entry-field themes/system/admin/entry/edit.html エントリーのカスタムフィールドを追加
admin-entry-field-foot themes/system/admin/entry/edit.html エントリーのカスタムフィールドを追加
admin-category-field themes/system/admin/category/edit.html カテゴリーのカスタムフィールドを追加
admin-blog-field themes/system/admin/blog/edit.html ブログのカスタムフィールドを追加
admin-user-field themes/system/admin/user/edit.html ユーザーのカスタムフィールドを追加