Zend_Search_Lucene – Suche nach Zahlen
Wenn man bei der Standardsuche von Zend_Search_Lucene nach Zahlen sucht, bekommt man eine Exception
// Suche nach z.B.: 12345 Application error Exception information: Message: At least 3 non-wildcard characters are required at the beginning of pattern. Stack trace: ...
Das Problem ist, das der Standard Zend_Search_Lucene_Analysis_Analyzer keine Numeric Werte mit aufnimmt.
Abhilfe schafft es, den Analyzer beim parsen einfach neu zu setzen
Zend_Search_Lucene_Analysis_Analyzer::setDefault( new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive() );
Dann sollte es auch mit der Suche nach Zahlen klappen.
Die Lösung kommt vom ZF Issue Tracker
Related Posts:
ZendFramework – Zend_Auth mit aktiven und inaktivem Nutzer
In meinem vorherigen Post habe ich geschrieben, wie man mit dem ZendFramework eine Spalte auf Eindeutigkeit prüft. Nun habe ich mit Zend_Auth herumgespielt. Diese Klasse ist für das Anmelden gegen eine definierte Datenquelle über einen Provider zuständig. Nun war meine pers. Anforderung, über Zend_Auth einen Login zu realisieren, welches auch aktive und inaktive User berücksichtigt. Ich habe dies in einem Modul integriert namens User.
Tabelle (gekürzt)
-- -- Tabellenstruktur für Tabelle `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(45) NOT NULL, `password` VARCHAR(45) NOT NULL, `firstname` VARCHAR(45) NOT NULL, `lastname` VARCHAR(45) NOT NULL, `email` VARCHAR(45) NOT NULL, `active` tinyint(4) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), ) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
Das Formular (vereinfacht):
// application/modules/user/form/Login.php class User_Form_Login extends Zend_Form { public function init() { // diese Felder kann man auch über Zend_Config realisieren $this->setAction('/user/authentication/login'); $this->setName('loginform'); $this->setMethod('post'); $username = new Zend_Form_Element_Text('username'); $username->setLabel('Benutzername'); $username->setRequired(); $password = new Zend_Form_Element_Password('password'); $password->setLabel('Passwort'); $password->setRequired(); $submit = new Zend_Form_Element_Submit('submit'); $submit->setLabel('Anmelden'); $this->addElements(array($username, $password, $submit)); } }
Im View (gekürzt):
<?php // application/modules/user/views/scripts/authentication/login.phtml ?> <h1>Login</h1> <?= $this->form->render(); ?>
Der Authentifizierungscontroller:
// application/modules/user/controller/Authentication.php class User_AuthenticationController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // action body } public function loginAction() { // schon eingeloggt? if (Zend_Auth::getInstance()->hasIdentity()) { $this->_redirect('/'); } $form = new User_Form_Login(); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $authAdapter = $this->getAuthAdapter(); $authAdapter->setIdentity($form->getValue('username')); $authAdapter->setCredential($form->getValue('password')); $auth = Zend_Auth::getInstance(); $res = $auth->authenticate($authAdapter); if ($res->isValid()) { $identity = $authAdapter->getResultRowObject(); $authStorage = $auth->getStorage(); $authStorage->write($identity); // ... } else { // ... } } else { $form->populate($formData); } } } public function logoutAction() { // action body Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/'); } /** * Liefert den AuthAdapter * * @return Zend_Auth_Adapter_DbTable */ private function getAuthAdapter() { return new Zend_Auth_Adapter_DbTable( Zend_Db_Table::getDefaultAdapter(), 'user', 'username', 'password' ); } }
In meiner persönlichen Anforderung wollte ich aber, das man auch einen Aktivstatus realisiert. Wenn ein User sich also registriert, soll er erstmal inaktiv sein und sich entweder durch eine E-Mail oder den Admin aktiviert werden. Solange darf er sich natürlich nicht anmelden können. Dazu ist nur ein Parameter mehr erforderlich
/** * Liefert den AuthAdapter * * @return Zend_Auth_Adapter_DbTable */ private function getAuthAdapter() { return new Zend_Auth_Adapter_DbTable( Zend_Db_Table::getDefaultAdapter(), 'user', 'username', 'password', 'SHA1(?) AND active=1' // hier kann man den credentialColumn-Parameter anpassen ); }
Vielleicht habt ihr ja noch weitere Möglichkeiten, den Loginprozess zu optimieren. Ich bin auf jeden Kommentar gespannt ![]()
Related Posts:
ZendFramework – Eindeutigen Datensatz prüfen
Das Zend Framework bietet mit seinen Validatoren sehr schöne Möglichkeiten, die Daten des Benutzers zu prüfen. Bisher habe ich immer im Controller geprüft, ob es einen Datensatz schon einmal gibt, wie z.B.: E-Mail Adresse, oder Benutzername. Doch es geht noch viel einfacher. Das ZendFramework bietet dafür die Klasse Zend_Validate_Db_NoRecordExists an. Diese erbt von der abstrakten Klasse Zend_Validate_Db_Abstract. Als Parameter gibt man in diesem Beispiel die Tabelle und die zu prüfende Spalte an.
Hier ein Beispiel der Benutzung in der Formklasse eureres Moduls
class User_Form_Register extends Zend_Form { /** * Init the Registerform * * @return void */ public function init() { $this->setAttrib('id', 'registerform'); $this->setAction('/user/index/create'); // ... // username $dbValUnique = new Zend_Validate_Db_NoRecordExists('user', 'username'); // Das DB ValidatorObjekt $username = new Zend_Form_Element_Text('username'); $username->setLabel('Benutzername'); $username->setRequired(); $username->addValidator('regex', true, array('/^[a-z]/i')); $username->addValidator($dbValUnique); // Hinzufügen zum Element $this->addElement($username); // ... // e-mail $dbValUnique = new Zend_Validate_Db_NoRecordExists('user', 'email'); // Das DB ValidatorObjekt $email = new Zend_Form_Element_Text('email'); $email->setLabel('E-Mail'); $email->setRequired(); $email->addValidator(new Zend_Validate_EmailAddress()); $email->addValidator($dbValUnique); // Hinzufügen zum Element $this->addElement($email); // ... } }



