diff --git a/classes/Carrier.php b/classes/Carrier.php index 86f10851d..6beb272b0 100644 --- a/classes/Carrier.php +++ b/classes/Carrier.php @@ -842,6 +842,8 @@ class CarrierCore extends ObjectModel SET `id_reference` = '.(int)$id_reference.' WHERE `id_carrier` = '.(int)$this->id); + $this->id_reference = (int)$id_reference; + // Copy tax rules group Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'carrier_tax_rules_group_shop` (`id_carrier`, `id_tax_rules_group`, `id_shop`) (SELECT '.(int)$this->id.', `id_tax_rules_group`, `id_shop` diff --git a/classes/ObjectModel.php b/classes/ObjectModel.php index 4946ae6b8..9dab94460 100644 --- a/classes/ObjectModel.php +++ b/classes/ObjectModel.php @@ -518,6 +518,54 @@ abstract class ObjectModelCore return $result; } + + /** + * Duplicate current object to database + * + * @return new object + */ + public function duplicateObject() + { + $definition = ObjectModel::getDefinition($this); + + $res = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.bqSQL($definition['table']).'` + WHERE `'.bqSQL($definition['primary']).'` = '.(int)$this->id + ); + if (!$res) + return false; + unset($res[$definition['primary']]); + + if (!Db::getInstance()->insert($definition['table'], $res)) + return false; + + $object_id = Db::getInstance()->Insert_ID(); + + if ($definition['multilang']) + { + $res = Db::getInstance()->executeS(' + SELECT * + FROM `'._DB_PREFIX_.bqSQL($definition['table']).'_lang` + WHERE `'.bqSQL($definition['primary']).'` = '.(int)$this->id + ); + + if (!$res) + return false; + + foreach ($res as $row) + { + $row[$definition['primary']] = (int)$object_id; + if (!Db::getInstance()->insert($definition['table'].'_lang', $row)) + return false; + } + } + + $object_duplicated = new $definition['classname']((int)$object_id); + $object_duplicated->duplicateShops((int)$this->id); + + return $object_duplicated; + } /** * Update current object to database diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index 9ba604af3..2651d9286 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -696,20 +696,19 @@ class AdminControllerCore extends Controller if ($this->deleted && $this->beforeDelete($object)) { // Create new one with old objet values - $object_new = new $this->className($object->id); - $object_new->id = null; - $object_new->date_add = ''; - $object_new->date_upd = ''; - - // Update old object to deleted - $object->deleted = 1; - $object->update(); - - // Update new object with post values - $this->copyFromPost($object_new, $this->table); - $result = $object_new->add(); + $object_new = $object->duplicateObject(); if (Validate::isLoadedObject($object_new)) - $this->afterDelete($object_new, $object->id); + { + // Update old object to deleted + $object->deleted = 1; + $object->update(); + + // Update new object with post values + $this->copyFromPost($object_new, $this->table); + $result = $object_new->update(); + if (Validate::isLoadedObject($object_new)) + $this->afterDelete($object_new, $object->id); + } } else { diff --git a/controllers/admin/AdminCarriersController.php b/controllers/admin/AdminCarriersController.php index 715045420..989457d84 100644 --- a/controllers/admin/AdminCarriersController.php +++ b/controllers/admin/AdminCarriersController.php @@ -472,17 +472,20 @@ class AdminCarriersControllerCore extends AdminController $current_carrier = new Carrier($id); if (!Validate::isLoadedObject($current_carrier)) throw new PrestaShopException('Cannot load Carrier object'); - // Set flag deteled to true for historization - $current_carrier->deleted = true; - $current_carrier->update(); - - // Create new carrier - $new_carrier = new Carrier(); - // Fill the new carrier object - $this->copyFromPost($new_carrier, $this->table); - $new_carrier->position = $current_carrier->position; - if ($new_carrier->add()) + + // Duplicate current Carrier + $new_carrier = $current_carrier->duplicateObject(); + if (Validate::isLoadedObject($new_carrier)) { + // Set flag deteled to true for historization + $current_carrier->deleted = true; + $current_carrier->update(); + + // Fill the new carrier object + $this->copyFromPost($new_carrier, $this->table); + $new_carrier->position = $current_carrier->position; + $new_carrier->update(); + $this->updateAssoShop($new_carrier->id); $new_carrier->copyCarrierData((int)$current_carrier->id); $this->changeGroups($new_carrier->id);