05 oct
Par Clément dans Tutoriels
Mots-clefs :Tutoriel, Watchmydesk, Zend Framework, Zend_Form, Zend_Mail
Dans cet épisode, nous allons voir comment gérer les formulaires avec le Zend Framework pour créer la page d’inscription de WatchMyDesk.
Cette partie va être assez compliquée et un peu longue. Accrochez vous !
Comme vous avez pu le voir, cette partie va être assez longue. Nous allons tout de suite attaquer par la création de l’objet Zend_Form de notre formulaire.
Pour cela, nous avons besoin de savoir les champs à utiliser pour qu’un utilisateur puisse s’inscrire.
Quand un membre s’inscrira, il devra renseigner :
Pour créer l’objet du formulaire, rendez-vous dans applications/forms de notre application. Nous allons créer un fichier PHP nommé : Inscription.php .
Un formulaire construit avec Zend_Form à une structure précise :
class Form_Inscription extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
// le formulaire
}
}
Dans le Zend Framework, l’intégralité des composants sont des objets, il faudra donc utiliser des objets pour créer nos champs de texte ou liste déroulante de notre formulaire.
Commençons par le champs Login. Celui-ci doit être unique dans la base de donnée (c’est à dire que deux personnes ne peuvent pas s’inscrire avec le même login). Il est obligatoire et entre 3 et 20 caractères.
class Form_Inscription extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$login = new Zend_Form_Element_Text("login", array('size' => 25));
$loginDoesntExist = new Zend_Validate_Db_NoRecordExists('membres', 'login');
$login ->setLabel('Login')
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty')
->addValidator($loginDoesntExist)
->addValidator('StringLength', false, 3, 20)
->setDescription("Login between 3 and 20 alphanumerics characters.");
}
}
Dans ce simple morceau de code, plusieurs notions sont abordées.
La création de notre élément HTML passe par l’utilisation de Zend_Form_Element_Text qui prend 2 paramètres :
Nous lui ajoutons ensuite un label avec setLabel, ainsi que plusieurs filtres et validateurs. Les filtres utilisés ici sont très simple :
Concernant les validateurs (addValidator):
La différence entre les filtres et les validateurs est très simple. Les filtres sont s’appliquer avant la validation et les validateurs sont appliqués durant la validation et peuvent retourner des erreurs.
Dans notre cas, nous avons besoin de vérifier l’unicité du login dans la base de donnée, pour cela, le Zend Framework possède un validateur très simple d’utilisation mais très pratique : Zend_Validate_Db_NoRecordExists.
Il prend en paramètres :
Si lors de l’inscription, un login identique à celui renseigné dans le formulaire est trouvé dans la base de données, le validateur va nous ressortir une erreur.
Pratique non?
Passons ensuite à l’adresse email qui ressemble tout particulièrement au login, sauf qu’ici nous validons un email et utilisons le validateur EmailAddress :
$emailDoesntExist = new Zend_Validate_Db_NoRecordExists('membres', 'email');
$email = new Zend_Form_Element_Text("email", array('size' => 25));
$email ->setLabel('Email address')
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty')
->addValidator($emailDoesntExist)
->addValidator('EmailAddress')
->setDescription("Require a valid email address.");
La méthode setDescription permet d’ajouter un message d’aide à l’utilisateur. Nous reviendrons sur son affichage dans la partie de personnalisation d’un formulaire.
Les champs de password sont eux aussi très simple :
$password = new Zend_Form_Element_Password("password", array('size' => 25));
$password ->setLabel('Password')
->addFilter('StringTrim')
->addValidator('NotEmpty');
$repassword = new Zend_Form_Element_Password("repassword", array('size' => 25));
$repassword ->setLabel('Retype password')
->addFilter('StringTrim')
->addValidator('NotEmpty');
$repassword->setDescription("Retype the previous password to prevent errors.");
Nous reviendrons tout à l’heure sur le fait que la confirmation du mot de passe doit être identique au mot de passe.
Ensuite la liste déroulante des pays.
Comme tout le monde le sait sûrement, quand on développe une application sans framework, il est souvent compliquer d’avoir une liste de pays complète et compatible avec plusieurs langues. Le Zend Framework embarque nativement ce genre de fonctionnalités que nous allons utilisé dans notre formulaire.
$pays = new Zend_Form_Element_Select("pays");
$pays ->setLabel('Country')
->addMultiOptions(Zend_Locale::getCountryTranslationList(Zend_Registry::get('Zend_Locale')))
->addValidator('NotEmpty');
Le addMultiOptions prend un tableau en paramètre, ici la liste des pays généré par Zend_Local. De plus, nous allons récupérer la langue courante de notre application et changer la langue des pays.
Ce qui va nous donner :

