ZF : comprendre le fonctionnement des urls

Url de ZF et distribution des rôles aux contrôleurs

Avec Zend Framework, de base le système mis en place par le contrôleur est celui-ci :

url module contrôlleur action paramètre
http://exemple.test/ default index index
http://exemple.test/news default news index
http://exemple.test/news/ajouter default news ajouter
http://exemple.test/news/modifier/id/5 default news modifier id=5
http://exemple.test/news/modifier/?id=5 default news modifier id=5

Avec des modules perso

Maintenant ajoutons la gestion des modules news et livredor:

 $ctrl->setControllerDirectory(     array(         'news'    => '/module/news/controllers',         'livredor'    => '/livredor/ctrl'     ) ); 
url module contrôlleur action paramètre
http://exemple.test/ default index index
http://exemple.test/news news index index
http://exemple.test/news/ajouter news ajouter index
http://exemple.test/news/modifier/id/5 news modifier id
http://exemple.test/news/modifier/?id=5 news modifier index id=5

Comprendre le Zend_Controller_Router_Route

ce que l’on vient de voir s’explique par ceci :

 $route = new Zend_Controller_Router_Route(     ':module/:controller/:action/*',     array('module' => 'default') ); $router->addRoute('default', $route); 

Ce qui correspond à l’option par défaut. De plus, ceci nous montre un exemple de paramètre par défaut, en effet à module, on attribue la valeur default.

Allons plus loin et créer nos propres routes!

Route personnalisée

imagions un espace membre, on désire afficher chaque profile. On pourrait imaginer quelque chose du genre : http://exemple.test/profil/voir/id/5 ou encore http://exemple.test/profil/voir/membre/grummfy afin d’avoir le contrôleur profil et et l’action voir. Cependant ce n’est ni joli, ni pratique. Utilisons donc le Zend_Controller_Router_Route

 $route = new Zend_Controller_Router_Route(     'profiledemembre/:username/*',     array(         'controller' => 'profil',         'action'     => 'voir'     ) ); $router->addRoute('myProfileRoute', $route); 

Ce qu’on fait pour les url du type http://exemple.test/profiledemembre/grummfy, on assigne les valeurs suivantes :

 * controller = profil  * action = voir  * username = grummfy, ceci via les :  * et on garde la possibilité d'avoir des paramètres avec *

