/** * Transfer all back refs from given object of same class * * @param CMbObject &$object The object to transfer back objects from * * @return string|null store-like error message if failed, null if successful */ function transferBackRefsFrom(CMbObject &$object) { if (!$object->_id) { trigger_error("transferNoId"); } if ($object->_class !== $this->_class) { trigger_error("An object from type '{$object->_class}' can't be merge with an object from type '{$this->_class}'", E_USER_ERROR); } $object->loadAllBackRefs(); foreach ($object->_back as $backName => $backObjects) { /** @var self[] $backObjects */ if (count($backObjects)) { $backSpec = $this->_backSpecs[$backName]; $backObject = new $backSpec->class(); $backField = $backSpec->field; $fwdSpec = $backObject->_specs[$backField]; $backMeta = $fwdSpec->meta; // Change back field and store back objects foreach ($backObjects as $backObject) { /** @var self $transferer Dummy tranferer object to prevent checks on all values */ $transferer = new $backObject->_class(); $transferer->_id = $backObject->_id; $transferer->{$backField} = $this->_id; $transferer->_forwardRefMerging = true; // Cas des meta objects if ($backMeta) { $transferer->{$backMeta} = $this->_class; } if ($msg = $transferer->store()) { return $msg; } } } } return null; }