【ver2.0.0以上】CKEditor4.1のACF機能について


Advanced Content Filter

a-blog cms ver2.0.0 より CKEditorのバージョンがver4.1になり、Advanced Content Filterという機能が追加され挙動が変化してますのでここで共有しておきます。 この機能は、CKEditorで入力できる(制限された)コード以外のコードの入力を許可しないセキュリティ機能になります。

Advanced Content Filter

注意する点

この機能より例えば自由入力などで、定義リスト(dl,dt,dd)を使用していて、wysiwygに変更した場合に1系(CKEditor4.0以下)の場合はそのまま定義リストで表示されていましたが、ver4.1以上のCKEditorの場合は 定義リストが削除されます。 特にインポートなどでwysiwygでエントリーを追加した場合に注意が必要になります。

対応方法

通常の使い方であれば問題はありませんが、インポートデータをwysiwygで編集したいなど、やむを得ない場合などは、この機能をOFFにして利用する事が出来ます。

機能を無効にする方法

/js/library/ckeditor/config.js ファイルに以下を追記

CKEDITOR.editorConfig = function( config )
{
    config.allowedContent = true;
};

CSVファイルからのユーザーのインポート

CSVファイルを使ったインポートについて

管理ページからカンマ区切りデータ(csv形式)をユーザ情報に変換してインポートすることができます。
利用するには、エンタープライズライセンスか、無制限ユーザーのオプションが必要になります。

インポート方法

ユーザのCSVファイルのインポート設定は、管理ページ > インポート > USERから行うことができます。下の図のように1からインポートしたいユーザのCSVファイルを選択し、2「インポートを実行する」を押してCSVファイルをインポートすることができます。


ユーザーインポート実行方法

ユーザーインポート実行方法


インポート時のポイント

ユーザをCSVファイルでインポートする際、以下の項目は必須項目です。なお、そのほかの項目についてはユーザのカスタムフィールド名となります。
なお、CSVファイルにuser_idを指定することで既存のユーザーを上書きすることができます。

  • user_code:ユーザのコード(既存のユーザとの重複を避けユニークな文字列を指定してください)
  • user_mail:ユーザのメールアドレス
  • user_pass:ユーザのパスワード

必須ではありませんが、データ流し込み時に設定しておくと便利な項目を挙げておきます。

  • user_name:ユーザ名
  • user_status:ユーザーのステータス
  • user_auth:ユーザーの権限

ユーザーのカスタムフィールドで複数項目あるチェックボックスを使用している場合、field_check_box[1] のように添字も指定してください。添字は1から始まります。

CSVファイルの例

user_code,user_mail,user_pass,cfd_addr,cfd_zip,cfd_tel
appleple,info@example.com,********,名古屋市中村区名駅3-18-5 モンマートビル5F,450-0002,052-485-8577

カスタムフィールド

上記のCSVファイルで取り込まれた項目は以下のようにカスタムフィールドとして取り込まれます

カスタムフィールド名
{cfd_addr}名古屋市中村区名駅3-18-5 モンマートビル5F
{cfd_zip}450-0002
{cfd_tel}052-485-8577

カスタムフィールドの値は、管理ページのカスタム設定等に表示することが出来ます。


Ver. 2.12 の ビルド環境ご紹介


この記事では、a-blog cms Training Camp 2021 Autumn のカスタマイズ講座「Ver.2.12のテーマのビルド環境ご紹介」について、補足事項や使用方法についてご紹介します。

各テーマにビルド環境入りました!

Ver. 2.11 までは、developテーマだけに、ビルド環境をいれていましたが、全てのテーマでビルドできるような環境を整えました。 ぜひ、いままでビルド環境を使ったことがなかった方や、自分で用意していたかたは、お試しください。

  • beginner
  • blog
  • site
  • utsuwa
  • develop

LibSass から Dart Sass へ変更されました。

scssのビルドが、LibSass(node-sass)からDart Sassへ変更されました。scssの記述方法が変わっていますので、ご注意ください。 LibSassは廃止予定なので、この機にぜひDart Sassをお試しください。

初期設定

node が必要なので、nodeが入っていない場合はインストールします。
https://nodejs.org/ja/

おすすめは、nodenvという、nodeのバージョン管理ができるツールになります。 https://github.com/nodenv/nodenv

themes/各テーマ/ に移動して、下記のコマンドを実行します。実行することでビルドに必要なツールなどがインストールされます。

$ npm install

package.json を編集

もし、LiveReload を行う場合(npm run start)は、package.json の config.theme を変更してください。 実行しているローカル環境のアドレスに合わせて config.local に ドメイン を設定し、ご利用のテーマ名(ディレクトリ名)を config.theme に設定ます。

"config": {
  "local": "localhost",
  "theme": "テーマ名"
},

ビルド方法

本番用ビルド

cssのbuildとjsのbuildを行います。 納品時にはこのコマンドを実行して納品してください。 JavaScriptが productionビルド となります。

$ npm run build

開発用ビルド

以下のコマンドを実行すると、cssとjsの変更をwatchしてビルドを行います。余分なコードが入ったり、最適化されないため納品時には必ず npm run build しましょう。

Watchのみ

$ npm run dev

LiveReloadを行う場合

$ npm run start

CSSの読み込み方について

配信では、以下3つのCSSの読み込み方法をご紹介しました。ここでは、おすすめの全CSSをインライン化する方法について具体的にご紹介します。

  • 通常の読み込み
  • ファーストビューのCSSをインライン化
  • 全CSSをインライン化

全CSSをインライン化

