October CMSで一覧画面の内容をEXCELエクスポートする方法を紹介致します。
環境
Laravel:5.5
October CMS:1.0
前提
October CMSでは標準で提供しているインポート/エクスポート機能がある。
※ただし、CSVファイルのみを提供している。
※EXCELファイルは標準では提供していない。
インポート/エクスポート機能の公式ドキュメントはこちらです。
https://octobercms.com/docs/backend/import-export
今回やりたいこと
October CMSで作成した一覧画面の内容をEXCELエクスポートしたい。
※一覧画面にはソート機能、検索機能、フィルター機能がある。
※一覧画面でソート、検索、フィルターされた状態をそのままエクスポートしたい。
実装の流れ
1.一覧画面の実装
まずは一覧画面を実装する必要があります。
以下のOctober CMSの公式ドキュメントに詳しく載っているので参照してください。
ソート、検索、フィルターの内容も載っています。
https://octobercms.com/docs/backend/lists
2.EXCELエクスポート用にプラグインをインストール
今回やりたいことはEXCELエクスポートなので、対応するプラグインをインストールします。
ここも公式ドキュメントにインストール手順などが詳しく載っているので参照してください。
https://octobercms.com/plugin/vdomah-excel
3.EXCELエクスポート機能の実装
ここからEXCELエクスポートの実装を進めていきます。
以下2点を実施します。
・エクスポート用のクラスを作成
・「1.一覧画面の実装」で作成したコントローラにEXCELエクスポート処理を追加
こちらのサイトを参考に実装しました。
https://docs.laravel-excel.com/3.1/exports/from-query.html
<?php namespace Casareal\Test\Exports; use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\FromQuery; class TestExport implements FromQuery { private $query; use Exportable; public function __construct($query) { // ListControllerのqueryデータ $this->query = $query; } public function query() { return $this->query; } }
上記の実装のポイントは引数「$query」を持つコンストラクタを用意しているところです。
「$query」には一覧画面で実行したクエリが渡ってくるイメージです。
<?php namespace Casareal\Test\Controllers; use Backend\Classes\Controller; use BackendMenu; use Casareal\Test\Exports\TestExport; class Test extends Controller { public $implement = [ 'Backend\Behaviors\ListController', ]; public $listConfig = 'config_list.yaml'; // (省略) // EXCELエクスポート public function exportExcel() { // 一覧表示で実行しているqueryを取得 $widget = parent::makeList(); $query = $widget->prepareQuery(); // Excelエクスポート return (new TestExport($query))->download('テスト.xlsx'); } }
上記の実装のポイントは一覧画面で実行したクエリを取得し、先ほどのエクスポート用クラスのコンストラクタ引数に渡しているところです。
※ソート、検索、フィルターされた状態のクエリです。
今回の実装で一番つまずいたのは実はここです。
クエリの実行などはフレームワーク(October CMS)が請け負っている部分で処理の詳細があまり見えず、一覧画面で実行したクエリの取得方法をネットで探してもあまり参考になる情報が見つかりませんでした。
ただ、「前提」で書いた通り「October CMSでは標準で提供しているインポート/エクスポート機能」があり、公式ドキュメントを読み進めたところ、一覧表示のクエリをそのままエクスポートするオプション(useList)があるようだったのでその部分の処理を追ってみることにしました。
追ってみたところ、一覧画面で実行されたクエリを取得する処理があったので、その処理を参考に実装しました。
4.機能の確認
一覧画面でソート、検索、フィルターした状態でEXCELエクスポートを実行したところ、EXCEL側も一覧画面と連動した状態でエクスポートされました。
おわりに
一覧画面とEXCELエクスポートで内容を連動させたい要件はわりとよくある機能だと思います。
October CMSでは少し工夫が必要でしたが、今回の対応により一覧画面で実行したクエリをEXCELエクスポートでも使いまわせるようになりました。
もし今後、一覧画面に追加対応があった際にEXCELエクスポート機能への対応漏れや実装の手間が軽減されると思います。