PDA

Vollständige Version anzeigen : Zend_Auth messages an Zend_Form übergeben


TeeJay
02.05.2008, 09:30
Moin ich bin gerade dabei mein Loginscript auf Zend_Form umzustellen. Ich würde ganz gerne die Error behandlung von Zend_Form benutzen, habe allerding Problme fehlermeldungen an Zend_form weiter zu reichen. Hier mal meine auth Action


public function authenticateAction()
{

if ($this->_request->isPost()) {

$formData = $this->_request->getPost();
$form = $this->_createForm();

if (!$form->isValid($formData)) {
$this->view->form = $form;
$this->_helper->viewRenderer->setScriptAction('index');
return;
}

$values = $form->getValues();

$dbAdapter = Zend_Registry::get('db');
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('user');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');

// Set the input credential values to authenticate against
$authAdapter->setIdentity($values['login']);
$authAdapter->setCredential($values['passwd']);

// do the authentication
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);



if ($result->isValid()) {
$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);

$controllername = $values['controllername'];
$lang = $values['language'];
$actionname = $values['actionname'];

if($controllername == 'login'){
$controllername = $this->_config->site->default_controller;
}
$this->_redirect('/'.$lang.'/'.$controllername.'/'.$actionname.'/');
}else{
// hier muss was passieren
Zend_Debug::dump($result->getMessages());
}




}
$this->_helper->viewRenderer->setScriptAction('index');

return;


Das Problem liegt darin das wenn das authen fehl schlägt bekommt man mit getMessages ein array mit Fehlermeldungen. Diese Fehlermeldungen möchte ich nun den Form Elementen mitgeben, d.h. form nochmal rendern. Hab mir schon überlegt nen eigenen validator zu schreiben, aber da müsste ich ja einen Datenbankcall machen um an die messages zu kommen, die ohnehin schon beim Authen ausgeworfen werden. Habe immo keinen Plan, wie man das machen kann. Vielleicht weiss es ja jemand von euch.

Gruß Teejay

TeeJay
05.05.2008, 01:47
kann grad nur mit einer hand schreiben, deshalb alles klein.

also da ja niemand einen vorschlag beigesteuert hat, musste ich selbst eine Loesung finden. ich habe folgendes gemacht.

1. meine createForm() funktion hat einen parameter bekommen. dieser parameter enthaelt als vogabe ein leeres array.
2. im else zweig des if ($result->isValid()) { wird nun wieder das form mit createForm ertstellt. Nun wird aber das $result object dem fom mitgegeben ueber dem optionalen parameter.
3. im formobject erhalten die beiden elemente (login, passwd) einen neuen validator (new My_Validator_MyAuthResult($dataarray,"login || passwd")), der dann das auth result ueberprueft und anhand des $result->getCode() (case construct) entscheidet welches feld die entsprechende fehlermeldung enthaelt.

Falls jemand interesse am validator haben sollt ich koente ihn hier posten, da das thema aber scgeinbar auf wenig intersse stoesst, lassse ich es jetyt zumal ich auch nicht alles ausm kopf hinbekomme.

gruesse aus auckland
thomas

Mr.AndersoN
05.05.2008, 09:51
Kannst du gern posten.
Ich werde bald vor dem gleichen Problem stehen und würde dann selber nochmal schauen, obs eine andere Lösung gibt, wobei deine ja schon recht komfortabl ist.