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’);!

Zend Framework (ZF) : un livre d’or, quatrième étapes : Affichages et ajout de 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

Affichages et ajout de messages

Maintenant, il nous faut modifier le contrôleur afin qu’il affiche le contenu des fichier index.phtml et ajout.phtml.

 <?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(); 	} 	function init() 	{ 		$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; 	} }

Passons en revue chaque méthode

init()

Cette permet l’initialisation des différent paramètre, elle est appelé dans le constructeur parent de la class. On en profite pour définir un titre de page ($this-view->title) et divers autres paramètres. On défini aussi un répertoire supplémentaire pour les helper de view ($this->view->addHelperPath(‘./app/views/helpers’, ‘MyWsp_View_Helper’);).

ajouterAction()

Appeler lorsque on est à l’url /livre/ajouter, tout comme les autres méthode du type actionnNameAction() la partie actionName est prise depuis l’url! On récupère les différent paramètre si on a effectué un post ou on affiche simplement le contenu de ajouter.phtml (ceci se faisant automatiquement).

indexAction()

On récupère les informations dans la base de données, et on stocke les données dans le viewer.

Ajoutons quelques fichiers afin de rendre le tout plus intéressant et avoir un vrai jeu de templates/gabarit! header.phtml

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-be" lang="fr-be"> <head> 	<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 	<title><?php echo $this->escape($this->title); ?></title> </head> <body> <div id="content"> <h1><?php echo $this->escape($this->title); ?></h1>

le haut de la page html

footer.phtml

 	</div> </body> </html>

le bas de la page html

index.phtml

 <?php echo $this->render('header.phtml'); ?> 	<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'); ?>

La liste des messages du forum, on oublie pas d’inclure le haut et le bas de page (via $this->render();)

On voix ici l’utilisation du helper Date afin d’afficher la date au format choisi.

ajouter.phtml

 <?php echo $this->render('header.phtml'); ?> 	<div id="livre"> 	<strong><?php echo $this->message; ?></strong> 	<?php echo $this->render('livre/_form.phtml'); ?> 	</div> <?php echo $this->render('footer.phtml'); ?>

La page d’ajout des messages.

_form.phtml

 <form method="post" action="<?php echo $this->baseUrl ?>/livre/<?php echo $this->action; ?>" name="form_nom"> 	<div id="livre_haut"> 		<input type="text" name="nom" value="<?php echo $this->escape(trim($this->livre->nom)); ?>"> 		&nbsp;&bull;&nbsp; 		<input type="text" name="site" value="<?php echo $this->escape($this->livre->site);?>"> 		<br /> 		<textarea name="message" cols="50" rows="5"><?php echo $this->escape($this->livre->message); ?></textarea> 		<br /> 		<button type="submit" name="add">Poster</button> 	</div> </form> <br /> <br />

