Pass a variable from Zend controller to zend form

2019-05-28 08:38发布

问题:

I wanted to pass a variable from a controller to the form. How can this be implemented? Can anyone please help me on this issue.

Thank you.

回答1:

In the controller method of your application. addMultiOptions($options);

class OrderController extends Zend_Controller_Action
{   
    $options = array(
        'foo' => 'Foo2 Option',
        'bar' => 'Bar2 Option',
        'baz' => 'Baz2 Option',
        'bat' => 'Bat2 Option' 
    );

    $form  = new Application_Form_PlaceNewOrder();
    $form->items->addMultiOptions($options);

    ....
}

In the form script of your application.

class Application_Form_PlaceNewOrder extends Zend_Form
{
    public function init()
    { 
        $items= new Zend_Form_Element_Select('items');
        $items->setLabel('Items: *');       
        $items->setValue('foo');
        ....
}


回答2:

Just a live example:

class Admin_Form_Product extends Admin_Form_Abstract {

    protected $_categories = array();

    protected $_brands = array();

    protected $_types = array();

    protected $_periods = array();

    protected $_stores = array();

    public function init() {
        $this
            ->addElement('hidden', 'id')
            ->addElement('text', 'name', array('label' => 'Name:', 'required' => true, 'size' => 50))
            ->addElement('multiCheckbox', 'category_id', array('label' => 'Category:', 'required' => true, 'multiOptions' => $this->getCategories()))
            ->addElement('multiCheckbox', 'store_id', array('label' => 'Stores:', 'required' => true, 'multiOptions' => $this->getStores()))
            ->addElement('select', 'brand_id', array('label' => 'Brand:', 'required' => true, 'multiOptions' => $this->getBrands()))
            ->addElement('select', 'type_id', array('label' => 'Type:', 'required' => true, 'multiOptions' => $this->getTypes()))
            ->addElement('select', 'period_id', array('label' => 'Period:', 'required' => true, 'multiOptions' => $this->getPeriods()))
            ->addElement('textarea', 'description', array('label' => 'Description:', 'rows' => 12, 'cols' => 50))
            ->addElement('text', 'price', array('label' => 'Price ($):', 'required' => true, 'size' => 7))
            ->addElement('text', 'quantity', array('label' => 'Quantity:', 'required' => true, 'size' => 7, 'value' => 1))
            ->addElement('button', 'submit', array('label' => 'Save', 'type' => 'submit'));

        $this->category_id->setValidators(array(new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::NULL)));
        $this->brand_id->setValidators(array(
            new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::NULL)
        ));
        $this->price->setValidators(array(new Zend_Validate_Float()));
    }

    public function setCategories($categories = array()) {
        $this->_categories = $categories;
        return $this;
    }

    public function getCategories() {
        return $this->_categories;
    }

    public function setBrands($brands) {
        $this->_brands = $brands;
    }

    public function getBrands() {
        return $this->_brands;
    }

    public function setTypes($types) {
        $this->_types = $types;
    }

    public function getTypes() {
        return $this->_types;
    }

    public function setPeriods($periods) {
        $this->_periods = $periods;
    }

    public function getPeriods() {
        return $this->_periods;
    }

    public function setStores($stores) {
        $this->_stores = $stores;
    }

    public function getStores() {
        return $this->_stores;
    }

    public function prepareDecorators() {
        $this
            ->clearDecorators()
            ->addDecorator(new Zend_Form_Decorator_ViewScript(array('viewScript' => 'forms/product-form.phtml')))
            ->addDecorator('Form');

        $this->setElementDecorators(array('ViewHelper'));

        return parent::prepareDecorators();
    }

}

Then in you controller you can just pass necessary vars as config into form constructor:

public function addAction() {
    $categories = $this->_helper->service('Category')->getCategories();
    $brands = $this->_helper->service('Brand')->getBrands();
    $types = $this->_helper->service('Type')->getTypes();
    $stores = $this->_helper->service('Store')->getStores();
    $periods = $this->_helper->service('Period')->getPeriods();
    $filter = new Skaya_Filter_Array_Map('name', 'id');
    $filterCategory = new Skaya_Filter_Array_ParentRelation();

    $form = new Admin_Form_Product(array(
        'name' => 'user',
        'action' => $this->_helper->url('save'),
        'method' => Zend_Form::METHOD_POST,
        'categories' => $filterCategory->filter($categories->toArray()),
        'brands' => $filter->filter($brands->toArray()),
        'types' => $filter->filter($types->toArray()),
        'periods' => $filter->filter($periods->toArray()),
        'stores' => $filter->filter($stores->toArray())
    ));
    $form->prepareDecorators();
    $this->view->form = $form;
}


回答3:

when you create the form you can add a custom function

class Application_Form_Sample extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post')->setAction('/sampleController/sampleAction');

    $name = new Zend_Form_Element_Text('name');
    $name->setLabel('Nome')
        ->setDescription("Here goes the name")
        ->setRequired(true);

        $submit = new Zend_Form_Element_Submit('Submit');
        $submit->setIgnore(true);

        $this->addElement($name)
        ->addElement($submit);
    }
    public function myFunction($param) {
        //do something with the param
    }
}

from your controller you can call that function and "edit" or "do what you want" with the form