2017-01-21 22 views
14

Tôi đã làm theo một ví dụ và muốn chuyển bộ điều hợp cơ sở dữ liệu đến một fieldset để tạo ra một trình đơn thả xuống.Tôi làm cách nào để truy cập Bộ điều hợp cơ sở dữ liệu trong Bộ trường ZF2?

Mã bên dưới là cách tôi gọi trường.
Làm cách nào tôi có thể truy cập bộ điều hợp cơ sở dữ liệu trong lớp BrandFieldset?

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

Trả lời

1

Dựa trên những tài liệu này, tôi đã tìm được giải pháp.

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

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

tôi cần phải gọi các hình thức sử dụng dịch vụ định vị trong bộ điều khiển như dưới đây.

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

Ngoài ra, tôi đã thay đổi __construct thành init.

3

Lập tức một fieldset là trách nhiệm của FormElementManager. Khi bạn cố gắng truy cập biểu mẫu, phần tử biểu mẫu hoặc fieldset, FormElementManager biết nơi cần tìm và cách tạo. Hành vi này được mô tả trong phần Default Services của khuôn khổ.

Vì cách truy cập thích hợp của các phần tử biểu mẫu là lấy chúng từ FormElementManager, tôi sẽ viết BrandFieldsetFactory để tiêm bộ điều hợp DB hoặc phụ thuộc vào fieldset vào xây dựng để đạt được điều này.

Một nhà máy ZF3 thân thiện fieldset sẽ trông như thế:

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

Tại thời điểm này, BrandFieldset nên mở rộng Zend\Form\Fieldset\Fieldset và constructor của nó có thể trông giống như sau:

private $dbAdapter; 

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

Cuối cùng, trong module.config.php tập tin I 'd có cấu hình để thông báo cho FormElementManager về nhà máy này:

<?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 
     ], 
    ], 
]; 

GỢI Ý: Phương thức BrandFieldset::init() sẽ được gọi tự động bởi FormElementManager sau khi xây dựng. Bạn có thể đặt bất kỳ logic hậu khởi tạo nào vào phương thức này.

+0

Điều này có thể được sử dụng trong ZF2 không? Tôi gặp sự cố khi làm việc đó. – Matt

+0

Chắc chắn, sau khi làm cho nhà máy ZF2 thân thiện, nó sẽ hoạt động. Chỉ cần thêm phương thức createService() vào nhà máy giống như các nhà máy zf2 khác và gọi _invoke từ phương thức đó. – edigu

+0

Tôi không chắc chắn ý bạn là gì. Nếu tôi var dump $ db trong fieldset, tôi lấy tên của class ("brandfieldset"). Nó không giống như nhà máy được bao giờ gọi là (nếu tôi thoát hoặc var dump trong nhà máy không có gì happends) – Matt

Các vấn đề liên quan