EC-CUBE4でCSVファイル出力時に数値項目へ'.00'を付与させない方法

EC-CUBE Advent Calendar 2020 20日目の記事です。

EC-CUBE4で注文CSVダウンロードした時に数値項目(金額など)に.00が付与されてダウンロードされます。

国際化対応されているので小数点以下が付与されても別に気にしなくても良いのですが、偶に外部連携時に不要なことがあります。

今回は付与しない方法の説明です。

CsvExportServiceの変更

今回は一部の箇所を変更するのみです。

  • src/Eccube/Service/CsvExportService.php
/**
 * CSV出力項目と比較し, 合致するデータを返す.
 *
 * @param \Eccube\Entity\Csv $Csv
 * @param $entity
 *
 * @return string|null
 */
public function getData(Csv $Csv, $entity)
{
    // エンティティ名が一致するかどうかチェック.
    $csvEntityName = str_replace('\\\\', '\\', $Csv->getEntityName());
    $entityName = ClassUtils::getClass($entity);
    if ($csvEntityName !== $entityName) {
        return null;
    }

    // カラム名がエンティティに存在するかどうかをチェック.
    if (!$entity->offsetExists($Csv->getFieldName())) {
        return null;
    }

    // データを取得.
    $data = $entity->offsetGet($Csv->getFieldName());

    // one to one の場合は, dtb_csv.reference_field_name, 合致する結果を取得する.
    if ($data instanceof \Eccube\Entity\AbstractEntity) {
        if (EntityUtil::isNotEmpty($data)) {
            return $data->offsetGet($Csv->getReferenceFieldName());
        }
    } elseif ($data instanceof \Doctrine\Common\Collections\Collection) {
        // one to manyの場合は, カンマ区切りに変換する.
        $array = [];
        foreach ($data as $elem) {
            if (EntityUtil::isNotEmpty($elem)) {
                $array[] = $elem->offsetGet($Csv->getReferenceFieldName());
            }
        }

        return implode($this->eccubeConfig['eccube_csv_export_multidata_separator'], $array);
    } elseif ($data instanceof \DateTime) {
        // datetimeの場合は文字列に変換する.
        return $data->format($this->eccubeConfig['eccube_csv_export_date_format']);
    } else {
        // スカラ値の場合はそのまま.
        return $data;
    }

    return null;
}

となっています、がそれを

/**
 * CSV出力項目と比較し, 合致するデータを返す.
 *
 * @param \Eccube\Entity\Csv $Csv
 * @param $entity
 *
 * @return string|null
 */
public function getData(Csv $Csv, $entity)
{
    // エンティティ名が一致するかどうかチェック.
    $csvEntityName = str_replace('\\\\', '\\', $Csv->getEntityName());
    $entityName = ClassUtils::getClass($entity);
    if ($csvEntityName !== $entityName) {
        return null;
    }

    // カラム名がエンティティに存在するかどうかをチェック.
    if (!$entity->offsetExists($Csv->getFieldName())) {
        return null;
    }

    // データを取得.
    $data = $entity->offsetGet($Csv->getFieldName());

    // one to one の場合は, dtb_csv.reference_field_name, 合致する結果を取得する.
    if ($data instanceof \Eccube\Entity\AbstractEntity) {
        if (EntityUtil::isNotEmpty($data)) {
            return $data->offsetGet($Csv->getReferenceFieldName());
        }
    } elseif ($data instanceof \Doctrine\Common\Collections\Collection) {
        // one to manyの場合は, カンマ区切りに変換する.
        $array = [];
        foreach ($data as $elem) {
            if (EntityUtil::isNotEmpty($elem)) {
                $array[] = $elem->offsetGet($Csv->getReferenceFieldName());
            }
        }

        return implode($this->eccubeConfig['eccube_csv_export_multidata_separator'], $array);
    } elseif ($data instanceof \DateTime) {
        // datetimeの場合は文字列に変換する.
        return $data->format($this->eccubeConfig['eccube_csv_export_date_format']);
    } else {
        // スカラ値の場合はそのまま.
        if (is_string($data)) {
            $data = preg_replace('/\.0+$/', '', $data);
        }
        return $data;
    }

    return null;
}

に変更するだけで対応可能です。

変更箇所は

// スカラ値の場合はそのまま.
if (is_string($data)) {
    $data = preg_replace('/\.0+$/', '', $data);
}

になります。

特に対応する箇所でもないのですが、必要な方はこの記述を追加してください。