Zend Framework, Formulaire et Base de donnée, partie 2

database

On continue avec la deuxième partie de la gestion d’un formulaire, de la création de formulaire, et d’ajout de donnée en BDD dans le Zend Framework. Dans cette partie nous verrons comment afficher les données, les modifier à l’aide du même formulaire que pour l’ajout, et la suppression des données.

Sommaire

Afficher les données de la base de données.

Il faut tout d’abord toucher a notre controller qui gère la page user pour donner à la vue une instance de la classe >Model_DbTable_Users(). Vu que j’utilise souvent cette classe, j’ai fait une méthode dans la classe controller : (application/modules/Frontend/controllers/UserController.php)

private function getUsersAll() {
	$dbUser = new Model_DbTable_Users();
	return $dbUser->fetchAll()->toArray();
}

Et maintenant on a juste a passer cette classe à la vue :

public function indexAction(){
	$this->view->usersAll = $this->getUsersAll();
}

On passe maintenant à la vue (application/modules/Frontend/views/scripts/user/index.phtml).

if (isset($this->usersAll)){ ?>
	<h2><?php echo $this->translate('view_user_modify')?> : </h2>
	<table>
		<tr>
	    	<th><?php echo $this->translate('view_user_firstname')?></th>
	    	<th><?php echo $this->translate('view_user_name')?></th>
	    	<th><?php echo $this->translate('view_user_email')?></th>
	    	<th><?php echo $this->translate('view_user_modify')?></th>

		</tr>
		<?php
		$users = $this->usersAll;
		foreach ($users as $user){
			if ($user['active'] == 1){
				echo '<tr>';
			}else{
				echo '<tr style="text-decoration:line-through">';
			}
			echo '<td>'.$user['nom'].'</td>';
			echo '<td>'.$user['prenom'].'</td>';
			echo '<td>'.$user['email'].'</td>';

			echo '<td><a href="'.$this->url(array('action'=>'edit','id'=>$user['idUser'])).'">Modifier</a> | <a href="'.$this->url(array('action'=>'del','id'=>$user['idUser'])).'" >Supprimer</a></td>';
			echo '</tr>';
		}
		?>
	</table>
<?php
}
?>

liste users

On commence par vérifier que la variable usersAll est bien définit. Dans ce cas la on construit notre tableau assez naturellement. Encore une fois j’utilise ici la traduction du framework (mais on n’est pas forcé de le faire).

			if ($user['active'] == 1){
				echo '<tr>';
			}else{
				echo '<tr style="text-decoration:line-through">';
			}

Ce code sert juste a vérifié que l’utilisateur est actif. Si il ne l’est pas on barre la ligne :

echo '<td><a href="'.$this->url(array('action'=>'edit','id'=>$user['idUser'])).'">Modifier</a> | <a href="'.$this->url(array('action'=>'del','id'=>$user['idUser'])).'" >Supprimer</a></td>';

Enfin cette ligne est assez sympa : en effet on veut pouvoir éditer et supprimer des utilisateurs. Il nous faut donc des liens pour le faire. Et bien pour fabriquer ces liens on va utiliser une aide de vues (View Helper : Zend_View_Helper_Url) qui va nous construire notre lien directement. On lui passe comme argument un tableau, avec comme clés l’action, le controller, le module et des paramètres. Tout ces champs ne sont pas obligatoires. Dans mon cas, je reste sur le même controller, et donc le même module. Donc je n’utilise que l’action et un paramètre id. Ce paramètre est passé en GET donc directement dans l’url. De plus zend> va gérer automatiquement l’url rewriting, qui est beaucoup plus user-friendly et seo-friendly. Voyons ce que donne le résultat : (il y a un peu de css)

Modification d’un enregistrement

Donc notre lien pour modifier un utilisateur est déjà fait, et comme on a pu le voir, il pointe sur l’action edit du controller UserController.php. Il va donc falloir modifier celui-ci, ainsi que la classe qui gère le formulaire et la vue. On commence avec le formulaire. En fait on va utiliser la même classe que pour l’ajout, mais on va y rajouter un peu de code (à la fin de la méthode).

Model

		$idUser = $this->getIdUser();
		if (isset ( $idUser ) && $idUser != "") {
			$user = new Model_DbTable_Users ( );
			$user = $user->fetchRow ( array ("idUser = ?" => $idUser ) );
			if ($user != null) {
				$user = $user->toArray ();
				$this->populate ( $user );
			} else {
				throw new Zend_Exception ( "Il n'y a pas de d'utilisateur avec l'id : " . $idUser );
			}
			$password->setDescription ( "form_user_update_password_change" );
			$password->setRequired ( false );
			$submit->setLabel ( 'form_user_update_submit' );
		}

