Zend Form SetAction с использованием именованных маршрутов

У меня есть форма, для которой я пытаюсь установить действие. Я хочу объявить действие внутри моего файла формы (который расширяет Zend_Form), а не в контроллере или представлении, используя маршрут, который я создал в моем бутстрапе. Обычно, когда я хочу использовать маршрут, я делаю что-то вроде

$this->url(array(), 'route-name');

в представлении, или

$this->_helper->url(array(), 'route-name');

в контроллере.

Как мне вызвать маршрут из Zend_Form?


изменить: Я отказался от попытки загрузить маршрут в zend_form. Возможно, в будущем выпуске может быть функция, чтобы легко это сделать?

Я создал viewScript для своей формы и задал маршрут следующим образом: В функции init:

$this->setDecorators(array(
    'PrepareElements',
        array(
            'ViewScript', array(
                    'viewScript' => 'forms/formView.phtml'
            ))));

и в файле вида:

<form method="post" action="<?php echo $this->url(array(), 'route-name'); ?>" enctype="application/x-www-form-urlencoded">
    <?php
        foreach ($this->element->getElements() as $element)
        {
            echo $element;
        }
    ?>
</form>

Ответ 1

Способ 1. Получить маршрутизатор

// in your form
public function init()
{
    $router = Zend_Controller_Front::getInstance()->getRouter();
    $url = $router->assemble(
        array(
            'paramterName0' => 'parameterValue0',
            'paramterName1' => 'parameterValue1',
        ),
        'routeName'
    );

    $this->setAction($url);
    ...
}

Способ 2. Получите экземпляр объекта View и вызовите непосредственно hello-view-helper

// in your form    
public function init()
{
    $url = Zend_Layout::getMvcInstance()->getView()->url(array(), 'routeName';
    $this->setAction($url);
    ...
}

Я предпочитаю метод 1. Он более подробный, но у вас есть одна зависимость меньше в вашей форме.

Ответ 2

если в действии моего контроллера:

$this->view->form = $form;

Я буду использовать URL-адрес помощника вида, чтобы сгенерировать форму action url в моем представлении script (xxx.phtml):

$url = $this->url(array('controller'=>'my-controller-name', 
                    'action'=>'my-action-name'), 
              'my-route-name'
             );

$this->form->setAction($url);

echo $this->form;

Ответ 3

В настоящее время вы можете получить доступ к объекту Zend_View с помощью метода getView() в классах Zend_Form:

// init your form    
public function init()
{
    $view = $this->getView();
    $url = $view->url(array('module'=>'login','action'=>'login'));
    $this->setAction($url);
    ...
}

Возможно, эта помощь поможет ZF 1.8 +

Ответ 4

Я не знаю, когда он был добавлен, но есть еще более простое решение.

Вы можете получить объект вида формы с помощью getView(), который имеет доступ к зарегистрированным маршрутам.

//In the form
$this->setAction($this->getView()->url(array('param1' => 'value1'), 'routeName'));