Передайте переменную из контроллера Zend в форму Zend

Я хотел передать переменную из контроллера в форму. Как это можно реализовать? Может кто-нибудь, пожалуйста, помогите мне в этом вопросе.

Спасибо.

3 ответа

Решение

В методе контроллера вашего приложения. addMultiOptions ($ опционы);

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

    ....
}

В форме сценария вашего приложения.

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

Просто живой пример:

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

}

Затем в вашем контроллере вы можете просто передать необходимые переменные как config в конструктор формы:

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

При создании формы вы можете добавить пользовательскую функцию

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

из вашего контроллера вы можете вызвать эту функцию и "редактировать" или "делать то, что вы хотите" с помощью формы

Другие вопросы по тегам