Sfoglia il codice sorgente

Add/sync some french documentations

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22131 44c647ce-9c0f-0410-b52a-842ac1e357ba
doctorrock83 15 anni fa
parent
commit
d936fb70ed

+ 41 - 40
documentation/manual/fr/module_specs/Zend_Validate-Messages.xml

@@ -1,35 +1,35 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 20352 -->
+<!-- EN-Revision: 22119 -->
 <!-- Reviewed: no -->
 <sect1 id="zend.validate.messages">
     <title>Messages de validation</title>
 
     <para>
         Chaque validateur basé sur <classname>Zend_Validate</classname> propose un ou plusieurs messages
-        dans le cas d'un echec. Vous pouvez utiliser ces informations pour créer vos propres messages
+        dans le cas d'un échec. Vous pouvez utiliser ces informations pour créer vos propres messages
         ou pour traduire les messages présents.
     </para>
 
     <para>
-        These validation messages are constants which can be found at top of each validator class.
-        Let's look into <classname>Zend_Validate_GreaterThan</classname> for an descriptive example:
+        Ces messages sont représentés par des constantes se trouvant en haut de chaque classe de validateur.
+        Voyons <classname>Zend_Validate_GreaterThan</classname> pour un exemple complet:
     </para>
 
     <programlisting language="php"><![CDATA[
 protected $_messageTemplates = array(
-    self::NOT_GREATER => "'%value%' is not greater than '%min%'",
+    self::NOT_GREATER => "'%value%' n'est pas plus grande que '%min%'",
 );
 ]]></programlisting>
 
     <para>
-        As you can see the constant <constant>self::NOT_GREATER</constant> refers to the failure and
-        is used as key, and the message itself is used as value of the message array.
+        Comme vous le voyez, la constante <constant>self::NOT_GREATER</constant> fait référence à un échec et est
+        utilisée comme clé, le message lui-même est utilisé comme valeur dans le tableau des messages.
     </para>
 
     <para>
-        You can retrieve all message templates from a validator by using the
-        <methodname>getMessageTemplates()</methodname> method. It returns you the above array which
-        contains all messages a validator could return in the case of a failed validation.
+        Vous pouvez récupérer les templates de messages d'un validateur en utilisant la méthode
+        <methodname>getMessageTemplates()</methodname>. Elle vous retourne le tableau comme vu ci-dessus qui contient
+        tous les messages que le validateur pourrait retourner en cas d'échec de validation.
     </para>
 
     <programlisting language="php"><![CDATA[
@@ -38,76 +38,77 @@ $messages  = $validator->getMessageTemplates();
 ]]></programlisting>
 
     <para>
-        Using the <methodname>setMessage()</methodname> method you can set another message to be
-        returned in case of the specified failure.
+        La méthode <methodname>setMessage()</methodname> permet de modifier un message unique correspondant à un
+        cas particulier d'échec de validation.
     </para>
 
     <programlisting language="php"><![CDATA[
 $validator = new Zend_Validate_GreaterThan();
-$validator->setMessage('Please enter a lower value', Zend_Validate_GreaterThan::NOT_GREATER);
+$validator->setMessage('Entrez une valeur plus petite', Zend_Validate_GreaterThan::NOT_GREATER);
 ]]></programlisting>
 
     <para>
-        The second parameter defines the failure which will be overridden. When you omit this
-        parameter, then the given message will be set for all possible failures of this validator.
+        Le deuxième paramètre indique le cas d'échec à surcharger. Lorsque vous omettez ce paramètre,
+        alors le message précisé sera affecté comme message pour tous les cas d'échec possibles du validateur.
     </para>
 
     <sect2 id="zend.validate.messages.pretranslated">
-        <title>Using pre-translated validation messages</title>
+        <title>Utiliser les messages de validations pré-traduits</title>
 
         <para>
-            Zend Framework is shipped with more than 45 different validators with more than 200
-            failure messages. It can be a tendious task to translate all of these messages. But for
-            your convinience Zend Framework comes with already pre-translated validation messages.
-            You can find them within the path <filename>/resources/languages</filename> in your
-            Zend Framework installation.
+            Zend Framework est livré avec plus de 45 validateurs différents et plus de 200 messages d'échecs.
+            Cela peut-être pénible de tous les traduire. Pour votre convenance, Zend Framework est livré avec
+            des messages d'échec pré-traduits. Vous les trouverez dans <filename>/resources/languages</filename>
+            de votre installation de Zend Framework.
         </para>
 
         <note>