On commence par récupérer la valeur de l’id de l’utilisateur. Bien entendu, il faut déclarer une variable (private) et faire le getter et le setter qui va bien. Si il y a bien une valeur et qu’elle est différente de null on récupère une instance de la classe Model_DbTable_Users. On sélectionne la ligne qui va bien en fonction de l’id. Si on a bien récupérer un utilisateur (c’est a dire qu’il y a bien un enregistrement avec cet id)> on peuple le formulaire, c’est a dire qu’on le rempli des données récupérer. Sinon on renvoi une erreur. Ensuite, ce n’est pas obligatoire, mais je laisse le choix a l’utilisateur : si il ne veut pas changer de mot de passe, il ne fait rien, sinon il en rentre un nouveau. Enfin on change le label du bouton envoyer>. Mais ce n’est pas finit. En effet il reste un problème de validateur> sur le champs email. Il vaut donc le supprimer, mais que si c’est le même email (saisi) que l’email qui est déjà dans la BDD. De la même marnière que dans la partie 1, on va devoir redéfinir la méthode isValid :

	public function isValid($data)
	{
	    $this->getElement('password')->addValidator(new App_Validate_PasswordMatch($data['password2']));
		if ($this->getElement('email')->getValue() == $data['email']){
				$this->getElement('email')->removeValidator ( "Zend_Validate_Db_NoRecordExists" );
		}
	    return parent::isValid($data);
	}

Par rapport au code de la partie 1, on a rajouté le bloc IF : Si la valeur en base est la même que la valeur saisi, on supprime le validateur>, sinon on ne fait rien (et donc on le laisse).
Voilà notre formulaire est enfin prêt. On passe maintenant au controller.

Controller

	public function editAction() {
		try {
			$form = new Model_Form_User_User ( );
			$form->setIdUser($this->getRequest ()->getParam ( 'id' ));
			$form->init();
			$this->view->formUserEdit = $form;
		} catch (Zend_Exception $e) {
			$this->view->formUserEdit = $e->getMessage();
		}
	}

