バージョンは「2.11」からの結構カスタマイズされているサイトの移行となります。
どのように移行する?
特にDBの項目増やしたり、プラグインを入れたりしてなければ、データ移行プラグインで最低限移行できる。
データ構成を把握していて、SQLで変換スクリプトを作成して移行しても問題はない。
今回は、データ移行プラグインをカスタマイズして対応した。
2系のデータが多すぎてdumpで落ちる場合
サーバーのスペックにもよるが、dtb_order_detailで5万件以上+その他諸々でサーバー落ち
結局テーブル毎に一覧を取得し、データ移行プラグイン用にcsvを作成し対応
受注明細の消費税のズレ
税率が基本情報で設定されるので、受注明細に設定されているものを優先するように変更
app/Plugin/DataMigration4/Controller/Admin/ConfigController.php
PHP
// 2.4.4, 2.11, 2.12
if (isset($this->baseinfo) && !empty($this->baseinfo)) {
// $value['tax_rate'] = $data['tax_rate'] = $this->baseinfo['tax'];
// 商品別税率設定へ対応_dtb_order_detailの[tax_rule]があればそのまま移行
$value['tax_rate'] = $data['tax_rate'] ? $data['tax_rate'] : $this->baseinfo['tax'];
$data['point_rate'] = $this->baseinfo['point_rate'];
}
商品別税率機能
2系から移行すると「dtb_tax_rule」テーブルのproduct_class_idが設定されていないので、うまく表示できない
対応方法
商品規格を使用していなければ、productに対してproduct_classが1つなので、対象を取得してアップデートする
カスタムするコードのヒント
app/Customize/Repository/ProductClassRepository.phpへメソッドの追加
PHP
public function getTranslationData()
{
$qb = $this->createQueryBuilder('pc');
$qb->select('IDENTITY(pc.Product) AS product_id, pc.id AS product_class_id');
return $qb->getQuery()->getArrayResult();
}
app/Plugin/DataMigration4/Controller/Admin/ConfigController.php
作成したメソッド呼び出して、加工して当て込む
PHP
/** @var array $productData */
$productData = $this->productClassRepository->getTranslationData();
$this->productIdProductClassId = array_column($productData, 'product_class_id', 'product_id');
if ($data['product_id'] != 0) {
$productId = $data['product_id'];
if (isset($this->productIdProductClassId[$productId])) {
$value['product_class_id'] = $this->productIdProductClassId[$productId];
}
}
改行コード
app/Plugin/DataMigration4/Controller/Admin/ConfigController.php
PHP
/**
* 改行コードを変換
*/
public function convertToNewlineCode($staring) {
$convert = [
'\r' => "\r",
'\n' => "\n",
];
$target = array_keys($convert);
$replace = array_values($convert);
return str_replace($target, $replace, $staring);
}
/* 下記のような項目は変換が必要な場合もある */
$data['main_list_comment'];
$data['main_comment'];
$data['comment3'];
$data['body'];