Craft CMS の Sprout Reportsプラグインからエクスポートする CSV ファイルを UTF-8 with BOM にする

備忘録を兼ねて、手短にまとめます。

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 メソッドを追記しています。