﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alexandre JULIEN &#187; Model</title>
	<atom:link href="http://www.alexandre-julien.com/tag/model/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alexandre-julien.com</link>
	<description>Industrialisation des développements, PHP, .NET, jQuery, HTML5, Web, …</description>
	<lastBuildDate>Sun, 22 Jan 2012 20:26:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Zend Framework tutoriel #3 : Couche modèle, interaction avec une base de données avec Zend_Db</title>
		<link>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db</link>
		<comments>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 17:21:35 +0000</pubDate>
		<dc:creator>Alexandre JULIEN</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[tutoriel]]></category>
		<category><![CDATA[Zend f]]></category>
		<category><![CDATA[Zend_Db]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=633</guid>
		<description><![CDATA[Dans une application, il est impératif de se soucier de la portabilité de son application et de son aptitude à s&#8217;intégrer à plusieurs système de base de données. Pour cela, il faut gérer les transactions avec cette dernière avec un outil indépendant d&#8217;une base de données.
On appelle cela une couche  [...]]]></description>
			<content:encoded><![CDATA[<p>Dans une application, il est impératif de se soucier de la portabilité de son application et de son aptitude à s&#8217;intégrer à plusieurs système de base de données. Pour cela, il faut gérer les transactions avec cette dernière avec un outil indépendant d&#8217;une base de données.</p>
<p>On appelle cela une couche d&#8217;abstraction qui sert intermédiaire entre la base de données et l&#8217;application. Le but est de modéliser le schéma d&#8217;une base de données sous forme de classes et d&#8217;objet pour ne pas travailler avec le langage SQL et les drivers de base de données car il est évident qu&#8217;une application écrite de A à Z avec des mysql_connect() et mysql_query() ne sera pas très robuste et migrera difficilement vers un autre SGBD comme Postgre ou Oracle&#8230;</p>
<p><span id="more-633"></span>Zend_Framework fournit un outil nommé Zend_Db_Table pour gérer à l&#8217;aide d&#8217;un système de DAO (Database Access Object) les transactions avec les bases de données.</p>
<p>Nous allons voir dans un premier temps comment configurer Zend_Framework pour mettre en place ce système :</p>
<p><span style="text-decoration: underline;">Configuration du fichier Application.ini :</span></p>
<pre lang="ini">;database configuration
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "announcements"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true</pre>
<p>Il faut spécifier dans le &laquo;&nbsp;Application.ini&nbsp;&raquo; les paramètres pour accéder à votre base de données, il faut y spécifier l&#8217;adresse de la base, le type (pdo_mysql, postgre, sqllite, oci8, mssql, &#8230;), l&#8217;utilisateur avec le mot de passe, le nom de la base de données et le format de date et heure.</p>
<p>Ecrire les classes d&#8217;accès aux données (utilisation de Zend_Db_Table) :</p>
<p>Il nous faut maintenant écrire les classes permettant de modéliser  les tables de la base de données pour cela on va utiliser Zend_Db_Table pour générer une classe permettant d&#8217;accéder à la table &laquo;&nbsp;posts &nbsp;&raquo; de notre application :</p>
<p>On créer tout d&#8217;abord un dossier &laquo;&nbsp;models&nbsp;&raquo; dans notre répertoire /application avec un dossier DbTable dedans.</p>
<p>Nous allons générer un fichier <strong>Post.php :</strong></p>
<p>Tout d&#8217;abord,  on crée une classe dérivée de Zend_Db_Table que l&#8217;on nommera avec la syntaxe suivante : Model_DbTablr_NomDeLaTable en spécifiant le nom extact dans l&#8217;attribut protégé &laquo;&nbsp;name&nbsp;&raquo; :</p>
<p>Ensuite il ne reste plus qu&#8217;à écrire les méthodes qui permet les transactions avec les bases de données, je recommende fortement d&#8217;utiliser une méthode pour chaque transaction plutôt que de les écrire dans le contrôleur, on est dans un design-pattern MVC !</p>
<p>Voici le prototypage de notre classe et l&#8217;implémentation de notre classe :</p>
<pre lang="php">fetchRow('id = '.(int)$id);
		if (!$row)
		{
			// On lance une exception en cas d'erreur
			throw new Exception ("Erreur, l'enregistrement $id n'existe pas !");
		}
		// On retourne le résultat sous forme de tableau
		return $row-&gt;toArray();
	}

	/**
	 * Ajoute un article en base de données
	 * @param $values
	 * @return unknown_type
	 */
	public function addPost ($values)
	{
		// On enregistre les valeurs sous forme de tableau [champs] =&gt; valeur
		$result = $this-&gt;insert($values);
		if (!$result)
		{
			throw new Exception ("Erreur impossible d'enregister");
		}
	}

	/**
	 * Met à jour un article en base de donneés
	 * @param $values
	 * @return unknown_type
	 */
	public function updatePost ($id,$newValues)
	{
		$result = $this-&gt;update($newValues, 'id = '.(int)$id);
		if (!$result)
		{
			throw new Exception ("Erreur impossible de mettre à jour");
		}
	}

	/**
	 * Supprime l'article $id
	 * @param $id
	 * @return unknown_type
	 */
	public function removePost ($id)
	{
		$result = $this-&gt;delete('id = '.$id);
		if (!$result)
		{
			throw new Exception ("Erreur impossible de supprimer");
		}
	}

	/**
	 * Requête avec jointure pour récupérer les 5 premiers
	 * articles avec les données de la table auteur en jointure
	 * et qui ont leur status publié
	 * @return unknown_type
	 */
	public function findPostsWithAuthorsInformations ()
	{
		$db = $this-&gt;getAdapter();

		$select = $db-&gt;select()
					 -&gt;from('post')
					 -&gt;joinInner('author', 'post.author_id = author.id')
					 -&gt;where('status = "published"')
					 -&gt;limit(5);
		$query = $select-&gt;query();
                $result = $query->fetchAll();

		return $result;
	}
}
?&gt;</pre>
<p>Pour appeler cette classe dans le contrôleur rien de plus simple, on instancie un objet &laquo;&nbsp;$model&nbsp;&raquo; et pis on appelle les méthodes que l&#8217;on a implémentée :</p>
<pre lang="php">< ?php
	class PostController extends Zend_Controller_Action
	{
		public function init ()
		{
			// On fait rien
		}

		public function testModelAction ()
		{
			$model = new Model_DbTable_Post();

			// Ajout
			$model->addPost(array('title' => 'test', 'content' => 'ceci est mon premier post', 'status' => 'publised'));

			// Requête
			$this->view->posts = $model->findPostsWithAuthorsInformations();

			// Suppression
			$model->removePost(2);

		}
	}
?></pre>
<p>La prochaine fois nous verrons le fonctionnement des formulaires avec Zend_Form</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework tutoriel #2 : Layouts et design-pattern MVC</title>
		<link>http://www.alexandre-julien.com/php/zend-framework-tutoriel-2-layouts-et-design-pattern-mvc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zend-framework-tutoriel-2-layouts-et-design-pattern-mvc</link>
		<comments>http://www.alexandre-julien.com/php/zend-framework-tutoriel-2-layouts-et-design-pattern-mvc/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 20:07:21 +0000</pubDate>
		<dc:creator>Alexandre JULIEN</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Layouts]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=413</guid>
		<description><![CDATA[Bien que l&#8217;on puisse utiliser Zend Framework comme une simple bibliothèque de classes, ce dernier propose des moyens et outils pour construire sa propre architecture.
Pour cela Zend propose une structure très standard et très connue des développeurs, le design-pattern MVC (Modèle Vue  [...]]]></description>
			<content:encoded><![CDATA[<p>Bien que l&#8217;on puisse utiliser Zend Framework comme une simple bibliothèque de classes, ce dernier propose des moyens et outils pour construire sa propre architecture.</p>
<p>Pour cela Zend propose une structure très standard et très connue des développeurs, le <strong>design-pattern MVC (Modèle Vue Contrôleur).</strong></p>
<p style="text-align: left;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/07/mvc.jpg"><img class="aligncenter size-full wp-image-415" title="Pattern MVC Model View Controller" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/mvc.jpg" alt="Pattern MVC Model View Controller" width="527" height="288" /><span id="more-413"></span></a></p>
<p style="text-align: left;">Petit rappel sur le modèle <strong>MVC</strong> : il consiste à séparer les trois parties fondamentales d&#8217;une application finale.</p>
<p style="text-align: left;">La première regroupe les <strong><span style="color: #3366ff;">traitements et l&#8217;intégritée</span></strong> des données. Elle s&#8217;occupe généralement des <strong><span style="color: #3366ff;">interactions avec la base de données</span></strong> avec une couche d&#8217;abstraction que nous verrons dans un prochain tutoriel.</p>
<p style="text-align: left;">La <strong><span style="color: #ff0000;">vue</span></strong> n&#8217;est autre que la partie interface graphique de l&#8217;application, c&#8217;est l&#8217;interface avec l&#8217;utilisateur et elle ne doit exercer aucun traitement.</p>
<p style="text-align: left;">Le <span style="color: #ff0000;"><strong>contrôleur</strong></span> est l&#8217;intermédiaire entre les 2 autres couches, il récupère les actions de d&#8217;utilisateurs et déclenche les traitements à effectuer.</p>
<p style="text-align: left;">Voici la couche Vue de notre application Zend de départ, on remarque qu&#8217;elle contient exclusivement le code HTML et le CSS ainsi que des variables  qui ne servent qu&#8217;à afficher des données :</p>
<p style="text-align: left;"><img class="aligncenter size-medium wp-image-417" title="ViewScreen" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/ViewScreen-300x187.png" alt="ViewScreen" width="300" height="187" /></p>
<p style="text-align: left;">La couche contrôleur se comporte sous la forme d&#8217;une classe dérivée de <strong><span style="color: #3366ff;">Zend_Controller_Action</span></strong>, elle doit être nommé sous la forme NomController et il en est de même pour le fichier qui la contient. Dans notre <strong><span style="color: #3366ff;">IndexController</span></strong>, nous avons 2 méthodes par défaut : init() et <strong>indexAction()</strong>. La méthode <strong>init()</strong> est l&#8217;action à exécuter par défaut avant n&#8217;importe quelle autre action. On peut y mettre des traitements pour récupérer des variables en paramètres ou en session par exemple. La méthode IndexAction() est la méthode centrale du contrôleur, il s&#8217;agit de la page par défaut. Les vues du contrôleur doivent être regroupées dans un même répertoire et doivent porter le même nom que l&#8217;action avec l&#8217;extension *.phtml pour les templates.</p>
<p style="text-align: left;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/07/ControllerScreen.png"><img class="aligncenter size-medium wp-image-418" title="ControllerScreen" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/ControllerScreen-300x187.png" alt="ControllerScreen" width="300" height="187" /></a></p>
<p style="text-align: left;">Les urls fonctionnent de la façon suivante : <strong><span style="color: #ff0000;">racine/index.php/contrôleur/action</span></strong></p>
<p style="text-align: left;">Maintenant que nous sommes à l&#8217;aise avec le contrôleur et la vue, nous allons mettre en place un template principal qui sera la base graphique de notre application : il s&#8217;agit d&#8217;un layout.</p>
<p style="text-align: left;">On commence d&#8217;abord à paramètrer notre application, pour cela on se rend dans le application.ini dans le répertoire configs :</p>
<p style="text-align: left;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/07/Layout_ApplicationINI.png"><img class="aligncenter size-medium wp-image-421" title="Layout_ApplicationINI" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/Layout_ApplicationINI-300x187.png" alt="Layout_ApplicationINI" width="300" height="187" /></a></p>
<p style="text-align: left;">On y définit le répertoire, où nous allons placer nos fichiers de mise en page, par convention on choisira le répertoire application/layouts/scripts.</p>
<p style="text-align: left;">En suite nous allons modifier le Bootstrap et surcharger la méthode _initDoctype() qui définiera le doctype de notre page Web.</p>
<p style="text-align: left;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/07/Layout_Bootstrap.png"><img class="aligncenter size-medium wp-image-422" title="Layout_Bootstrap" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/Layout_Bootstrap-300x187.png" alt="Layout_Bootstrap" width="300" height="187" /></a></p>
<p style="text-align: left;">Nous pouvons maintenant créer le<strong><span style="color: #ff0000;"> layouts.phtml</span></strong> dans le répertoire <strong><span style="color: #ff0000;">/layours/scripts</span></strong> et y insérer les balises de contenue.</p>
<p style="text-align: left;">On pourra étendre ce layout à plusieurs fichiers comme un header, un footer, une sidebar par exemple.</p>
<p style="text-align: left;"><a href="http://www.alexandre-julien.com/wp-content/uploads/2009/07/Layout.png"><img class="aligncenter size-medium wp-image-424" title="Layout" src="http://www.alexandre-julien.com/wp-content/uploads/2009/07/Layout-300x187.png" alt="Layout" width="300" height="187" /></a></p>
<p style="text-align: left;">C&#8217;est fini pour la structure MVC de Zend et la création de layouts, nous verrons dans le prochain tutoriel comment se comporte la couche modèle et les interactions avec la base de données et nous ferons notre première application CRUD (Create Read Upload Delete).</p>
<p style="text-align: left;">
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/zend-framework-tutoriel-2-layouts-et-design-pattern-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 1/5 queries in 0.031 seconds using disk: basic
Object Caching 799/800 objects using disk: basic

Served from: www.alexandre-julien.com @ 2012-02-18 13:42:18 -->