-            <title>Used path</title>
+            <title>Chemin utilisé</title>
 
             <para>
-                The resource files are outside of the library path because all of your translations
-                should also be outside of this path.
+                Les fichiers de ressources sont en dehors du dossier library car les traductions sont sensées
+                être en dehors de ce chemin.
             </para>
         </note>
 
         <para>
-            So to translate all validation messages to german for example, all you have to do is to
-            attach a translator to <classname>Zend_Validate</classname> using these resource files.
+            Donc pour traduire les messages de validation en français par exemple, tout ce qu'il y a à faire est
+            d'attacher un objet de traduction à <classname>Zend_Validate</classname> en utilisant les fichiers
+            de ressources (pré-traductions).
         </para>
 
         <programlisting language="php"><![CDATA[
 $translator = new Zend_Translate(
-    'array',
-    '/resources/languages',
-    $language,
-    array('scan' => Zend_Locale::LOCALE_DIRECTORY)
+    array(
+        'adapter' => 'array',
+        'content' => '/resources/languages',
+        'locale'  => $language,
+        'scan' => Zend_Translate::LOCALE_DIRECTORY
+    )
 );
 Zend_Validate_Abstract::setDefaultTranslator($translator);
 ]]></programlisting>
 
         <note>
-            <title>Used translation adapter</title>
+            <title>Adaptateur de traduction utilisé</title>
 
             <para>
-                As translation adapter Zend Framework choosed the array adapter. It is simple to
-                edit and created very fast.
+                L'adaptateur array a été utilisé, ceci pour permettre une modification simple des
+                messages pré-traduits.
             </para>
         </note>
 
         <note>
-            <title>Supported languages</title>
+            <title>Langues supportées</title>
 
             <para>
-                This feature is very young, so the amount of supported languages may not be
-                complete. New languages will be added with each release. Additionally feel free to
-                use the existing resource files to make your own translations.
+                Cette caractéristique de pré-traduction est jeune, donc le nombre de langues supportées peut
+                ne pas être complet. De nouvelles langues seront ajoutées dans les sorties futures.
             </para>
 
             <para>
-                You could also use these resource files to rewrite existing translations. So you
-                are not in need to create these files manually yourself.
+                Vous pouvez aussi partir de ces fichiers pré-traduits pour créer vos propres traductions,
+                par exemple.
             </para>
         </note>
     </sect2>
@@ -138,7 +139,7 @@ Zend_Validate::setMessageLength(100);
 ]]></programlisting>
 
         <note>
-            <title>Où ce paramètre est-il utilisé&#160;?</title>
+            <title>Où ce paramètre est-il utilisé ?</title>
 
             <para>
                 La taille des messages affecte aussi les messages personnalisés enregistrés, dès

+ 15 - 0
documentation/manual/fr/tutorials/quickstart-conclusion.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="learning.quickstart.conclusion">
+    <title>Félicitations!</title>
+
+    <para>
+        Vous venez de construire une application très simple en utilisant la plupart des composants
+        du Zend Framework. Zend Framework se compose de plein de composants très utiles pour le
+        développement web, comme les services webs, la recherches, la gestions des <acronym>PDF</acronym>
+        , l'authentication et les listes d'autorisation, etc.
+        Le <link linkend="reference">Guide de référence</link> possède plein d'informations sur les
+        composants que vous avez utilisé dans le guide de démarrage (QuickStart) et sur les autres composants
+        aussi. Nous espérons que vous trouverez le Zend Framework utile et plus important encore - fun!
+    </para>
+</sect1>

+ 184 - 0
documentation/manual/fr/tutorials/quickstart-create-form.xml