Dans le contrôleur profil, on fera ceci :

 <?php public function voirAction() {     $request = $this->getRequest();     $username = $request->getParam('username');     // ou     $username = $this->_getParam('username'); } 

Aller plus loin

Le manuel de Zend vous enseignera comment faire des url avec expression régulière ou encore des rotue static, et bien plus! Mais aussi cette autre page : http://framework.zend.com/manual/fr…

Aller plus loin avec Zend Framework

Je vous ai brièvement présenté quelques une des nombreuses possibilités de ZF avec la fabrication d’un livre d’or en 6 étapes

Vous désirez allez plus loin? Plusieurs voix s’offre a vous :

  • Attendre que j’ai rédigé plein de tuto (je vous plein!)
  • Consulter le manuel de ZF
  • Aller sur le site francophone du framework : z-f.fr
  • Passez sur le wiki officiel
  • Ou sur devellopez.com : FAQ, forum, tuto
  • KitPages, und es admin de z-f.fr donnes aussi, régulièrement des tutos sur ZF : voir les tuto

Résister à la ligne de commande? Impossible, je suis accros!

Déjà sous Microsoft(r) windows (c) j’avais du mal a ne pas de temps à autres passer par cette fenêtre noire, avec son petit c:\>

Le temps évoluant j’ai découvert linux, et là j’ai eu encore plus de mal.

Pourtant, on n’est pas obligé d’y passer, surtout avec les dernières distributions, qui font tout à la souris, mais que voulez-vous, c’est dur,

Comment résister au clavier et son écran transparent avec un grummfy:~$

Comment éviter de gagner du temps et de la simplicité?

Je ne peux me résoudre a abandonné cette délicieuse voix qu’es la console, le terminal, le shell, l’invite de commande…

Et pourtant, je me suis dit : aujourd’hui tu ne passes pas par là! Mais rien n’y fait, c’est trop simple, trop rapide, trop direct pour s’en passer! Mais pour ceux qui ne sont pas accros, comme moi, oui c’est possible de l’éviter, sauf quelques rares exceptions (compilation, et encore… ou un très gros plantage)

Avant de devenir accros, fuyez la ligne de commandes, fuyez la facilité, fuyez la rapidité et sa grande séduction, fuyez le terminal! Bref, sauvez-vous!

Zend Framework (ZF) : un livre d’or, sixième étapes : Conclusions

Créations d’un livre d’or en 6 étapes

  1. Définition
  2. Créations des tables sql et des répertoires
  3. Bases des fichiers
  4. Affichages et ajout de messages
  5. Modification et suppression des messages
  6. Conclusions

Conclusions

Avant de faire la conclusion finale, je vais ajouter deux trois trucs au script : Dans la base de donnée ajouter trois champs : ip(varchar de 15), email(varchar de 60) et site(varchar de 60) et modifier en conséquence le fichier contrôleur

On pourrait ajouter un système de validation des messages… et encore d’autre choses.

On peux ajouter un système de cache (voir archive)

Afin de terminer en plus joli voici une feuille de style à ajouter : /public/style/site.css

 body,html { 	margin: 0px; 	font-family: Verdana,Arial,Helvetica,sans-serif; 	color: #000000; 	background-color: #ffffff; 	text-align: justify; } h1 { 	font-size: 1.4em; 	color: #800000; } #content { 	margin: 0px auto 0px auto; 	width: 500px; } .livre_block_message { 	border: 1px dotted #aaaaaa; 	margin-bottom: 1.5em; 	padding: 0.5em; } a { 	color: #800000; }

et pour qu’elle soit pris en compte on modifie header.phtml :

 ... 	<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $this->baseUrl;?>/public/style/site.css" /> </head> ...

Conclusion

Dans ce tutoriel on a :

  • Utiliser Zend_View
  • Utiliser Zend_View_Helper
  • Utiliser Zend_Db_Table
  • Utiliser Zend_Config_Ini
  • Utiliser Zend_Controller_Front

Maintenant essayer de modifier et de bien comprendre tout cela, lisez le manuel de Zend Framework et vous irez rapidement vers de plus grosses application!

Télécharger

Zend Framework (ZF) : un livre d’or, cinquième étapes : Modification et suppression des messages

Créations d’un livre d’or en 6 étapes

  1. Définition
  2. Créations des tables sql et des répertoires
  3. Bases des fichiers
  4. Affichages et ajout de messages
  5. Modification et suppression des messages
  6. Conclusions

Modification et suppression des messages

Modifions notre contrôleur :

 <?php /** Zend_Controller_Action */ require_once 'Zend/Controller/Action.php'; class LivreController extends Zend_Controller_Action { 	public function indexAction() 	{ 		$livre = new livre(); 		$this->view->livres = $livre->fetchAll(); 	} 	public function ajouterAction() 	{ 		$this->view->title .= ' .: Ajout d\'un message'; 		if ($this->getRequest()->isPost()) 		{ 			Zend_Loader::loadClass('Zend_Filter_StripTags'); 			$filter = new Zend_Filter_StripTags(); 			$livre = $this->_getEmptyMsg(); 			$livre->id = null; 			$livre->nom = trim($filter->filter($this->getRequest()->getPost('nom'))); 			$livre->message = trim($filter->filter($this->getRequest()->getPost('message'))); 			if ($livre->nom != htmlspecialchars('Pseudo')) 			{ 				$livre_ = new Livre(); 				$livre_->insertObject($livre); 				$this->_redirect('/livre'); 				return; 			} 			else 			{ 				$this->view->message = 'Merci de donner votre pseudo!'; 			} 		} 		//création d'un message vide 		$this->view->livre = $this->_getEmptyMsg(); 	} 	public function modifierAction() 	{ 		//si on est aps connecter ->redirection sur le logeur 		if (!$_SESSION['connecter']) 			$this->getResponse()->setRedirect($this->view->baseUrl . '/livre/admin/'); 		$this->view->title .= ' .: Modification d\'un message'; 		//récupération du message correspondant au paramètre id 		$livreTable = new Livre(); 		$where  = $livreTable->getAdapter()->quoteInto('id = ?', intval($this->getRequest()->getParam('id'))); 		$livre = $livreTable->fetchRow($where); 		if ($this->getRequest()->isPost()) 		{ 			Zend_Loader::loadClass('Zend_Filter_StripTags'); 			$filter = new Zend_Filter_StripTags(); 			$livre->nom = trim($filter->filter($this->getRequest()->getPost('nom'))); 			$livre->message = trim($filter->filter($this->getRequest()->getPost('message'))); 			if ($livre->nom != htmlspecialchars('Pseudo')) 			{ 				$livre_ = new Livre(); 				$livre_->updateObject($livre, $livre_->getAdapter()->quoteInto('id = ?', $livre->id)); 				$this->_redirect('/livre/'); 				return; 			} 		} 		$this->view->livre = $livre; 		$this->view->action .= '/id/' . $livre->id; 		$this->render('ajouter'); 	} 	public function adminAction() 	{ 		$this->view->title .= ' .: Administration'; 		if ($this->getRequest()->isPost() && !$_SESSION['connecter']) 		{ 			if ($this->getRequest()->getPost('login') == 'admin' && $this->getRequest()->getPost('pass') == '1234') 			{ 				//bon password et bon login 				$_SESSION['connecter'] = true; 			} 		} 		elseif (!$_SESSION['connecter']) 		{ 			$this->render(); 			return; 		} 		$this->getResponse()->setRedirect($this->view->baseUrl . '/livre/'); 	} 	public function disadminAction() 	{ 		$this->view->title .= ' .: Déconnection'; 		if ($_SESSION['connecter']) 		{ 			$_SESSION['connecter'] = false; 		} 		$this->getResponse()->setRedirect($this->view->baseUrl . '/livre/'); 	} 	public function supprimerAction() 	{ 		//si on est aps connecter ->redirection sur le logeur 		if (!$_SESSION['connecter']) 			$this->getResponse()->setRedirect($this->view->baseUrl . '/livre/admin/'); 		$this->view->title .= ' .: Suppretion d\'un message'; 		$livre = $this->_getEmptyMsg(); 		$livre->id = intval($this->getRequest()->getParam('id')); 		$this->view->action .= '/id/' . $livre->id; 		if ($this->getRequest()->isPost()) 		{ 			$livre_ = new Livre(); 			if ($livre_->delete($livre_->getAdapter()->quoteInto('id = ?', $livre->id))) 				$this->view->message = 'Message supprimé!'; 			else 				$this->view->message = 'Message <b>non</b> supprimé!'; 			$this->view->message .= '<br /> Vous aller être rediriger!<br />'; 			$this->getResponse()->setRawHeader('Refresh:3; url=' . $this->view->baseUrl . '/livre/'); 		} 	} 	function init() 	{ 		session_name('goldbook'); 		session_start(); 		$_SESSION['connecter'] = isset($_SESSION['connecter'])?$_SESSION['connecter']:false; 		$this->view->connecter = $_SESSION['connecter']; 		$this->view->title = 'Livre d\'or'; 		//url de base... 		$this->view->baseUrl = $this->_request->getBaseUrl(); 		$this->view->action = $this->getRequest()->getActionName(); 		//prêt à travailler sur les livres 		Zend_Loader::loadClass('Livre'); 		//ajout des aides de view 		$this->view->addHelperPath('./app/views/helpers', 'MyWsp_View_Helper'); 		$this->view->setEscape('utf8_encode'); 	} 	/** 	 * Créer un message vide 	 * 	 * @return Object 	 */ 	protected function _getEmptyMsg() 	{ 		//création d'un message vide 		$livre = new stdClass(); 		$livre	->id = -99; 		$livre	->nom = 'Pseudo'; 		$livre	->message = 'Entrez votre message'; 		$livre	->date = time(); 		return $livre; 	} }

Il nous faut créer un système de session, et une authentification pour l’administration. Ici les choses sont très basiques, car le but n’y est pas! Donc on utilise els session php et une authentification des plus basique (login: admin, password: 1234)!

Il nous faut encore modifier index.phtml

 <?php echo $this->render('header.phtml'); ?> <?php if ($this->connecter) echo '<a href="' , $this->baseUrl , '/livre/disadmin">Se déconnecter</a>'; ?> 	<div id="livre"> 		<p><a href="<?php echo $this->baseUrl; ?>/livre/ajouter">Ajouter un message</a></p> 		<div id="livre_message"> 		<?php foreach($this->livres as $livre) : ?> 			<div class="livre_block_message"> 				<span class="livre_pseudo"><?php 					echo $this->escape($livre->nom); 				?></span> | 				<span class="livre_date">Le <?php echo $this->date('DDDD DD MMMM YYYY', $this->escape($livre->date)); ?></span> 				<br /> 				<span class="livre_message"><?php echo nl2br($this->escape($livre->message)); ?></span> 				<?php 				if ($this->connecter) 					echo '<br /><a href="' , $this->baseUrl , '/livre/modifier/id/' , $livre->id , '">Modifier</a> 					<a href="' , $this->baseUrl , '/livre/supprimer/id/' , $livre->id , '">Supprimer</a>'; 				?> 			</div> 		<?php endforeach; ?> 		</div> 	</div> <?php echo $this->render('footer.phtml'); ?>

N’oublions pas d’ajouter les fichier admin.phtml et supprimer.phtml

suprimer.html

 <?php echo $this->render('header.phtml'); ?> 	<div id="livre"> 		<strong><?php echo $this->message; ?></strong> 		<form method="post" action="<?php echo $this->baseUrl ?>/livre/<?php echo $this->action ?>" name="form_nom"> 			<div id="livre_haut"> 				<button type="submit" name="del">Supprimer?</button> 			</div> 		</form> 		<br /> 		<br /> 	</div> <?php echo $this->render('footer.phtml'); ?>

admin.phtml

 <?php echo $this->render('header.phtml'); ?> 	<div id="livre"> 		<form method="post" action="<?php echo $this->baseUrl ?>/livre/admin" name="form_nom"> 			<div id="livre_haut"> 				Login : <input type="text" name="login"> 				<br /> 				Password : <input type="password" name="pass"> 				<br /> 				<button type="submit" name="admin">Poster</button> 			</div> 		</form> 		<br /> 		<br /> 	</div> <?php echo $this->render('footer.phtml'); ?>

Comme on peux le remarquer pas besoin d’un fichier modifier.phtml car nous réutilisons ajouter.phtml via $this->render(‘ajouter’);!