concrete5 で Web ページを構成する際の最小単位 「ブロック」 は、デフォルトで様々なタイプが用意されている。一般的な用途にはデフォルトのままでほぼ十分な状態だが、このブロックの真骨頂は、DB に任意のブロック専用のテーブルを追加し、見た目のコントロールや編集が容易にできる点にある。例えば 「営業所」 や 「商品」、「番組」 等の拡張ブロックを定義し、任意の条件によって適宜表示を切り替える、と言った具合だ (ただしブロック間で相互に参照し合うような場合は、concrete5 の履歴機能を考慮して実装する必要あり)。

先日納品した某サイトでは、独自定義ブロックを 40個程使うことになり、かなり込み入った状態になって大変だったと言うのはまァいいとして、このように調子に乗ってブロックを大量に追加して行くと、ある問題が発生する。

concrete5 の管理画面であるダッシュボードで 「機能を追加」 ページを見ると、「インストール済み」 の拡張ブロックは、名前順にソートされるている。これは全く問題ないが、任意のページにブロックを追加する際に表示されるダイアログのブロック一覧では、ブロックを登録した順番、正確には BlockTypes.btID 順になってしまい、あまりユーザー・フレンドリーではない。大量にブロックを追加すると、目的のブロックを目視で探すのも一苦労なので、名前順でソートされるように挙動を変えてみた。

このカスタマイズは、/concrete/models/block_types.php を /models/ 以下にコピーし、コピーした block_types.php のメソッド BlockTypeList() を次のように編集する。リスト中の行番号は concrete5.4.0.5.ja の block_types.php なので、バージョンが異なると多少前後したり、記述が違っているかもしれない点に注意。

尚、オリジナルをいきなり編集してしまうとアップグレードが困難になるので、デフォルトで存在するファイルをカスタマイズする際は、極力 concrete5 のオーバーライドの仕組みを利用する。

・44行目付近
変更前: $q = "select btID from BlockTypes where btIsInternal = 0 ";
変更後: $q = "select btID,btName from BlockTypes where btIsInternal = 0 ";

・48行目付近
変更前: $q .= ' order by btID asc';
変更後: $q .= ' order by btName asc';

デフォルトの SQL 文は btID のみを拾い、btID で昇順ソートしているので、ブロックの名前が完全に無視されている。そこでブロックの名前が記録されているカラム btName を一緒に取得し、btName でソートするようにした。

愛用する PHPEclipse に限らず、関数等の情報をツールチップで表示してくれる IDE のコーディング支援機能は非常に便利で重宝しているが、この手の変更ポイントを探すには、やはりシェル上で grep するのが最も早い (UNIX 系 OS の場合)。

Comments are closed.