直接表示させないテンプレートを指定する

a-blog cmsは静的なHTMLと同じようにテーマを作成できる特徴を持っているため、とくに考えずに実装すると「同じ表示のページが複数存在してしまう」という問題が出てきます。

例えばa-blog cmsでサイト構築した場合、サイトトップのテンプレートを「top.html」にすることは多いかと思います(※テーマ設定で指定できるテンプレートファイルのこと)。

もちろん、「https://example.com/」のURLでページを開いたときに「top.html」がトップページとして動的に表示されるのですが、静的なHTMLと同じようにテーマを作成できる特徴を持っているため「https://example.com/」と「https://example.com/top.html」のURLでページを開いたときにはどちらも同じコンテンツが表示されます。



上記の例のように同じコンテンツが複数のURLで表示されることが問題になる場合があります。対応策としては、top.html にアクセスがあった場合、301リダイレクトをして正規化する事が考えられますが、a-blog cmsの機能で404を表示させることが可能です。この記事では直接表示させないテンプレートを指定する方法をご紹介します。

直接表示させないテンプレートのファイルの命名規則を作る

テンプレートのファイル名やディレクトリ名の命名規則により、URLにアクセスしたときにテンプレートを直接表示させないことができます。

例: top.html を直接表示させない

1.まずは命名規則の設定を行います。「private/config.system.yaml」に次の記述を追加します。

forbid_direct_access_tpl  : /^_/

「forbid_direct_access_tpl」という項目では、ファイル名を正規表現で指定できます。今回の例では、先頭にアンダーバーがつく、ファイル・ディレクトリ以下が直接表示させないファイルまたはディレクトリの対象になります。

2.命名規則を設定したら、対応したいファイルまたはディレクトリを命名規則に合わせてリネームします。例えば、ここでは「top.html」を「_top.html」にリネームします。このとき、「管理ページ > コンフィグ > テーマ設定」でトップページのテンプレートに「top.html」を指定していた場合はこのままでは404になってしまいますので、「top.html」から「_top.html」に変更するのを忘れないでください。

これで完了です。「https://example.com/top.html」「https://example.com/_top.html」とも 404 になることが確認できます。



インクルードファイルの対応

インクルード専用のファイルも直接表示させたくないファイルのため、以下のHTMLタグがないファイルはデフォルトで404になるような仕組みになっています。

  • htmlタグ
  • bodyタグ

そのため、インクルード専用ファイルのファイル名には特別な命名規則は特に対応は必要ありません。

例: https://example.com/include/header.html

たとえば上記のようなURLにアクセスしても、header.htmlはヘッダーパーツのファイルでありhtmlタグやbodyタグはありませんので、ページが404になることが確認できます。

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

レンタルサーバーのXSERVERで、a-blog cms Ver. 3.0.x を動かしている環境で、エントリーを編集したのに、古い情報が表示される問題が確認されております。

原因

キャッシュドライバーの「APCu」が原因で、XSERVERのある特定の環境の場合、キャッシュがPHPプロセス毎にキャッシュされてしまい、ランダムに古い情報が返ってきてしまいます。

再現する環境

  • a-blog cms Ver. 3.0.0 以上
  • キャッシュドライバーに「APCu」を指定している場合(デフォルト)
  • XSERVERの「Xアクセラレータ」が OFFまたは「Ver. 1」の場合

対策1

おすすめの対策は、XSERVERのコントロールパネルにログインし、「Xアクセラレータ Ver. 2」 を有効にする方法です。パフォーマンスもよくなりますので、a-blog cms Ver. 3.0.0 以上をXSERVERでお使いの場合は是非ご利用ください。

対策2

キャッシュドライバーに「APCu」を利用しない方法でも解決できます。「.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

XSERVERは a-blog cms の動作環境としてもお勧めしているサーバー環境ですので、現状お手数ですが a-blog cms Ver. 3.0.0 以上をお使いの場合は、必ず「Xアクセラレータ Ver. 2」を指定するようにお願いいたします。

今後とも a-blog cms をよろしくお願いいたします。

拡張アプリ開発の基本

