エクスポート機能の実装
メディアクラスとその拡張点において、「データ生成を指定したクラスにさせ生成結果を返す」という方法を利用することで、テーブルの内容やあるいはビューの内容などをCSVファイル等にエクスポートすることが可能です。そのような拡張クラスを作成すれば良いのですが、汎用的なエクスポートクラスを利用することで、より簡単にエクスポートを実装することができます。
汎用クラスを用いたエクスポート
aタグや、あるいはbuttonタグをクリックした後に、以下のリンクにアクセスします。そのページで使っている定義ファイルへのパスは、scriptタグのsrcに指定しているものと同じです。そのリンクにmediaパラメータを指定しますが、そのキーの値は、プロトコルとして「class」を指定し、続いて汎用エクスポートクラスのパスとして「INTERMediator\DB\Export」を指定し、さらにパスに利用するコンテキスト名をつなげます。コンテキスト名は、定義ファイルに定義されたコンテキストである必要があります。
定義ファイル?media=class://INTERMediator\DB\Export/コンテキスト名(/条件...)
これにより、指定したコンテキストのデータを含むShift-JIS化したCSVファイルがダウンロードされます。aタグ等をクリックしても、ページ遷移はしないはずです。そのほか、CSVファイルの1行目にはフィールド名がそのまま入り、2行目からデータとなります。1つのコンテキストの結果が全部得られます。つまり、コンテキストに存在するフィールド全て、レコード全てが出力されます。ファイル名は「Exported-日付時刻」となります。また、改行コードは、0x0Aのみとなります。ページ上に表示しているコンテキストだと、例えば、20レコードずつ表示する設定になっていると思います。しかしながら、エクスポートでは全部のレコードが欲しいことになるかと思います。その意味では、ページ上のコンテキストとは別に、エクスポート用のコンテキストを用意する方が、ニーズに合致した結果が得られるでしょう。
エクスポート機能のカスタマイズ
エクスポートの処理をカスタマイズすることができます。例えば、以下のようなExportSampleクラスを、定義ファイルと同じディレクトリに、ExportSample.phpというファイル名で保存したとします。そうすれば、前述のエクスポートのリンク先は「定義ファイル?media=class://ExportSample/コンテキスト名」のようになります。既存のエクスポートのためのクラスを拡張しており、その動作を変更できるということになります。
<?php
class ExportSample extends \INTERMediator\DB\Export
{
protected $keysAndLabels = [
"unitprice" => "単価",
"name" => "商品名",
"taxrate" => "消費税率",
"photofile" => "画像ファイル名",
"acknowledgement" => "画像謝辞",
"ack_link" => "謝辞リンク",
"id" => "ID",
"category_id" => "カテゴリID",
];
protected $fileNamePrefix = "Exported-";
protected $fileExtension = "csv";
protected $encoding = "SJIS";
protected $fieldSeparator = ',';
protected $quote = '"';
protected $endOfLine = "\n";
public function processing($contextData, $options){}
}
まず、1行目のフィールド名のカスタマイズに加えて、取り出すフィールドのカスタマイズは$keysAndLabelsプロパティに連想配列で指定します。コンテキストのフィールド名として、出力に加えたいフィールドのフィールド名をキーとします。その値は出力結果の1行目に登場する名目のカラム名を指定します。
$fileNamePrefixは、ファイル名に指定する名前の前半部分を指定します。ファイル名の拡張子は$fileExtensionで指定します。出力データのエンコーディングは$encodingで指定します。フィールド区切りは$fieldSeparator、行区切りは$endOfLineで指定できます。文字列データのクオート記号は$quoteで指定します。これらは既定値のままで良いのであれば、定義する必要はありません。変更したい場合にのみ定義をします。
場合によっては、processingメソッドを指定して、処理プログラムを自分で書くこともできます。最初の引数には、コンテキストで得られた結果が連想配列の配列で得られるので、あとは自由に加工をして、echo等で出力すれば良いでしょう。また、元になっているExportクラスは、league/csvというライブラリを利用しています。INTER-Mediatorの中にもインストールしてあるので、その仕組みを使うことも検討すれば良いでしょう。なお、Exportクラスのprocessingメソッドを呼び出せば、通常のCSV出力が可能なので、上記ExportSampleクラスのprocessingメソッドでは、引数で得られたフィールドの内容を加工して、Exportクラスのprocessingメソッドを呼び出すということも可能です。