プラグイン内の/Event/Event.php 164行目の以下の記述が原因で
一旦すべて、関連商品データを削除して新規登録し直しているようです。
$app['eccube.plugin.repository.related_product']->removeChildProduct($Product);
function onRenderAdminProductComplete()の中を
以下のソースのように、登録済の関連商品と画面から送信された関連商品を比較して、追加・更新・削除を行うようにすれば、
無駄にIDを消費する事は無くなると思います。
public function onRenderAdminProductComplete(EventArgs $event)
{
log_info('RelatedProduct trigger onRenderAdminProductComplete start');
$app = $this->app;
$Product = $event->getArgument('Product');
$form = $event->getArgument('form');
//$app['eccube.plugin.repository.related_product']->removeChildProduct($Product);
//$FromRelatedProducts = $app['eccube.plugin.repository.related_product']->getRelatedProduct($Product, Constant::DISABLED);
$FromRelatedProducts = $app['eccube.plugin.repository.related_product']->findBy(array('Product' => $Product));
//更新対象の関連商品を一時的に格納する配列
$updateRelatedProducts = array();
//削除対象の関連商品を一時的に格納する配列
$deleteRelatedProducts = array();
log_info('remove all now related product data of ', array('Product id' => $Product->getId()));
$RelatedProducts = $form->get('related_collection')->getData();
if (count($FromRelatedProducts) == 0) {
//関連商品が未登録の場合
foreach ($RelatedProducts as $RelatedProduct) {
/* @var $RelatedProduct \Plugin\RelatedProduct\Entity\RelatedProduct */
if ($RelatedProduct->getChildProduct() instanceof Product) {
$RelatedProduct->setProduct($Product);
$app['orm.em']->persist($RelatedProduct);
$app['orm.em']->flush($RelatedProduct);
log_info('save new related product data to DB ', array('Related Product id' => $RelatedProduct->getId()));
}
}
} else {
//既に登録されている関連商品と画面から渡された関連商品を比較
foreach ($FromRelatedProducts as $FromRelatedProduct) {
$deleteFlg = true;
$FromChildProduct = $FromRelatedProduct->getChildProduct();
if ($FromChildProduct) {
foreach ($RelatedProducts as $RelatedProduct) {
/* @var $RelatedProduct \Plugin\RelatedProduct\Entity\RelatedProduct */
if ($RelatedProduct->getChildProduct() instanceof Product) {
if ($RelatedProduct->getChildProduct()->getId() == $FromChildProduct->getId()) {
//既に登録済の関連商品は更新する
$deleteFlg = false;
$updateRelatedProducts[] = $RelatedProduct;
$FromRelatedProduct->setContent($RelatedProduct->getContent());
$app['orm.em']->persist($FromRelatedProduct);
$app['orm.em']->flush($FromRelatedProduct);
break;
}
}
}
}
if ($deleteFlg) {
$deleteRelatedProducts[] = $FromRelatedProduct;
}
}
//画面から渡された関連商品の内、新規追加分を登録
foreach ($RelatedProducts as $RelatedProduct) {
if ($RelatedProduct->getChildProduct() instanceof Product) {
if (!in_array($RelatedProduct, $updateRelatedProducts)) {
$RelatedProduct->setProduct($Product);
$app['orm.em']->persist($RelatedProduct);
$app['orm.em']->flush($RelatedProduct);
log_info('save new related product data to DB ', array('Related Product id' => $RelatedProduct->getId()));
}
}
}
//既に登録済で画面から渡された関連商品に存在しなかった関連商品を削除
foreach ($deleteRelatedProducts as $RelatedProduct) {
$app['orm.em']->remove($RelatedProduct);
$app['orm.em']->flush($RelatedProduct);
}
}
log_info('RelatedProduct trigger onRenderAdminProductComplete finish');
}
※軽く動作確認していますが、パパッと書いたコードなので、きちんとした検証は必要かと思います。
----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
■EC-CUBE3マニュアル
■blog