2017-01-21 10 views
14

मैंने एक उदाहरण का पालन किया है और एक ड्रॉप डाउन मेनू बनाने के लिए डेटाबेस एडेप्टर को फ़ील्डसेट में पास करना चाहता हूं।मैं ZF2 फ़ील्ड सेट में डेटाबेस एडाप्टर का उपयोग कैसे कर सकता हूं?

नीचे दिया गया कोड यह है कि मैं फ़ील्डसेट को कैसे कॉल करता हूं।
मैं ब्रांडफ़िल्सेट कक्षा में डेटाबेस एडाप्टर का उपयोग कैसे कर सकता हूं?

$this->add(array(
    'type' => 'Application\Form\BrandFieldset', 
    'name' => 'brand', 
    'options' => array(
     'label' => 'Brand of the product', 
    ), 
)); 

उत्तर

1

इन दस्तावेज़ों के आधार पर मैं समाधान ढूंढने में सक्षम था।

https://framework.zend.com/manual/2.1/en/modules/zend.form.advanced-use-of-forms.html

'form_elements' => array(
    'invokables' => array(
     'fieldset' => BrandFieldsetFactory::class 
    ) 
) 

मैं नीचे की तरह नियंत्रक में सेवा लोकेटर का उपयोग कर प्रपत्र कॉल करने के लिए की जरूरत है।

$sl = $this->getServiceLocator(); 
$form = $sl->get('FormElementManager')->get('Application\Form\CreateForm'); 

इसके अतिरिक्त मैंने __construct को init में बदल दिया।

3

एक फ़ील्ड को इंस्टेंट करना FormElementManager की ज़िम्मेदारी है। जब आप किसी प्रपत्र, फॉर्म तत्व या फ़ील्डसेट तक पहुंचने का प्रयास करते हैं, तो FormElementManager जानता है कि कहां ढूंढना है और इसे कैसे बनाया जाए। ढांचे के Default Services खंड में यह व्यवहार गर्म हो गया।

के बाद से फार्म तत्वों तक पहुँचने का उचित तरीके से FormElementManager से उन्हें पुनर्प्राप्त कर रहा है, मैं एक BrandFieldsetFactory बारे में इंजेक्षन करने के लिए कि डीबी अनुकूलक या आगे निर्भरता निर्माण पर fieldset के लिए इस लक्ष्य को हासिल करने के लिए होगा।

एक ZF3 अनुकूल fieldset कारखाना देखने की तरह होगा:

<?php 
namespace Application\Form\Factory; 

use Application\Form\BrandFieldset; 
use Interop\Container\ContainerInterface; 

class BrandFieldsetFactory 
{ 
    /** 
    * @return BrandFieldset 
    */ 
    public function __invoke(ContainerInterface $fem, $name, array $options = null) 
    { 
     // FormElementManager is child of AbstractPluginManager 
     // which makes it a ContainerInterface instance 
     $adapter = $fem->getServiceLocator()->get('Your\Db\Adapter'); 
     return new BrandFieldset($adapter); 
    } 
} 

इस बिंदु पर, BrandFieldsetZend\Form\Fieldset\Fieldset का विस्तार करना चाहिए और यह के निर्माता ऐसी नज़र हो सकता है:

private $dbAdapter; 

/** 
* {@inheritdoc} 
*/ 
public function __construct(My/Db/Adapter $db, $options = []) 
{ 
    $this->dbAdapter = $db; 
    return parent::__construct('brand-fieldset', $options); 
} 

अंत में, module.config.php फ़ाइल मैं में इस कारखाने के बारे में FormElementManager बताने के लिए कॉन्फ़िगरेशन है:

HINT:BrandFieldset::init() विधि निर्माण के बाद FormElementManager द्वारा स्वचालित रूप से कॉल किया जाएगा। आप इस विधि में कोई पोस्ट-प्रारंभिक तर्क डाल सकते हैं।

+0

क्या इसका उपयोग ZF2 में किया जा सकता है? मुझे इसे काम करने में परेशानी हो रही है। – Matt

+0

निश्चित रूप से, फैक्टरी ZF2 दोस्ताना बनाने के बाद, इसे काम करना चाहिए। बस अन्य zf2 कारखानों की तरह कारखाने में एक createService() विधि जोड़ें और उस विधि से _invoke को कॉल करें। – edigu

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। यदि मैं फ़ील्ड में $ db डंप करता हूं तो मुझे कक्षा का नाम मिलता है ("ब्रांडफील्डसेट")। ऐसा लगता है कि फैक्ट्री को कभी भी बुलाया नहीं जाता है (अगर मैं फैक्ट्री में बाहर निकलता हूं या वैर डंप खुश नहीं करता) – Matt

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

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