/** * Copy Into Description * @casted * @return Str */ public function getCopyInto() { $className = $this->CopyIntoClassName; if ($className) { $obj = $className::get()->byID($this->CopyIntoClassNameID); if ($obj) { return CopyFactory::title_for_object($obj) . " (" . $className . ")"; } } return _t("CopyFactory.N_A", "n/a"); }
/** * we run the actual copying onAfterWrite */ function onAfterWrite() { parent::onAfterWrite(); if (SiteConfig::current_site_config()->AllowCopyingOfRecords) { $fieldName = $this->owner->CopyFromFieldName(false); $fieldNameWithID = $this->owner->CopyFromFieldName(true); if ($this->owner->{$fieldNameWithID}) { if ($copyFrom = $this->owner->{$fieldName}()) { $factory = CopyFactory::create($this->owner); $factory->copyObject($copyFrom, $this->owner); } else { // a little cleanup: lets reset ... $this->owner->{$fieldNameWithID} = 0; $this->owner->write(); } } } }
/** * Usage: an object has many children * and we want to also copy the children and add them to the * copied into parent ... * * @param DataObject $copyFromParent * @param DataObject $newObjectParent * @param String $relationalFieldForChildren - this is the field on the parent that provides the children (e.g. Children or Images) WITHOUT the ID part. * @param String $relationFieldForParentWithoutID - this is the field on the children that links them back to the parent. * * @return CopyFactory */ function copyHasManyRelation($copyFromParent, $newObjectParent, $relationalFieldForChildren, $relationFieldForParentWithoutID) { if ($this->recordSession) { self::add_to_session("\n\t\t\t\t====================================\n\t\t\t\tCOPY HAS-MANY RELATION:\n\t\t\t\tCHILDREN METHOD: '{$relationalFieldForChildren}' and\n\t\t\t\tPARENT METHOD: '{$relationFieldForParentWithoutID}'\n\t\t\t\t====================================\n\t\t\t\t", $copyFromParent, $newObjectParent); } foreach ($copyFromParent->{$relationalFieldForChildren}() as $copyFromChildObject) { $className = $copyFromChildObject->ClassName; $relationFieldForParentWithID = $relationFieldForParentWithoutID . "ID"; $childCopyField = $copyFromChildObject->CopyFromFieldName($withID = true); if ($this->recordSession) { self::add_to_session("Creating a new object '{$className}'; adding parent field ({$relationFieldForParentWithID}) ID: " . $newObjectParent->ID, $copyFromParent, $newObjectParent); } //create object and set parent ... $newObjectChildObject = new $className(); if ($this->isForReal) { $newObjectChildObject->{$relationFieldForParentWithID} = $newObjectParent->ID; //does the child also copy ... //we copy the data here so that we dont run into validation errors $obj = CopyFactory::create($newObjectChildObject); $obj->copyObject($copyFromChildObject, $newObjectChildObject); //we reset the copy field here so that the copy can run another //time and do the has-many and many-many parts //$newObjectChildObject->$childCopyField = intval($copyFromChildObject->ID); //$newObjectChildObject->write(); //retrieve it again to set more details ... //$newObjectChildObject = $className::get()->byID($newObjectChildObject->ID); // setting parent again - just in case ... $newObjectChildObject->{$relationFieldForParentWithID} = $newObjectParent->ID; $newObjectChildObject->write(); } if ($this->recordSession) { if (!$newObjectChildObject) { self::add_to_session("ERROR: did not create object listed above", $copyFromChildObject, $newObjectChildObject); } else { self::add_to_session("CREATED object", $copyFromChildObject, $newObjectChildObject); } if ($newObjectChildObject->{$relationFieldForParentWithID} != $newObjectParent->ID) { self::add_to_session("\n\t\t\t\t\t\tERROR: broken link ... '" . $newObjectChildObject->{$relationFieldForParentWithID} . "' is not equal to '" . $newObjectParent->ID . "'", $copyFromChildObject, $newObjectChildObject); //hack fix } else { self::add_to_session("Saved with correct new parent field ({$relationFieldForParentWithID}) ID: " . $newObjectChildObject->{$relationFieldForParentWithID}, $copyFromChildObject, $newObjectChildObject); } } } if ($this->recordSession) { self::add_to_session("*** END OF copyHasManyRelation ***", $copyFromParent, $newObjectParent); } return $this; }