I am having major issues here, I had thought that separating the login
processing and the logout functions from the index page where the
actual login form is rendered would solve the issues im having but I
was mistaken. The issue still remains, I select logout and the
browser hourglasses and times out.
Is there some internal MVC zend log that I can take a look at? I have
taken a look at the apache logs but nothing happens. Its as if the
request is stuck in the framework. Im not sure it will help, but this
is my logout function and my index function inside the index
controller:
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$config = Zend_Registry::get('config');
$this->view->title = $config->english->login->title;
$this->view->baseurl = $config->production->hosturl;
$this->view->shead = $config->english->login->subheader;
$this->view->form = $this->getLoginForm();
$this->_helper->layout->disableLayout();
}
And logout function:
public function logoutAction()
{
Zend_Auth::getInstance()->clearIdentity();
return $this->_helper->redirector('index');
}
On Sat, Oct 18, 2008 at 10:33 PM, Matthew Ishii <[EMAIL PROTECTED]> wrote:
> Matt,
>
> Thank you. Separating the login/logout functionality from the
> IndexController definitely solved the issue (though I would love to
> know why that problem was occuring in the first place, so I avoid it
> in the future.)
>
> I do have one more technical issue with this however. When I separate
> the processing of the form to the LoginController from the actual
> rendering of the form in the IndexController, I get an exception when
> the login form is not valid. Reason being is that I need to set the
> view with the errors when the controller action deems it invalid, and
> I thought I do this successfully, but apparently Its not done right.
> Here is the relevant code from my LoginController:
>
> if (!$form->isValid($request->getPOST()))
> {
> // Form is not valid - re-set form and re-render index page
> with filter/validator-set errors
> $this->view->form = $form;
> return $this->render('index', 'index');
> }
>
> I thought this would be fine, even if its not setting the correct
> view, its returning a command to render the controller index, index
> action. Despite this, the framework looks for /login/index.phtml. I
> dont want to create an index page that duplicates the IndexController
> index. Must I?
>
> On Sat, Oct 18, 2008 at 7:11 AM, Matthew Weier O'Phinney
> <[EMAIL PROTECTED]> wrote:
>> -- Matthew Ishii <[EMAIL PROTECTED]> wrote
>> (on Friday, 17 October 2008, 10:40 PM -0700):
>>> Hello, I have a small issue.
>>>
>>> I would like to process the form action with a different controller
>>> than the one containing the form object.
>>>
>>> The problem for me is that I dont see how i can call the form
>>> validation method on the form object from the other controller.
>>>
>>> In other words, I have the main controller, IndexController.php. It
>>> generates the form object and sets the index view with the form.
>>>
>>> I then want the action of that form to call the LoginController's
>>> method 'login'. I can easily access the forms values via POST object,
>>> but how can i call the form objects validate method to make sure that
>>> the filters and validators i specified for the form actually return
>>> valid?
>>
>> From the code snippets you've provided, you're already on the right
>> track. You define the form as a separate class, and instantiate it when
>> needed. All you need to do is pass the appropriate method and action to
>> it when instantiating it -- the filters and validators will be the same
>> regardless of instance as long as you're not customizing them on a
>> per-action basis (which you don't appear to be doing anyways).
>>
>> It's simply a matter of calling $form->isValid(...). It's as easy as
>> that, really. :)
>>
>>> The whole reason I would like to split the functionality between the
>>> two is because when the login and logout methods are contained within
>>> the IndexController, the logout method has serious problems. It
>>> totally screws up the browser, it hourglasses and takes forever, only
>>> to tell me the page cannot be displayed. I dont quite understand why
>>> this is, so I wanted to attempt to split the functionality over two
>>> controllers.
>>>
>>> Here is the IndexController as it stands:
>>>
>>>
>>> <?php
>>>
>>> require_once('Zend/Controller/Action.php');
>>> require_once('Zend/Auth.php');
>>> require_once('../database/adapters/AuthAdapter.php');
>>>
>>> class IndexController extends Zend_Controller_Action
>>> {
>>>
>>>
>>> public function indexAction()
>>> {
>>> $config = Zend_Registry::get('config');
>>>
>>> $this->view->title = $config->english->login->title;
>>> $this->view->baseurl = $config->production->hosturl;
>>> $this->view->shead = $config->english->login->subheader;
>>> $this->view->form = $this->getLoginForm();
>>>
>>> $this->_helper->layout->disableLayout();
>>> }
>>>
>>> public function manualAction()
>>> {
>>> $this->_helper->layout->disableLayout();
>>>
>>> }
>>>
>>> public function logoutAction()
>>> {
>>> Zend_Auth::getInstance()->clearIdentity();
>>> return $this->_helper->redirector('index', 'index');
>>> }
>>>
>>> public function loginAction()
>>> {
>>> // Retreive Request
>>> $request = $this->getRequest();
>>>
>>> // Redirect to index if request is not POST
>>> if (!$request->isPost())
>>> {
>>> return $this->_helper->redirector('index');
>>> }
>>>
>>> // Get form and validate it
>>> $form = $this->getLoginForm();
>>>
>>> if (!$form->isValid($request->getPOST()))
>>> {
>>> // Form is not valid - re-set form and re-render index page
>>> with filter/validator-set errors
>>> $this->view->form = $form;
>>> return $this->render('index');
>>> }
>>>
>>> // Get authentication adapter to check input variables
>>> $adapter = $this->getAuthAdapter($form->getValues());
>>> $auth = Zend_Auth::getInstance();
>>> $result = $auth->authenticate($adapter);
>>>
>>> if (!$result->isValid())
>>> {
>>> // Check reasons for authentication failure
>>> switch ($result->getCode()) {
>>>
>>> case Zend_Auth_Result::FAILURE:
>>> // Invalid input variables
>>> $form->setDescription('Invalid Username or Password');
>>> $this->view->form = $form;
>>> break;
>>>
>>> case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
>>> // Identity confirmed : But requires a password update
>>> $form->setDescription('Access Credentials Expired -
>>> Contact an Administrator for renewal');
>>> $this->view->form = $form;
>>> break;
>>> }
>>>
>>> $this->_helper->layout->disableLayout();
>>> return $this->render('index');
>>> }
>>>
>>>
>>> // We're authenticated!
>>> $this->_helper->redirector('index', 'search');
>>>
>>> }
>>>
>>> public function getLoginForm()
>>> {
>>> return new LoginForm(array('action' => '/index/login', 'method'
>>> => 'post'));
>>> }
>>>
>>>
>>> public function getAuthAdapter(array $params)
>>> {
>>> return new AuthAdapter($params['username'], $params['password']);
>>> }
>>>
>>> }
>>>
>>>
>>> class LoginForm extends Zend_Form
>>> {
>>>
>>> public function init()
>>> {
>>> $this->setAttrib('name', 'login_form');
>>>
>>> $username = $this->addElement('text', 'username',
>>> array('filters' => array('StringTrim', 'StringToLower'),
>>> 'validators' => array('Alpha',
>>> array('StringLength', false, array(3, 20))),
>>> 'required' => true, 'label' =>
>>> 'Username', 'class' => 's_indentbottom'));
>>>
>>>
>>> $password = $this->addElement('password', 'password',
>>> array('filters' => array('StringTrim'),
>>> 'validators' => array('Alnum',
>>> array('StringLength', false, array(6, 20))),
>>> 'required' => true, 'label' =>
>>> 'Password'));
>>>
>>> $login = $this->addElement('submit', 'login', array('required'
>>> => false, 'ignore' => true, 'label' => 'Log In', 'class' =>
>>> 'login_submit_button'));
>>>
>>> $this->setDecorators(array('FormElements', array('HtmlTag',
>>> array('tag' => 'dl', 'class' => 'Zend_form')),
>>> array('Description', array('placement' =>
>>> 'prepend')), 'Form'));
>>>
>>> }
>>>
>>> }
>>>
>>
>> --
>> Matthew Weier O'Phinney
>> Software Architect | [EMAIL PROTECTED]
>> Zend Framework | http://framework.zend.com/
>>
>