エクスポート機能の実装

メディアクラスとその拡張点において、「データ生成を指定したクラスにさせ生成結果を返す」という方法を利用することで、テーブルの内容やあるいはビューの内容などを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メソッドを呼び出すということも可能です。