チェックをつけたエントリーの情報をCSVでダウンロードするには

エントリーの一覧に表示されている情報からチェックボックスにチェックをつけたものだけをダウンロードするにはどうしたら? という事を相談され、簡単に実装できるだろうと思ったのですが、a-blog cms の URLコンテキストで複数の EID を処理することができず詰んでしまいました。その方法を考えてみます。

今回は、エントリーカレンダーモジュールでの一覧を表示させています。

1件を選択する場合 input type="radio"

まずは簡単な1件を出力する用のラジオボタンでの実装を考えてみます。



calendar.html

Entry_Calendar モジュールに、チェックボックスを追加し、EID をPOSTで渡すようにします。submit ボタンには name="ACMS_POST_Download" と書くことでページの遷移をするのではなくファイルがダウンロードされるようになります。そこでダウンロードするのは、name="tpl" value="test.csv" ということになり、action="download.csv" がダウンロードするファイルの名前になります。

<!-- BEGIN_MODULE Entry_Calendar id="sample" -->
<form action="download.csv" method="POST">

<!-- BEGIN week:loop --> 
<!-- BEGIN day:loop -->
<!-- BEGIN entry:loop -->

<input type="checkbox" name="eid[]" value="{eid}">
{title}

<!-- END entry:loop -->
<!-- END day:loop -->
<!-- END week:loop -->

<input type="hidden" name="bid" value="%{BID}" />
<input type="hidden" name="tpl" value="test.csv" />
<input type="submit" name="ACMS_POST_Download" value="CSVダウンロード" />
</form>
<!-- END_MODULE Entry_Calendar -->

test.csv

実際に欲しい CSV ファイルを用意します。Entry_Summary のモジュールID には id="download" を作成し、EID にチェックをつけるような設定をします。(チェックボックスではなくラジオボタンの場合)

<!-- BEGIN_MODULE Entry_Summary id="download" --><!-- BEGIN unit:loop --><!-- BEGIN entry:loop -->{eid},{url},{title}
<!-- END entry:loop --><!-- END unit:loop --><!-- END_MODULE Entry_Summary -->

複数件を選択する場合 input type="checkbox"

次が、今回このエントリーを書く理由になった複数の EID を選択して CSV 出力させる方法になります。



calendar.html

残念ながら EID をそのまま URLコンテキストで検索することができませんでした。

これを解決するには、モジュールID の画面で EID をテキスト入力で 16,19,20 のように書くことで3件の情報を表示させることができます。

<!-- BEGIN_MODULE Entry_Calendar id="sample" -->
<form action="download.csv" method="POST">

<!-- BEGIN week:loop --> 
<!-- BEGIN day:loop -->
<!-- BEGIN entry:loop -->

<input type="checkbox" name="eid_array[]" value="{eid}">
{title}

<!-- END entry:loop -->
<!-- END day:loop -->
<!-- END week:loop -->

<input type="hidden" name="query[]" value="eid_array" />
<input type="hidden" name="bid" value="%{BID}" />
<input type="hidden" name="tpl" value="test.csv" />
<input type="submit" name="ACMS_POST_Download" value="CSVダウンロード" />
</form>
<!-- END_MODULE Entry_Calendar -->

ここでのポイントは、name="query[]" value="eid_array" で、?eid_array=16 のような URLにすることができます。

test.csv

これは同様です。

<!-- BEGIN_MODULE Entry_Summary id="download" --><!-- BEGIN unit:loop --><!-- BEGIN entry:loop -->{eid},{url},{title}
<!-- END entry:loop --><!-- END unit:loop --><!-- END_MODULE Entry_Summary -->

hook.php

EID を複数 URLコンテキストで指定できなかったので、query で取得したものをグローバル変数に入れます。

public function extendsGlobalVars(&$globalVars)
{
    $app = \App::getInstance();
    $params = $app->getGetParameter();
    $eids = $params->getArray('eid_array');

    if (!empty($eids)) { 
        $globalVars->set('EID_ARRAY', implode(',', $eids));
    } else {
        $globalVars->set('EID_ARRAY', '9999999999999');
    }
}

config.server.php

hook.php に手を入れる場合には、config.server.php の設定「HOOK_ENABLE」を修正する必要があります。

define('HOOK_ENABLE', 1);

モジュールID id="download"

EID : %{EID_ARRAY} を記述します。



エントリーの一覧に表示されている情報からチェックボックスにチェックをつけたものだけをダウンロードするにはどうしたら? の問い合わせに対する回答としては、上記のようになりました。

簡単にテキストで書くとするのであれば、query で渡した EID をグローバル変数にして、モジュールIDに渡すことでできる という事になります。この1文では分からないと思いブログの記事にしてみました。