2012-10-23 13 views
7

से बाइंडिंग ज़ेंड 2 फॉर्म डेटा क्या bind() का उपयोग करने के अलावा एक सिद्धांत 2 ओडीएम इकाई वर्ग से डेटा को बाध्य करने का एक बेहतर तरीका है?डक्ट्रिन 2 ओडीएम

यदि हां, तो यह क्या होगा? क्या मैं सिर्फ डेटा को सरणी के रूप में पुनर्प्राप्त करूंगा और प्रत्येक व्यक्तिगत क्षेत्र को पास करूंगा? मैं इसके साथ संघर्ष कर रहा हूं और संभवतः इसे जितना कठिन होना चाहिए उतना कठिन बनाना।

जब मैं bind() फ़ंक्शन को कॉल करता हूं तो यह डिफ़ॉल्ट हाइड्रेटर का संदर्भ देने वाली ज़ेंड त्रुटि आउटपुट करता है। क्या मुझे अपनी इकाई वर्ग में कुछ खास करने की ज़रूरत है?

संपादित करें: यहाँ सटीक त्रुटियों Zend फेंक है

~ \ विक्रेता \ zendframework \ zendframework \ पुस्तकालय \ Zend \ Stdlib \ Hydrator \ ArraySerializable.php: 35

Zend \ Stdlib \ Hydrator \ ArraySerializable :: निकालने प्रदान की वस्तु getArrayCopy()

को लागू करने की उम्मीद है वे मुझे लगता है कि मैं जरूरत बनाने के लिए या तो करने के लिए:

  1. उपयोग hydrators (जो मैं कैसे लागू करने के लिए अनुसंधान करने के लिए होगा) या
  2. उपयोग doctrine2 के hydrators
+0

उपयोग करने के लिए कृपया अपने प्रश्न को संशोधित वास्तविक त्रुटि संदेश को रोकने के लिए। जिस तरह से ZF2 काम करता है, आप किसी ऑब्जेक्ट/इकाई को अपने फॉर्म में बांधते हैं और फिर निर्दिष्ट हाइड्रेटर सुनिश्चित करता है कि संदर्भित फॉर्म-फील्ड उचित रूप से मैप किए गए हैं। यह वास्तव में एक बहुत ही सरल उपयोग-मामला है और चिंताओं का एक अच्छा अलगाव है, जैसा कि त्रुटि संदेशों द्वारा दिया गया है, आपको हमेशा पता चल जाएगा कि कहां देखना है। – Sam

उत्तर

14

लिए Zend \ पर्चा अपनी इकाई hydrating करने में सक्षम होने से आप अपने इकाई कक्षा में ऐसा ही कुछ करने की जरूरत है:

public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 
+1

स्वचालित हाइड्रेशन जादू, ZF2 शैली लागू करने की अपेक्षा करता है। आसान सीखने की वक्र ... –

+1

get_object_vars फ़ंक्शन से चिंतित था। संदर्भ: [get_object_vars] (http://php.net/manual/en/function.get-object-vars.php) - "दायरे के अनुसार दिए गए ऑब्जेक्ट के सुलभ गैर स्थैतिक गुण प्राप्त करता है।" –

+1

अधिक स्पष्ट रूप से, हम इस फ़ाइल में उपर्युक्त विधि जोड़ते हैं: '\ zf2-tutorial \ module \ album \ src \ album \ Model \ album.php'। –

1

मैं (जो, मैं भी लागू करने के लिए सबसे अच्छा तरीका है यह पता लगाने की होगा) Zends मेरी इकाई वर्ग में जनसंख्या विधि का उपयोग करें। कुछ इस

public function populate($data = array()) 
    { 
     $this->id = (isset($data['id'])) ? $data['id'] : null; 
     $this->username = (isset($data['username'])) ? $data['username'] : null; 
     $this->pass = (isset($data['pass'])) ? $data['pass'] : null;    

    } 

की तरह और फिर नियंत्रक में आप इस तरह समारोह कुछ पॉप्युलेट उपयोग कर सकते हैं।

$user = new User(); 
$request = $this->getRequest(); 
$user->populate($request->getPost()); 

मुझे यकीन नहीं है कि मैं आपके quesiton सही ढंग से समझता हूं।

+0

असल में, मेरे प्रश्न एक संपादन एक्शन() से संबंधित हैं। मैं चाहता हूं कि उपयोगकर्ता पहले से ही पोस्ट की गई जानकारी को संपादित कर सकें, जाहिर है। मैंने कुछ शोध किया है और पाया है कि ज़ेंड एक बाइंड() विधि का उपयोग करता है जो मेरी इकाई से डेटा खींच लेगा और फ़ॉर्म को संपादित करने के लिए पॉप्युलेट करेगा। वर्तमान में मैं $ form = new फॉर्म() की तरह कुछ कर रहा हूं; $ फार्म> बाँध ($ इकाई)। मेरी $ इकाई doctrne2 के getServiceLocator() का उपयोग कर रही है और मैं getQueryBuilder() का उपयोग करके एक क्वेरी बना रहा हूं। जब मैं अपने संपादन एक्शन पर नेविगेट करता हूं तो मुझे निम्न त्रुटि मिलती है Zend \ Stdlib \ Hydrator \ ArraySerializable :: निकालने के लिए प्रदान की गई वस्तु को getArrayCopy() – bl4design

1

सौभाग्य से, आप अपने सत्ता के बारे में अधिक कुछ नहीं चाहिए, तो आप इस ट्यूटोरियल का पालन करें:

http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/ मैं लगभग एक ही दृष्टिकोण का उपयोग करें और यह (लगभग) अच्छी तरह से काम कर रहा है। आपको दो चीजों की देखभाल करनी चाहिए:

1.) सुनिश्चित करें कि आप अपने टेबल (या कम से कम नल वाले) में मौजूद सभी डेटा को मान्य करते हैं, क्योंकि केवल सत्यापित फ़ील्ड डीबी को भेजे जाते हैं। यह मुझे इस ब्लॉग के लेखक ने कहा था। :)

2.) जब आप संपादित करें फार्म के लिए दृश्य बनाते हैं, रूट करने के लिए आईडी जोड़ें:

$form->setAttribute('action', $this->url('post', 
        array('action'=>'add', 'id'=>"$this->id")))->prepare(); 

गुड लक!

2
आप में

.../मॉडल/XXXXTable.php
परिभाषित एक समारोह चाहते हैं एक रिकॉर्ड प्राप्त करने के लिए।

$id = (int)$id; 
    $row = $this->tableGateway->select(array('id'=>$id)); 
    $row = $row->current(); //this line is very important 
+0

धन्यवाद, वास्तव में मेरे घंटों को बचाया। –

2

मैं module.config.php पर निम्न कोड का उपयोग सिद्धांत Hydrator

$form = new ...; 
$dm = $sm->get('doctrine.documentmanager.odm_default'); 
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm)); 
return $form; 
संबंधित मुद्दे