Краткий ответ:
$form->setAction('/public/index/login');
Смешно многословный ответ следует:; -)
Одной из путаниц является использование термина "действие".
СЧто касается формы , «действие» относится к атрибуту действия:
<form action="/url/at/which/the/form/will/be/processed" method="post">
Это действие будет упоминаться при вызове метода $form->setAction()
.Ключевым моментом является то, что это должен быть URL , и приложение должно иметь на месте маршрутизацию, которая отображает этот URL на пару (контроллер, действие).
, которая вызывает другойспособ, которым используется термин «действие»: в качестве сокращенного имени для метода на контроллере.Например, действие с именем «smile» отображается на метод smileAction()
на контроллере.
Таким образом, в вашем случае проблема заключается в том, чтобы синхронизировать вызов setAction()
вашей формы с маршрутизациейэто на месте для приложения.
Указывая URL-адрес «логин» в качестве действия формы, вы предоставляете относительный URL-адрес, поэтому браузер будет интерпретировать его как URL-адрес, отображаемый в строке адреса браузера.Когда вы переходите на страницу, но пропускаете часть URL-адреса «index», тогда маршрутизация по умолчанию в платформе рассматривает «login» как контроллер.Поскольку у вас нет LoginController
, запрос прекращается.
Так что ваш IndexController
может выглядеть следующим образом:
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->form = $this->_getForm();
}
public function loginAction()
{
$form = $this->_getForm();
if ($this->getRequest()->isPost()){
if ($form->isValid($this->getRequest()->getPost())){
// All cool. Process your form,
// probably with a redirect afterwords to
// clear the POST.
}
}
// Still alive?
// Then it was either not a post request or the form was invalid.
// In either case, set the form in the view
$this->view->form = $form;
}
/**
* A helper method to keep the form creation DRY
*/
protected function _getForm()
{
$loginform = new Application_Form_Login();
$loginform->setMethod('post');
// Points the form to the IndexController::loginAction();
$loginform->setAction('/public/index/login');
return $loginform;
}
}
В результате вызову setAction () требуется URL-адрес, которыймаршрутизатор может подключиться к контроллеру / пара действий знает, как обрабатывать сообщение.
Надеюсь, это поможет!