全CSSをインライン化するメリットは、パフォーマンス的にもHTMLに含まれているので、別で取得する必要がなくパフォーマンスが向上します。またレイアウトスラッシングも起きないのでユーザー体験も損ないません。デメリットはファーストビューのみCSSをインライン化する方法に比べれば若干パフォーマンスが落ちることです。気にするほどのものではないと思います。それよりも、レイアウトスラッシングのほうをが気になるので、この方法をお勧めいたします。

全CSSをインライン化する方法

ビルドされたCSSを手動で、テンプレートに貼り付ける方法でも実現できますが、スタイルの変更があるたびに貼り付けるのはめんどくさいです。そこで自動でテンプレートに挿入されるようにカスタマイズします。

CMSの処理が終わった後の、Hook(afterBuild)を利用して、ここでインラインCSSを挿入するようにします。

フックの有効化

config.server.php の HOOK_ENABLE を 1 に設定します。

define('HOOK_ENABLE', 1);

フックの実装

extension/acms/Hook.php をカスタマイズします。 管理画面や編集画面以外で、ビルドしたCSSを読み込むようにします。xxxxxx には、テーマのディレクトリ名を入れてください。

public function afterBuild(&$res)
{
    if (ADMIN == 'entry-edit' || substr(ADMIN, 0, 9) === 'entry-add' || !ADMIN) {
        $inlineCss = \Storage::get(SCRIPT_DIR . 'themes/xxxxx/dest/bundle.css');
        $css = '<style>' . $inlineCss . '</style>';
        $res = preg_replace('@(?=<\s*/\s*head[^\w]*>)@i', $css, $res);
    }
}

テンプレートの編集

デフォルトのテーマのCSS読み込みを修正します。各テーマによって読み込み方が若干ちがいますが、include/head/link.html では、bundle.cssを読み込まないようにして、include/head/preload.html がある場合は、preload.html 内はすべて削除します。

組み込みJSについて

a-blog cms には組み込みJSが用意されていますが、汎用的にさまざまなことに対応しているため、便利ですがパフォーマンス的には、あまりよくありません。ただ組み込みJSを読み込まないとよく使うようなJavaScriptも自分ですべて実装しないといけないので、あまり実現的ではありませんでした。

そこで、Ver. 2.12 ではよく使う組み込みJSと同じ機能を、各テーマのバンドル環境に用意しました。これで組み込みJSを使わず、パフォーマンスを意識した開発ができるようになりました。

組み込みJSを使わないJSの読み込み

include/head/js.html を以下のように修正します。これにより、投稿者以上でログインしている場合だけ、組み込みJSを読み込み ログアウトしている場合などは、組み込みJSを読み込まないようになります。

<!-- 投稿者以上以上の場合だけ組み込みJSを読み込むようにする -->
<!-- BEGIN_MODULE Touch_SessionWithContribution -->
<script src="%{JS_LIB_JQUERY_DIR}jquery-%{JS_LIB_JQUERY_DIR_VERSION}.min.js" charset="UTF-8"></script><!-- BEGIN_MODULE Js -->
<script src="/acms.js{arguments}" charset="UTF-8" id="acms-js"></script><!-- END_MODULE Js -->
<!-- END_MODULE Touch_SessionWithContribution -->

<script src="/dest/vendor.js" async></script>
<script src="/dest/bundle.js" async></script>

バンドル環境での組み込みJSの読み込み方

src/js/index.js ファイルで、組み込みJSと同じような機能をもつ処理を実装できます。 まず、import で、使用するJavaScriptを読み込みます。不要なJavaScriptはコメントアウトください。

import {
  validator,
  linkMatchLocation,
  externalLinks,
  scrollTo,
  ...
} from './lib/build-in'; 

次に、読み込んんだJavaScriptを実行します。使用しないJavaScriptは読み込みと同様コメントアウトください。 また、if (window.ACMS === undefined) で囲まれている理由としては、組み込みJSを読み込んでない場合だけ、 動作するようにするためになります。

if (window.ACMS === undefined) {
  window.dispatch = (context) => {
    validator(context);
    linkMatchLocation(context);
    externalLinks(context);
    scrollTo(context);
    ...
  };
  window.dispatch(document);
}

最後に

以上になります。 ビルド環境を使用することにより、よりよいパフォーマンス、保守性の向上、よりよい開発体験をすることができます。ぜひお試しください。

画像が一定数枚までしかアップロードできない場合の対処法

アップロード数に制限がある?

1つのエントリーで、画像ユニットや画像のカスタムフィールドを使って、写真・画像ファイルを添付すると20枚までは登録できるけど、それ以上はアップされないことがあります。その場合、バナーモジュール(Banner)でも同様に発生します。

原因

サーバー側(PHP)の設定で、以下の制限が設けられている事が原因になります。

  • アップロード出来るファイル数(PHP 5.2.12 以降)
  • input要素の最大数(PHP 5.3.9 以降)

対処法

以下の項目の制限を緩めてあげる必要があります。環境に合わせて適度に設定して下さい。

  • max_file_uploads(アップロード出来るファイル数 デフォルト値:20 アクセスレベル:PHP_INI_SYSTEM)
  • max_input_vars(input要素の最大数 デフォルト値:1000 アクセスレベル:PHP_INI_PERDIR)

max_input_varsは「htaccess」でも設定可能な場合が多いですが、 max_file_uploadsは「htaccess」で設定出来ない場合もありますので、設定出来ない場合は「php.ini」などで設定をしてみて下さい。

その他の制限

以上の事が原因ではないと思われる場合は、以下のような制限項目もチェックして見て下さい。