@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="learning.quickstart.create-form">
+    <title>Créer un formulaire</title>
+
+    <para>
+        Pour que notre livre d'or soit utile, nous allons avoir besoin d'un formulaire permettant de
+        le remplir.
+    </para>
+
+    <para>
+        Nous devons donc créer un formulaire. Pour créer un formulaire vierge, exécutez la commande:
+    </para>
+
+    <programlisting language="shell"><![CDATA[
+% zf create form Guestbook
+Creating a form at application/forms/Guestbook.php
+Updating project profile '.zfproject.xml'
+]]></programlisting>
+
+    <para>
+        Ceci créera le dossier <filename>application/forms/</filename> avec un fichier de classe
+        <filename>Guestbook.php</filename>. Ouvrez ce fichier et mettez le à jour comme suit:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// application/forms/Guestbook.php
+
+class Application_Form_Guestbook extends Zend_Form
+{
+    public function init()
+    {
+        // La méthode HTTP d'envoi du formulaire
+        $this->setMethod('post');
+
+        // Un élément Email
+        $this->addElement('text', 'email', array(
+            'label'      => 'Your email address:',
+            'required'   => true,
+            'filters'    => array('StringTrim'),
+            'validators' => array(
+                'EmailAddress',
+            )
+        ));
+
+        // Un élément pour le commentaire
+        $this->addElement('textarea', 'comment', array(
+            'label'      => 'Please Comment:',
+            'required'   => true,
+            'validators' => array(
+                array('validator' => 'StringLength', 'options' => array(0, 20))
+                )
+        ));
+
+        // Un captcha
+        $this->addElement('captcha', 'captcha', array(
+            'label'      => 'Please enter the 5 letters displayed below:',
+            'required'   => true,
+            'captcha'    => array(
+                'captcha' => 'Figlet',
+                'wordLen' => 5,
+                'timeout' => 300
+            )
+        ));
+
+        // Un bouton d'envoi
+        $this->addElement('submit', 'submit', array(
+            'ignore'   => true,
+            'label'    => 'Sign Guestbook',
+        ));
+
+        // Et une protection anti CSRF
+        $this->addElement('hash', 'csrf', array(
+            'ignore' => true,
+        ));
+    }
+}
+]]></programlisting>
+
+    <para>
+        Le formulaire ci-dessus définit cinq éléments: une adresse email, un champ commentaire, un
+        <acronym>CAPTCHA</acronym> anti spam, un bouton d'envoi et une protection anti
+        <acronym>CSRF</acronym>.
+    </para>
+
+    <para>
+        Maintenant nous allons ajouter une action <methodname>signAction()</methodname> à notre
+        <classname>GuestbookController</classname> qui va s'occuper de la soumission du formulaire. Pour
+        créer cette action et son script de vue, éxécutez:
+    </para>
+
+    <programlisting language="shell"><![CDATA[
+% zf create action sign Guestbook
+Creating an action named sign inside controller
+    at application/controllers/GuestbookController.php
+Updating project profile '.zfproject.xml'
+Creating a view script for the sign action method
+    at application/views/scripts/guestbook/sign.phtml
+Updating project profile '.zfproject.xml'
+]]></programlisting>
+
+    <para>
+        Comme vous le voyez d'après l'affichage, ceci va créer une méthode <methodname>signAction()</methodname>
+        dans notre contrôleur, ainsi que le script de vue approprié.
+    </para>
+
+    <para>
+        Ajoutons de la logique dans notre action. Nous devons d'abord vérifier le type de requête HTTP
+        <acronym>POST</acronym> ou <acronym>GET</acronym>; dans ce dernier cas nous affichons simplement
+        le formulaire. Cependant, si nous possédons une requête <acronym>POST</acronym>, nous allons vouloir
+        valider le formulaire par rapport aux données postées, et s'il est valide, créer une nouvelle entrée
+        et la sauvegarder. La logique ressemble à ceci:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// application/controllers/GuestbookController.php
+
+class GuestbookController extends Zend_Controller_Action
+{
+    // indexAction() ici ...
+
+    public function signAction()
+    {
+        $request = $this->getRequest();
+        $form    = new Application_Form_Guestbook();
+
+        if ($this->getRequest()->isPost()) {
+            if ($form->isValid($request->getPost())) {
+                $comment = new Application_Model_Guestbook($form->getValues());
+                $mapper  = new Application_Model_GuestbookMapper();
+                $mapper->save($comment);
+                return $this->_helper->redirector('index');
+            }
+        }
+
+        $this->view->form = $form;
+    }
+}
+]]></programlisting>
+
+    <para>
+        Bien sur, nous devons aussi éditer le script de vue. Editez
+        <filename>application/views/scripts/guestbook/sign.phtml</filename> avec ceci:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+<!-- application/views/scripts/guestbook/sign.phtml -->
+
+Utilisez le formulaire ci-après pour signer notre livre d'or!
+
+<?php
+$this->form->setAction($this->url());
+echo $this->form;
+]]></programlisting>
+
+    <note>
+        <title>Améliorer le rendu visuel du formulaire</title>
+
+        <para>
+            Ce formulaire n'a pas un look terrible, peu importe : l'apparence d'un formulaire est entièrement
+            personnalisable! Voyez la <link
+                linkend="zend.form.decorators">section sur les décorateurs dans le guide de réference</link>
+            pour plus de détails.
+        </para>
+
+        <para>
+            Aussi, vous pouvez être intéréssés par <link
+                linkend="learning.form.decorators.intro">notre tutoriel sur les décorateurs de formulaires</link>.
+        </para>
+    </note>
+
+    <note>
+        <title>Checkpoint</title>
+
+        <para>
+            Naviguez maintenant sur "http://localhost/guestbook/sign". Vous devriez voir ceci dans votre navigateur:
+        </para>
+
+        <para>
+            <inlinegraphic width="421" scale="100" align="center" valign="middle"
+                fileref="figures/learning.quickstart.create-form.png" format="PNG" />
+        </para>
+    </note>
+</sect1>

