Theo như tài liệu của ZF thì các Element của Form được tạo ra bằng cách kế thừa 

Zend\Form\View\Helper\FormElement

Và hàm View Helper để xuất mã HTML ra form là hàm formRow. Thường sử dụng trong view script phtml như sau:

<?=$this->formRow($form->get('name-element'))?>

Các Form Element cung cấp sẵn bởi ZF thường sử dụng theo cách đó.

Ở đây ta tìm cách tạo ra một FormElement và tạo ra code render riêng cho Element đó.

Giả sử ta cần tạo một Element với tên là Mytextear thì ở cấp độ module làm như sau:

<?php
namespace MyModule\Form\Element;
use Zend\Form\Element;
class Mytextear extends Element
{
    protected $attributes = [
        'type' => 'textarea',
    ];
}

Như vậy bạn tạo ra một lớp

MyModule\Form\Element\MyTextarear

nó có chức năng tương tự Textarear gốc của ZF, và bạn sử dụng tùy ý giống Element gốc khi tạo Form. Bạn có thể sử dung Ví dụ:

       $form->add(array(
                'name' => 'message',
                'type' => '\Ahdbase\Form\Element\Textarea',                
        )); 

Giờ trong bạn muốn cập nhật tự render với View Hepler fromRow thì làm như sau:

Trong file module.config.php

<?
return array(  
    'view_helpers'=>array(
            'invokables' => array(             
            'formelement' => '\Ahdbase\Form\View\Helper\FormElement', //Cutome Formelemet Render
            'form_my_textarea' => '\Ahdbase\Form\View\Helper\FormTextarea'
        ),
        ), 
);

Trong file trên làm quá tải key: formelement  là key mặc định chỉ ra lớp chuyên render các element của Form. Thứ hai bạn tạo ra form_my_textarea để render riêng Mytextarear.

Tiếp theo bạn tạo file:

MyModule\Form\View\Helper\FromElemet.php

Nội dung như sau

<?
namespace MyModule\Form\View\Helper;
use \Ahdbase\Form\Element;
use \Zend\Form\View\Helper\FormElement as BaseFormElement;
use \Zend\Form\ElementInterface;

class FormElement extends BaseFormElement
{
    public function render(ElementInterface $element)
    {  
        $renderer = $this->getView();
        if (!method_exists($renderer, 'plugin')) {
            // Bail early if renderer is not pluggable  
            return '';
        }       
        if ($element instanceof \MyModule\Form\Element\Mytextarea) {
           
            $helper = $renderer->plugin('form_textare_ahd');
            return $helper($element);
        } 
        $renderedInstance = $this->renderInstance($element);
        if ($renderedInstance !== null) {
            return $renderedInstance;
        }
        $renderedType = $this->renderType($element);
        if ($renderedType !== null) {
            return $renderedType;
        }
        return $this->renderHelper($this->defaultHelper, $element);
    }
}

Đoạn mã trên cho biết khi bạn gọi hàm formRow trong View, nếu là element Mytextarear nó sẽ sử dụng plugin tên là form_my_textarea để render.

Giờ bạn tạo ra 

\MyModule\Form\View\Helper\FormTextarea.php

Dùng cho key form_my_textarea 

Nội dung như sau:

<?
namespace MyModule\Form\View\Helper;
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;
class FormTextarea extends AbstractHelper
{
     public function __invoke(ElementInterface $element)
    {
         //Bạn render HTML cho elemet ở đây
    }
}

Nếu thích render từ một script phtml thì thêm vào như sau:

<?
namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;
class FormTextarea extends AbstractHelper
{
    protected $script = 'myscrip.phtml';
    public function __invoke(ElementInterface $element)
    {
        //Render Here        
       return $this->getView()->render($this->script, array(
            'element' => $element
        ));
    }
}

Đăng ký nhận bài viết mới