拡張アプリとして拡張機能を作ることにより、様々な拡張を1パッケージにして、ブログ単位でインストール出来るようになります。

拡張できる機能

  • 校正オプションの拡張
  • フック処理の拡張
  • Validatorの拡張
  • 独自GETモジュールの追加
  • 独自POSTモジュールの追加
  • テンプレートの挿入(テンプレートの拡張)

最低限必要なファイル

拡張アプリを作るためには、以下のファイルが最低限必要になります。

  • extension/拡張アプリのディレクトリ/ServiceProvider.php

このファイルがあれば、最小限の拡張アプリとして成立し、管理画面からインストールもできるようになります。このファイルは、アプリのバージョンや説明やインストール・アップデート時の処理や起動の初期処理を記述できるファイルになっています。詳しく見ていきましょう。

ServiceProvider.php

下のコードは、 ServiceProvider.php の 基本的なコードになります。

<?php

namespace Acms\Plugins\SamplePlugin;

use ACMS_App;

class ServiceProvider extends ACMS_App
{
    /**
     * @var string
     */
    public $version = '1.0.0';

    /**
     * @var string
     */
    public $name = 'SamplePlugin';

    /**
     * @var string
     */
    public $author = 'com.appleple';

    /**
     * @var bool
     */
    public $module = false;

    /**
     * @var bool|string
     */
    public $menu = false;

    /**
     * @var string
     */
    public $desc = 'サンプルのプラグインです。';

    /**
     * サービスの初期処理
     */
    public function init()
    {

    }

    /**
     * インストールする前の環境チェック処理
     *
     * @return bool
     */
    public function checkRequirements()
    {
        return true;
    }

    /**
     * インストールするときの処理
     * データベーステーブルの初期化など
     *
     * @return void
     */
    public function install()
    {

    }

    /**
     * アンインストールするときの処理
     * データベーステーブルの始末など
     *
     * @return void
     */
    public function uninstall()
    {

    }

    /**
     * アップデートするときの処理
     *
     * @return bool
     */
    public function update()
    {
        return true;
    }

    /**
     * 有効化するときの処理
     *
     * @return bool
     */
    public function activate()
    {
        return true;
    }

    /**
     * 無効化するときの処理
     *
     * @return bool
     */
    public function deactivate()
    {
        return true;
    }
}

プロパティ


プロパティ名 説明
$version バージョンを指定します。バージョン表記に決まりはありませんが、セマンティックバージョニングで付けるといいと思います。
$name 拡張アプリの名前を指定します。ここの名前が管理画面に表示されます。特に命名規則はありません
$author 作者を指定します。
$module ここにString(英数字)を指定すると、その名前でモジュールID作成の時、選択肢として表示されます。(非推奨)
$menu ここにString(英数字)を指定すると、そのURLで拡張アプリの管理画面が作成されます。
例: 'sample_index'
URL: /bid/1/admin/app_sample_index/
パス: themes/system/admin/app/sample/index.html
$desc 拡張アプリの詳細を記述します。管理画面で表示されます。

メソッド


メソッド名 説明
init インストールされた場合に動作し初期処理を記述できます。
例えば、Hook処理のバインドやテンプレートの挿入処理、autoloadの設定などに利用します。
checkRequirements インストール前のチェックに利用します。「false」を返すとインストールが出来ません。
install ルートブログのアプリ管理画面からアプリのインストール時に実行されます。データベースの初期化処理などに利用ください。
uninstall ルートブログのアプリ管理画面からアプリのアンインストール時に実行されます。データベースの削除処理などに利用ください。
update 拡張アプリのアップデート時に利用します。データ構造の変更などある場合に利用します。
activate 拡張アプリの有効時(ブログ単位)に動作します。インストール時にもここが実行されます。
deactivate 拡張アプリを無効化時(ブログ単位)に動作します。アンインストール時にもここが実行されます。

ポイント

  • extension/plugins/ の名前空間は 「Acms\Plugins」 です。
  • \ACMS_App を継承します。

これで拡張アプリ開発の基本は終了です。次から実際の拡張方法について見ていきます。