2017-01-21 20 views
14

Я воспользовался примером и хотел бы передать адаптер базы данных в набор полей, чтобы создать раскрывающееся меню.Как я могу получить доступ к адаптеру базы данных в поле ZF2 Field Set?

Код, приведенный ниже, как я называю набор полей.
Как я могу получить доступ к адаптеру базы данных в классе BrandFieldset?

$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, чтобы ввести этот адаптер БД или дополнительные зависимости к набору полей для построения для достижения этого.

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); 
    } 
} 

На данный момент, BrandFieldset следует расширить Zend\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 файле I 'd имеют конфигурацию, чтобы сообщить FormElementManager об этой заводе:

<?php 

use Application\Form\BrandFieldset; 
use Application\Form\Factory\BrandFieldsetFactory; 

return [ 
    // other config 

    // Configuration for form element manager 
    'form_elements' => [ 
     'factories' => [ 
      BrandFieldset::class => BrandFieldsetFactory::class 
     ], 
    ], 
]; 

УКАЗАНИЕ: Метод BrandFieldset::init() будет вызван автоматически FormElementManager после его строительства. В этот метод можно поместить любую логику после инициализации.

+0

Может ли это использоваться в ZF2? У меня проблемы с работой. – Matt

+0

Несомненно, после того, как завод ZF2 дружелюбен, он должен работать. Просто добавьте метод createService() на фабрику, как и другие фабрики zf2, и вызовите _invoke из этого метода. – edigu

+0

Я не уверен, что вы имеете в виду. Если я var dump $ db в fieldset, я получаю имя класса («brandfieldset»). Это не похоже на то, что фабрика когда-либо называется (если я выхожу или var dump на фабрике ничего не происходит) – Matt