+ 222 - 0
documentation/manual/fr/tutorials/quickstart-create-layout.xml

@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="learning.quickstart.create-layout">
+    <title>Créer une layout</title>
+
+    <para>
+        Vous avez remarqué que les scripts de vue dans les sections précédentes étaient des fragments de
+        <acronym>HTML</acronym>, pas des pages complètes. C'est le design: nous voulons que nos actions
+        retournent du contenu uniquement relatif à elles mêmes et non de l'application en général.
+    </para>
+
+    <para>
+        Maintenant nous devons introduire le contenu généré dans une page entière <acronym>HTML</acronym>.
+        Nous utiliserons une layout globale pour tout le site dans ce but.
+    </para>
+
+    <para>
+        Il y a deux designs pattern que le Zend Framework utilise pour les layouts: <ulink
+            url="http://martinfowler.com/eaaCatalog/twoStepView.html">Two Step View</ulink> et
+        <ulink
+            url="http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html">Composite
+            View</ulink>. <emphasis>Two Step View</emphasis> est souvent associé au pattern <ulink
+            url="http://www.martinfowler.com/eaaCatalog/transformView.html">Transform View</ulink>
+        l'idée de base est que les vues de l'application créent une représentation qui est ensuite injectée dans
+        une vue plus globale. Le pattern <emphasis>Composite
+            View</emphasis> traite avec une vue fabriquée à partir de plusieurs vues applicatives.
+    </para>
+
+    <para>
+        Dans Zend Framework, <link linkend="zend.layout">Zend_Layout</link> combine les idées de ces patterns.
+        Plutot que chaque vue inclut tout le design, chacune ne contient que ses propres données.
+    </para>
+
+    <para>
+        Par contre vous pourriez avoir besoin occasionnelement d'informations globales dans la vue
+        générale. Heureusement, le Zend Framework propose une variété de conteneurs appelés
+        <emphasis>placeholders</emphasis> pour permettre de stocker de telles informations depuis les
+        scripts de vue des actions.
+    </para>
+
+    <para>
+        Pour démarrer avec <classname>Zend_Layout</classname>, nous devons d'abord informer le bootstrap
+        de l'objet <classname>Layout</classname> (resource). On peut activer cela au moyen de la commande
+        <command>zf enable layout</command>:
+    </para>
+
+    <programlisting language="shell"><![CDATA[
+% zf enable layout
+Layouts have been enabled, and a default layout created at
+application/layouts/scripts/layout.phtml
+A layout entry has been added to the application config file.
+]]></programlisting>
+
+    <para>
+        Comme le suggère la commande,
+        <filename>application/configs/application.ini</filename> est mis à jour et contient maintenant les
+        informations suivantes dans la section <constant>production</constant>:
+    </para>
+
+    <programlisting language="ini"><![CDATA[
+; application/configs/application.ini
+
+; Add to [production] section:
+resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
+]]></programlisting>
+
+    <para>
+        Le fichier <acronym>INI</acronym> final devrait ressembler à ceci:
+    </para>
+
+    <programlisting language="ini"><![CDATA[
+; application/configs/application.ini
+
+[production]
+; PHP settings we want to initialize
+phpSettings.display_startup_errors = 0
+phpSettings.display_errors = 0
+includePaths.library = APPLICATION_PATH "/../library"
+bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
+bootstrap.class = "Bootstrap"
+appnamespace = "Application"
+resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
+resources.frontController.params.displayExceptions = 0
+resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
+
+[staging : production]
+
+[testing : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+
+[development : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+]]></programlisting>
+
+    <para>
+        Cette directive indique à l'application de chercher les scripts de layout dans
+        <filename>application/layouts/scripts</filename>. Si vous examinez votre structure de repertoires,
+        vous verrez que ce dossier a été crée pour vous, avec le fichier <filename>layout.phtml</filename>.
+    </para>
+
+    <para>
+        Nous voulons aussi nous assurer que nous avons une déclaration de DocType XHTML pour notre
+        application. Pour activer cela, nous devons ajouter une ressource à notre bootstrap.
+    </para>
+
+    <para>
+        La manière la plus simple d'ajouter une ressource au bootstrap est de définir une méthode protégée
+        qui commence par <methodname>_init</methodname>. Dans notre cas, nous voulons initialiser le
+        doctype et donc nous créons une méthode <methodname>_initDoctype()</methodname>:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// application/Bootstrap.php
+
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    protected function _initDoctype()
+    {
+    }
+}
+]]></programlisting>
+
+    <para>
+        Dans cette méthode, nous devons renseigner la vue au sujet du doctype. Mais d'où va provenir notre
+        objet de vue ? La solution simple consiste à initialiser la ressource <classname>View</classname>
+        et la récupérer dans la méthode de bootstrap pour l'utiliser.
+    </para>
+
+    <para>
+        Pour initialiser la vue, ajoutez la ligne suivante dans le fichier
+        <filename>application/configs/application.ini</filename>, dans la section
+        <constant>production</constant>:
+    </para>
+
+    <programlisting language="ini"><![CDATA[
+; application/configs/application.ini
+
+; Add to [production] section:
+resources.view[] =
+]]></programlisting>
+
+    <para>
+        Ceci indique de charger la vue avec aucune option (les '[]' indiquent que la clé "view" est un tableau
+        et nous ne lui passons rien du tout).
+    </para>
+
+    <para>
+        Maintenant que nous possédons une vue, retournons à notre méthode <methodname>_initDoctype()</methodname>.
+        Dedans, nous allons d'abord nous assurer que la ressource <classname>View</classname> existe, puis nous la
+        récupèrerons et la configurerons:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// application/Bootstrap.php
+
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    protected function _initDoctype()
+    {
+        $this->bootstrap('view');
+        $view = $this->getResource('view');
+        $view->doctype('XHTML1_STRICT');
+    }
+}
+]]></programlisting>
+
+    <para>
+        Maintenant que <classname>Zend_Layout</classname> est initialisé et que le Doctype est réglé, créons notre
+        vue globale de layout:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+<!-- application/layouts/scripts/layout.phtml -->
+<?php echo $this->doctype() ?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>Zend Framework Quickstart Application</title>
+  <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
+</head>
+<body>
+<div id="header" style="background-color: #EEEEEE; height: 30px;">
+    <div id="header-logo" style="float: left">
+        <b>ZF Quickstart Application</b>
+    </div>
+    <div id="header-navigation" style="float: right">
+        <a href="<?php echo $this->url(
+            array('controller'=>'guestbook'),
+            'default',
+            true) ?>">Guestbook</a>
+    </div>
+</div>
+
+<?php echo $this->layout()->content ?>
+
+</body>
+</html>
+]]></programlisting>
+
+    <para>
+        Nous récupérons le contenu de l'application au moyen de l'aide de vue <methodname>layout()</methodname>
+        et nous accédons à la clé "content". Vous pouvez utiliser d'autres segments de l'objet de réponse, mais dans
+        la plupart des cas ce n'est pas nécessaire.
+    </para>
+
+    <para>
+        Notez aussi l'utilisation du placeholer <methodname>headLink()</methodname>. C'est un moyen simple de
+        générer du <acronym>HTML</acronym> pour les éléments &lt;link&gt; et ca permet de les garder sous le
+        coude au travers de l'application. Si vous devez ajouter des feuilles CSS c'est aussi possible.
+    </para>
+
+    <note>
+        <title>Checkpoint</title>
+
+        <para>
+            Allez maintenant sur "http://localhost" et regarder le code source rendu. Vous devriez voir un en-tête
+            XHTML, head, title, et body.
+        </para>
+    </note>
+</sect1>

