EC-CUBE4でCSVファイルを常にダブルクォーテーション付きで出力させる方法

EC-CUBE4では管理画面の商品管理や受注管理でCSV出力をする場合、項目によってはダブルクォーテーションが付いたり付かなかったりとバラバラな状態で出力されます。

理由はfputcsv関数を利用しているからです。 https://www.php.net/manual/ja/function.fputcsv.php

ただ、サイトによっては常にダブルクォーテーションをつけて欲しいという要望があります。 その時は以下の修正を行うことで対応が可能です。

説明は割愛して、修正した関数だけ載せておきます。 src/Eccube/Service/CsvExportService.phpファイルの以下の関数を修正します。

  • exportHeader関数の修正
/**
 * ヘッダ行を出力する.
 * このメソッドを使う場合は, 事前にinitCsvType($CsvType)で初期化しておく必要がある.
 */
public function exportHeader()
{
    if (is_null($this->CsvType) || is_null($this->Csvs)) {
        throw new \LogicException('init csv type incomplete.');
    }

    $row = [];
    foreach ($this->Csvs as $Csv) {
        $row[] = '"'.$Csv->getDispName().'"';
    }
    $row[] = "\r\n";

    $str = implode($this->eccubeConfig['eccube_csv_export_separator'], $row);
    $csv = mb_convert_encoding($str, $this->eccubeConfig['eccube_csv_export_encoding'], 'UTF-8');

    $this->fopen();
    fputs($this->fp, $csv);
    $this->fclose();
}
  • fputcsv関数の修正
/**
 * @param $row
 */
public function fputcsv($row)
{
    // if (is_null($this->convertEncodingCallBack)) {
    //     $this->convertEncodingCallBack = $this->getConvertEncodingCallback();
    // }

    // fputcsv($this->fp, array_map($this->convertEncodingCallBack, $row), $this->eccubeConfig['eccube_csv_export_separator']);

    $rows = [];
    foreach ($row as $r) {
        $rows[] = '"'.$r.'"';
    }
    $rows[] = "\r\n";

    $str = implode($this->eccubeConfig['eccube_csv_export_separator'], $rows);
    $csv = mb_convert_encoding($str, $this->eccubeConfig['eccube_csv_export_encoding'], 'UTF-8');

    fputs($this->fp, $csv);

}

以上の対応でCSV出力時は常にダブルクォーテーションが付くようになります。