Et enfin, il nous faut le composant Captcha qui est directement intégré dans le Zend Framework. Pour pouvoir utiliser ce composant, il faut un compte sur le site de ReCaptcha.net. Une fois inscrit, vous aurez accès à votre clef publique et à une clef privée :
$pubKey = 'clef publique';
$privKey = 'clef privée';
$recaptcha = new Zend_Service_ReCaptcha($pubKey, $privKey);
$adapter = new Zend_Captcha_ReCaptcha();
$adapter->setService($recaptcha);
$captcha = new Zend_Form_Element_Captcha('recaptcha', array( 'label' => "Captcha", 'captcha' => $adapter));
$captcha->removeDecorator('label')->removeDecorator('errors');
Ici nous utilisons un concept de Zend_Form qui sont les décorateurs. Nous allons supprimer le label et les erreurs du captcha (ça rendra mieux au niveau du design).
Maintenant il suffit d’ajouter tout ces composants dans votre formulaire et le tour sera joué !
$this->addElements(array($login,$email, $password, $repassword, $pays, $captcha));
OUF ! Voila notre formulaire est enfin finit, enfin presque. Rappelons nous que il faut que le mot de passe correspondent à la confirmation.
Pour cela, je vais vous fournir un composant qui va vérifier si les Password correspondent entre eux ( à placer dans le repertoire library/App/Validate de votre application). Vous pouvez le télécharger ici.
Mais cela ne suffira pas, il faut maintenant utiliser ce composant.
Pour cela, nous allons re-écrire la méthode de validation du Zend_Form.
public function isValid($data)
{
$password = $this->getElement('password');
$password->addValidator(new App_Validate_PasswordMatch($data['repassword']));
return parent::isValid($data);
}
Et voila, à la validation nous allons bien avoir une validation sur la confirmation du mot de passe.
Pour afficher le formulaire c’est très simple, rendez vous dans le contrôleur MembreController.php et ajouter cela:
class MembreController extends Zend_Controller_Action
{
function newAction()
{
$this->view->form = $form = new Form_Inscription;
}
}
Ensuite, il faut afficher le formulaire dans la vue correspondante à l’action de notre contrôleur dans membres/new.phtml
<h1><?php echo $this->translate('Register to Watch My Desk'); ?></h1>
<?php echo $this->form; ?>
Code source complet de la création du formulaire :
class Form_Inscription extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('inscription');
$login = new Zend_Form_Element_Text("login", array('size' => 25));
$loginDoesntExist = new Zend_Validate_Db_NoRecordExists('membres', 'login');
$login ->setLabel('Login')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty')
->addValidator($loginDoesntExist)
->addValidator('StringLength', false, 3, 20)
->setDescription("Login between 3 and 20 alphanumerics characters.");
$emailDoesntExist = new Zend_Validate_Db_NoRecordExists('membres', 'email');
$email = new Zend_Form_Element_Text("email", array('size' => 25));
$email ->setLabel('Email address')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty')
->addValidator($emailDoesntExist)
->addValidator('EmailAddress')
->setDescription("Require a valid email address.");
$password = new Zend_Form_Element_Password("password", array('size' => 25));
$password ->setLabel('Password')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('NotEmpty');
$repassword = new Zend_Form_Element_Password("repassword", array('size' => 25));
$repassword ->setLabel('Retype password')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('NotEmpty');
$repassword->setDescription("Retype the previous password to prevent errors.");
$pays = new Zend_Form_Element_Select("pays");
$pays ->setLabel('Country')
->setRequired(true)
->addMultiOptions(Zend_Locale::getCountryTranslationList(Zend_Registry::get('Zend_Locale')))
->addValidator('NotEmpty');
$pubKey = '';
$privKey = '';
$recaptcha = new Zend_Service_ReCaptcha($pubKey, $privKey);
$adapter = new Zend_Captcha_ReCaptcha();
$adapter->setService($recaptcha);
$captcha = new Zend_Form_Element_Captcha('recaptcha', array( 'label' => "Captcha", 'captcha' => $adapter));
$captcha->removeDecorator('label')->removeDecorator('errors');
$this->addElements(array($login,$email, $password, $repassword, $pays, $captcha));
}
public function isValid($data)
{
$password = $this->getElement('password');
$password->addValidator(new App_Validate_PasswordMatch($data['repassword']));
return parent::isValid($data);;
}
}
Pour le moment notre formulaire est, nous pouvons le dire, sacrement moche ! Néanmoins tout ce dont nous avons besoin est présent !
Maintenant on va re-skinner le formulaire car pour le moment il utilise les éléments DD-DT et nous voulons utiliser des Li.
Pour faire cela, nous allons créer une vue dans /application/modules/frontend/views/scripts/membre nommé registerform.phtml. C’est dans cette vue que nous allons définir la manière de rendu de notre formulaire.
Nous allons appeler cette vue dans notre formulaire, avant la fin du constructeur :
$this->setDecorators( array( array('ViewScript', array('viewScript' => 'membre/registerform.phtml'))));
Ce morceau de code va donc permettre de spécifier quelle vue va décrire notre formulaire.
et ensuite il nous reste à implémenter ce fichier .phtml :
<form action="< ?= $this->escape($this->element->getAction()) ?>"
method="< ?= $this->escape($this->element->getMethod()) ?>" id="myform">
<fieldset>
<legend><?php echo $this->translate('Create your account'); ?>
<ul class="formRegister">
<?php foreach($this->element as $element): ?>
<li>
<span>
<?php echo $this->formLabel($element->getName(),$this->translate($element->getLabel())) ?>
<?php echo $element->renderDescription() ?>
</span>
<?php if($element->getName() == "recaptcha"): ?>
<?php echo $element->render();?>
<?php else:?>
<?php echo $this->{$element->helper}(
$element->getName(),
$element->getValue(),
$element->getAttribs(),
(method_exists($element,'getMultiOptions')) ? $element->getMultiOptions() : ''
) ?>
<?php endif;?>
<?php echo $this->formErrors($element->getMessages()) ?>
</li>
<?php endforeach; ?>
</ul>
<p><input type="submit" id='submit' value="<?php echo $this->translate('Register'); ?>" /></p>
</fieldset>
</form>
Ce script va disséquer les éléments que nous avons créés dans la première partie et afficher dans des éléments HTML ce qu’il faut et où il faut !
Excellent non? Bon ok, vous allez surement me dire que c’est toujours aussi moche …
Vous avez raison !
Mais essayer d’ajouter ces lignes de CSS dans le fichier public/css/main.css :
#myform {
font-size: 1em;
margin: 0 auto;
width: 560px;
}
#myform fieldset {
background-color: #F2F9FE;
border: 1px solid #AEDCF5;
margin: 10px 0 20px;
padding: 20px 15px 10px;
position: relative;
}
#myform fieldset:hover {
background-color: #FFFCCD;
border: 1px solid #FFDB60;
}
#myform fieldset:hover input, #myform fieldset:hover textarea {
background-color: #FFFFFF;
border: 1px solid #FFDB60;
}
#myform fieldset:hover select {
background-color: #FFFFFF;
border: 1px solid #FFDB60;
}
#myform legend {
color: #FF5A00;
font-family: Georgia, "Times New Roman", Times, serif;
font-size: 16px;
font-style: italic;
left: 10px;
position: absolute;
top: -8px;
}
#myform fieldset:hover legend, .designField:hover legend {
color: #3F87E9;
}
#myform label {
color: #000000;
display: block;
float: left;
font-weight: bold;
margin: 0 10px 0px 0;
padding: 0;
text-align: right;
width: 190px;
font-size: 12px;
}
#myform input {
border: 1px solid #AEDCF5;
color: #3F87E9;
font-size: 12px;
line-height: 24px;
height: 24px;
margin: 0 0 13px;
padding: 7px 3px 3px 3px;
width: 210px;
}
#myform span {
margin-right: 20px;
display:block;
float: left;
width: 190px;
text-align: right;
}
#myform input:hover {
border: 1px solid #41A9D8;
}
#myform textarea {
border: 1px solid #AEDCF5;
color: #3F87E9;
font-size: 1em;
width: 215px;
}
#myform select {
border: 1px solid #AEDCF5;
color: #3F87E9;
font-size: 12px;
height: 29px;
margin: 0 0 13px;
padding: 4px 3px 2px;
width: 220px;
}
#myform select option {
padding-left: 10px;
}
#myform select:hover {
border: 1px solid #41A9D8;
}
#myform p {
text-align: center;
}
#myform #submit {
border: 1px solid #000;
height: 35px;
padding: 5px;
width: 92px;
font-weight: bold;
color: #000;
background: #c0c0c0;
line-height: 35px;
font-variant: small-caps;
margin: 0;
}
#myform #submit:hover {
border: 0 none;
cursor: pointer;
}
et le changement est radical !
Maintenant passons à la traduction du formulaire.
Il y a plusieurs choses à voir, par exemple :
Pour résoudre les deux premiers points, rendez-vous dans notre plugin de traduction (application/plugins/Translate.php) et ajouter ces deux lignes de code à la fin de la méthode routeShutdown:
Zend_Form::setDefaultTranslator($translate); Zend_Validate_Abstract::setDefaultTranslator($translate);
Il ne nous reste plus qu’à aller dans notre fichier de traduction fr_FR.php et le remplir comme suivant :
return array( 'hello' => 'Bonjour et bienvenue sur notre site', 'english' => 'Anglais', 'french' => 'Français', 'Watch My Desk - Show Off your Geekstation' => 'Watch My Desk - Show Off your Geekstation', 'Browse' => 'Explorer', 'Join Now' => "S'inscrire", 'Login' => 'Identification', 'Your Desk' => 'Ton Bureau', 'Show off' => 'Montre', 'your geekstation.' => 'ton bureau de geek', 'Watch My Desk is a website where you can share, browse and rate pictures of desks and computers of the world.' => 'Watch my desk est un site où vous pouvez partager, explorer et noter des photos du bureaux et ordinateurs du monde entier', 'Join the website to share your desk or post comments, just in 2 clics !' => 'Inscrivez vous pour partager vos bureaux, poster des coms... en 2 clics !', 'Join now and show off your desk with the community !' => 'Inscris-toi maintenant et partage ton bureau de geek avec la communauté !', 'Login between 3 and 20 alphanumerics characters.' => 'Pseudo compris entre 3 et 20 caractères alphanumériques.', 'Require a valid email address.' => 'Adresse email valide requise.', 'Retype the previous password to prevent errors.' => 'Saisissez de nouveau le mot de passe.', 'Create your account' => 'Créez votre compte', 'Country' => 'Pays', 'Retype password' => 'Password (encore)', 'Register' => 'S\'enregistrer' );
Rendez-vous dans notre contrôleur MembreController (dans application/modules/frontend/controllers).
Il va falloir procéder à la validation de notre formulaire :
class MembreController extends Zend_Controller_Action
{
function newAction()
{
$this->view->form = $form = new Form_Inscription;
if($post = $this->_request->isPost()){
$formData = $this->getRequest()->getPost();
if($form->isValid($formData)){
// Traitement
}else{
$form->populate($formData);
}
}
}
}
Vous pouvez tester ! Maintenant si une erreur est détecté, nous aurons les messages d’erreurs pour chaque éléments de notre formulaire.
Pour ajouter un membre une fois la validation terminer nous allons utiliser notre modèle Model_DbTable_Membres créé dans les premiers épisodes.
Mais avant nous allons ajouter un champs dans la base de donnée. Ce champs sera nommé token, sera un varchar de 32 caractère et servira à l’envoie d’un mail de confirmation à notre utilisateur !
Rendez vous dans le fichier Model_DbTable_Membres pour créer une nouvelle méthode d’ajout de membre.
public function addUser($data)
{
$otherData = array(
'ip_inscription' => $_SERVER['REMOTE_ADDR'],
'pass' => md5($data['password']),
'date_inscription' => date('Y-m-d H:i:s'),
'lvl' => 1,
'etat' => 0, // Doit valider son compte
'token' => md5($data['email'].$_SERVER['REMOTE_ADDR'].$data['password'])
);
unset($data['recaptcha_challenge_field'],
$data['recaptcha_response_field'],
$data['repassword'],
$data['password']);
$userData = array_merge($data, $otherData);
$this->insert($userData);
return $otherData['token'];
}
Ici le processus est très simple, on va récupérer les informations dont on a besoin et les traiter dans cette méthode. C’est à dire supprimer ceux qui ne nous servent pas, conserver celle qui nous servent et en créer de nouvelle.
On voit aussi que le champ token est utiliser ici, c’est un md5 de l’email, de l’ip et du mot de passe de l’utilisateur.
Une fois cela fait, placez-vous dans la partie traitement du code précédent et ajoutez :
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
try{
$user = new Model_DbTable_Membres();
$token = $user->addUser($formData);
$db->commit();
Zend_Session::regenerateId();
}catch (Exception $e)
{
$db->rollBack();
throw $e;
}
$this->_redirect('/');
Alors, beaucoup de choses ici ! on récupère l’adapteur de notre base de donnée pour pouvoir gérer les transactions à la main. Simplement car si il y a un problème (on ne sait jamais) lors de l’enregistrement, on puisse revenir à l’état initial avec un rollback !
Dans le bloc try, on créer un objet Membres, on utilise la méthode addUser écrite précédemment, et on commit. Si une erreur se produit dans ce bloc, on rollback directement.
Je trouve cela très pratique de pouvoir gérer manuellement les transactions SQL personnellement !
Après le commit(), on génère un nouvel identifiant de session, uniquement pour la sécurité.
Et voila ! Nous pouvons nous inscrire sur WatchMyDesk! Mais le compte par défaut n’est pas actif… il va donc falloir envoyer un mail à l’utilisateur pour lui demander la confirmation de son compte.
Pour faire cela, rendez vous dans le fichier application/configs/application.ini et ajouter ces lignes de configurations juste avant la ligne [development : production] :
[mail] mail.from.name = WatchMyDesk Support mail.from.address = support@watchmydesk.com mail.config.ssl = tls mail.config.port = 587 mail.config.auth = login mail.config.username = votre email pour gmail mail.config.password = votre mot de passe gmail
Pour envoyer un message je vais utiliser le service SMTP de Gmail, mais vous pouvez utiliser le serveur SMTP de votre propre serveur si vous le souhaitez !
Direction ensuite le fichier Bootstrap.php pour ajouter une méthode de configuration pour les emails.
protected function _initMails()
{
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'mail');
$mailConfig = $config->toArray();
Zend_Registry::set('Mail_Config', $mailConfig['mail']['config']);
}
De cette façon, nous aurons accès dans toute notre application à la configuration de nos emails.
Revenons dans la méthode newAction de notre contrôleur membreController pour finir le code d’envois d’email juste après l’ajout d’un utilisateur:
$smtpConnection = new Zend_Mail_Transport_Smtp('smtp.gmail.com', Zend_Registry::get('Mail_Config'));
$mail = new Zend_Mail('utf-8');
$mail ->addTo($formData['email'])
->setFrom('support@watchmydesk.com', 'WatchMyDesk Support')
->setSubject('Bienvenue sur WatchMyDesk')
->setBodyHtml('
Dear '.$formData['email'].'
Welcome to WatchMyDesk !!
Please visit this url to activate your account:
'.ROOT_URL.'/membre/activate/id/'.$token.'
See you there,
The WatchMyDesk Team');
$mail->send($smtpConnection);
Notre email peut maintenant être envoyer tranquillement.
Vous avez du remarquer que nous demandons l’activation du compte par un lien dans l’email. Il va donc falloir créer l’action et la méthode du model Membre pour valider l’utilisateur.
Dans le contrôler membre:
public function activateAction()
{
$token = $this->getRequest()->getParam('id');
if($token){
$user = new Model_DbTable_Membres();
$user->validateUserByToken($token);
}
$this->_redirect('/');
}
Le token est passé dans le paramètre dans l’url est est récupéré dans le contrôleur pour valider l’utilisateur.
Dans le modèle Membres:
public function validateUserByToken($token)
{
$where = array('token = ?' => (int)$token);
$this->update(array('etat' => 1), $where);
return $user;
}
Une simple mise à jour est effectué ici, en changeant l’état de 0 à 1 en fonction du token passé.
Ok, cet article est long mais il est très complet sur le processus d’inscription d’un utilisateur. Je vous conseille de prendre le temps d’analyser le code créer ici, de tester par vous même !
Retrouver la gestion des formulaire pour Symfony sur la FermeDuWeb:
N’hésitez pas à me poser votre question dans les commentaires! et Bonne journée !
« Tipsy, un plugin jQuery pour créer des tooltips comme sur Facebook. | Vous connecter à Facebook grâce à la librairie Javascript MU Connect »
Un trackback
40 commentaires
Joris
5 octobre 2009 à 7:00
1Bon boulot, merci
Patrice Robitaille
5 octobre 2009 à 13:26
2Enfin un autre tutoriel sur Zend !
Voilà une autre façon de faire un formulaire, je suis particulièrement interessé avec la façon avec laquelle tu as utilisé le décorator. C’est souvent un gros problème qui revient avec Zend.
leknoppix
5 octobre 2009 à 13:58
3Rendez vous tous sur symfony
Alexandre JULIEN
5 octobre 2009 à 18:05
4Excellent tutoriel !
Je ne savais même pas que Zend_Locale pouvait générer une liste de pays multilingue
epasquier
6 octobre 2009 à 14:50
5Bravo ! Complet et très didactique.
Merci !
David
13 octobre 2009 à 13:23
6Salut,
Je cherchais moi aussi une façon de personnaliser les formulaires avec ce framework, ce qui n’est pas du tout évident quand on débute. c’est chose faite, merci.
Lorsque je valide mon formulaire en laissant le login vide je n’ai pas de message d’erreur. J’ai rajouté
$login->setRequired(true); et ça marche désormais.
PS : il manque un dans registerform.phtml
David
15 octobre 2009 à 18:24
7manque un pardon
David
15 octobre 2009 à 18:31
8zut ça a bouffé mon tag html
je voulais dire il manque la fermeture du tag legend
Graurk
23 octobre 2009 à 11:53
9Salut,
Très intéressant ce tuto mais je suis un peu étonné de ta façon d’utiliser le validateur personnalisé pour la confirmation de mot de passe. Pour moi la fonction isValid devrait être dans le validateur et celui-ci s’utiliserait de façon similaire à un validateur du framework…Enfin c’est comme ça que je fais^^, mais j’amerai connaître les raison de ton choix.
Sinon j’ai un soucis avec l’envoi de mail. Avec ta méthode la connexion smtp ne semble pas se faire, j’ai soit un « un unable send mail» soit un problème de socket soit un délais de reponse trop selon les réglage que je met. Pour envoyer un mail, je suis obligé de renseigné dans php.ini le smtp de mon fai et le port et ne pas faire appel à Zend_Mail_Transport_Smtp. J’utilise wampServer, y-a-t-il un des réglages à effectuer sur Apache ou php ou une extension à charger?
Clément
25 octobre 2009 à 14:52
10@Graurk: Pour le validateur, il me fallais la valeur avant validation du post[password] pour pouvoir valider le tout (si tu as une autre méthode, je suis preneur
)
Concernant le SMTP, il n’y a pas de réglage normalement mais après je suis sous mac … donc il y peut être des différence entre MAMP et WAMP. Je vais essayer de me renseigner pourquoi cela ne marche pas chez toi
myDev
3 novembre 2009 à 18:57
11Bonjour,
Comment fais-tu pour avoir accès à la classe du formulaire sans avoir fait d’include/require ?
» $this->view->form = $form = new Form_Inscription; »
Merci d’avance
myDev
3 novembre 2009 à 19:22
12J’ai trouvé tout seul (cf : Zend_Application_Module_Autoloader)
aquaa
11 décembre 2009 à 17:28
13Bonjour
On peut avoir la source ?
choubichoub
17 décembre 2009 à 14:46
14Merci pour ce tuto, je vais maintenant tester celui symphony histoire de me faire une idée sur ces deux framework ^^
abdel
21 décembre 2009 à 1:05
15bonsoir,
j’ai utilisé ton tuto pour intégré le captcha ça marche bien nikel sauf que le captcha se met au dessus du formulaire je comprend rien vous avez une idée
Mat
30 décembre 2009 à 0:45
16Super tutoriel… bon faut que je comprenne pourquoi la mise en forme via le css est complètement foireuse chez moi…
Dans ton source css, je trouve bizarre que tu n’es pas de référence sur le decorator pour les balises li… j’ai raté un truc??
Mat
30 décembre 2009 à 0:48
17J’ai un premier élément de réponse… j’ai moins de soucis d’affichage sous Firefox… mais sous Chrome c’est pas ça du tout!
Mat
30 décembre 2009 à 14:24
18Je continue… il y a une balise manquante dans le fichier css fourni qui expliquait mon soucis d’affichage…
Maintenant que tout s’affiche, j’ai un problème lors de la validation…. j’ai le droit au message suivant :
exception ‘Zend_Controller_Action_Exception’ with message ‘Action « 3c20″ does not exist and was not trapped in __call()
A vote bon coeur messieurs dames… si vous avez une idée je suis preneur!
Merci
Mat
30 décembre 2009 à 14:42
19On va croire que je spam… Mais bon explication trouvée pour le message d’erreur précédent : c’est une erreur de syntaxe dans la balise .
Cela étant, je ne rentre jamais dans le ‘then’ du IF qui détecte si les données ont été posté…
if($post = $this->_request->isPost())
Une idée d’où cela pourrait venir?
le_viking
18 janvier 2010 à 18:28
20Super billet !
Merci !
Kirk57
21 février 2010 à 10:34
21Il n’y a pas la suite?
Le backoffice, il est géré où?
Merci d’avance.
crowmosta
19 avril 2010 à 17:15
22Problème d’affichage sous Firefox, ça dois être dû au css mais je trouve pas où
crowmosta
19 avril 2010 à 17:16
23@Mat:
C quoi la balise manquante
xclam
28 avril 2010 à 13:22
24Bonjour,
J’ai 2 problèmes :
- mon formulaire est accessible par l’adresse index.php/en/register. Si je passe part /en/register cela me met une erreur 404.
- sur la page index.php/en/register j’ai un warning include(application/forms//Inscription.php). D’où viennent les deux slash?
Niko
31 août 2010 à 12:13
25Bonjour,
Quelqu’un peut-il fournir le code final de l’appli ?
Ca ne fonctionne plus depuis l’étape 4 ou 5, et je n’ai pas réussi à rétablir ensuite..
Merci d’avance.
Jp
2 septembre 2010 à 15:34
26Bonjour,
Pareil que Niko! Ce tuto est absolument super et avoir les sources m’aiderait à m’en sortir! Je suis perdu depuis l’étape 5 et après c’est trop complexe pour que j’arrive à m’en sortir sans vues concrète de l’application!
Merci d’avance pour le Zip!
Ariden
11 septembre 2010 à 10:07
27Merci pour tous ces 8 tutos très intéressants et très bien expliqués.
Juste une question, pourquoi ne pas avoir mis cette instruction :
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
directement dans le try ? on évite ainsi de préparer des paramètres qui ne serviront pas dans le cas du catch.
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
try{
$user = new Model_DbTable_Membres();
$token = $user->addUser($formData);
$db->commit();
Zend_Session::regenerateId();
2 ème question, pourquoi ne pas avoir mis ces paramètres directement dans le model tel que :
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
$this->insert($userData);
$db->commit();
qui fonctionne aussi bien et qui permet une réelle séparation entre le controller et le model.
En vous souhaitant une bonne continuation
Acher
15 octobre 2010 à 2:49
28merci pour ces information ca ma bien aider
Pandemus
29 octobre 2010 à 13:53
29Vraiment très intéressant ce tuto, y a t il une suite de prevu?
Pandemus
2 novembre 2010 à 22:55
30j’aimerai faire une colonne de droite dépendante du layout()->content
en fait ma colonne de droite afficherai des infos par rapport à la partie centrale,
Est ce quelqu’un peut me dire comment faire?
Je comptais sur la suite de ce tuto pour y arriver.
Un exemple de ce que je veux réaliser
la partie central est un formulaire d’un artiste a droite je vais avoir la liste de tous les morceaux de cette artiste, la liste des instruments joués etc….
Merci à vous
Pandemus
5 novembre 2010 à 11:57
31Quelqu’un sait comment on peut faire un checkbox avec cet exemple.
car moi j’botiens un message d’erreur si je rajoute dans la class Form_Inscription
$newsletter = new Zend_Form_Element_Checkbox(’newsletter’);
$newsletter->setLabel(’Newsletters’);
Merci
Enfin en espérant que ce site vive encore
17h13r
24 novembre 2010 à 16:39
32Pour la vérification du mot de passe, on peut aussi utiliser la classe Zend_Validate_Identical
Exemple (Doc Zend):
$form->addElement(’password’, ‘elementOne’);
$form->addElement(’password’, ‘elementTwo’, array(
‘validators’ => array(
array(’identical’, false, array(’token’ => ‘elementOne’))
)
));
Michel Houillon
11 janvier 2011 à 10:34
33Excellent travail. Enfin un tutoriel simple et efficace et surtout à jour, comparé aux tuto officiels de ZEND souvent obscurs, avec des erreurs selon les versions et sans exemples concrets.
craigzour
23 février 2012 à 12:32
34Pour information puisque j’ai bloqué dessus en suivant ton tutoriel :
–> Le validator « ->addValidator(’StringLength’, false, 3, 20)» ne s’écrit plus de cette manière mais de la suivante : « ->addValidator(’StringLength’, false, array(3, 20))»
Axx72
2 avril 2012 à 15:46
35Bonjour, c’est un très bon tutoriel !
Toute fois, je suis débutant avec Zend Framework, et je me demande ou je dois coder le code du lien pour la vérification du mot de passe, il s’agit de ce lien (http://pastie.textmate.org/640447).
Merci de bien vouloir me guider =)
Electronic cigarette nyjoy
27 décembre 2012 à 19:09
36tbszwebups, Electronic Cigarette, Nkjfmen, [url=http://electroniccigarettespage.com/]Njoy electronic cigarette filters[/url], YDKJAHm, http://electroniccigarettespage.com/ Wicked electronic cigarette, mkOWjsr.
Fioricet mg
27 décembre 2012 à 19:12
37tslydebups, Fioricet, oSSgzPU, [url=http://fioricetarticles.com/]Fioricet overdose[/url], CLMKLNu, http://fioricetarticles.com/ Fioricet codeine, xBzbrVI.
Palace casino online
27 décembre 2012 à 19:32
38aatwaebups, online casino, CZmIhKj, [url=http://goldcasinostar.com/]online casino[/url], AIEAFiS, http://goldcasinostar.com/ Casino online real money, DAxTMlr.
Hoyle casino games
27 décembre 2012 à 19:33
39tnzmxebups, Online casino us slot invaders moolah, CAeSnNC, [url=http://chessmkd.com/]Uk best casino online[/url], ouCtzbu, http://chessmkd.com/ Casino games with good odds, LvTbNwL.
Payday cash advance illinois
28 décembre 2012 à 4:46
40unxniebups, Quickest cash advance, BaMYwOU, [url=http://coloradoflushot.com/]Cash advance payday loan nevada[/url], DmxCDlW, http://coloradoflushot.com/ Wwwquick cash advance, NPzGJLq.
Laisser un commentaire
Devenir Fan de Dator.fr
Nuage de tags
Sponsors
Warning: gzinflate() [function.gzinflate]: data error in /homez.27/dator/www/wp-includes/http.php on line 1787
Blogoliste
Blogs Amis
Derniers Posts
Derniers Commentaires
Les meilleurs sujets
Propulsé par WordPress