+ 114 - 0
documentation/manual/fr/tutorials/quickstart-intro-mvc.xml

@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="learning.quickstart.intro">
+    <title>Zend Framework &amp; Introduction MVC</title>
+
+    <sect2 id="learning.quickstart.intro.zf">
+        <title>Zend Framework</title>
+
+        <para>
+            Zend Framework est un cadre de travail open source orienté objets pour des applications web
+            basées sur <acronym>PHP</acronym> 5. Zend Framework est souvent appelé une 'bibliothèque
+            de composants' car ses composants sont faiblement couplés et vous pouvez les utiliser de
+            manière plus ou moins indépendante. Mais Zend Framework propose aussi une solution
+            avancée Model-View-Controller (<acronym>MVC</acronym>) qui peut être utilisée pour monter
+            des structures de base pour vos applications. Une liste complète des composants de
+            Zend Framework avec une brève description peut être trouvée dans <ulink
+                url="http://framework.zend.com/about/components">l'aperçu des composants</ulink>.Ce
+            guide de démarrage montre les composants les plus utilisés dans Zend Framework, comme
+            <classname>Zend_Controller</classname>, <classname>Zend_Layout</classname>,
+            <classname>Zend_Config</classname>, <classname>Zend_Db</classname>,
+            <classname>Zend_Db_Table</classname>, <classname>Zend_Registry</classname>, ainsi que
+            quelques aides de vue.
+        </para>
+
+        <para>
+            En utilisant ces composants nous allons construire un livre d'or reposant sur une base de
+            données, simple, en quelques minutes. Le code source complet pour cette application est
+            disponible dans les formats suivants:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <ulink
+                        url="http://framework.zend.com/demos/ZendFrameworkQuickstart.zip">zip</ulink>
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <ulink
+                        url="http://framework.zend.com/demos/ZendFrameworkQuickstart.tar.gz">tar.gz</ulink>
+                </para>
+            </listitem>
+        </itemizedlist>
+    </sect2>
+
+    <sect2 id="learning.quickstart.intro.mvc">
+        <title>Model-View-Controller</title>
+
+        <para>
+            Qu'est ce que <acronym>MVC</acronym> dont tout le monde parle et pourquoi se pencher dessus?
+            <acronym>MVC</acronym> est bien plus qu'un acronyme de trois lettres (<acronym>TLA</acronym>)
+            que vous pouvez sortir pour faire "élégant"; c'est devenu un standard de conception des
+            applications webs modernes, cecipour de bonnes raisons. La plupart du code des application se
+            retrouvent dans une de ces catégories : présentation, logique métier, accès aux données.
+            Le pattern <acronym>MVC</acronym> modélise cette séparation à merveille. Le résultat final est
+            qu'un code de présentation peut être travaillé à un endroit de l'application alors que la
+            logique métier et l'accès aux données le sont à d'autres endroits. La plupart des développeurs
+            ont trouvé cette séparation indispensable pour maintenir le code global organisé, particulièrement
+            lorsque plusieurs développeurs travaillent ensemble sur la même application.
+        </para>
+
+        <note>
+            <title>Plus d'informations</title>
+
+            <para>
+                Cassons le pattern pour voir les pièces individuellement:
+            </para>
+
+            <para>
+                <inlinegraphic width="321" scale="100" align="center" valign="middle"
+                    fileref="figures/learning.quickstart.intro.mvc.png" format="PNG" />
+            </para>
+
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        <emphasis>Model</emphasis> - C'est la partie qui définit la fonctionnalité
+                        de base de l'application derrière des abstractions. L'accès aux données
+                        et la logique métier sont définis dans cette couche.
+                    </para>
+                </listitem>
+
+                <listitem>
+                    <para>
+                        <emphasis>View</emphasis> - La vue définit exactement ce qui sera présenté à
+                        l'utilisateur. Normalement les contrôleurs passent des données à chaque vue
+                        à rendre dans un format précis. Les vues collectent les données de l'utilisateur
+                        aussi. Ici vous trouverez principalement du <acronym>HTML</acronym>.
+                    </para>
+                </listitem>
+
+                <listitem>
+                    <para>
+                        <emphasis>Controller</emphasis> - Les contrôleurs sont la colle qui lie tout.
+                        Ils manipulent les modèles, décident de la vue à rendre en fonction de la
+                        requête utilisateur et d'autres facteurs, passent les données dont chaque vue
+                        a besoin et passent éventuellement la main à un autre contrôleur. La plupart des
+                        experts <acronym>MVC</acronym> experts recommandent <ulink
+                            url="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model">de garder
+                            les contrôleurs les plus simples et petits possibles</ulink>.
+                    </para>
+                </listitem>
+            </itemizedlist>
+
+            <para>
+                Bien sûr <ulink url="http://ootips.org/mvc-pattern.html">on pourrait en dire plus
+                </ulink> sur ce pattern critique, mais nous avons là suffisament d'informations pour
+                comprendre l'application de livre d'or que nous allons construire.
+            </para>
+        </note>
+    </sect2>
+</sect1>

