2012-09-17 7 views
5

मेरे एक्स्टबेस/तरल प्रोजेक्ट में, मानक क्रियाओं जैसे कि बनाना, हटाना, सूची इत्यादि के अलावा, मैं एक मॉडल क्लास ऑब्जेक्ट का डुप्लिकेट बनाना चाहता हूं जो एक भंडार में संग्रहीत है। Findall() का उपयोग करके, सभी ऑब्जेक्ट्स एक सूची में प्रदर्शित होते हैं और संबंधित क्रियाएं जैसे कि डिलीट, प्रत्येक के बगल में संपादित होते हैं। एक वस्तु को डुप्लिकेट के लिए, मैं इसी नियंत्रक में एक नकली कार्रवाई बनाई है और यहाँ कोड है हैएक्सपबेस रिपोजिटरी ऑब्जेक्ट डुप्लिकेटिंग

public function dupcliateAction(Tx_CcCompanylogin_Domain_Model_MyObject $testObject) 
{ 
$this->myObjectRepository->add($testObject); 
$this->redirect('list');//Lists the objects again from the repository 
} 

लगता है पर्याप्त straitforward लेकिन कोई नई वस्तु भंडार में जोड़ा जाता है और मैं नहीं मिल रहा है एक error.I है दस्तावेज़ीकरण की जांच की और डुप्लीकेटिंग के लिए कोई स्पष्ट विधि उपलब्ध नहीं है।

उत्तर

3

नोट: जब कोई ऑब्जेक्ट क्लोन किया जाता है, तो PHP 5 ऑब्जेक्ट की सभी गुणों की उथली प्रतिलिपि करेगा। कोई भी गुण जो अन्य चर के संदर्भ हैं, संदर्भ बने रहेंगे।

वैकल्पिक आप अपनी वस्तु की एक (गहरी) प्रतिलिपि बनाने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

$productClone = $this->objectManager->create('Tx_Theext_Domain_Model_Product'); 

// $product = source object 
    $productProperties = Tx_Extbase_Reflection_ObjectAccess::getAccessibleProperties($product); 
    foreach ($productProperties as $propertyName => $propertyValue) { 
     Tx_Extbase_Reflection_ObjectAccess::setProperty($productClone, $propertyName, $propertyValue); 
    } 

// $productAdditions = ObjectStorage property 
    $productAdditions = $product->getProductAddition(); 
    $newStorage = $this->objectManager->get('Tx_Extbase_Persistence_ObjectStorage'); 
    foreach ($productAdditions as $productAddition) { 
     $productAdditionClone = $this->objectManager->create('Tx_Theext_Domain_Model_ProductAddition'); 
     $productAdditionProperties = Tx_Extbase_Reflection_ObjectAccess::getAccessibleProperties($productAddition); 
     foreach ($productAdditionProperties as $propertyName => $propertyValue) { 
      Tx_Extbase_Reflection_ObjectAccess::setProperty($productAdditionClone, $propertyName, $propertyValue); 
     } 
     $newStorage->attach($productAdditionClone); 
    } 
    $productClone->setProductAddition($newStorage); 
// This have to be repeat for every ObjectStorage property, or write a service. 
0

मुझे लगता है कि एड कमांड उन वस्तुओं को अनदेखा करता है जो पहले से मौजूद हैं।

आप ऑब्जेक्ट को क्लोन करने का प्रयास कर सकते हैं और फिर क्लोन को रिपोजिटरी $copy_of_object = clone $object; पर जोड़ सकते हैं। या हो सकता है कि सभी समान गुणों के साथ एक नया ऑब्जेक्ट बनाएं।

2

जो लोग चिंता का विषय हो सकता है के लिए:

आप इस बिंदु पर प्रतिबिंब-api कॉल करने के लिए की जरूरत नहीं है। आपको केवल एक विधि को लागू करने की आवश्यकता है उदा। resetUid() इस तरह अपने मॉडल में:

public function resetUid() { 
    $this->uid = NULL; 
    $this->_setClone(FALSE); 
} 

तो आप अपने नियंत्रक में वस्तु क्लोन करने के लिए जादू clone विधि का उपयोग कर सकते हैं। उसके बाद आपको नई resetUid() विधि को कॉल करना होगा और फिर आप पुराने गुणों के साथ नई वस्तु को जारी रखने में सक्षम हैं।

1

मेरे लिए, समाधान "मॉडेल में क्लोन $ ऑब्जेक्ट और रीसेट यूआईडी() काम नहीं करता है .. शायद इस समाधान ने पुराने TYPO3 संस्करणों में काम किया था लेकिन 7.6 में। LTS यह एक अपवाद

#1222871239: The uid "61" has been modified, that is simply too much. 

तो शायद किसी ने मेरे समाधान पा सकते हैं फेंकता सहायक के रूप में यह अन्य प्रतिबिंब समाधान से काफी कम कोड है: (और आप सभी एकल गुणों को सेट करने के बारे में सोचने की जरूरत नहीं है ..)

दिया गया: ऑब्जेक्ट को सभी डेटा के साथ $ registrant कहा जाता है। वांटेड परिणाम: वाले एक ही डेटा है कि वस्तु की एक प्रति है, लेकिन नई Uid ..

/** @var \JVE\JvEvents\Domain\Model\Registrant $newregistrant */ 

$newregistrant = $this->objectManager->get("JVE\\JvEvents\\Domain\\Model\\Registrant") ; 

$properties = $registrant->_getProperties() ; 
unset($properties['uid']) ; 

foreach ($properties as $key => $value) { 
    $newregistrant->_setProperty($key , $value) ; 

} 
संबंधित मुद्दे