Le formulaire d’ajout et de modification (noté le _ devant le nom permettant d’avoir un template/gabarit privé.

En principe vous êtes maitenant capable d’ajouter des messages et de les afficher!

Zend Framework (ZF) : Geshi comme filtre dans ZF

Grâce à la libraire Geshi (http://qbnz.com/highlighter/) et à l’ingéniosité de ZF, colorer tout vos code, facilement, via ce nouveau filtre.

Pour l’utiliser, Télécharger la libraire geshi et décompresser là (dans l’exemple dans ./../site/lib/geshi/, donc le fichier geshi.php se trouve dans se répertoire et ./../site/lib/geshi/geshi/ contient les fichiers de langues)

<?php Zend_Loader::loadClass('Zend_Filter_Geshi'); $zfg = new Zend_Filter_Geshi('php', '../site/lib/geshi/'); echo $zfg->filter(<<<ABC <?php Zend_Loader::loadClass('Zend_Filter_Geshi'); \$zfg = new Zend_Filter_Geshi('php', '../site/lib/geshi/'); ABC );

Autre endroit ou trouver ce code : http://www.z-f.fr/code/detail/17

Zend Framework (ZF) : un livre d’or, troisième étapes : Bases des fichiers

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

Bases des fichiers

Avant tout, il nous faut créer les différents fichier .htaccess

 RewriteEngine on #RewriteBase /serveur/mon_repertoire/ RewriteRule .* index.php php_flag magic_quotes_gpc off php_flag register_globals off

La ligne en commentaire, permet dans le cas d’une erreur de ce type : Fatal error: Uncaught exception ‘Zend_Controller_Dispatcher_Exception’ with message ‘Invalid controller specified (serveur)’ in de corriger le problème, pour un accès, par exemple, via : http://localhost/serveur/mon_repertoire/

LivreControllers.php

 <?php /** Zend_Controller_Action */ require_once 'Zend/Controller/Action.php'; class LivreController extends Zend_Controller_Action { 	public function indexAction() 	{ 		echo 'Index du livre d\'or'; 		return; 	} 	public function ajouterAction() 	{ 		$this->view->title .= ' .: Ajout d\'un message'; 		echo 'ajout d\'un message!'; 		return; 	} }

Le controlleur, c’est ce qui va diriger notre application

index.php

 <?php error_reporting(E_ALL|E_STRICT); date_default_timezone_set('Europe/Brussels'); set_include_path('.' . PATH_SEPARATOR . '../site/lib' . PATH_SEPARATOR . './app/models/'  . PATH_SEPARATOR . get_include_path()); include 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Controller_Front'); Zend_Loader::loadClass('Zend_Config_Ini'); Zend_Loader::loadClass('Zend_Registry'); Zend_Loader::loadClass('Zend_Db'); // load configuration $config = new Zend_Config_Ini('./app/config.ini', 'general'); $registry = Zend_Registry::getInstance(); $registry->set('config', $config); // setup database $db = Zend_Db::factory($config->db->adapter,  $config->db->config->toArray()); Zend_Db_Table::setDefaultAdapter($db); // Régler le dossier des contrôleurs par défaut : $frontController = Zend_Controller_Front::getInstance(); $frontController->throwExceptions(true); $frontController->setControllerDirectory('./app/controllers'); // run! $frontController->dispatch();

Livre.php

 <?php Zend_Loader::loadClass('Zend_Db_Table'); class Livre extends Zend_Db_Table {     protected $_name = 'livre';     protected $_primary = 'id'; 	public function insertObject($object) 	{ 		return parent::insert((array) $object); 	} 	public function updateObject($object, $where) 	{ 		return $this->update((array) $object, $where); 	} }

Le modèle du livre, c’est-à-dire les données -> ici la base des données.

Date.php

 <?php class MyWsp_View_Helper_Date { 	/** 	 * Retourne une date sous forme d'une chaîne, au format donné par le 	 * paramètre format, fournie par le paramètre timestamp ou la date et 	 * l'heure courantes si aucun timestamp n'est fourni. En d'autres termes, 	 * le paramètre timestamp est optionnel et vaut par défaut la valeur de la 	 * fonction time(). 	 * Plus d'info sur http://www.php.net/manual/fr/function.date.php 	 * 	 * @param string $format format de la date 	 * @param int $timestampdate à formaté 	 * 	 * @return string 	 */ 	public function date($format, $timestamp = null) 	{ 		if (!is_nan($timestamp)) 			$timestamp = time(); 		// see http://www.php.net/manual/fr/function.strftime.php 		$dates = array( 			'DDDD'	=> '%A', 			'DDD'	=> '%a', 			'DD'	=> '%d', 			'D'		=> '%e', 			'MMMM'	=> '%B', 			'MMM'	=> '%b', 			'MM'	=> '%m', 			'YYYY'	=> '%Y', 			'YY'	=> '%y', 			'HH'	=> '%H', 			'hh'	=> '%I', 			'mm'	=> '%M', 			'ss'	=> '%S', 		); 		return strftime(str_replace(array_keys($dates), array_values($dates), $format), $timestamp); 	} }

config.ini

 [general] db.adapter = PDO_MYSQL db.config.host = localhost db.config.username = root db.config.password = db.config.dbname = livredor

Contient la configuration pour accéder à la base de donnée du livre d’or.

Test

Rendez-vous à l’adresse de votre script :

  • Lire les messages : http://localhost/serveur/mon_repertoire/livre/
  • Ajouter un message : http://localhost/serveur/mon_repertoire/livre/ajouter/

Si tout est ok, passons à la suite!

Zend Framework (ZF) : un livre d’or, deuxième étapes : Créations des tables sql et répertoires

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

Créations des tables sql

Créer une nouvelle base de donnée dans votre serveur mysql. Ensuite exécuter la requête suivante :

CREATE TABLE `livre` (

 `id` int(10) unsigned NOT NULL auto_increment,  `date` int(10) unsigned NOT NULL,  `message` text character set utf8 collate utf8_unicode_ci NOT NULL,  `nom` varchar(60) character set utf8 collate utf8_unicode_ci NOT NULL,  PRIMARY KEY  (`id`),  KEY `inde` (`date`)

);

La structure de la table correspond donc a ceci :

Champ Type Défaut Extra
id int(10) auto_increment
date int(10)
message text
nom varchar(60)

Très simple et rien de compliquer jusque là, enfin normalement.

Structure du script

Les répertoires d’abords :

 /site     /lib         /Zend --> ici le zend framework /test     /app         /controllers         /models         /views             /scripts                 /livre

Et avec les fichiers :

 /app     /controllers         LivreControllers.php     /models        Livre.php     /views         /helpers         /scripts             header.phtml             footer.phtml             /livre                 livre.phtml                 ajouter.phtml     config.ini index.php .htaccess
Pourquoi une tel disposition?

En fait, ZF va chercher de manière automatique grâce, notamment, au ViewHelper où se trouve les différent fichiers et les charger automatiquement! Zf utilisé le système MVC, c’est-à-dire modèle-vue-contrôleur!

  • Contrôleur : Lien entre la vue et le modèle, réagit au requête de l’utilisateurs, etc
  • Vue : ce que voix l’utilisateur, souvent le système de templates, donc c’est la présentation des données!
  • Modèle : accès aux données, en gros accès à la base des données, au fichiers, etc

Cependant divers dossiers peuvent se trouver à d’autres emplacement, mais ici on fait dans le simple!

Pensez à utiliser mon script pour avoir plus facile …