ECCUBEのCSVで出力されないデータが存在する

2017.08.23 20:49 ブログ

ECCUBEのCSVで出力されないデータが存在するの画像

ECCUBEの管理画面にCSV出力が行える所を、カスタマイズしていると、ある事に気がつきました。
商品管理にて、商品情報をCSVで出力した時に、とある商品がCSVに出力されていない!

最初は、dtb_csvテーブルのSQLの記述がおかしいのかと思い、SQLを見直してみましたが、特に問題なし...
SQLにて取得できるデータにも問題なく取得出来ている。

ここで予想したのが、特殊文字等が入っているとfputcsvで書き出す事が出来なくなるのでは?と思い、テストで特殊文字を出力するPHPプログラムを作成し、実行してみても問題なし。

何が問題なのだ...と思い、細かーく見ていくと、下記プログラムがおかしい事がわかりました。
記載するのを忘れてましたが、バージョンは2.13.5です。

ファイル:data/class/helper/SC_Helper_CSV.php
 

    /**
     * CSV 出力用のファイルポインタリソースを開く
     *
     * @return resource ファイルポインタリソース
     */
    public static function &fopen_for_output_csv($filename = 'php://output')
    {
        $fp = fopen($filename, 'w');

        stream_filter_append($fp, 'convert.iconv.utf-8/cp932');
        stream_filter_append($fp, 'convert.eccube_lf2crlf');

        return $fp;
    }

このプログラムの「stream_filter_append($fp, 'convert.iconv.utf-8/cp932');」←この部分!
これは、CSVに書き込む文字を変換する部分ですが、変換に失敗すると、データを空で返す様です。
そのせいで、特殊文字が入っている商品情報がCSVに出力されなかった様です。

解決策として下記の方法に変更
    /**
     * CSV 出力用のファイルポインタリソースを開く
     *
     * @return resource ファイルポインタリソース
     */
    public static function &fopen_for_output_csv($filename = 'php://output')
    {
        $fp = fopen($filename, 'w');

        //stream_filter_append($fp, 'convert.iconv.utf-8/cp932');
        // 「//TRANSLIT」を追加
        stream_filter_append($fp, 'convert.iconv.utf-8/cp932//TRANSLIT');
        stream_filter_append($fp, 'convert.eccube_lf2crlf');

        return $fp;
    }

こうする事で、変換出来なかった文字を変換できる近い文字に変えてくれる様です。


解決まで簡単に記載していますが、結構時間を要しました。
特殊文字がダメなのかと思った時に、どの文字がダメなのか調査しようと思い、少しずつ商品情報の文字を消して、CSVを出力の過程を繰り返して、やっと特定された文字がまさかの「オリジナル」という文字でした。
入力されていたものをコピーしておいて、手入力で入れ直すとCSVで出力される...
コピーしていたものを貼り付けてCSV出力を行うと、また出力されない。
ここまでで、かなり時間を要してしまったので、「オリジナル」の何が原因なのかを調査するのを辞めました。
本当に時間を要しましたので、同じ現象が発生した方がいましたら、この記事を見て、すぐに解決出来ている事を祈ります。