+ 242 - 0
documentation/manual/fr/tutorials/view-placeholders-basics.xml

@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="learning.view.placeholders.basics">
+    <title>Utilisation de base des Placeholders</title>
+
+    <para>
+        Zend Framework définit une aide de vue générique <methodname>placeholder()</methodname> que vous
+        pouvez utiliser pour créer vos placeholders("conteneurs") personnalisés. Il propose aussi une variété de
+        placeholders pour des fonctionnalités très demandées comme préciser un
+        <emphasis>DocType</emphasis>, le titre d'une page, etc.
+    </para>
+
+    <para>
+        Tous les placeholders agissent de la même manière. Ce sont des conteneurs, et donc vous pouvez les
+        manipuler comme des collections. Vous pouvez ainsi:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                <emphasis>Ajouter(append)</emphasis> ou <emphasis>préfixer(prepend)</emphasis> des entités dans la collectio.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>Remplacer(replace)</emphasis> toute la collection avec une seule valeur.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Spécifier une chaine utilisée pour <emphasis>préfixer le contenu</emphasis> de la collection lors de son rendu.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Spécifier une chaine utilisée pour <emphasis>ajouter le contenu</emphasis> de la collection lors de son rendu.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Spécifier une chaine utilisée pour <emphasis>séparer du contenu</emphasis> de la collection lors de son rendu.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>Capturer du contenu</emphasis> dans la collection.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>Rendre</emphasis> le contenu agrégé.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        Typiquement, vous appelerez cette aide de vue sans argument, ce qui retournera le conteneur sur
+        lequel opérer. Après vous afficherez (echo) ce contenu ou appelerez une méthode dessus pour le
+        remplir ou le configurer. Si le conteneur est vide, son rendu sera une simple chaine vide, sinon,
+        le contenu sera aggrégé en fonction des règles que vous avez fixées.
+    </para>
+
+    <para>
+        Par exemple, créons une barre de menu qui contient des "blocs" de contenu. Supposons que la structure
+        de chaque bloc ressemble à ceci:
+    </para>
+
+    <programlisting language="html"><![CDATA[
+<div class="sidebar">
+    <div class="block">
+        <p>
+            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus
+            consectetur aliquet odio ac consectetur. Nulla quis eleifend
+            tortor. Pellentesque varius, odio quis bibendum consequat, diam
+            lectus porttitor quam, et aliquet mauris orci eu augue.
+        </p>
+    </div>
+    <div class="block">
+        <ul>
+            <li><a href="/some/target">Link</a></li>
+            <li><a href="/some/target">Link</a></li>
+        </ul>
+    </div>
+</div>
+]]></programlisting>
+
+    <para>
+        Le contenu variera en fonction du contrôleur et de l'action, mais la structure est identique, elle.
+        Configurons en premier lieu la barre de menu dans une méthode du bootstrap:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    // ...
+
+    protected function _initSidebar()
+    {
+        $this->bootstrap('View');
+        $view = $this->getResource('View');
+
+        $view->placeholder('sidebar')
+             // "prefix" -> contenu à afficher une fois avant les données dans la collection
+             ->setPrefix("<div class=\"sidebar\">\n    <div class=\"block\">\n")
+             // "separator" -> contenu à afficher entre chaque entité de la collection
+             ->setSeparator("</div>\n    <div class=\"block\">\n")
+             // "postfix" -> contenu à afficher une fois après les données dans la collection
+             ->setPostfix("</div>\n</div>");
+    }
+
+    // ...
+}
+]]></programlisting>
+
+    <para>
+        Le code ci-dessus définit un placeholder, "sidebar", qui n'a pas d'entité. Ce code configure la structure de base
+        du placeholder, selon nos désirs.
+    </para>
+
+    <para>
+        Maintenant supposons que pour toutes les actions du contrôleur "user" nous voulons un bloc en haut qui contienne
+        des informations. Nous pouvons faire cela de deux manières: (a) nous pourrions ajouter le contenu au
+        placeholder directement dans la méthode <methodname>preDispatch()</methodname> du contrôleur, ou (b) nous pourrions
+        rendre un script de vue depuis la méthode <methodname>preDispatch()</methodname>. Nous utiliserons le cas (b),
+        car il propose une séparation propre des logiques en laissant la vue classique contenir ses données utiles.
+    </para>
+
+    <para>
+        Nous appelerons le script de vue "<filename>user/_sidebar.phtml</filename>", et nous le remplirons comme ceci:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+<?php $this->placeholder('sidebar')->captureStart() ?>
+<h4>User Administration</h4>
+<ul>
+    <li><a href="<?php $this->url(array('action' => 'list')) ?>">
+        List</a></li>
+    <li><a href="<?php $this->url(array('action' => 'create')) ?>">
+        Create</a></a></li>
+</ul>
+<?php $this->placeholder('sidebar')->captureEnd() ?>
+]]></programlisting>
+
+    <para>
+        L'exemple ci-dessus utilise les possibilités de capture dynamique de contenu des placeholders. Par défaut, le contenu
+        est ajouté à la suite ce qui permet d'en agréger. Cette exemple utilise des aides de vues et du contenu
+        <acronym>HTML</acronym> statique pour générer un menu qui est capturé et ajouté au placeholder.
+    </para>
+
+    <para>
+        Pour utiliser le script de vue, nous écrirons ceci dans la méthode <methodname>preDispatch()</methodname>:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+class UserController extends Zend_Controller_Action
+{
+    // ...
+
+    public function preDispatch()
+    {
+        // ...
+
+        $this->view->render('user/_sidebar.phtml');
+
+        // ...
+    }
+
+    // ...
+}
+]]></programlisting>
+
+    <para>
+        Notez que nous ne capturons pas le rendu, il n'y a pas besoin car le contenu complet de ce script de
+        vue est déja capturé dans un placeholder.
+    </para>
+
+    <para>
+        Maintenant imaginons que l'action "view" dans ce même contrôleur ait besoin de présenter des informations. Dans
+        "<filename>user/view.phtml</filename>" il pourrait y avoir ceci:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$this->placeholder('sidebar')
+     ->append('<p>User: ' . $this->escape($this->username) .  '</p>');
+]]></programlisting>
+
+    <para>
+        Cet exemple utilise la méthode <methodname>append()</methodname> et lui passe du contenu à agréger.
+    </para>
+
+    <para>
+        Enfin, modifions le script de layout pour rendre le placeholder.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+<html>
+<head>
+    <title>My Site</title>
+</head>
+<body>
+    <div class="content">
+        <?php echo $this->layout()->content ?>
+    </div>
+    <?php echo $this->placeholder('sidebar') ?>
+</body>
+</html>
+]]></programlisting>
+
+    <para>
+        Pour les contrôleurs et les actions que ne remplissent pas le placeholder "sidebar", aucun contenu ne sera
+        rendu; cependant afficher le placeholder rendra le contenu "fixe" suivant les règles définies dans le
+        bootstrap ainsi que le contenu aggrégé dans l'application. Dans le cas de l'action "<filename>/user/view</filename>",
+        en supposant que le nom de l'utilisateur est "matthew", nous pouvons récupérer le contenu de la barre de menu comme
+        ceci (formaté pour la lisibilité de l'exemple):
+    </para>
+
+    <programlisting language="html"><![CDATA[
+<div class="sidebar">
+    <div class="block">
+        <h4>User Administration</h4>
+        <ul>
+            <li><a href="/user/list">List</a></li>
+            <li><a href="/user/create">Create</a></a></li>
+        </ul>
+    </div>
+    <div class="block">
+        <p>User: matthew</p>
+    </div>
+</div>
+]]></programlisting>
+
+    <para>
+        Les possibilités sont immenses en ce qui concerne les placeholders et les layouts, essayez les et lisez les<link
+            linkend="zend.view.helpers.initial.placeholder">sections relatives du manuel</link> pour plus d'informations.
+    </para>
+</sect1>

+ 40 - 0
documentation/manual/fr/tutorials/view-placeholders-intro.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="learning.view.placeholders.intro">
+    <title>Introduction</title>
+
+    <para>
+        Dans <link linkend="learning.layout">le chapitre précédent</link>, nous avons abordé le pattern
+        Two Step View, qui permet d'encapsuler des vues individuelles dans un layout plus global. A la fin
+        du chapitre, cependant, nous avons parlé de certaines limites:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                Comment changer le titre de la page?
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Comment injecter conditionnelement des scripts ou des feuilles de style dans le layout?
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Comment créer et rendre une barre de navigation optionnelle? Que se passe-t-il si la barre
+                doit contenir conditionnelement du contenu ?
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        Ces questions sont traitées dans le pattern <ulink
+            url="http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html">Composite
+        View</ulink>. Une approche de ce pattern est de proposer du contenu pour la layout globale. Dans
+        Zend Framework, ce mécanisme est implémenté au travers d'aides de vue spéciales appelées
+        "placeholders." Les placeholders permettent d'agréger du contenu et de le rendre ailleurs.
+    </para>
+</sect1>