October CMSの並び替え画面で、取得するレコードを絞ったり、表示する内容を変更する

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は今回の並び替え以外にも使えるテクニックになるはずなので、覚えていて損はないと思います。


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。