備忘録を兼ねて、手短にまとめます。
Sprout Reports Plugin - Craft CMS Reports Plugin
https://sprout.barrelstrengthdesign.com/craft-plugins/reports
Craft CMS に保存された任意のデータを表組みで閲覧したり、CSV エクスポートできる Sprout Reports プラグイン。
とても使いやすくて便利ではあるのですが、データに日本語の文字列を含む場合にエクスポートした CSV ファイルを直接 Excel で開くと文字化けしてしまいます。
そこで、UTF-8 with BOM で出力する方法を調べてみました。
CSV 出力に関する処理を調整する
cms/craft/plugins/sproutreports/services/SproutReports_ExportsService.php
を開き、 toCsv
メソッド内の82・83行目の間に $csv->setOutputBOM(Writer::BOM_UTF8);
を加えます。
参考までに、修正後のコードを載せておきます。
public function toCsv(array &$values, array $labels = array(), $filename = 'export.csv')
{
$filename = str_replace('.csv', '', $filename) . '.csv';
if (empty($labels) && !empty($values))
{
$arrayValues = array_values($values);
$firstRowOfArray = array_shift($arrayValues);
$labels = array_keys($firstRowOfArray);
}
$csv = Writer::createFromFileObject(new \SplTempFileObject());
$csv->insertOne($labels);
$csv->insertAll($values);
// この1行を追加
$csv->setOutputBOM(Writer::BOM_UTF8);
$csv->output($filename);
exit(0);
}
この状態で保存すれば、完了。
管理画面で任意のレポートの CSV をダウンロードすると、UTF-8 with BOM に切り替わっているハズです。
なお、この方法ではプラグインのアップデートごとに都度修正する必要がありますので、注意してください。
簡単な解説
Sprout Reports プラグインの CSV 出力は League という PHP ライブラリを利用しているようです。
そこで、配布元の公式ドキュメントを探したところ、該当するページがありました。
CSV and BOM character - CSV
http://csv.thephpleague.com/8.0/bom/
出力前に変換後の BOM を指定しておけばいい感じに処理してくれるため、 setOutputBOM
メソッドを追記しています。