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