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

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

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

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

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

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

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


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

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

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

person Richard Parnaby-King    schedule 20.07.2010    source источник
comment
Не сдавайся так быстро. Просто дайте нам время ответить на ваш вопрос;)   -  person Benjamin Cremer    schedule 20.07.2010


Ответы (4)


Способ 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 и напрямую вызвать помощника url-view-helper

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

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

person Benjamin Cremer    schedule 20.07.2010
comment
Проблема с первым методом заключается в том, что у меня уже есть маршруты, настроенные в начальной загрузке. Второй метод фантастический! - person Richard Parnaby-King; 21.07.2010
comment
@Dickie Method 1 не определяет новый маршрут. Он собирает URL-адрес с существующим маршрутом. Взгляните на Zend_View_Helper_Url. Он делает то же самое: достает маршрутизатор и вызывает сборку. - person Benjamin Cremer; 21.07.2010
comment
Ты прав. Я неправильно прочитал код. Я думал, что это создание нового маршрута, а не использование маршрута. Это именно то, что мне нужно. Спасибо. - person Richard Parnaby-King; 21.07.2010
comment
Не знаю почему, но до сих пор я не думал об этом. Бен, спасибо за красивое и простое решение. Теперь мои формы могут синхронизироваться с моей таблицей маршрутизации. - person Matthew Setter; 09.10.2012

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

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

Я буду использовать URL-адрес помощника просмотра для создания URL-адреса действия формы в моем сценарии просмотра (xxx.phtml):

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

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

echo $this->form;
person jian hang    schedule 03.06.2011

В настоящее время вы можете получить доступ к объекту 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+

person Stephan de Souza    schedule 25.02.2012

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

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

//In the form
$this->setAction($this->getView()->url(array('param1' => 'value1'), 'routeName'));
person Richard Parnaby-King    schedule 21.02.2012