October CMSの並び替え画面で、取得するレコードを絞ったり、表示する内容を自由に変更できるようにするのに少し手こずったので、実装した方法をご紹介します。
環境
- Laravel:5.5
- October CMS:1.0
1. 並び替え画面の準備
まずは最低限、並び替え画面が使えるように準備をします。
詳しくは公式を参照してください。
https://octobercms.com/docs/backend/reorder
フォルダ構造
plugins/ casareal/ <=== 作者名 blog/ <=== プラグイン名 controllers/ article/ _list_toolbar.htm _reorder_toolbar.htm <=== 並び替え画面の上部部品ファイル config_form.yaml config_list.yaml config_reorder.yaml <=== 並び替え画面のconfigファイル create.htm index.htm reorder.htm <=== 並び替え画面のhtmlファイル update.htm Controller.php lang/ ja/ lang.php models/ article/ columns.yaml fields.yaml Model.php Plugin.php <=== プラグイン必須ファイル
_reorder_toolbar.htm
<div data-control="toolbar"> //画面上部に「前の画面に戻るボタン」などの設置ができる </div>
config_reorder.yaml
# Reorder Title title: 画面タイトル # Attribute name nameFrom: 表示したいカラム名 # Model Class name modelClass: Casareal\Blog\Models\Model # Toolbar widget configuration toolbar: # Partial for toolbar buttons buttons: reorder_toolbar
reorder.htm
<?= $this->reorderRender() ?>
Controller.php
<?php namespace Casareal\Blog\Controllers; use Backend\Classes\Controller; use BackendMenu; class Controller extends Controller { public $implement = [ 'Backend\Behaviors\ListController', 'Backend\Behaviors\FormController', 'Backend\Behaviors\ReorderController' //並び順変更のために必要 ]; public $listConfig = 'config_list.yaml'; public $formConfig = 'config_form.yaml'; public $reorderConfig = 'config_reorder.yaml'; //並び順変更の設定ファイル public function __construct() { parent::__construct(); BackendMenu::setContext('Casareal.Blog', 'blog', 'article'); } }
Model.php
<?php namespace Casareal\Blog\Models; use Model; class Model extends Model { use \October\Rain\Database\Traits\Sortable; //並び替えのために必要 //どのカラムをソート対象にするのか指定する const SORT_ORDER = 'sort'; // Modelの基本プロパティ public $table = 'model'; }
2. 取得するレコードを絞る
ここまでで並び替え画面を使うことができるようになりました。
次は並び替え画面で取得するレコードを絞る方法です。
Controller.php
拡張メソッドの「reorderExtendQuery」を使います。
<?php namespace Casareal\Blog\Controllers; use Backend\Classes\Controller; use BackendMenu; class Controller extends Controller { public $implement = [ 'Backend\Behaviors\ListController', 'Backend\Behaviors\FormController', 'Backend\Behaviors\ReorderController' //並び順変更のために必要 ]; public $listConfig = 'config_list.yaml'; public $formConfig = 'config_form.yaml'; public $reorderConfig = 'config_reorder.yaml'; //並び順変更の設定ファイル public function __construct() { parent::__construct(); BackendMenu::setContext('Casareal.Blog', 'blog', 'article'); } // このメソッドで条件や表示順などを変更できる public function reorderExtendQuery($query) { $query->where('published', 1)->orderBy('published_at', 'desc'); } }
3. 表示する内容を変更する
先ほどの「reorderExtendQuery」で、SelectRawでCONCATなどを使ってカラムを結合したりすればいいんじゃないかと考えるかもしれませんが、結果として並び替え機能自体が動かなくなってしまったので別の方法を使用しました。
Model.php
afterFetchメソッドを追加
<?php namespace Casareal\Blog\Models; use Model; class Model extends Model { use \October\Rain\Database\Traits\Sortable; //並び替えのために必要 //どのカラムをソート対象にするのか指定する const SORT_ORDER = 'sort'; // Modelの基本プロパティ public $table = 'model'; // モデル取得後に呼ばれるメソッド public function afterFetch(){ // ここで疑似カラムを用意する $this->reorder_text = $this->title . " " . $this->sub_title; } }
config_reorder.yaml
nameFromの値を変更
# Reorder Title title: 画面タイトル # Attribute name # 用意した疑似カラムを使用する nameFrom: reorder_text # Model Class name modelClass: Casareal\Blog\Models\Model # Toolbar widget configuration toolbar: # Partial for toolbar buttons buttons: reorder_toolbar
まとめ
以上がOctober CMSの並び替え画面で、取得するレコードを絞ったり、表示する内容を変更する方法でした。
afterFetchは今回の並び替え以外にも使えるテクニックになるはずなので、覚えていて損はないと思います。