2010-12-14 3 views
8

Iam, столкнувшись с типичной проблемой с отправкой формы с использованием рамки Zend. В принципе, я написал простой код для входа в систему, но это получилось неожиданным.Типичная проблема с логином с использованием Zend_Form

код, чтобы показать форму является довольно стандартным

$ LoginForm = новый Application_Form_Login(); $ loginform-> setMethod ('post'); $ loginform-> setAction ('login'); $ this-> view-> form = $ loginform;

Когда я использую мой адрес домашней страницы, как - http://localhost.ruin.com/public/

я получаю исключение

Page not found 
Exception information: 

Message: Invalid controller specified (login) 
Stack trace: 

#0 C:\domains\ruin\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#1 C:\domains\ruin\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#2 C:\domains\ruin\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#3 C:\domains\ruin\public\index.php(27): Zend_Application->run() 
#4 {main} 

Request Parameters: 

array (
    'controller' => 'login', 
    'action' => 'index', 
    'module' => 'default', 
    'username' => 'fsdf', 
    'password' => 'fdsf', 
    'submit' => 'submit', 
) 

Однако, если я использую базовый URL, как http://localhost.ruin.com/public/index/, тот же код работает отлично.

Я также знаю, что это связано с тем, что в первом URL-адресе маршрутизатор zend испортил указательный контроллер с логином, поскольку он не смог добавить действие входа в контроллер индекса по умолчанию.

ли вы, ребята, думаете, что это по дизайну Zend Framework и мне придется силой шлю пользователь этого адрес http://localhost.ruin.com/public/index/ всякий раз, когда они попали на главной странице, или есть способ, которым я могу сделать мой код работает с http://localhost.ruin.com/public/

Любые предложения?

+0

опубликовать ваш маршрута и содержимое файла .htaccess – Ish

+0

Что произойдет, если вы пытаетесь получить доступ к/Public/логин/индекс? –

+0

@ishkumar - Нет настраиваемых маршрутов, .htaccess - это значение по умолчанию, которое создает инструмент zend. Ни одно из них не изменилось. –

ответ

2

Короткий ответ:

$form->setAction('/public/index/login'); 

Смехотворно многословен ответ следующим образом: ;-)

Одна точка путаницы является использование термина "действие".

Что касается в форме, «действие» относится к атрибуту действия:

<form action="/url/at/which/the/form/will/be/processed" method="post"> 

Это действие упоминаться при вызове метода $form->setAction(). Ключевым моментом является то, что это должно быть URL, и приложение должно иметь маршрутизацию на месте, которая отображает этот URL-адрес в пару (контроллер, действие).

Что вызывает другой способ использования термина «действие»: как сокращенное название метода на контроллере. Например, действие с именем «улыбка» сопоставляется методу smileAction() на контроллере.

Итак, в вашем случае проблема заключается в получении вашей формы setAction() вызова синхронизации с маршрутизацией, которая находится на месте для приложения.

Указывая URL-адрес 'login' как действие формы, вы предоставляете относительный адрес URL, поэтому браузер будет интерпретировать это как относительно URL-адреса, отображаемого в строке местоположения браузера. Когда вы переходите на страницу, но оставьте часть «индекса» URL-адреса, тогда по умолчанию маршрутизация в структуре просматривает «вход» в качестве контроллера. Поскольку у вас нет 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, что маршрутизатор может отображать на контроллер/действие пара знает, как обрабатывать почту.

Надеюсь, это поможет!

-1

В первую очередь вы должны понимать, что «общедоступная» папка в вашем примере должна быть веб-корнем (или DocumentRoot). После правильной настройки вы увидите, что вы можете получить доступ к своему сайту, используя http://localhost.ruin.com, и я совершенно уверен, что ваша форма входа будет работать без каких-либо проблем.

Для получения дополнительной информации см. http://framework.zend.com/manual/en/project-structure.project.html.

+0

Это не имеет никакого отношения к структуре каталогов. –

2

Вы должны установить URL ваших действий, как это:

Если вы на взгляд

$this->form->setAction($this->url(array('params here or'), 'the route name')); 

Если вы на контроллере

$form->setAction($this->_helper->url(array('params or...'), 'the route name')); 

или

$form->setAction($this->getRequest()->getBaseUrl() . '/index/login'); 

См. Это повторно веден вопрос:

Zend Form SetAction Using Named Routes

+1

Этот ответ лучше, чем принятый, но в контроллере вместо этого следует использовать помощник действий. – takeshin

+0

Спасибо @takeshin Я добавлю ваше одобрение. –

Смежные вопросы