On essaye d’instancier la classe Model_Form_User_User ( ). Ensuite on récupère la valeur du paramètre id (passer en GET) et on la passe a notre classe forme. On est obligé de refaire le formulaire puis on la passe a la vue. Si il y a un problème (pas d’utilisateur avec id X) on passe les erreurs a la vue.

		if ($this->_request->isPost ()) {
			$formData = $this->_request->getPost ();
			if ($form->isValid ( $formData )) {

Ensuite, comme dans la première partie, on vérifie qu’il y ai des données de poster, et les recupère puis on les passes au validateur.

				$user = new Model_DbTable_Users ( );
				if ($formData ['password'] == "") {
					unset ( $formData ['password'] );
					unset ( $formData ['password2'] );
				} else {
					$formData ['password'] = md5 ( $formData ['password'] );
					unset ( $formData ['password2'] );
				}
				unset ( $formData ['submit'] );
				$result = $user->update ( $formData, array ("idUser = ?" => $formData ['idUser'] ) );

Si elle sont valide, on instancie la classe Model_DbTable_Users. On vérifie la valeur du champs password : Si elle est nul, on enlève du tableau de donnée formData les champs password et password2, sinon on chiffre en md5 le champ password et en enlève password2. Enfin on enlève le champ submit. Et pour finir on met a jour la base de donnée.

$this->_helper->redirector ( 'index', 'user' );

Enfin on redirige vers l’action index du controller user.

Vue

Ici c’est le même principe que pour le formulaire d’ajout

if (isset($this->formUserEdit)){ ?>
	<h2><?php echo $this->translate('view_user_edit')?> : </h2>
	<?php echo $this->formUserEdit;
}

edit user

Supprimer un Enregistrement

La suppression d’un utilisateur va se faire en deux étape, la première servant à confirmer la demande de suppression. Donc on crée une action intermédiaire qui passe à la vue la valeur de l’id de l’utilisateur.
public function delAction() {

	public function delAction() {
		$id = $this->getRequest ()->getParam ( 'id' );
		$this->view->delUserId = $id;
		$this->render('index');
	}

Et on ajoute à la vue le code qui va générer notre demande de suppression. Encore ici on réutilise l’aide de vue url.

if (isset($this->delUserId)){ ?>
	<h2><?php echo $this->translate('are_you_sure')?> : </h2>
	<a href="<?php echo $this->url(array('action'=>'delete','id'=>$this->delUserId));?>"><?php echo $this->translate('yes')?></a>
	<a href="<?php echo $this->url(array('action'=>'index','controller'=>'user'),null,true)?>"><?php echo $this->translate('no')?></a>
	<?php
}

Enfin si l’utilisateur clique sur oui, on exécute l’action suivante :

	public function deleteAction() {
		public function deleteAction() {
		$id = $this->getRequest ()->getParam ( 'id' );
		$user = new Model_DbTable_Users ( );
		$result = $user->delete ( array ("idUser = ?" => $id ) );
		$this->_helper->redirector ( 'index', 'user' );
	}

Et voilà le tour est joué. On a bien supprimer notre utilisateur.

Conclusion

On à enfin finit la gestion d’une table de la base de donnée grâce a un seul formulaire. Je vous donne donc maintenant le code de tous les fichiers dont j’ai eu besoin. Il y a des petites différence dans la mesure ou j’ai ajouté des messages de confirmation ou d’échec. De plus la structure de l’archive n’est pas bonne du tout… Il y a bien tous les fichiers (enfin je pense, mais c’est plus a titre indicatif). Il ne fonctionneront pas sans le bootstrap, le fichier de config, le fichier de traduction et enfin la bdd. Je referais un gros package plus tard.
Fichiers


Articles en rapport :

9 Commentaires

Lywamai 6th, 2010 at 12 h 10 min

Slt!
je travaille sur le ZendFramework depuis lors mais g des problémes si je veux des jointures entre tables et recupérer les valeurs pour un éventuel suppression ou modification.Si je peux avoir un exemple sur ça.

Lywamai 6th, 2010 at 12 h 11 min

J’attends ta réponse avc impatience.
Merci

Gregmai 6th, 2010 at 13 h 55 min

la j’ai pas d’exemple sous la main. Quand j’ai des jointures (complexes) a faire j’utilise l’objet select.
Mais pour une suppression ou un update, tu peux le faire avec les outils habituelles. Tu peux donner un tableau en argument de la fonction update. regardes dans la doc de zf …

Lywamai 6th, 2010 at 14 h 03 min

Merci pour la réponse.
Mais je veux faire le méme exemple ke vs avé fait pour la suppression et modification mais en utilisation des champs issue de table différents de ma bases de données.Par exemple voici ce ke j’essaye de faire:
escape($this->title);?>
Administration

id_Article
Titre
Section
Categorie
 

query(« select article.id_art,article.titre,section.id_sect,categorie.id_cat from article a,section s,categorie c where a.id_art = c.id_cat and c.id_cat= s.id_sect; »)?>

escape($article->id_art); ?>
escape($article->titre_art); ?>
escape($categorie->id_cat); ?>
escape($section->id_sect); ?>

<a href="url(array(‘controller’=>’administration’,'action’=>’modifierarticle’,'id_art’=>$article->id_art));?> »>Modifier /
<a href="url(array(‘controller’=>’administration’,'action’=>’supprimerarticle’,'id_art’=>$article->id_art));?> »>Supprimer

Gspr ke vs comprendrez ce ke je veux faire avc ça.Mon problém c de recupéré les données de ma requéte pr chak champ.

Gregmai 6th, 2010 at 14 h 06 min

Hm, la je suis désolé, j’ai pas trop compris. En plus WordPress vire toutes les balises html / php.
Dans tous les cas je pense que tu ferais mieux de poster un message sur le forum francais : http://z-f.fr/ … Par contre evite le langage sms

Lywamai 6th, 2010 at 14 h 09 min

Voici un exemple d’erreur:

id_Article Titre Section Categorie

Notice: Undefined variable: article in C:\wamp\www\Intranet\application\views\scripts\administration\index.phtml on line 15

Notice: Trying to get property of non-object in C:\wamp\www\Intranet\application\views\scripts\administration\index.phtml on line 15

Notice: Undefined variable: article in C:\wamp\www\Intranet\application\views\scripts\administration\index.phtml on line 16

Notice: Trying to get property of non-object in C:\wamp\www\Intranet\application\views\scripts\administration\index.phtml on line 16

Notice: Undefined variable: categorie in C:\wamp\www\Intranet\application\views\scripts\administration\index.phtml on line 17

Notice: Trying to get property of non-object in C:\wamp\www\Intranet\application\views\scripts\administration\index.phtml on line 17

Gregmai 6th, 2010 at 14 h 15 min

cf la réponse précédente …

Lywamai 6th, 2010 at 14 h 24 min

Tjrs mm problém.
Mais merci kan mm.

TonTaXaoût 10th, 2010 at 17 h 03 min

Utilise un referenceMap dans ta classe de table

Va faire un tour sur ZendCast ça peut t’aider je pense
http://www.zendcasts.com/may-to-many-with-zend_db-and-zend_form/2009/05/

Laisser un commentaire

Votre commentaire :