<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title type="text">LyRiX Blog, tutos sur le Zend Framework, php et autre techno Web</title>
    <subtitle type="html">et bien d'autre choses encore</subtitle>
    
    <link href="http://blog.lyrixx.info/" />
        <id>http://blog.lyrixx.info/</id>
            <updated>2013-04-12T00:00:00+02:00</updated>
            <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/lyrixblog" /><feedburner:info uri="lyrixblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>47.386055</geo:lat><geo:long>0.694857</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><logo>http://blog.lyrixx.info/favicon.ico</logo><feedburner:emailServiceId>lyrixblog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
        <title>Symfony2: How to mock services during functional tests</title>
                <id>http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html</id>
                <updated>2013-04-12T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/4ROB0TV70Pg/symfony2-how-to-mock-services-during-functional-tests.html" />
        <content type="html" xml:lang="en">&lt;p&gt;When you are working with web-service and you want to add some tests, you have
two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the real service&lt;/li&gt;
&lt;li&gt;Mock the service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first one has some advantages: If the web-service change, your tests will
fail. And it has some inconvenience: If the web-service is momently down, your
tests fail.&lt;/p&gt;

&lt;p&gt;But sometime, you really want to mock these services to perform some extra
tests, such as emulate a service down, etc...&lt;/p&gt;

&lt;p&gt;With Symfony2 you have some options to mock a web-service.&lt;/p&gt;

&lt;p&gt;The first one is to use a mock class for &lt;code&gt;test&lt;/code&gt; environment. Here, we assume you
have created a Symfony2 service (think DIC) to wrap the web-service.&lt;/p&gt;

&lt;p&gt;The first
option is to change the service through the configuration in
&lt;code&gt;app/config/config_test.yml&lt;/code&gt;. So you may have something like this in your
&lt;code&gt;src/MyBundle/Resources/config/services.xml&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;parameters&amp;gt;
    &amp;lt;parameter key="my_bundle.twitter.class"&amp;gt;Twitter&amp;lt;/parameter&amp;gt;
&amp;lt;/parameters&amp;gt;

&amp;lt;services&amp;gt;
    &amp;lt;service id="my_bundle.twitter" class="%my_bundle.twitter.class%"&amp;gt;
    &amp;lt;/service&amp;gt;
&amp;lt;services&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and so the &lt;code&gt;config_test.yml&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;parameters:
    my_bundle.twitter.class: TwitterMock
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This option is not very flexible because we can emulate a service down, ...&lt;/p&gt;

&lt;p&gt;So the second option is to replace the service by a &lt;code&gt;phpunit&lt;/code&gt; mock. To do that,
we have to change during the runtime a Symfony2 service. But this is not so
easy, because symfony will shutdown and re-boot your kernel between each
request (&lt;a href="https://github.com/symfony/symfony/blob/3196dbdf528ab62c304b72b3208f8d03f7247203/src/Symfony/Bundle/FrameworkBundle/Client.php#L94-L102"&gt;see here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;So the idea is to override the Kernel to allow the developer to execute some
code after the &lt;code&gt;boot&lt;/code&gt; call. So we start to create a new kernel:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php

// app/AppTestKernel.php

require_once __DIR__.'/AppKernel.php';

class AppTestKernel extends AppKernel
{
    private $kernelModifier = null;

    public function boot()
    {
        parent::boot();

        if ($kernelModifier = $this-&amp;gt;kernelModifier) {
            $kernelModifier($this);
            $this-&amp;gt;kernelModifier = null;
        };
    }

    public function setKernelModifier(\Closure $kernelModifier)
    {
        $this-&amp;gt;kernelModifier = $kernelModifier;

        // We force the kernel to shutdown to be sure the next request will boot it
        $this-&amp;gt;shutdown();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And now, we can alter the kernel during the test:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class TwitterTest extends WebTestCase
{
    public function testTwitter()
    {
        $twitter = $this-&amp;gt;getMock('Twitter');
        // Configure your mock here.
        static::$kernel-&amp;gt;setKernelModifier(function($kernel) use ($twitter) {
            $kernel-&amp;gt;getContainer()-&amp;gt;set('my_bundle.twitter', $twitter);
        });

        $this-&amp;gt;client-&amp;gt;request('GET', '/fetch/twitter'));

        $this-&amp;gt;assertSame(200, $this-&amp;gt;client-&amp;gt;getResponse()-&amp;gt;getStatusCode());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And thats it ;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/4ROB0TV70Pg" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html</feedburner:origLink></entry>
        <entry>
        <title>What my sismo configuration looks like?</title>
                <id>http://blog.lyrixx.info/2013/02/07/what-is-look-like-my-sismo-config.html</id>
                <updated>2013-02-07T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/3hSS2Ek3Sj8/what-is-look-like-my-sismo-config.html" />
        <content type="html" xml:lang="en">&lt;p&gt;&lt;a href="http://sismo.sensiolabs.org/"&gt;Sismo&lt;/a&gt; is a Continuous Testing Server written in
PHP. I build all projects I'm working on with it.&lt;/p&gt;

&lt;p&gt;It's very fast to set up a newproject, but it's a little but boring. So I want
to share my &lt;code&gt;~/.sismo/config.php&lt;/code&gt; and a little script to set-up a new project.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php

// ~/.sismo/config.php

Sismo\Project::setDefaultCommand('if [ -f composer.json ]; then composer install --dev; fi &amp;amp;&amp;amp; phpunit');

$notifier = new Sismo\Notifier\DBusNotifier();

$sfCommand = &amp;lt;&amp;lt;&amp;lt;'EOL'
cp app/config/parameters.yml-dist app/config/parameters.yml

sed -i -e "s/database_user:.*/database_user: greg/" app/config/parameters.yml
sed -i -e "s/database_password:.*/database_password: ~/" app/config/parameters.yml

./bin/run-tests.sh
EOL;

$projects = array(
    (new Sismo\Project(ucfirst('monolog'), '/home/greg/dev/labs/monolog', $notifier)),
    (new Sismo\Project('Project FOO', '/home/greg/dev/project/foo', $notifier))-&amp;gt;setCommand($sfCommand),
    // ...
);

return $projects;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then the little script to set up the &lt;strong&gt;post commit hook&lt;/strong&gt; and &lt;code&gt;config.php&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put this command in your &lt;code&gt;$PATH&lt;/code&gt; (like &lt;code&gt;/usr/local/bin/sismo-add&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Adapt the &lt;code&gt;SISMO_PATH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Then call it from a git project that you want to test with sismo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The script:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash

SISMO_PATH=$HOME/dev/labs/sismo/sismo

#/usr/local/bin/sismo-add

######################################
# Do not change code after this line #
######################################

BASE_PATH=`pwd`
SLUG=`basename $BASE_PATH`

cat &amp;gt; $BASE_PATH/.git/hooks/post-commit &amp;lt;&amp;lt;EOL
#!/bin/bash

$SISMO_PATH build $SLUG \`git log -1 HEAD --pretty="%H"\` --force --quiet &amp;amp;
EOL

chmod +x $BASE_PATH/.git/hooks/post-commit

SISMO_PROJECT="    (new Sismo\\\\Project(ucfirst('$SLUG'), '$BASE_PATH', \$notifier)),"

sed -ie "s#\(\$projects = array(\)#\1\n$SISMO_PROJECT#" $HOME/.sismo/config.php
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/3hSS2Ek3Sj8" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/2013/02/07/what-is-look-like-my-sismo-config.html</feedburner:origLink></entry>
        <entry>
        <title>How to open a file with sublime text from your browser</title>
                <id>http://blog.lyrixx.info/2013/02/05/how-to-open-a-file-with-sublime-text-from-your-browser.html</id>
                <updated>2013-02-05T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/sZG01QWuebM/how-to-open-a-file-with-sublime-text-from-your-browser.html" />
        <content type="html" xml:lang="en">&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This work only with ubuntu.&lt;/p&gt;

&lt;h2&gt;Why?&lt;/h2&gt;

&lt;p&gt;If you are doing some &lt;strong&gt;php with sublime text 2&lt;/strong&gt;, this tips will enjoy your
day. You can configure your system (ubuntu, may be other other distro too) to
handle links like &lt;code&gt;subl:///tmp/file.txt?10&lt;/code&gt; to open the file &lt;code&gt;/tmp/file.txt&lt;/code&gt;
with sublime text 2 at the line &lt;code&gt;10&lt;/code&gt;. To do that, you have to register a new
&lt;strong&gt;protocol handler&lt;/strong&gt;, and to configure &lt;strong&gt;xdebug&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When did it happend ? When a fatal error or an exception is throwed by php:&lt;/p&gt;

&lt;p&gt;&lt;img src="../../../images/xdebug.png" alt="Xdebug" /&gt;&lt;/p&gt;

&lt;p&gt;With this tip &lt;code&gt;/opt/dotefiles/www/fail.php&lt;/code&gt; is clickable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you are using symfony2 all files in an exception page, or the web
developper toolbar will be clickable!!!&lt;/p&gt;

&lt;h2&gt;How?&lt;/h2&gt;

&lt;p&gt;Start by editing &lt;code&gt;~/.local/share/applications/mimeapps.list&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Added Associations]
# ...
x-scheme-handler/subl=subl-urlhandler.desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then create the file &lt;code&gt;/usr/share/applications/subl-urlhandler.desktop&lt;/code&gt;. (This is
a fake application):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Desktop Entry]
Version=1.0
Name=Sublime Text 2
Name[en_PH]=Sublime Text 2
Exec=xdebug-urlhandler %u
Icon=/opt/subl/Icon/48x48/sublime_text.png
Terminal=false
Type=Application
Categories=Development;
StartupNotify=true
MimeType=x-scheme-handler/subl;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then create the file &lt;code&gt;/usr/local/bin/xdebug-urlhandler&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash

url=$1
file=${url#subl*//}
path=`echo $file | cut -d? -f 1`
line=`echo $file | cut -d? -f 2`
sublime-text $path:$line
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/xdebug-urlhandler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And now you have to configure xdebug &lt;code&gt;/etc/php5/conf.d/90-my.ini&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[PHP]
xdebug.file_link_format=subl://%f?%l
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Thinks to restart &lt;code&gt;apache&lt;/code&gt; or &lt;code&gt;php-fpm&lt;/code&gt;. &lt;strong&gt;Enjoy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/svizion/3654834"&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/sZG01QWuebM" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/2013/02/05/how-to-open-a-file-with-sublime-text-from-your-browser.html</feedburner:origLink></entry>
        <entry>
        <title>Symfony2: How to debug your functionals tests</title>
                <id>http://blog.lyrixx.info/2013/02/03/symfony2-how-to-debug-your-functional-tests.html</id>
                <updated>2013-02-03T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/T-YIJaIlP9w/symfony2-how-to-debug-your-functional-tests.html" />
        <content type="html" xml:lang="en">&lt;p&gt;When you write functional tests with &lt;strong&gt;symfony2&lt;/strong&gt; and &lt;strong&gt;phpunit&lt;/strong&gt;, it could be
hard to debug them if an exception happened. You can try to &lt;code&gt;var_dump&lt;/code&gt; the
response, but since you ran tests from cli, the output is totally unreadable.&lt;/p&gt;

&lt;p&gt;So there is a very usefull way to view what happening. You should add
&lt;code&gt;echo $this-&amp;gt;client-&amp;gt;getReponse()-&amp;gt;getContent();die;&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;namespace MyBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class UserControllerTest extends WebTestCase
{
    public function testRegister()
    {
        $this-&amp;gt;client-&amp;gt;request('GET', '/register');

        echo $this-&amp;gt;client-&amp;gt;getReponse()-&amp;gt;getContent();die;// Just add this line

        // Perform some test
        // $this-&amp;gt;assertOk($this-&amp;gt;client);
        // ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then run your test:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;phpunit --filter testRegister path/to/the/test/UserControllerTest.php &amp;gt; web/debug.html
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And now, you can browse &lt;code&gt;http://yourpoject.localhost/debug.html&lt;/code&gt; with your favorite browser.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/T-YIJaIlP9w" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/2013/02/03/symfony2-how-to-debug-your-functional-tests.html</feedburner:origLink></entry>
        <entry>
        <title>Symfony2: Snippet to render all form errors</title>
                <id>http://blog.lyrixx.info/2013/01/31/symfony2-snippet-to-render-all-form-error.html</id>
                <updated>2013-01-31T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/RZmYR3y2FAw/symfony2-snippet-to-render-all-form-error.html" />
        <content type="html" xml:lang="en">&lt;p&gt;With symfony 2, you can render all errors from a form with a little macro. You
can use it for only one form, or for all your application&lt;/p&gt;

&lt;h3&gt;The macro&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;{# MyBundle:form.html.twig #}

{% macro display_error(form) %}
    {% import _self as forms %}
    &amp;lt;ul&amp;gt;
        {% for child in form if not child.vars.valid %}
            &amp;lt;li&amp;gt;
                {% if child.vars.compound and not child.vars.valid %}
                    {{ child.vars.label|trans|capitalize }}:
                    {{ forms.display_error(child) }}
                {% else %}
                    &amp;lt;h5&amp;gt;
                        &amp;lt;a href="#{{ child.vars.id }}"&amp;gt;
                            {{ child.vars.label|trans|capitalize }}:
                        &amp;lt;/a&amp;gt;
                        &amp;lt;small&amp;gt;
                            {% for error in child.vars.errors %}
                                {{ error.message|capitalize }}
                            {% endfor %}
                        &amp;lt;/small&amp;gt;
                    &amp;lt;/h5&amp;gt;
                {% endif %}
            &amp;lt;/li&amp;gt;
        {% endfor %}
    &amp;lt;/ul&amp;gt;
{% endmacro %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Usage&lt;/h3&gt;

&lt;h4&gt;Just for one form:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;{# MyBundle:User:new.html.twig #}

{% import "MyBundle:form.html.twig" as macros %}

{% if not form.vars.valid %}
    &amp;lt;!-- Wep, this is some twitter bootstrap markup --&amp;gt;
    &amp;lt;div class="alert alert-block alert-error"&amp;gt;
        &amp;lt;button type="button" class="close" data-dismiss="alert"&amp;gt;&amp;amp;times;&amp;lt;/button&amp;gt;
        &amp;lt;h3&amp;gt;Oh snap!&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Change a few things up and try submitting again.&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
        {{ macros.display_project_error(form) }}
    &amp;lt;/div&amp;gt;
{% endif %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;For all you application&lt;/h4&gt;

&lt;p&gt;Add the layout in your &lt;code&gt;config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;twig:
    form:
        resources:
            - MyBundle::form_div_layout.html.twig
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And override the &lt;code&gt;form_errors&lt;/code&gt; block:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{# form_div_layout.html.twig #}

{% block form_errors %}
{% spaceless %}
    {% import "MyBundle:form.html.twig" as macros %}
    {% if not form.parent and not form.vars.valid %}
         {% import _self as forms %}
        &amp;lt;div class="alert alert-block alert-error"&amp;gt;
            &amp;lt;button type="button" class="close" data-dismiss="alert"&amp;gt;&amp;amp;times;&amp;lt;/button&amp;gt;
            &amp;lt;h3&amp;gt;Oh snap!&amp;lt;/h3&amp;gt;
            &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Change a few things up and try submitting again.&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
            {{ macros.display_project_error(form) }}
        &amp;lt;/div&amp;gt;
    {% else %}
        {{ parent() }}
    {% endif %}
{% endspaceless %}
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/RZmYR3y2FAw" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/2013/01/31/symfony2-snippet-to-render-all-form-error.html</feedburner:origLink></entry>
        <entry>
        <title>Sublime text 2 et xdebug : liens cliquables sur les fichiers</title>
                <id>http://blog.lyrixx.info/web-dev/sublime-text-2-et-xdebug-liens-cliquables-sur-les-fichiers.html</id>
                <updated>2012-02-23T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/SgP_3K20S30/sublime-text-2-et-xdebug-liens-cliquables-sur-les-fichiers.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Salut,&lt;/p&gt;

&lt;p&gt;Si comme moi vous utilisez sublime text 2 pour développer, vous allez apprécier
ce petit tips. Par exemple quand vous avez une erreur 500 et / ou une fatal
erreur, xdebug vous affiche la backtrace avec le nom des fichiers. Grâce a ce
hacks, &lt;strong&gt;il est possible d’ouvrir directement dans sublimetext le fichier
correspondant&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Configuration de Xdebug :&lt;/h2&gt;

&lt;p&gt;dans le fichier xdebug.ini (ou directement dans php.ini) il faut ajouter la
ligne suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;xdebug.file_link_format=sblm://%f?%l
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Puis redémarrer apache ou php-fpm …&lt;/p&gt;

&lt;h2&gt;Configuration de sublime text&lt;/h2&gt;

&lt;p&gt;Il faut ajouter &lt;a href="https://bitbucket.org/sublimator/sublimeprotocol/src/"&gt;ce
package&lt;/a&gt; dans la liste
des packages. Il suffit de dézipper le contenue de l’archive dans le dossier
package de sublime text 2, disponssible via le menu « Preference &gt; Browse
Package »&lt;/p&gt;

&lt;p&gt;Et voila le tours est joué ;)&lt;/p&gt;

&lt;h2&gt;Attention&lt;/h2&gt;

&lt;p&gt;Cela ne marche pour l’instant que sur windows. Je pense que c’est assez
simple de faire la meme choses pour linux.&lt;/p&gt;

&lt;h2&gt;Source&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sublimetext.com/forum/viewtopic.php?f=4&amp;amp;t=116&amp;amp;start=10"&gt;Topic du forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.koch.ro/blog/index.php?/archives/77-Firefox,-VIM,-Xdebug-Jumping-to-the-error-line.html"&gt;Astuce pour VIM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/SgP_3K20S30" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/web-dev/sublime-text-2-et-xdebug-liens-cliquables-sur-les-fichiers.html</feedburner:origLink></entry>
        <entry>
        <title>Mysql + export + csv + groupy en gardant les colonnes groupées</title>
                <id>http://blog.lyrixx.info/web-dev/mysql-export-csv-groupy-en-gardant-les-colonnes-groupees.html</id>
                <updated>2012-02-01T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/_yzMM_8LsLQ/mysql-export-csv-groupy-en-gardant-les-colonnes-groupees.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Petit tips avec MySQL. Admettons que vous voulez faire un export en csv d’une
table (A). Dans ce cas, c’est facile, il suffit d’utiliser « INTO OUTFILE ». Par
contre, si vous avez une jointure (A -&gt; B), c’est plus compliqué.&lt;/p&gt;

&lt;p&gt;Il y a plusieurs solutions : soit on se retrouve avec plusieurs ligne de la
table A en double, puis à « droite » de ces lignes , les colonnes de la table B.&lt;/p&gt;

&lt;p&gt;Soit on utilise la fonction &lt;a href="dev.mysql.com/doc/refman/5.0/fr/group-by-functions.html#id441997"&gt;group_concat&lt;/a&gt;; et un petit hack ;)&lt;/p&gt;

&lt;p&gt;Exemple :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT c.id, c.first_name, c.last_name, GROUP_CONCAT(CONCAT(p.bar_code, '||', p.quantity, '||', p.date) SEPARATOR "||")
    FROM contact c
    LEFT JOIN product p on (c.id = p.contact_id)
    GROUP BY c.id
    INTO OUTFILE '/tmp/export.csv' FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On fait notre jointure normalement, on group by sur c.id, et c’est dans le
select qu’il y a une peu de magie. On va d’abord concaténer les attributs de la
table « product » avec comme séparateur deux pipes « || ». Et ensuite, on va
concaténer toutes les valeurs résultantes de la fonction GROUP BY.&lt;/p&gt;

&lt;p&gt;Enfin, il va falloir remplacer tous nos doubles pipes (&lt;code&gt;||&lt;/code&gt;) par &lt;code&gt;;&lt;/code&gt; qui
correspond a nos délimiteurs de champs.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sed -i 's/||/";"/g' /tmp/export.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et voila, vous avec un beau fichier CSV bien formaté ;) Ici le hack c’est de
remplacer un délimiteur un peu spécial « || » par un vrai délimiteur, a
posteriori.&lt;/p&gt;

&lt;p&gt;P.S. : Il se peut que mysql exporte le fichier csv avec l’utilisateur mysql.
Vous n’aurez donc pas les droits pour le lire et/ou le modifier. Il faut donc
passer en root ;).&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/_yzMM_8LsLQ" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/web-dev/mysql-export-csv-groupy-en-gardant-les-colonnes-groupees.html</feedburner:origLink></entry>
        <entry>
        <title>Silex Kitchen Edition</title>
                <id>http://blog.lyrixx.info/silex/silex-kitchen-edition.html</id>
                <updated>2011-10-24T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/BDUS3L5Nmo0/silex-kitchen-edition.html" />
        <content type="html" xml:lang="en">&lt;div class="pull-right"&gt;
    &lt;img src="../images/silex.png" alt="Silex"&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Silex est un micro-framework&lt;/strong&gt; (en php) basé sur les &lt;strong&gt;composants symfony2&lt;/strong&gt;.
Je vous invite à aller voir la
&lt;a href="http://silex.sensiolabs.org/documentation"&gt;documentation&lt;/a&gt;. Elle est déjà très
bien fournie.&lt;/p&gt;

&lt;p&gt;Cependant, si vous voulez débuter avec silex, je vous propose une édition avec
une achitecture déjà mise en place, qui respecte les bonnes pratiques. On y
retrouve les services suivants: &lt;strong&gt;sessions&lt;/strong&gt;, &lt;strong&gt;cache&lt;/strong&gt;, &lt;strong&gt;twig&lt;/strong&gt;, &lt;strong&gt;assetic&lt;/strong&gt;,
&lt;strong&gt;doctrine&lt;/strong&gt;, &lt;strong&gt;translation&lt;/strong&gt;, &lt;strong&gt;form&lt;/strong&gt;, &lt;strong&gt;test&lt;/strong&gt;. De plus, elle est
packagé avec &lt;strong&gt;&lt;a href="http://twitter.github.com/bootstrap/"&gt;twitter bootstrap&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Je vous invite à lire &lt;a href="http://lyrixx.github.com/Silex-Kitchen-Edition/"&gt;la doc&lt;/a&gt;
ou à la &lt;a href="https://github.com/lyrixx/Silex-Kitchen-Edition"&gt;télécharger sur github&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/BDUS3L5Nmo0" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/silex/silex-kitchen-edition.html</feedburner:origLink></entry>
        <entry>
        <title>Lister ses films</title>
                <id>http://blog.lyrixx.info/ubuntu/lister-ses-films.html</id>
                <updated>2011-06-05T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/k8FKzPgt2cI/lister-ses-films.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Un petit script bash (donc pour linux/mac) pour lister tous les films qui
peuvent trainer dans plusieurs répertoires et sous répertoires…&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget https://gist.github.com/raw/1008082/dc6cdb8ae50bd981ae9458cc270f96de41583718/movieList.sh
chmod +x movieList.sh
# Configure VIDEO_FOLDER
./movieList.sh
cat movie_list.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Script :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash

VIDEO_FOLDER=(
  /PATH/TO/MOVIE1
  /PATH/TO/MOVIE2
)
VIDEO_EXTENTION=(avi mkv mpg mpeg)

OUTPUT='movie_list.txt'
OUTPUT_TEMP=${OUTPUT}.temp

`&amp;gt;$OUTPUT_TEMP`

for folder in "${VIDEO_FOLDER[@]}"
do
  if [ -d $folder ]; then
      for ext in "${VIDEO_EXTENTION[@]}"
      do
        find $folder -iname "*.$ext" &amp;gt;&amp;gt; $OUTPUT_TEMP
      done
  fi
done

`cat $OUTPUT_TEMP | awk -F "/" '{print $NF;}' | sort | uniq &amp;gt; $OUTPUT`
`rm $OUTPUT_TEMP`
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/k8FKzPgt2cI" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/ubuntu/lister-ses-films.html</feedburner:origLink></entry>
        <entry>
        <title>Symfony2 en vidéo</title>
                <id>http://blog.lyrixx.info/symfony/symfony2-en-video.html</id>
                <updated>2011-01-03T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/g6lHD8JcybQ/symfony2-en-video.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Voici l’évolution du code source de &lt;a href="http://symfony.com/"
target="_blank"&gt;symfony2&lt;/a&gt; réalisé grâce à &lt;a
href="http://code.google.com/p/gource/" target="_blank"&gt;gource&lt;/a&gt;, ffmpef,
pitivi et ubuntu ;)&lt;/p&gt;

&lt;iframe width="853" height="480" src="http://www.youtube.com/embed/164Z1gyqk6M" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;(Il est possible de voir la vidéo en HD)&lt;/p&gt;

&lt;p&gt;La ligne de commande qui a permit le résultat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gource --title "Symfony2" -s .25 --file-idle-time 600  --auto-skip-seconds 1 -1920x1080 --output-framerate 30 --stop-at-end --max-files 1000000 --bloom- multiplier 1.1 --bloom-intensity .25 --background 101010  --highlight-dirs --highlight-users --hide filenames,date,progress --output-ppm-stream - | nice -n19 ffmpeg -y -b 3000k -r 30 -f image2pipe -vcodec ppm -i - -vcodec libx264 -vpre hq -crf 22 -threads 0 symfony.avi
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/g6lHD8JcybQ" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/symfony/symfony2-en-video.html</feedburner:origLink></entry>
        <entry>
        <title>Comment utiliser le Routeur du Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/comment-utiliser-le-routeur-du-zend-framework.html</id>
                <updated>2010-08-09T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/7YfRFx5Sq3A/comment-utiliser-le-routeur-du-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Je suppose que vous connaissez déjà tous l’&lt;strong&gt;url rewriting&lt;/strong&gt;. Il est assez
simple de mettre en place des formats d’URL (user firendly) prédéfinis avec
&lt;strong&gt;Zend&lt;/strong&gt;. On va voir ensemble comment faire.&lt;/p&gt;

&lt;p&gt;Comme souvent avec le &lt;strong&gt;Zend Framework&lt;/strong&gt;, il y a plusieurs façons de faire. Je
vais vous en montrer deux. &lt;strong&gt;Une première en PHP&lt;/strong&gt;, puis une &lt;strong&gt;deuxième avec le
fichier de configuration application.ini&lt;/strong&gt;. Quelque que soit la méthode, tout le
code PHP sera à mettre dans le fichier &lt;code&gt;bootstrap.php&lt;/code&gt;. Pourquoi ? Car il faut
bien que le routage s’effectue avant le premier &lt;code&gt;dispatch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Préparation du bootstrap&lt;/h2&gt;

&lt;p&gt;On peut commencer par préparer notre &lt;code&gt;bootstrap&lt;/code&gt; : il faut ajouter une nouvelle
méthode :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;protected function _initRouter() {
    $front = $this-&amp;gt;bootstrap('FrontController')-&amp;gt;getResource('FrontController');
    $router = $front-&amp;gt;getRouter();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On ajoute la méthode &lt;code&gt;_initRouter()&lt;/code&gt;. Pour l’instant cette méthode est un peu
vide. La première ligne de code sert à démarrer le &lt;code&gt;bootstrap&lt;/code&gt;si cela n’avait
pas encore été fait puis a récupérer le &lt;code&gt;FrontController&lt;/code&gt; depuis le &lt;code&gt;registre&lt;/code&gt;
du &lt;code&gt;bootstrap&lt;/code&gt;. La deuxième ligne sert à récupérer le &lt;code&gt;router&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Configuration en php depuis le bootstrap&lt;/h2&gt;

&lt;h3&gt;Syntaxe d’ajout&lt;/h3&gt;

&lt;p&gt;Il existe différent type de route possible. Des routes statiques,  dynamiques,
basés sur des expressions régulières, basés sur le domaine et sous-domaines …
Mais quelque soit le type de route choisi, la syntaxe reste la même. Il faut
commencer par créer une route, puis ensuite l’ajouter au routeur.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$uneRoute = new Zend_Controller_Router_Route($route, $defaults, $reqs);
$router-&amp;gt;addRoute('uneRoute', $uneRoute);
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$route&lt;/code&gt; correspond a l’Uri de la ressource. C’est le bout de l’URL
qui se trouve après le nom de domaine. Par
exemple l’Uri peut être ‘a-propos’ ou alors ‘contactez-nous’.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$default&lt;/code&gt; doit être un tableau contenant les informations de redirection
(module, controller, action, …)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$reqs&lt;/code&gt; est optionnels, il permet d’ajouter des contraintes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$uneRoute&lt;/code&gt; est la route au format Zend_Controller_Router_Route&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;enfin la pseudo-constante &lt;code&gt;uneRoute&lt;/code&gt; est la clé identifiant la route. En effet
il est possible de retrouver une route enregistrée dans le routeur grâce et
uniquement grâce à cette clé.&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Note :&lt;/span&gt; il est très fortement
déconseillé de mettre des accents ou des caractères « bizarres » dans le nom de
la route ou dans la clé de la route.&lt;/p&gt;

&lt;h3&gt;Routage Statique&lt;/h3&gt;

&lt;p&gt;On va commencer avec le routage statique. Avec le routage statique, il n’est pas
vraiment possible de transmettre des variables en GET. On utilise par exemple le
routage statique pour la page a-propos, contact etc … Voici un exemple :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;protected function _initRouter() {
    $front = $this-&amp;gt;bootstrap('FrontController')-&amp;gt;getResource('FrontController');
    $router = $front-&amp;gt;getRouter();
    $route = new Zend_Controller_Router_Route('accueil', array('controller' =&amp;gt; 'index', 'action' =&amp;gt; 'index')));
    $router-&amp;gt;addRoute('accueil', $route);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Note :&lt;/span&gt; Ici j’ai remis tous le
code à mettre dans le &lt;code&gt;bootstrap&lt;/code&gt;. Dans la suite du tutoriel, je ne mettrais que
les lignes de code intéressantes (i.e. les deux dernières lignes).&lt;/p&gt;

&lt;p&gt;Dans cette exemple, le fait de se rendre sur la page
&lt;code&gt;http://exemple.com/accueil&lt;/code&gt; aura le même effet que d’aller sur la page
&lt;code&gt;http://exemple.com/index/index&lt;/code&gt;. Bien entendu, ce n’est pas une redirection
(l’url ne change pas), mais bien un vrai routage ou ré-écriture d’Url. Dans cet
exemple, la route ‘accueil’ porte le même nom que la clé. C’est en général plus
simple de mettre les même valeurs, ou alors des valeurs proches.&lt;/p&gt;

&lt;h3&gt;Routage Dynamique&lt;/h3&gt;

&lt;p&gt;Qu’est-ce que le routage dynamique ?  Par exemple vous voulez qu’une partie de
l’url soit dynamique : un id, un nom de fonction, un message … Il faut donc,
dans le routeur, nommé cette variable. Pour ce faire il faut utiliser les « : »
devant le nom de votre variable. Voici un exemple ou l’on veut faire passer une
message en paramètre (GET) de notre URL :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$route = new Zend_Controller_Router_Route('contact/:topic', array('controller' =&amp;gt; 'index', 'action' =&amp;gt; 'contact','topic' =&amp;gt; 'Topic par defaut'));
$router-&amp;gt;addRoute('contact', $route);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici nous faisons passer dans les paramètres GET un sujet (&lt;code&gt;topic&lt;/code&gt;). Ainsi si
l’on se rend à l’adresse suivante : &lt;code&gt;http://exemple.com/contact/Mon Topic&lt;/code&gt;, le
controller exécuter sera le controller &lt;code&gt;indexController&lt;/code&gt;, et l’action exécuter
sera l’action &lt;code&gt;contactAction&lt;/code&gt;. On pourra récupérer la valeur de &lt;code&gt;topic&lt;/code&gt;grâce à
:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;getRequest()-&amp;gt;getParam('topic');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il faut placer ce code dans la méthode &lt;code&gt;contactAction&lt;/code&gt; du fichier
&lt;code&gt;indexController.php&lt;/code&gt;. C’est transparent pour l’utilisateur, mais il y a bien eu
une ré-écriture d’url. Sans celle ci l’URL aurai pu être :
&lt;code&gt;http://exemple.com/contact/?topic=Mon Topic&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On peut aussi attribuer une valeur par défaut à notre variable &lt;code&gt;topic&lt;/code&gt;. C’est un
des arguments du tableau &lt;code&gt;$default&lt;/code&gt; : &lt;code&gt;topic =&amp;gt; Topic par defaut&lt;/code&gt;. Donc  si
l’utilisateur se rend à cette adresse : &lt;code&gt;http://exemple.com/contact&lt;/code&gt; la valeur
de &lt;code&gt;topic&lt;/code&gt; sera :  &lt;code&gt;Topic par defaut&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vous pouvez aussi remarquer qu’ici la route est différente de la clé de celle-ci
(&lt;code&gt;contact/:topic&lt;/code&gt; VS &lt;code&gt;contact&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;Routage Dynamique avec des contraintes&lt;/h3&gt;

&lt;p&gt;On peut ajouter des contraintes aux routages dynamique. Comme par exemple forcer
que la variable x ou y soit un entier ou un string. On utilise pour ca la
variable &lt;code&gt;$reqs&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$route = new Zend_Controller_Router_Route(
    'membres/:id/`',
    array(
        'controller' =&amp;gt; 'index', 'action' =&amp;gt; 'membres'
    ),
    array('id' =&amp;gt; 'd+')
);
$router-&amp;gt;addRoute('membres', $route);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici on force la route à utiliser un id de type nombre. Si ce n’est pas un
nombre, l’URL ne passera pas dans la route, et il y aura une erreur.&lt;/p&gt;

&lt;p&gt;Vous pouvez remarquer aussi qu’il est possible d’utiliser des caractères joker
(wildcard). Le caractère ` symbolise tout type de caractère. Grâce a ce
caractère, il est possible de mettre a peu près tout ce que l’on veut dans
l’url. Il est donc possible de faire passer des informations dans l’URL même
avec un routages statiques.&lt;/p&gt;

&lt;h3&gt;Routage avec les expressions régulières.&lt;/h3&gt;

&lt;p&gt;On à déjà vu le routage statique et le routage dynamique. Mais juste avec ces
deux routages, il n’est pas encore possible de réaliser toutes les routes
inimaginables. Par exemple, il n’est pas encore possible de faire une route qui
ressemblerai a ca : &lt;code&gt;http://exemple.com/team/25-aka&lt;/code&gt; ou alors
&lt;code&gt;http://exemple.com/blogpost/9-Comment-faire-cuire-une-pizza.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Voila le code d’une route :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$routeRegex = new Zend_Controller_Router_Route_Regex(
    'teams/(d+)-(w+)',
    array('controller' =&amp;gt;'index', 'action' =&amp;gt; 'teams'),
    array(1 =&amp;gt; 'id',2=&amp;gt;'name'),
    'teams/%d-%s'
);
$router-&amp;gt;addRoute('teams', $routeRegex);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il faut noter que la route n’est plus de type &lt;code&gt;Zend_Controller_Router_Route&lt;/code&gt;
mais de type &lt;code&gt;Zend_Controller_Router_Route_Regex&lt;/code&gt;.&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;La route en elle-même est à peu près la même que pour le routage dynamique. Il&lt;/dt&gt;
&lt;dt&gt;faut utiliser des expressions régulières. Ici les routes acceptées sont du type&lt;/dt&gt;
&lt;dd&gt;&lt;code&gt;http://exemple.com/teams/NOMBRE-STRING&lt;/code&gt;.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Le troisième argument du constructeur est un peu différent. Il permet de mapper
(i.e. binder, associé) les ‘variables’ capturées par la regxp (grâce aux
parenthèse) à des noms de variables. Par exemple, ici le nombre &lt;code&gt;capturé&lt;/code&gt; sera
mapper à la variable &lt;code&gt;id&lt;/code&gt; et le &lt;code&gt;string&lt;/code&gt; sera mappé à la variable &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Enfin le dernier paramètre du constructeur sert au reverse. Il est possible
(comme pour tous les autres types de route) d’utiliser un ViewHelper pour
construire notre url (dans le cas où l’on veut faire un lien par exemple).
Cependant avec une expression régulière en entré, il n’est pas très facile de
pouvoir deviner le pattern en sortie. C’est pourquoi il y a ce dernier argument
qui est facultatif. En effet il est facultatif, car tant qu’on n’utilise pas le
ViewHelper, on n »en a pas besoin.&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Note :&lt;/span&gt; on verre plus tard
comment utiliser le ViewHelper url() avec les routes.&lt;/p&gt;

&lt;h2&gt;Configuration avec un fichier de configuration .ini&lt;/h2&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Note :&lt;/span&gt; pour cette partie, je ne
vais pas trop détaillé le code. Il reste assez similaire pour le bootstrap. Le
fichier .ini reprend le même fonctionnement qu’en php.&lt;/p&gt;

&lt;h3&gt;Configuration du Bootstrap&lt;/h3&gt;

&lt;p&gt;Il faut commencer par créet une nouvelle méthode dans le fichier bootstrap.php&lt;/p&gt;

&lt;p&gt;protected function _initRouter() {&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$front = $this-&amp;gt;bootstrap('FrontController')-&amp;gt;getResource('FrontController');
$router = $front-&amp;gt;getRouter();
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'production');
$routing = new Zend_Controller_Router_Rewrite();
$routing-&amp;gt;addConfig($config, 'routes');
 $front-&amp;gt;setRouter($routing);}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Application.ini&lt;/h3&gt;

&lt;p&gt;Et maintenant, il faut coller ce code dans le fichier application.ini, dans la
section production&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;; Routage

routes.accueil.route = "accueil"
routes.accueil.defaults.controller = "index"
routes.accueil.defaults.action = "index"

routes.apropos.type = "Zend_Controller_Router_Route"
routes.apropos.route = "a-propos"
routes.apropos.defaults.controller = "index"
routes.apropos.defaults.action = "apropos"

routes.contact.type = "Zend_Controller_Router_Route"
routes.contact.route = "contact/:topic"
routes.contact.defaults.controller = "index"
routes.contact.defaults.action = "contact"
routes.contact.defaults.topic = "Topic par defaut"

routes.membres.type = "Zend_Controller_Router_Route"
routes.membres.route = "membres/:id/`"
routes.membres.defaults.controller = "index"
routes.membres.defaults.action = "membres"
routes.membres.reqs.id = "d+"

routes.teams.type = "Zend_Controller_Router_Route_Regex"
routes.teams.route = "teams/(d+)-(w+)"
routes.teams.defaults.controller = "index"
routes.teams.defaults.action = "teams"
routes.teams.map.1 = "id"
routes.teams.map.2 = "name"
routes.teams.reverse ="teams/%d-%s"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On peut voir que pour un routage statique simple, 3 lignes suffisent (cf
accueil). Cependant on peur forcer le type de la route (cf apropos).&lt;/p&gt;

&lt;p&gt;Comme en PHP, il est aussi possible de définir une route dynamique (cf contact).
Et on peut aussi faire une validation par expressions régulières (cf membres).&lt;/p&gt;

&lt;p&gt;Enfin pour utiliser un route de type expression régulière, il faut utilise le
type « &lt;code&gt;Zend_Controller_Router_Route_Regex&lt;/code&gt; » (cf teams).&lt;/p&gt;

&lt;h2&gt;Utilisation de l’aide de Vue url()&lt;/h2&gt;

&lt;p&gt;L’aide de vue url() est très utile. Il est possible de l’utiliser avec le
système de route du Framework. On peut l’utiliser depuis une vue ou depuis le
layout. En accord avec la définition des routes vu précédemment, on peut
l’appeler de la façon suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo $this-&amp;gt;url(array(),'accueil').'&amp;lt;br /&amp;gt;';
echo $this-&amp;gt;url(array(),'apropos').'&amp;lt;br /&amp;gt;';
echo $this-&amp;gt;url(array('topic'=&amp;gt;'Sujet du message'),'contact').'&amp;lt;br /&amp;gt;';
echo $this-&amp;gt;url(array('id'=&amp;gt;'78'),'membres').'&amp;lt;br /&amp;gt;';
echo $this-&amp;gt;url(array('id'=&amp;gt;'25','name'=&amp;gt;'aka'),'teams').'&amp;lt;br /&amp;gt;';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Le première argument doit etre un tableau (&lt;code&gt;array&lt;/code&gt;). Il représente les arguments
(ou paramètres) de la route. C’est un tableau associatif. La clé représente le
nom de la variable, et la valeur représente la valeur de cette variable. Le
deuxième argument représente la nom de la route.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/7YfRFx5Sq3A" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/comment-utiliser-le-routeur-du-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>ZFDebug : Un plugin pour Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/zfdebug-un-plugin-pour-zend-framework.html</id>
                <updated>2010-08-05T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/i3Dkxo4XKoU/zfdebug-un-plugin-pour-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;&lt;strong&gt;ZFDebug&lt;/strong&gt; est un outils très utile lorsqu’on développe avec Zend. En effet ce
plugin, &lt;strong&gt;qui ne demande presque aucunes configurations&lt;/strong&gt;, permet de mettre en
évidence beaucoup d’informations utilises. On va voir commment l’installer dans
un projet déjà existant (ou un nouveau, ca ne change rien).Donc ce plugin va
ajouter automatiquement une barre d’outils en bas de votre page. Sur cette
barre, on peut voire les informations suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache: Information sur Zend_Cache et APC.&lt;/li&gt;
&lt;li&gt;Database: Liste complète des requêtes SQL ainsi que les temps
d’exécution.&lt;/li&gt;
&lt;li&gt;Exception: Capture des erreurs et exceptions.&lt;/li&gt;
&lt;li&gt;File: Nombre et poids des fichiers inclus.&lt;/li&gt;
&lt;li&gt;Html: Nombre de fichier JS et CSS inclus. Liens pour passer la page au
validateur W3C.&lt;/li&gt;
&lt;li&gt;Memory: Utilisation de la mémoire.&lt;/li&gt;
&lt;li&gt;Registry: Contenu du Zend_Registry&lt;/li&gt;
&lt;li&gt;Time: Information sur les temps d’exécution.&lt;/li&gt;
&lt;li&gt;Variables: Variables de vues, de requêtes, de $COOKIE et $POST&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voila à quoi ressemble cette barre  : (Note : Tous les modules ne sont pas
chargé)&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2010/08/ZFDebug-bar1.png"
rel="lightbox[1270]"&gt;&lt;img class="aligncenter size-full wp-image-1274"
title="ZFDebug bar" src="../wp-content/uploads/2010/08/ZFDebug-
bar1.png" alt="" width="626" height="25" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alors pour l’installer il faut  commencer par télécharger la dernière version
sur &lt;a href="http://code.google.com/p/zfdebug/" target="_blank"&gt;le site du
projet&lt;/a&gt;. Ensuite il faut extraire l’archive et déplacer le dossier &lt;code&gt;ZFDebug&lt;/code&gt;
qui se trouve dans le dossier &lt;code&gt;library&lt;/code&gt; de l’archive dans votre dossier
&lt;code&gt;library&lt;/code&gt; de votre projet. Puis il faut configurer le bootstrap pour qu’il
démarre le plugin. Il faut placer le code qui suit tout à la fin du bootstrap :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;protected function _initZFDebug() {
    // Setup autoloader with namespace
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader-&amp;gt;registerNamespace('ZFDebug');

    // Ensure the front controller is initialized
    $this-&amp;gt;bootstrap('FrontController');

    // Retrieve the front controller from the bootstrap registry
    $front = $this-&amp;gt;getResource('FrontController');

    // Only enable zfdebug if options have been specified for it
    if ($this-&amp;gt;hasOption('zfdebug')) {
        // Create ZFDebug instance
        $zfdebug = new
        ZFDebug_Controller_Plugin_Debug($this-&amp;gt;getOption('zfdebug'));

        // Register ZFDebug with the front controller
        $front-&amp;gt;registerPlugin($zfdebug);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et enfin, pour qu’il démarre, il faut ajouter la configuration de la barre dans
le fichier &lt;code&gt;application.ini&lt;/code&gt; et plus précisément dans la partie &lt;code&gt;[development :
production]&lt;/code&gt; pour que cette barre ne se retrouve que sur les machines de
développement.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zfdebug.plugins.Variables = null
zfdebug.plugins.Time = null
zfdebug.plugins.Memory = null
zfdebug.plugins.Exception = null
zfdebug.plugins.Html = null
zfdebug.plugins.Registry = null
; zfdebug.plugins.File = null
; zfdebug.plugins.Cache = null
; zfdebug.plugins.Database = null
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila le fichier de configuration « minimum ». Il est possible d’activer ou
désactiver des fonctionnalités juste en commentant ou dé-commentant une ligne.
Il y a plus d’information sur le &lt;a href="http://code.google.com/p/zfdebug/wiki/Installation" target="_blank"&gt;wiki
du plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Et voila, la barre de Debug se retrouve automatiquement en bas de votre page. Si
ce n’est pas le cas, pensez a vérifier que vous etes bien sur un environement de
developpement. Si vous etes en production, il faudra ajouter la ligne suivante
en haut du fichier &lt;code&gt;index.php&lt;/code&gt; qui se trouve dans le répertoire &lt;code&gt;public.&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apache_setenv("APPLICATION_ENV", "development");
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/i3Dkxo4XKoU" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zfdebug-un-plugin-pour-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>Qu'est-ce que PECL ?</title>
                <id>http://blog.lyrixx.info/web-dev/quest-ce-que-pecl.html</id>
                <updated>2010-05-10T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/4sfXNilVQZU/quest-ce-que-pecl.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Il y a quelques semaines un rapport sur l’&lt;strong&gt;utilisation de PHP sur les serveurs
debian est sorti&lt;/strong&gt; (&lt;a href="http://popcon.debian.org/"
target="_blank"&gt;http://popcon.debian.org/&lt;/a&gt; ; vraiment pas sexy ! ). &lt;a
href="http://www.industrialisation-php.com/statistiques-dusage-de-php-sur-
debian/" target="_blank"&gt;Industrialisation PHP en a fait une bonne analyse&lt;/a&gt;,
je vous conseil de la lire. En lisant ce rapport, j’ai été assez étonné sur
&lt;strong&gt;les pourcentages d’utilisation des extensions PECL et PEAR&lt;/strong&gt;. On va donc
commencer par faire une petite piqure de rappel sur PECL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PECL&lt;/strong&gt; est l’anagramme de  &lt;strong&gt;PHP Extension Community Library&lt;/strong&gt; (on le prononce
pickle). C’est une librairie d’extensions codées en C issu de la communauté PHP
pour le PHP. Ces extensions viennent directement se greffer au moteur PHP (&lt;a
href="http://pecl.php.net/packages.php" target="_blank"&gt;Liste des
Extensions&lt;/a&gt;). Il y a par exemple des extensions pour le débogage, le cache,
la sécurité, les gui … Ces extensions ont l’avantage d’être codées en C, donc
elles sont beaucoup plus rapide et performantes que les librairies codées en
PHP. Par contre il faut aussi savoir que plusieurs extensions ne sont plus
maintenues, en effet, il arrive souvent que des extensions soient directement
intégré directement au moteur PHP (comme domxml ou json)  ou alors elles sont
abandonnées :S.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quelques exemples d’extentions connu :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pecl.php.net/package/memcache" target="_blank"&gt;memcache&lt;/a&gt;
: offre la possibilité de mettre des objets en cache et donc de réduire la
consommation CPU (et réduit l’utilisation de MySQL)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pecl.php.net/package/imagick" target="_blank"&gt;imagick&lt;/a&gt;
: pour gérer les images. Offre plus d’options que GD2&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pecl.php.net/package/Xdebug" target="_self"&gt;XDebug&lt;/a&gt; :
pour améliorer le débogage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il y a plusieurs types d’utilisation de ces extensions. En fait soit l’extension
rajoute des nouvelles fonctions à notre moteur php (comme avec imagick, &lt;a
href="http://fr2.php.net/manual/fr/function.imagick-clone.php"
target="_blank"&gt;exemple&lt;/a&gt;), soit l’extension redéfinit une fonction (on verra
le cas dans un projet tuto avec var_dump).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pour installer des extensions PECL&lt;/strong&gt;, il y a plusieurs écoles.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pour les utilisateurs de Windows, il y a souvent deux options :

&lt;ul&gt;
&lt;li&gt;Télécharger les binaires et les copier au bon endroit, puis éditer
le php.ini&lt;/li&gt;
&lt;li&gt;Télécharger le code source et re-compiler PHP (ou juste l'extension)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pour les utilisateurs de Linux (et surement Mac…) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On peut aussi télécharger les sources a la main et compiler le tout (ou
juste l'extension)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ou Une ligne de commande suffit :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pecl install &amp;lt;nom du paquet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’avantage d’être sous Linux, c’est que c’est plus simple et surtout plus à jour
sachant que PECL fonctionne comme un dépôt, d’ailleurs c’est un dépôt (comme apt
par exemple)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.php.net/manual/fr/install.pecl.php"
target="_blank"&gt;Documentation sur php.net&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/4sfXNilVQZU" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/web-dev/quest-ce-que-pecl.html</feedburner:origLink></entry>
        <entry>
        <title>Architecture du Zend Framework 1.10 en MVC</title>
                <id>http://blog.lyrixx.info/zend/architecture-du-zend-framework-1-10.html</id>
                <updated>2010-03-18T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/1IkSlS4xMTI/architecture-du-zend-framework-1-10.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Depuis quelques versions du &lt;strong&gt;Zend Framework&lt;/strong&gt;, l’architecture de celui-ci en
mode MVC à un petit peu changé. Je vous donne le nouveau schémas, et je
l’explique ensuite. La racine des dossiers est (chez moi) le dossier « zftuto ».
Je précise que &lt;strong&gt;cette structure a été obtenu grâce aux Zend_Tool&lt;/strong&gt; (cf prochain
tutoriel).&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2010/03/architecture.png"
rel="lightbox[1187]"&gt;&lt;img class="alignright size-full wp-image-1188"
title="architecture" src="../wp-
content/uploads/2010/03/architecture.png" alt="" width="260" height="592" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans ce dossier nous avons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;application&lt;/strong&gt; : c’est le dossier où tous notre code va se situer,
il ne doit pas être accessible depuis
l’extérieur.

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;configs&lt;/strong&gt; : c’est le dossier qui va contenir tous nos fichiers
de configuration

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;application.ini&lt;/strong&gt; : C’est le fichier qui permet de définir
les réglage de l’application comme
les paramètre de base de données, les chemins par défaut …&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;controllers&lt;/strong&gt; : c’est le dossier qui va contenir tous les controllers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;forms&lt;/strong&gt; : c’est un nouveau dossier qui contient maintenant tous
les formulaires&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;layouts&lt;/strong&gt;/&lt;strong&gt;scripts&lt;/strong&gt;/ : c’est le dossier qui contient les fichiers
de layout

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;layout.phtml&lt;/strong&gt; : layout (ou template) de base de notre application&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;models&lt;/strong&gt; : c’est le dossier qui contient tous les modèles, ou
plus exactement tous notre code métier

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DbTable&lt;/strong&gt; : c’est le dossier qui contient toutes les
représentation de nos tables (ORM).&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Views&lt;/strong&gt; : c’est le dossier qui contient tous ce qui touchent
a l’affichage

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;helpers&lt;/strong&gt; : c’est le dossier qui contient les aides de vues&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scripts&lt;/strong&gt; : c’est le dossier qui contient les dossiers contenant
les vues&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;docs&lt;/strong&gt; : c’est le dossier qui contient la documentation (oui il en faut)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;library&lt;/strong&gt; : c’est le dossier qui contient les librairies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zend&lt;/strong&gt; : c’est dans ce dossier qu’il faut mettre la librairie du
Zend Framework&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;public&lt;/strong&gt; : c’est le seul dossier qui doit être accessible depuis
l’extérieur.

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;index.php&lt;/strong&gt; : c’est le fichier qui va démarrer notre application&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tests&lt;/strong&gt; : c’est le dossier qui contient tous les fichiers pour faire
des tests unitaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/1IkSlS4xMTI" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/architecture-du-zend-framework-1-10.html</feedburner:origLink></entry>
        <entry>
        <title>Application de site E-Commerce [Code-Source]</title>
                <id>http://blog.lyrixx.info/zend/application-de-site-e-commerce.html</id>
                <updated>2010-03-18T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/8fCQYtMoE_4/application-de-site-e-commerce.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Comme vous l’avez peut être vu passer sur &lt;a href="http://twitter.com/lyrixx"
target="_blank"&gt;twitter&lt;/a&gt;, j’ai du faire pour les cours une &lt;strong&gt;application
e-commerce très basique&lt;/strong&gt;. J’ai choisis de la faire avec Zend. Et du coup je
partage le code ici ;). &lt;strong&gt;Cette application est très simplifié : il n’y a qu’une
page produit, avec la possibilité d’ajouter des produits dans un panier et
ensuite de gérer son panier. Il y a aussi la toute la partie gestion des
utilisateurs : connexion, enregistrement, déconnexion&lt;/strong&gt; etc… Et enfin il y a une
page paiement qui vérifie les informations de la carte bancaire.&lt;/p&gt;

&lt;p&gt;Quelques points techniques abordés dans cette application :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bootstrap&lt;/strong&gt; (Zend_Application)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controller&lt;/strong&gt;, &lt;strong&gt;View&lt;/strong&gt;, &lt;strong&gt;Model&lt;/strong&gt; (MVC)&lt;/li&gt;
&lt;li&gt;Mapping &lt;strong&gt;de base de données&lt;/strong&gt; (ORM) (Zend_Db_Table)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Formulaires&lt;/strong&gt;, &lt;strong&gt;Validations&lt;/strong&gt;, &lt;strong&gt;Décorateurs&lt;/strong&gt; (Zend_Form,
Zend_Validate)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt; et &lt;strong&gt;Aides de vue&lt;/strong&gt; (Zend_View_Helper)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentification&lt;/strong&gt; (Zend_Auth)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session&lt;/strong&gt; (Zend_Session)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cookie&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Zend_Text_Figlet (Bonus ca :))&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;voila quelques screenshots :&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2010/03/TP1-Ecommerce-prod.png"
rel="lightbox[1175]"&gt;&lt;img class="alignnone size-medium wp-image-1176"
title="TP1-Ecommerce prod" src="../wp-
content/uploads/2010/03/TP1-Ecommerce-prod-300x168.png" alt="" width="300"
height="168" /&gt;&lt;/a&gt; &lt;a href="../wp-content/uploads/2010/03/TP1
-Ecommerce-register.png" rel="lightbox[1175]"&gt;&lt;img class="alignnone size-medium
wp-image-1177" title="TP1-Ecommerce register" src="../wp-
content/uploads/2010/03/TP1-Ecommerce-register-300x168.png" alt="" width="300"
height="168" /&gt;&lt;/a&gt;&lt;a href="../wp-content/uploads/2010/03/TP1
-Ecommerce-panier.png" rel="lightbox[1175]"&gt;&lt;img class="alignnone size-medium
wp-image-1178" title="TP1-Ecommerce panier" src="../wp-
content/uploads/2010/03/TP1-Ecommerce-panier-300x153.png" alt="" width="300"
height="153" /&gt;&lt;/a&gt;&lt;a href="../wp-content/uploads/2010/03/TP1
-Ecommerce-paiment.png" rel="lightbox[1175]"&gt;&lt;img class="alignnone size-medium
wp-image-1179" title="TP1-Ecommerce paiment" src="../wp-
content/uploads/2010/03/TP1-Ecommerce-paiment-300x165.png" alt="" width="300"
height="165" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et enfin &lt;a href="../wp-content/uploads/2010/03/TP1-Ecommerce.tar.gz"&gt;les sources à télécharger&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/8fCQYtMoE_4" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/application-de-site-e-commerce.html</feedburner:origLink></entry>
        <entry>
        <title>Comment bien démarrer un projet Zend Framework grâce aux Zend_Tool</title>
                <id>http://blog.lyrixx.info/zend/comment-bien-demarrer-un-projet-zend-framework-grace-aux-zend_tool.html</id>
                <updated>2010-03-18T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/qd5W_W0txiw/comment-bien-demarrer-un-projet-zend-framework-grace-aux-zend_tool.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Cet article est une mise à jour du tutoriel sur &lt;strong&gt;l’outil Zend_Tool&lt;/strong&gt;. Donc
depuis quelque temps dans le Zend Framework, il y a de nouvelles
fonctionnalités. Mais pour bien faire les choses, on va reprendre Zend_Tool
depuis le début.&lt;/p&gt;

&lt;h2&gt;Qu’est-ce que Zend_Tool ?&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zend Tool est un outils qui s’utilise en ligne de commande&lt;/strong&gt; (depuis une
console) et qui &lt;strong&gt;permet de mettre en place la structure de son projet&lt;/strong&gt;,
d’ajouter des controllers, actions, vues, modules… D’après la roadmap de Zend,
cet outils à pour objectif de devenir très puissant.&lt;/p&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Alors il va falloir commencer par &lt;a
href="http://framework.zend.com/download/latest" target="_blank"&gt;télécharger le
Zend Framework&lt;/a&gt;. On l’extrait, chez moi c’est dans le répertoire : «
/home/lyrix/prog/php/Lib/Zend_librairie/ZendFramework-1.10.2/ ». On va donc
créer un alias pour nous faciliter la vie.  Si vous avez la chance d’être sur un
système linux (ou mac) une ligne de commande suffit :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias zf="/home/lyrix/prog/php/Lib/Zend_librairie/ZendFramework-1.10.2/bin/zf.sh"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vous pouvez aussi ajouter cette commande a votre fichier de configuration du
bash (~/.bashrc), pour que l’alias soit toujours actif. On va ensuite aller dans
le dossier où l’on veut que notre projet soit crée.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /home/lyrix/prog/php/2010/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On nommera ce projet « zftuto ». Création de projet avec Zend_Tool on commence
par créer notre projet :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf create project
./zftuto/ zftuto
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;./zftuto/ représente le PATH de la racine de l’application.
zftuto représente le nom de l’application.
Il faut maintenant se déplacer dans le dossier contenant l’application.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd zftuto/
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Base de donnée&lt;/h2&gt;

&lt;p&gt;Zend_Tool peut se connecter à une base de donnée, pour ensuite nous créer les
classes métiers représentant les tables de notre bases de données (ORM). On
commence par configurer notre application pour qu’elle se connecte à la BDD.
Puis ensuite on génère nos classes :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf configure db-adapter "adapter=pdo_mysql&amp;amp;username=ecommerce&amp;amp;password=ecommerce&amp;amp;dbname=ecommerce"
zf create db-table.fromdatabase
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Le nom des variables est assez explicite pour que je ne les détail pas.&lt;/p&gt;

&lt;h2&gt;Layout&lt;/h2&gt;

&lt;p&gt;On peut maintenant activer la gestion d’un layout depuis zend tool.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf enable layout
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Formulaire&lt;/h2&gt;

&lt;p&gt;On peut créer un formulaire en ligne de commande :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf create form UserCU
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Model&lt;/h2&gt;

&lt;p&gt;Pour créer un nouveau model (ou classe métier) :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf create model TestModel
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Controller, Action, Vue :&lt;/h2&gt;

&lt;p&gt;Et bien sur on peut toujours ajouter un controller (avec la vue associé)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf create controller Users
zf create action read Users
zf create view read2 Users
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Module :&lt;/h2&gt;

&lt;p&gt;On peut aussi créer des modules :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf create module Moduletest
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Aide :&lt;/h2&gt;

&lt;p&gt;Pour de l’aide, vous pouvez directement depuis votre console exécuter la
commande suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zf ?
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Si on fait attention, le nommage des classes a changé. &lt;strong&gt;Il y a maintenant
un namespace « application »&lt;/strong&gt;. Ce
qui a mon goût est plus propre, et anticipe peut être les changements
qu’il va y avoir avec php 5.3 puis php 6&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/qd5W_W0txiw" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/comment-bien-demarrer-un-projet-zend-framework-grace-aux-zend_tool.html</feedburner:origLink></entry>
        <entry>
        <title>Gerer l'authentification avec Zend_Auth du Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/gerer-lauthentification-avec-zend_auth-du-zend-framework.html</id>
                <updated>2009-12-23T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/Y0Z5NStakiY/gerer-lauthentification-avec-zend_auth-du-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;&lt;strong&gt;Comment faire un système de login sur son application&lt;/strong&gt; ? On va voir comment
mettre en place un système de connexion d’utilisateur dans son application avec
le &lt;strong&gt;Zend Framework&lt;/strong&gt;. Pour ce faire on va utiliser le composant &lt;strong&gt;Zend_Auth&lt;/strong&gt;.
Il va falloir commencer par faire le &lt;strong&gt;formulaire de login&lt;/strong&gt; qui n’est pas très
compliqué. Faire la validation de ce formulaire puis si il est valide s’occuper
de la partie &lt;strong&gt;Zend_Auth ou authentification&lt;/strong&gt;. Enfin nous verrons comment faire
un petit &lt;strong&gt;Zend_View_Helper&lt;/strong&gt; (aide de vue) pour créer automatiquement des liens
(&lt;strong&gt;« login» ou « logout »&lt;/strong&gt;)&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire :&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#formulaire"&gt;Mise en place du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#controller"&gt;Le controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#deconnexion"&gt;Déconnexion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verif"&gt;Vérification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#zend-view-helper"&gt;Le controller de vue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="formulaire"&gt;Création du formulaire de login :&lt;/h2&gt;

&lt;p&gt;On va allé assez vite sur la création du formulaire dans la mesure ou j’explique
dans un autre tutoriel &lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#formulaire" title="Zend Framework, Formulaire et Base de donnée, partie 1"&gt;&lt;strong&gt;comment faire un formulaire&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Model_Form_User_Login extends Zend_Form {

public function init(){
    $this-&amp;gt;setName('add_user');

    $email = new Model_Form_EText('email','Adresse Email : ');

    $password = new Zend_Form_Element_Password('password');
    $password-&amp;gt;setLabel('Mot de pase : ')
        -&amp;gt;setRequired(true)
        -&amp;gt;addFilter('StripTags')
        -&amp;gt;addFilter('StringTrim');

    $submit = new Zend_Form_Element_Submit('submit');
    $submit-&amp;gt;setAttrib('id', 'submitbutton')
        -&amp;gt;setLabel('Se connecter');

    $elements = array($email,$password, $submit);
    $this-&amp;gt;addElements($elements);

    $this-&amp;gt;setDecorators(array(
        'FormElements',
        array('HtmlTag', array('tag' =&amp;gt; 'dl', 'class' =&amp;gt; 'zend_form')),
        array('Errors', array('placement' =&amp;gt; 'apend')),
        'Form'
    ));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;On voit qu’on utilise un champ &lt;code&gt;email&lt;/code&gt; et un champ &lt;code&gt;password&lt;/code&gt; et bien sur un
bouton valider. Si la classe de l’email vous parait bizarre je vous conseil de
lire le tutoriel sur les formulaires. Enfin les dernières lignes concernent la
mise en forme du formulaire ainsi que la position des messages d’erreurs qui
seront envoyés (ajoutés) par &lt;strong&gt;le modèle pour la vérification du couple Email /
Password&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="controller"&gt;Le controller&lt;/h2&gt;

&lt;p&gt;Le &lt;code&gt;controller&lt;/code&gt; est dans la classe &lt;code&gt;LoginController&lt;/code&gt; et l’action que nous allons
utiliser est &lt;code&gt;loginAction&lt;/code&gt;. On commence par donner une instance de notre
formulaire à la vue pour qu’elle puisse l’afficher.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$form = new
Model_Form_User_Login();
$this-&amp;gt;view-&amp;gt;formLogin = $form;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ensuite on vérifie qu’il y ai des données postées, on les récupère
et on les valide.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($this-&amp;gt;_request-&amp;gt;isPost ()) {
    $formData = $this-&amp;gt;_request-&amp;gt;getPost ();
    if ($form-&amp;gt;isValid ( $formData )) {
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si elles sont valides, on récupère les données :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$email = $form-&amp;gt;getValue ( 'email' );
$password = $form-&amp;gt;getValue ( 'password' );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin on arrive à la &lt;strong&gt;partie qui concerne Zend_Auth&lt;/strong&gt;. Il faut commencer par
créer ce qu’on appel un &lt;code&gt;Zend_Auth_Adapter_DbTable&lt;/code&gt;, c’est un composant de
&lt;code&gt;Zend_Auth&lt;/code&gt; qui va pouvoir se connecter à la &lt;code&gt;BDD&lt;/code&gt;. Cet nouvel objet va prendre
en paramètre un &lt;code&gt;Zend_Db_Adapter_Abstract&lt;/code&gt;, c’est à dire un connecteur à la base
de donnée. Dans notre cas nous allons prendre le connecteur principal, celui qui
est définit dans les paramètres globaux de Zend (application.ini)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$authAdapter = new Zend_Auth_Adapter_DbTable ( Zend_Db_Table::getDefaultAdapter () );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin il faut donner quelques informations à cet adaptateur :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le nom de la table qui contient les utilisateurs (ici users)&lt;/li&gt;
&lt;li&gt;Le nom de la colonne qui contient les identifiants (ici email)&lt;/li&gt;
&lt;li&gt;Le nom de la colonne qui contient les mots de passe (ici password)&lt;/li&gt;
&lt;li&gt;Le type de hashage dans la base (ici MD5)&lt;/li&gt;
&lt;li&gt;La valeur de l’email&lt;/li&gt;
&lt;li&gt;La valeur du mot de passe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$authAdapter-&amp;gt;setTableName ( 'users' )
    -&amp;gt;setIdentityColumn ( 'email' )
    -&amp;gt;setCredentialColumn ( 'password' )
    -&amp;gt;setCredentialTreatment ( 'MD5(?)' )
    -&amp;gt;setIdentity ( $email )
    -&amp;gt;setCredential ( $password );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin on essaye d’identifier l’utilisateur :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$authAuthenticate = $authAdapter-&amp;gt;authenticate ();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Maintenant il faut regarder si cette authentification à réussi ou échoué.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($authAuthenticate-&amp;gt;isValid ()) {
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si elle est valide, on va mettre en &lt;strong&gt;variable de session les informations de
l’utilisateur&lt;/strong&gt;. À ce moment vous pouvez mettre toutes les informations
relatives à l’utilisateur. On peu même envisager de créer une classe pour
stocker toutes ces informations. Dans le cas présent, seule les informations
issu de la table users sont utiles. On commence donc par &lt;strong&gt;récupérer l’espace de
stockage (storage) par défaut de l’application&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$storage = Zend_Auth::getInstance ()-&amp;gt;getStorage ();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Puis on y ajoute les informations de l’utilisateur, on y enlève bien sur le mot
de passe :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;write ( $authAdapter-&amp;gt;getResultRowObject ( null, 'password' ) );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et enfin on redirige l’utilisateur sur la page principale de l’application&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'index' );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et pour finir si le couple login / password n’était pas bon, on ajoute
une description au formulaire :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;} else {
    $form-&amp;gt;addError ( 'Il n'existe pas d'utilisateur avec ce mot de passe' );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voilà l’action du controller est faite on peu passer à la suite.&lt;/p&gt;

&lt;h2 id="deconnexion"&gt;Déconnexion&lt;/h2&gt;

&lt;p&gt;Si l’utilisateur veut se déconnecter, il doit cliquer sur un lien qui map
l’action suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function logoutAction() {
    Zend_Auth::getInstance()-&amp;gt;clearIdentity ();
    $this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'index' );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Grâce à la ligne &lt;code&gt;Zend_Auth::getInstance ()-&amp;gt;clearIdentity ();&lt;/code&gt; on supprime
l’identification de l’utilisateur.&lt;/p&gt;

&lt;h2 id="verif"&gt;Vérification de connexion&lt;/h2&gt;

&lt;p&gt;Il faut bien entendu vérifier (si l’on code proprement) si l’utilisateur est
déjà connecté si il veut se déconnecter, et il faut aussi vérifier que
l’utilisateur connecté puisse seulement se déconnecter dans &lt;strong&gt;ce&lt;/strong&gt; controller.
On va utiliser la méthode &lt;code&gt;preDispatch&lt;/code&gt; du controller, cette méthode est
systématiquement appelé à l’exécution d’une action du controller. Je vous donne
le code et je l’explique après :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function preDispatch() {
    if (Zend_Auth::getInstance ()-&amp;gt;hasIdentity ()) {
        if ('logout' != $this-&amp;gt;getRequest ()-&amp;gt;getActionName ()) {
            $this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'index' );
        }
    } else {
        if ('logout' == $this-&amp;gt;getRequest ()-&amp;gt;getActionName ()) {
            $this-&amp;gt;_helper-&amp;gt;redirector ( 'index' );
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par vérifier si l’utilisateur est connecté, si il l’est et que
l’action sur laquelle il veut aller est différente de &lt;code&gt;‘logout’&lt;/code&gt; on le renvoi
sur la page d’accueil du site. Sinon, si il n’est pas connecté et qu’il veut se
déconnecter, on l’envoi sur l’action qui permet de se connecter.&lt;/p&gt;

&lt;h2 id="zend-view-helper"&gt;Zend_View_Helper&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment faire automatiquement un lien qui permet de se connecter si on ne
l’est pas, ou alors de se deconnecter si on l’est ?&lt;/strong&gt; Et bien on utilise ce
qu’on appel un &lt;strong&gt;Zend_View_Helper&lt;/strong&gt;, c’est un bout de code qui va être
utilisable dans le layout.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Zend_View_Helper_ProfileLink extends Zend_View_Helper_Abstract {
    public function profileLink() {
        $helperUrl = new Zend_View_Helper_Url ( );
        $auth = Zend_Auth::getInstance ();
        if ($auth-&amp;gt;hasIdentity ()) {
            $username = $auth-&amp;gt;getIdentity ()-&amp;gt;prenom . ' ' . strtoupper ( substr ( $auth-&amp;gt;getIdentity ()-&amp;gt;nom, 0, 1 ) ) . '.';
            $logoutLink = $helperUrl-&amp;gt;url ( array ('action' =&amp;gt; 'logout', 'controller' =&amp;gt; 'login' ) );

            return 'Salut ' . $username . ' (&amp;lt;a href="' . $logoutLink . '"&amp;gt;Logout&amp;lt;/a&amp;gt;)';
        }
        $loginLink = $helperUrl-&amp;gt;url ( array ('action' =&amp;gt; 'login', 'controller' =&amp;gt; 'login' ) );

        return '&amp;lt;a href="' . $loginLink . '"&amp;gt;Login&amp;lt;/a&amp;gt;';
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par créer un nouveau &lt;code&gt;Zend_View_Helper_Url&lt;/code&gt; pour nous aider à
construire les URL, puis on récupère une instance de Zend_Auth. Donc si il y a
un utilisateur de connecté, on récupère son identité. Puis on construit l’URL de
déconnexion, et enfin on retourne la chaine de caractère (message + lien). Si
l’utilisateur n’est pas connecté, on construit le lien de connexion, et on
retourne la chaine de caractère. Si on veut utiliser ce script dans la vue, il
va falloir faire :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo $this-&amp;gt;profileLink();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et voila le code du controller en entier :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class LoginController extends Zend_Controller_Action {

    public function init() {
        /** Initialize action controller here */
        Zend_Auth::getInstance ()-&amp;gt;clearIdentity ();

    }

    public function preDispatch() {
        if (Zend_Auth::getInstance ()-&amp;gt;hasIdentity ()) {
            if ('logout' != $this-&amp;gt;getRequest ()-&amp;gt;getActionName ()) {
                $this-&amp;gt;_helper-&amp;gt;redirector ( 'index','index' );
            }
        } else {
            if ('logout' == $this-&amp;gt;getRequest()-&amp;gt;getActionName ()) {
                $this-&amp;gt;_helper-&amp;gt;redirector ( 'index' );
            }
        }
    }

    public function indexAction() {
        $this-&amp;gt;_forward ( 'login' );
    }

    public function loginAction() {

        $form = new Model_Form_User_Login ( );
        $this-&amp;gt;view-&amp;gt;formLogin = $form;

        if ($this-&amp;gt;_request-&amp;gt;isPost ()) {
            $formData = $this-&amp;gt;_request-&amp;gt;getPost ();
            if ($form-&amp;gt;isValid ( $formData )) {
                $email = $form-&amp;gt;getValue ( 'email' );
                $password = $form-&amp;gt;getValue ( 'password' );
                $authAdapter = new Zend_Auth_Adapter_DbTable ( Zend_Db_Table::getDefaultAdapter () );
                $authAdapter-&amp;gt;setTableName ( 'users' )
                    -&amp;gt;setIdentityColumn ( 'email' )
                    -&amp;gt;setCredentialColumn ( 'password' )
                    -&amp;gt;setCredentialTreatment ( 'MD5(?)' )
                    -&amp;gt;setIdentity ( $email )
                    -&amp;gt;setCredential ( $password );
                $authAuthenticate = $authAdapter-&amp;gt;authenticate ();
                if ($authAuthenticate-&amp;gt;isValid ()) {
                    $storage = Zend_Auth::getInstance ()-&amp;gt;getStorage ();
                    $storage-&amp;gt;write ( $authAdapter-&amp;gt;getResultRowObject ( null, 'password' ) );
                    $this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'index' );
                } else {
                    $form-&amp;gt;addError ( 'Il n'existe pas d'utilisateur avec ce mot de passe' );
                }
            }
        }
        $this-&amp;gt;render ( 'index' );
    }

    public function logoutAction() {
        Zend_Auth::getInstance ()-&amp;gt;clearIdentity ();
        $this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'index' );
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/Y0Z5NStakiY" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/gerer-lauthentification-avec-zend_auth-du-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>Zend Framework, Formulaire et Base de donnée, partie 2</title>
                <id>http://blog.lyrixx.info/zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html</id>
                <updated>2009-11-20T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/s8nCiNuZMbQ/zend-framework-formulaire-et-base-de-donnee-partie-2.html" />
        <content type="html" xml:lang="en">&lt;p&gt;On continue avec la deuxième partie de la &lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html" title="Zend Framework, Formulaire et Base de donnée, partie 1"&gt;gestion d’un formulaire&lt;/a&gt;, de &lt;strong&gt;la
création de formulaire, et d’ajout de donnée en BDD&lt;/strong&gt; dans le &lt;strong&gt;Zend
Framework&lt;/strong&gt;. Dans cette partie nous verrons &lt;strong&gt;comment afficher les données, les
modifier à l’aide du même formulaire que pour l’ajout, et la suppression des
données&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Partie 1

&lt;ul&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#bdd"&gt;Préparation de la BDD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#formulaire"&gt;Préparation du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#affichage"&gt;Affichage du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#controller"&gt;Le Controller du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html#validateur"&gt;Gérer d’autres validateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=../zend/zend-framework-formulaire-et-base-de-donnee-partie-1/"#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Partie 2

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#read"&gt;Afficher des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update"&gt;Mettre a jour des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#delete"&gt;Supprimer des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="read"&gt;Afficher les données de la base de données.&lt;/h2&gt;

&lt;p&gt;Il faut tout d’abord toucher a notre &lt;code&gt;controller&lt;/code&gt; qui gère la page &lt;code&gt;user&lt;/code&gt; pour
donner à la vue une instance de la classe &gt;&lt;code&gt;Model_DbTable_Users()&lt;/code&gt;. Vu que
j’utilise souvent cette classe, j’ai fait une méthode dans la classe
&lt;code&gt;controller&lt;/code&gt; : (&lt;code&gt;application/modules/Frontend/controllers/UserController.php&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private function getUsersAll() {
    $dbUser = new Model_DbTable_Users();
    return $dbUser-&amp;gt;fetchAll()-&amp;gt;toArray();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et maintenant on a juste a passer cette classe à la vue :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function indexAction(){
    $this-&amp;gt;view-&amp;gt;usersAll = $this-&amp;gt;getUsersAll();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On passe maintenant à la vue
(&lt;code&gt;application/modules/Frontend/views/scripts/user/index.phtml&lt;/code&gt;).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (isset($this-&amp;gt;usersAll)): ?&amp;gt;
    &amp;lt;h2&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;translate('view_user_modify')?&amp;gt;:
    &amp;lt;/h2&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;&amp;lt;?php echo $this-&amp;gt;translate('view_user_firstname')?&amp;gt;&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;&amp;lt;?php echo $this-&amp;gt;translate('view_user_name')?&amp;gt;&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;&amp;lt;?php echo $this-&amp;gt;translate('view_user_email')?&amp;gt;&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;&amp;lt;?php echo $this-&amp;gt;translate('view_user_modify')?&amp;gt;&amp;lt;/th&amp;gt;

        &amp;lt;/tr&amp;gt;
        &amp;lt;?php foreach ($this-&amp;gt;usersAll as $user){
            if ($user['active'] == 1){
                echo '&amp;lt;tr&amp;gt;';
            }else{
                echo '&amp;lt;tr style="text-decoration:line-through"&amp;gt;';
            }
            echo '&amp;lt;td&amp;gt;'.$user['nom'].'&amp;lt;/td&amp;gt;';
            echo '&amp;lt;td&amp;gt;'.$user['prenom'].'&amp;lt;/td&amp;gt;';
            echo '&amp;lt;td&amp;gt;'.$user['email'].'&amp;lt;/td&amp;gt;';

            echo '&amp;lt;td&amp;gt;&amp;lt;a
            href="'.$this-&amp;gt;url(array('action'=&amp;gt;'edit','id'=&amp;gt;$user['idUser'])).'"&amp;gt;Modifier&amp;lt;/a&amp;gt;
            | &amp;lt;a
            href="'.$this-&amp;gt;url(array('action'=&amp;gt;'del','id'=&amp;gt;$user['idUser'])).'"
            &amp;gt;Supprimer&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;';
            echo '&amp;lt;/tr&amp;gt;';
        }
        ?&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;?php endif; ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: center;"&gt;   &lt;a href="../wp-
content/uploads/2009/11/liste-users.png"   rel="lightbox[947]"&gt;&lt;img
class="aligncenter   size-full wp-image-948" title="liste users" src="../wp-content/uploads/2009/11/liste-users.png"   alt="liste
users" width="675" height="220" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;On commence par vérifier que la variable &lt;code&gt;usersAll&lt;/code&gt; est bien définit. Dans ce
cas la on construit notre tableau assez naturellement. Encore une fois j’utilise
ici la &lt;a href="../zend/mettre-en-place-un-systeme-de-traduction-dans-zend-framework.html" title="Comment mettre en place un systeme de traduction dans Zend Framework"&gt;traduction du framework&lt;/a&gt; (mais on n’est pas forcé de le faire).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($user['active'] == 1) {
    echo '&amp;lt;tr&amp;gt;';
} else {
    echo '&amp;lt;tr style="text-decoration:line-through"&amp;gt;';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ce code sert juste a vérifié que l’utilisateur est actif. Si il ne l’est pas on
barre la ligne :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="&amp;lt;?php echo $this-&amp;gt;url(array('action'=&amp;gt;'edit','id'=&amp;gt;$user['idUser'])) ?&amp;gt;"&amp;gt;
    Modifier
&amp;lt;/a&amp;gt;
|
&amp;lt;a href="&amp;lt;?php echo $this-&amp;gt;url(array('action'=&amp;gt;'del','id'=&amp;gt;$user['idUser'])) ?&amp;gt;"&amp;gt;
    Supprimer
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin cette ligne est assez sympa : en effet on veut pouvoir &lt;strong&gt;éditer et
supprimer des utilisateurs&lt;/strong&gt;. Il nous faut donc des &lt;strong&gt;liens&lt;/strong&gt; pour le faire. Et
bien pour fabriquer ces liens on va utiliser une &lt;strong&gt;aide de vues&lt;/strong&gt; (View Helper :
&lt;code&gt;Zend_View_Helper_Url&lt;/code&gt;) qui va nous construire notre lien directement. On lui
passe comme argument un tableau, avec comme clés l'&lt;code&gt;action&lt;/code&gt;, le &lt;code&gt;controller&lt;/code&gt;, le
&lt;code&gt;module&lt;/code&gt; et des &lt;code&gt;paramètres&lt;/code&gt;. Tout ces champs ne sont pas obligatoires. Dans mon
cas, je reste sur le même &lt;code&gt;controller&lt;/code&gt;, et donc le même &lt;code&gt;module&lt;/code&gt;. Donc je
n’utilise que l’&lt;code&gt;action&lt;/code&gt; et un &lt;code&gt;paramètre id&lt;/code&gt;. Ce paramètre est passé en &lt;code&gt;GET&lt;/code&gt;
donc directement dans l’&lt;code&gt;url&lt;/code&gt;. De plus &lt;code&gt;zend&lt;/code&gt; va gérer automatiquement l’&lt;strong&gt;url
rewriting&lt;/strong&gt;, qui est beaucoup plus &lt;strong&gt;user-friendly et seo-friendly&lt;/strong&gt;. Voyons ce
que donne le résultat : (il y a un peu de &lt;code&gt;css&lt;/code&gt;)&lt;/p&gt;

&lt;h2 id="update"&gt;Modification d’un enregistrement&lt;/h2&gt;

&lt;p&gt;Donc notre lien pour modifier un utilisateur est déjà fait, et comme on a pu le
voir, il pointe sur l’&lt;code&gt;action edit&lt;/code&gt; du &lt;code&gt;controller UserController.php&lt;/code&gt;. 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).&lt;/p&gt;

&lt;h3&gt;Model&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$idUser = $this-&amp;gt;getIdUser();
if (isset ( $idUser ) &amp;amp;&amp;amp; $idUser != "") {
    $user = new Model_DbTable_Users ( );
    $user = $user-&amp;gt;fetchRow ( array ("idUser = ?" =&amp;gt; $idUser ) );
    if ($user != null) {
        $user = $user-&amp;gt;toArray ();
        $this-&amp;gt;populate ( $user );
    } else {
        throw new Zend_Exception ( "Il n'y a pas de
        d'utilisateur avec l'id : " . $idUser );
    }
    $password-&amp;gt;setDescription ( "form_user_update_password_change" );
    $password-&amp;gt;setRequired ( false );
    $submit-&amp;gt;setLabel ( 'form_user_update_submit' );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par récupérer la valeur de l’&lt;code&gt;id&lt;/code&gt; de l’utilisateur. Bien entendu, il
faut déclarer une variable (&lt;code&gt;private&lt;/code&gt;) et faire le &lt;code&gt;getter&lt;/code&gt; et le &lt;code&gt;setter&lt;/code&gt; 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 &lt;code&gt;Model_DbTable_Users&lt;/code&gt;. On sélectionne la ligne qui
va bien en fonction de l’&lt;code&gt;id&lt;/code&gt;. Si on a bien récupérer un utilisateur (c’est a
dire qu’il y a bien un enregistrement avec cet id)&gt; on &lt;strong&gt;peuple le formulaire&lt;/strong&gt;,
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 &lt;code&gt;label&lt;/code&gt; du bouton envoyer&gt;. Mais ce n’est pas finit.
En effet il reste un problème de validateur&gt; sur le champs &lt;code&gt;email&lt;/code&gt;. Il vaut donc
le supprimer, mais que si c’est le même email (saisi) que l’email qui est déjà
dans la &lt;code&gt;BDD&lt;/code&gt;. De la même marnière que dans la partie 1, on va devoir redéfinir
la méthode &lt;code&gt;isValid&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function isValid($data)
{
    $this-&amp;gt;getElement('password')-&amp;gt;addValidator(new App_Validate_PasswordMatch($data['password2']));
    if ($this-&amp;gt;getElement('email')-&amp;gt;getValue() == $data['email']){
        $this-&amp;gt;getElement('email')-&amp;gt;removeValidator ( "Zend_Validate_Db_NoRecordExists" );
    }
    return parent::isValid($data);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Par rapport au code de la partie 1, on a rajouté le bloc &lt;code&gt;IF&lt;/code&gt; : Si la valeur en
base est la même que la valeur saisi, on supprime le validateur&gt;, sinon on ne
fait rien (et donc on le laisse). Voilà notre formulaire est enfin prêt. On
passe maintenant au &lt;code&gt;controller&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Controller&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;public function editAction() {
    try {
        $form = new Model_Form_User_User ( );
        $form-&amp;gt;setIdUser($this-&amp;gt;getRequest ()-&amp;gt;getParam ( 'id' ));
        $form-&amp;gt;init();
        $this-&amp;gt;view-&amp;gt;formUserEdit = $form;
    } catch (Zend_Exception $e) {
        $this-&amp;gt;view-&amp;gt;formUserEdit = $e-&amp;gt;getMessage();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On essaye d’instancier la classe &lt;code&gt;Model_Form_User_User ( )&lt;/code&gt;. Ensuite on
récupère la valeur du paramètre &lt;code&gt;id&lt;/code&gt; (passer en &lt;code&gt;GET&lt;/code&gt;) 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.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($this-&amp;gt;_request-&amp;gt;isPost ()) {
    $formData = $this-&amp;gt;_request-&amp;gt;getPost ();
    if ($form-&amp;gt;isValid ( $formData )) {
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$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-&amp;gt;update ( $formData, array ("idUser = ?" =&amp;gt; $formData ['idUser'] ) );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si elle sont valide, on instancie la classe &lt;code&gt;Model_DbTable_Users&lt;/code&gt;. On vérifie
la valeur du champs &lt;code&gt;password&lt;/code&gt; : Si elle est nul, on enlève du tableau de donnée
&lt;code&gt;formData&lt;/code&gt; les champs &lt;code&gt;password&lt;/code&gt; et &lt;code&gt;password2&lt;/code&gt;, sinon on chiffre en md5 le
champ &lt;code&gt;password&lt;/code&gt; et en enlève &lt;code&gt;password2&lt;/code&gt;. Enfin on enlève le champ &lt;code&gt;submit&lt;/code&gt;. Et
pour finir on met a jour la base de donnée.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'user' );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin on redirige vers l’&lt;code&gt;action index&lt;/code&gt; du &lt;code&gt;controller user&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Vue&lt;/h3&gt;

&lt;p&gt;Ici c’est le même principe que pour le formulaire d’ajout&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php if (isset($this-&amp;gt;formUserEdit)) : ?&amp;gt;
    &amp;lt;h2&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;translate('view_user_edit')?&amp;gt;:
    &amp;lt;/h2&amp;gt;
    &amp;lt;?php echo $this-&amp;gt;formUserEdit; ?&amp;gt;
&amp;lt;?php endif ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: center;"&gt;   &lt;a href="../wp-
content/uploads/2009/11/edit-user.png"   rel="lightbox[947]"&gt;&lt;img
class="aligncenter   size-full wp-image-949" title="edit user" src="../wp-content/uploads/2009/11/edit-user.png"   alt="edit user"
width="468" height="669" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2 id="delete"&gt;Supprimer un Enregistrement&lt;/h2&gt;

&lt;p&gt;La suppression d’un utilisateur &lt;strong&gt;va se faire en deux étape&lt;/strong&gt;, 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’&lt;code&gt;id&lt;/code&gt; de l’utilisateur.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function delAction() {
    $id = $this-&amp;gt;getRequest ()-&amp;gt;getParam ( 'id' );
    $this-&amp;gt;view-&amp;gt;delUserId = $id;
    $this-&amp;gt;render('index');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;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 &lt;code&gt;url&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php if (isset($this-&amp;gt;delUserId)): ?&amp;gt;
    &amp;lt;h2&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;translate('are_you_sure')?&amp;gt;:
    &amp;lt;/h2&amp;gt;
    &amp;lt;a
        href="&amp;lt;?php echo $this-&amp;gt;url(array('action'=&amp;gt;'delete','id'=&amp;gt;$this-&amp;gt;delUserId));?&amp;gt;"&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;translate('yes')?&amp;gt;
    &amp;lt;/a&amp;gt;
    &amp;lt;a href="&amp;lt;?php echo $this-&amp;gt;url(array('action'=&amp;gt;'index','controller'=&amp;gt;'user'),null,true)?&amp;gt;"&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;translate('no')?&amp;gt;
    &amp;lt;/a&amp;gt;
&amp;lt;?php endif ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin si l’utilisateur clique sur oui, on exécute l’action suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function deleteAction() {
    public function deleteAction() {
    $id = $this-&amp;gt;getRequest ()-&amp;gt;getParam ( 'id' );
    $user = new Model_DbTable_Users ( );
    $result = $user-&amp;gt;delete ( array ("idUser = ?" =&amp;gt; $id ) );
    $this-&amp;gt;_helper-&amp;gt;redirector ( 'index', 'user' );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et voilà le tour est joué. On a bien supprimer notre utilisateur.&lt;/p&gt;

&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;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. &lt;a href="../wp-content/uploads/2009/11/formulaire.zip"&gt;Fichiers&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/s8nCiNuZMbQ" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html</feedburner:origLink></entry>
        <entry>
        <title>Zend Framework, Formulaire et Base de donnée, partie 1</title>
                <id>http://blog.lyrixx.info/zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html</id>
                <updated>2009-11-19T00:00:00+01:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/EuJe7bKJggI/zend-framework-formulaire-et-base-de-donnee-partie-1.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Hello, On va voir aujourd’hui &lt;strong&gt;comment construire et gérer un formulaire&lt;/strong&gt;,
&lt;strong&gt;ajouter les données récupéré dans une base de données&lt;/strong&gt;, &lt;strong&gt;afficher ces
données&lt;/strong&gt;, et enfin &lt;strong&gt;modifier&lt;/strong&gt; et &lt;strong&gt;supprimer&lt;/strong&gt; celles-ci. En gros, on va
utiliser les propriétés &lt;strong&gt;&lt;acronym title="Create Read Update
Delete"&gt;CRUD&lt;/acronym&gt;&lt;/strong&gt; de &lt;strong&gt;Zend Framework&lt;/strong&gt; en y associant une &lt;strong&gt;base de
donnée&lt;/strong&gt; et un &lt;strong&gt;formulaire&lt;/strong&gt;. P.S. : Pendant la rédaction de ce &lt;strong&gt;tuto&lt;/strong&gt;, je me
suis rendu compte qu’il allait être beaucoup trop gros, du coup j’ai décidé de
&lt;strong&gt;le couper en deux parties&lt;/strong&gt;, une première sur la création du formulaire et
l’ajout en base, une deuxième sur la l’affichage, la modification et la
suppression.&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Partie 1

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bdd"&gt;Préparation de la BDD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#formulaire"&gt;Préparation du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#affichage"&gt;Affichage du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#controller"&gt;Le Controller du formulaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#validateur"&gt;Gérer d’autres validateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Partie 2

&lt;ul&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html#read"&gt;Afficher des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html#update"&gt;Mettre a jour des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html#delete"&gt;Supprimer des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="bdd"&gt;Préparation de la base de donnée :&lt;/h2&gt;

&lt;p style="text-align: center;"&gt;   &lt;a href="../wp-
content/uploads/2009/11/database.png"   rel="lightbox[929]"&gt;&lt;img
class="aligncenter   size-full wp-image-931" title="database user" src="../wp-content/uploads/2009/11/database.png"   alt="database user"
width="136" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CREATE TABLE IF NOT
EXISTS `Budget`.`users` (
*idUser` INT NOT NULL AUTO_INCREMENT ,
*nom` VARCHAR(20) NULL ,
*prenom` VARCHAR(20) NULL ,
*email` VARCHAR(30) NULL ,
*active` INT NULL ,
*level` INT NULL ,
*password` BIGINT NOT NULL ,
PRIMARY KEY (`idUser`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
PACK_KEYS = DEFAULT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Comme &lt;a href="../zend/comment-gerer-une-base-de-donnee-avec-le-zend-framework.html" title="Comment gérer une base de donnée avec le Zend Framework"&gt;on a vu dans un précédant tutoriel&lt;/a&gt;, il faut créer une &lt;strong&gt;classe qui
va nous mapper les informations de la table&lt;/strong&gt; (&lt;strong&gt;&lt;acronym title="Object Relation
Mapper"&gt;ORM&lt;/acronym&gt;&lt;/strong&gt; du &lt;code&gt;Zend Framework&lt;/code&gt;).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Model_DbTable_Users extends Zend_Db_Table_Abstract {
    protected $_name = 'users';
    protected $_primary = array('idUser');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="formulaire"&gt;Préparation du formulaire&lt;/h2&gt;

&lt;p&gt;Il existe plusieurs façons de faire un formulaire : soit en utilisant des
&lt;code&gt;tableaux php&lt;/code&gt;, des &lt;code&gt;objets php&lt;/code&gt;, un &lt;code&gt;fichier xml&lt;/code&gt; etc… Pour ma part j’utilise
des &lt;code&gt;objets php&lt;/code&gt; et j’implémente pour chaque formulaire la classe &lt;strong&gt;Zend_Form&lt;/strong&gt;
(je vais y revenir). Pour plus de clarté dans mon arborescence de fichiers, je
place tous mes formulaires, dans le dossier : &lt;code&gt;application/models/Form/&lt;/code&gt; et
comme ce formulaire ci concerne l’&lt;code&gt;ajout et/ou la modification d’un
utilisateur&lt;/code&gt;, mon fichier &lt;code&gt;User.php&lt;/code&gt; est dans le dossier :
&lt;code&gt;application/models/Form/User&lt;/code&gt;. Donc le fichier de base doit ressembler à ça :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Model_Form_User_User extends Zend_Form {
    public function init() {
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Comme on peut le voir, il faut étendre la classe &lt;code&gt;Zend_Form&lt;/code&gt;, et mettre tout
notre code qui ajoute des éléments dans la méthode &lt;code&gt;init()&lt;/code&gt;. Ce code sera
&lt;strong&gt;directement exécuter lors de la création d’un nouveau formulaire&lt;/strong&gt;. Mais on va
très vite ajouter des éléments à notre formulaire, sinon il ne va pas servir à
grand chose. On peut, par exemple, &lt;strong&gt;ajouter un champ input texte&lt;/strong&gt; grâce a
ce code (le principe reste le même pour tous les types d’éléments) :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$champText = new Zend_Form_Element_Text('champText');
$champText-&amp;gt;setLabel('un champ texte')
    -&amp;gt;setRequired(true)
    -&amp;gt;addValidator('notEmpty')
    -&amp;gt;addFilter('StripTags')
    -&amp;gt;addFilter('StringTrim');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par créer un nouvel élément de type input texte, puis on ajoute un
&lt;code&gt;label&lt;/code&gt;, on ajoute ensuite un &lt;code&gt;validateur&lt;/code&gt; qui (dans ce cas) oblige la valeur à
être rempli, puis on ajoute deux &lt;code&gt;filtres&lt;/code&gt;. Il existe un grand nombre de
&lt;code&gt;validateurs&lt;/code&gt; et de &lt;code&gt;filtres&lt;/code&gt;. On en verra quelques un ici. Mais comme on peut
se douter, on va très souvent répéter le même code. Donc on peut se &lt;strong&gt;créer une
petite classe&lt;/strong&gt; qui ne va servir qu’a ajouter un champ de type input texte :
(&lt;code&gt;application/models/Form/EText.php&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Model_Form_EText extends Zend_Form_Element_Text {

    public function __construct($options = null,$label) {
        parent::__construct($options);
        $this-&amp;gt;setLabel($label)
            -&amp;gt;setRequired(true)
            -&amp;gt;addFilter('StripTags')
            -&amp;gt;addFilter('StringTrim');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Voilà, je vous donne maintenant une partie du code du formulaire et j’explique
les points nouveaux.&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Model_Form_User_User extends Zend_Form {

    public function init() {
        $this-&amp;gt;setName ( 'add_user' );

        $id = new Zend_Form_Element_Hidden ( 'idUser' );

        $nom = new Model_Form_EText ( 'nom', 'form_user_add_name' );

        $prenom = new Model_Form_EText ( 'prenom', 'form_user_add_firstname' );

        $email = new Model_Form_EText ( 'email', 'form_user_add_mail' );
        $email-&amp;gt;addValidator ( 'EmailAddress' )-&amp;gt;addValidator( new Zend_Validate_Db_NoRecordExists ('users', 'email' ) );

        $password = new Zend_Form_Element_Password ( 'password' );
        $password-&amp;gt;setLabel ( 'form_user_add_password' )-&amp;gt;addFilter ( 'StripTags' )-&amp;gt;addFilter ( 'StringTrim' )-&amp;gt;setRequired ( true );

        $password2 = new Zend_Form_Element_Password ( 'password2' );
        $password2-&amp;gt;setLabel ( 'form_user_add_password2' )-&amp;gt;addFilter ( 'StripTags' )-&amp;gt;addFilter ( 'StringTrim' );

        $active = new Zend_Form_Element_Checkbox ( 'active' );
        $active-&amp;gt;setLabel ( 'form_user_add_enable' )-&amp;gt;addFilter ( 'StripTags' )-&amp;gt;addFilter ( 'StringTrim' )-&amp;gt;setValue ( 1 );

        $level = new Zend_Form_Element_Select ( 'level' );
        $level-&amp;gt;setLabel ( 'form_user_add_level' )-&amp;gt;addFilter ( 'StripTags' )-&amp;gt;addFilter ( 'StringTrim' );

        $levelOptions = array ();
        for($i = 0; $i &amp;lt;= 9; $i ++) {
            $levelOptions [$i] = array ('key' =&amp;gt; $i, 'value' =&amp;gt; $i );
        }
        $level-&amp;gt;addMultiOptions ( $levelOptions );

        $submit = new Zend_Form_Element_Submit ( 'submit' );
        $submit-&amp;gt;setAttrib ( 'id', 'submitbutton' )-&amp;gt;setLabel ( 'form_user_add_submit' );

        $elements = array ($id, $nom, $prenom, $email, $password, $password2, $active, $level, $submit );
        $this-&amp;gt;addElements ( $elements );
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour commencer je donne un &lt;code&gt;nom&lt;/code&gt; a mon formulaire, ce qui peut être pratique
pour le retrouver, en effet le nom du formulaire correspond a son &lt;code&gt;id&lt;/code&gt; dans le
&lt;code&gt;code html et css&lt;/code&gt;. On peut aussi ajouter d’autre options, comme l’&lt;code&gt;action du
controller&lt;/code&gt;, mais dans notre cas, le formulaire et sa page de destination
(&lt;code&gt;l’action&lt;/code&gt;) sont les mêmes, donc on pas besoin de le définir. Ensuite, comme on
peut le voir, on crée plusieurs éléments :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;l’&lt;code&gt;id&lt;/code&gt; qui est un &lt;code&gt;élément de type hidden&lt;/code&gt;, qui nous servira lors des
mises à jour d’un utilisateur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nom&lt;/code&gt;, &lt;code&gt;prenom&lt;/code&gt; qui sont des éléments de type &lt;code&gt;Etext&lt;/code&gt;, les éléments
qu’on a crée un peu plus haut.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Le champ &lt;code&gt;email&lt;/code&gt; est aussi un champs de type &lt;code&gt;Etext&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;On a ajouter un &lt;code&gt;validateur d’adresse mail&lt;/code&gt;, pratique, le boulot est
déjà fait ! &lt;code&gt;-&amp;gt;addValidator('EmailAddress')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;On ajoute un second &lt;code&gt;validateur&lt;/code&gt; qui vérifie que l’adresse mail n’est
pas déjà dans la base de donnée:  *addValidator (new Zend_Validate_Db_NoRecordExists('users','email'))&lt;code&gt;.
Le premier paramètre est le&lt;/code&gt;nom de la table`. Le second est
l’attribut qui doit être unique.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt; et &lt;code&gt;password2&lt;/code&gt; sont des &lt;code&gt;champs de type password&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;active&lt;/code&gt; sert a savoir si l’utilisateur est actif. C’est un élément &lt;code&gt;de type Checkbox&lt;/code&gt;,
avec comme valeurpar défaut 1 (case coché)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;level&lt;/code&gt; sert a niveau d’administration du site. &lt;code&gt;De type Select&lt;/code&gt; On ajoute
dans un tableau des correspondances &lt;code&gt;key =&amp;gt; value&lt;/code&gt; qui représentent les
*options du select`&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;submit&lt;/code&gt; qui est notre bouton envoyer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Les **labels&lt;/strong&gt; ne sont pas très significatifs ou user-friendly, c’est normale,
j’utilise la traduction du zend framework**. Enfin il ne reste plus qu’a ajouter
tous ces éléments dans le formulaire lui même et le tours est joué, on a notre
formulaire. Je tiens a rappelé qu’&lt;strong&gt;il existe vraiment un grand nombre de façon
de fabriquer un formulaire&lt;/strong&gt;, &lt;strong&gt;d’ajouter des filtres&lt;/strong&gt;, &lt;strong&gt;des validateurs&lt;/strong&gt;. Il
y a quelques exemples ici, mais je ne peux pas faire un exemple pour chaque cas.
Je vous recommande donc d’aller faire un tour sur sur le doc du &lt;strong&gt;zf&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="affichage"&gt;Affichage du formulaire&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Je ne vais pas m’occuper ici de styler le formulaire&lt;/strong&gt;. Juste de l’afficher
comme il vient. Par défaut &lt;strong&gt;zf&lt;/strong&gt; utilise ce qu’on appel des &lt;strong&gt;décorateurs&lt;/strong&gt;, il
est possible de les personnaliser, mais ce n’est pas le but ici. Vous pouvez
aller faire un tours &lt;a href="http://www.dator.fr/tutorial-creer-une-application-avec-le-zend-framework-%E2%80%93-8-le-formulaire-dinscription-de-watchmydesk/"&gt;sur le site de dator pour avoir un exemple&lt;/a&gt; de ce
qu’on peut faire (même si je ne suis pas fan de sa technique, mais elle reste
valide à 100% … huhu). Pour les &lt;code&gt;décorateurs&lt;/code&gt;, le code a &lt;code&gt;ajouter / modifier&lt;/code&gt;
doit se trouver dans la classe qui fabrique notre formulaire. Donc il va falloir
&lt;strong&gt;éditer la vu qui affichera le formulaire.&lt;/strong&gt; Chez moi c’est
&lt;code&gt;application/modules/Frontend/views/scripts/user/index.phtml&lt;/code&gt; car c’est le
&lt;strong&gt;controller&lt;/strong&gt; &lt;code&gt;userController.php&lt;/code&gt; qui va être appelé ici. Voilà a quoi doit
ressembler la vues &lt;strong&gt;au minimum&lt;/strong&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php if (isset($this-&amp;gt;formUser)) : ?&amp;gt;
    &amp;lt;h2&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;translate('view_user_add')?&amp;gt; ?
    &amp;lt;/h2&amp;gt;
    &amp;lt;?php echo $this-&amp;gt;formUser ?&amp;gt;
&amp;lt;?php endif ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On fait une simple vérification pour voir sur le formulaire a bien était envoyé
par le &lt;code&gt;controller&lt;/code&gt; à la vue et on l’affiche.&lt;/p&gt;

&lt;h2 id="controller"&gt;Le controller du formulaire&lt;/h2&gt;

&lt;p&gt;Bon on arrive la &lt;strong&gt;gestion du controller&lt;/strong&gt; de notre formulaire. Je vous &lt;strong&gt;livre
le code et je l’explique ensuite&lt;/strong&gt; :
(&lt;code&gt;application/modules/Frontend/controllers/UserController.php&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class UserController extends Zend_Controller_Action
{
    public function indexAction(){
    $form = new Model_Form_User_User();
    $this-&amp;gt;view-&amp;gt;formUser = $form;
    if ($this-&amp;gt;_request-&amp;gt;isPost()) {
        $formData = $this-&amp;gt;_request-&amp;gt;getPost();
        if ($form-&amp;gt;isValid($formData)) {
            $users = new Model_DbTable_Users();
            $row = $users-&amp;gt;createRow();
            $row-&amp;gt;nom = $form-&amp;gt;getValue('nom');
            $row-&amp;gt;prenom = $form-&amp;gt;getValue('prenom');
            $row-&amp;gt;email = $form-&amp;gt;getValue('email');
            $row-&amp;gt;password = md5($form-&amp;gt;getValue('password'));
            $row-&amp;gt;active = $form-&amp;gt;getValue('active');
            $row-&amp;gt;level = $form-&amp;gt;getValue('level');
            $result = $row-&amp;gt;save();
            //On gere le resultat et l'action qui s'en suit.
            $form-&amp;gt;reset();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Petit apercu avant de continuer&lt;/p&gt;

&lt;p style="text-align: center;"&gt;   &lt;a href="../wp-
content/uploads/2009/11/Form-User-Add.png"   rel="lightbox[929]"&gt;&lt;img
class="aligncenter size-full wp-image-938" style="border: 1px solid black;"
title="Form User Add" src="../wp-content/uploads/2009/11/Form-
User-Add.png" alt="Form   User Add" width="370" height="571" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$form = new
Model_Form_User_User();
$this&amp;gt;view-&amp;gt;formUser = $form;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par &lt;code&gt;instancier&lt;/code&gt; la classe du formulaire et on le donne à la vue. A
partir de ce moment on peut &lt;strong&gt;déjà tester si notre formulaire s’affiche bien&lt;/strong&gt;.
Bien entendu ça ne sert a rien de cliquer sur envoyer, ça ne fonctionnera pas !
Comme on a pu le voir plus haut, la page de destination du formulaire est elle
même. Donc le &lt;code&gt;controller&lt;/code&gt; est le même. C’est donc dans la même &lt;code&gt;méthode&lt;/code&gt; du
même &lt;code&gt;controller&lt;/code&gt; qu’on teste en premier si notre &lt;strong&gt;formulaire est valide&lt;/strong&gt; et
qu’ensuite on traite le résultat.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($this-&amp;gt;_request-&amp;gt;isPost()) {
     $formData = $this-&amp;gt;_request-&amp;gt;getPost();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence avec le &lt;code&gt;IF&lt;/code&gt; pour voir si il y a eu des données de type &lt;code&gt;POST&lt;/code&gt;,
&lt;code&gt;POST&lt;/code&gt; étant le type d’envoi par défaut pour les formulaires. On peut bien
entendu envoyer notre formulaire en &lt;code&gt;GET&lt;/code&gt; en modifiant la classe &lt;code&gt;user.php&lt;/code&gt;.
Ensuite on récupère nos données.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($form-&amp;gt;isValid($formData)) {
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ce point est très intéressant, car il va &lt;strong&gt;automatiquement voir si notre
formulaire est valide&lt;/strong&gt;. C’est a dire qu’il va exécuter chaque &lt;code&gt;validateurs&lt;/code&gt; de
nos &lt;code&gt;élement&lt;/code&gt; composant le formulaire. Si il y a &lt;strong&gt;au moins une erreur la
validation ne passera pas&lt;/strong&gt;, mais zf va** automatiquement refaire notre
formulaire en reprenant les valeurs insérer, et en ajouter un message ou il y a
eu des erreurs** (par exemple « la valeur est requise »). Ici encore on peut
personnaliser le message. Dans mon cas j’utilise encore une fois la
&lt;code&gt;traduction&lt;/code&gt;. Bon et si le formulaire est valide ?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new Model_DbTable_Users();
$row = $users-&amp;gt;createRow();
$row-&amp;gt;nom = $form-&amp;gt;getValue('nom');
$row-&amp;gt;prenom = $form-&amp;gt;getValue('prenom');
$row-&amp;gt;email = $form-&amp;gt;getValue('email');
$row-&amp;gt;password = md5($form-&amp;gt;getValue('password'));
$row-&amp;gt;active = $form-&amp;gt;getValue('active');
$row-&amp;gt;level = $form-&amp;gt;getValue('level');
$result = $row-&amp;gt;save();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Comme on veut (à la base) que notre formulaire nous serve à &lt;strong&gt;ajouter des
utilisateurs en base&lt;/strong&gt;, et bien on reprend le même code que dans le tutoriel sur
la &lt;code&gt;gestion des BDD&lt;/code&gt; ; On instancie la classe &lt;code&gt;Model_DbTable_Users&lt;/code&gt;, &lt;strong&gt;on crée
un nouvelle ligne, on ajoute tous nos champs&lt;/strong&gt;, et enfin &lt;strong&gt;on sauvegarde&lt;/strong&gt;. Bien
entendu, on peut mettre la ligne &lt;code&gt;$row-&amp;gt;save()&lt;/code&gt; dans un bloque &lt;code&gt;try-catch&lt;/code&gt;, mais
si on a bien fait notre boulot sur les &lt;code&gt;validateurs&lt;/code&gt;, normalement, il n’y a pas
besoin.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;reset();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin on &lt;strong&gt;remet a zéro notre formulaire,&lt;/strong&gt; c’est a dire qu’on vide tout les
champs. On peut par la suite ajouter un message (pour l’ergonomie) qui
s’affichera expliquant que l’ajout s’est bien effectué. Ici c’est donc juste un
passage de variable à la vue. Voilà notre formulaire fonctionne mais il y reste
encore des choses a voir.&lt;/p&gt;

&lt;h2 id="validateur"&gt;Double vérification du password ; Validation avec données.&lt;/h2&gt;

&lt;p&gt;Du fait qu’il faille vérifier que l’utilisateur a bien rentré &lt;strong&gt;deux fois le
même password&lt;/strong&gt;, on va avoir besoin d’au moins un des deux &lt;code&gt;password&lt;/code&gt;. On va
donc redéfinir la méthode &lt;code&gt;isValid&lt;/code&gt; de la classe &lt;code&gt;Model_Form_User_User&lt;/code&gt; qui
étend &lt;code&gt;Zend_Form&lt;/code&gt; je vous rappel. Cette classe, comme on a vu plus haut, &lt;strong&gt;est
systématiquement appelé&lt;/strong&gt;, et elle appel à son tour tous les &lt;code&gt;validateurs&lt;/code&gt; de
tous les &lt;code&gt;éléments&lt;/code&gt;. On va utiliser pour vérifier que l’utilisateur a bien
rentré deux fois le même &lt;code&gt;password&lt;/code&gt; grâce une classe de validation réalisé par
&lt;a href="http://pastie.textmate.org/640447"&gt;l’ami dator&lt;/a&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class App_Validate_PasswordMatch extends Zend_Validate_Abstract
{
    const PASSWORD_MISMATCH = 'passwordMismatch';
    protected $_compare;
    protected $_messageTemplates = array(
        self::PASSWORD_MISMATCH =&amp;gt; "PASSWORD_MISMATCH"
    );
    public function __construct($compare){
        $this-&amp;gt;_compare = $compare;
    }
    public function isValid($value){
        $this-&amp;gt;_setValue((string) $value);
        if ($value !== $this-&amp;gt;_compare) {
            $this-&amp;gt;_error(self::PASSWORD_MISMATCH);
            return false;
        }
        return true;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On peut la mettre en bas de la classe &lt;code&gt;Model_Form_User_User&lt;/code&gt;, ça ne pose pas
de problème. Du coup il ne nous reste plus qu’a l’utiliser :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function isValid($data)
{
    $this-&amp;gt;getElement('password')-&amp;gt;addValidator(new
    App_Validate_PasswordMatch($data['password2']));
    if ($this-&amp;gt;getElement('email')-&amp;gt;getValue() == $data['email']){
        $this-&amp;gt;getElement('email')-&amp;gt;removeValidator ( "Zend_Validate_Db_NoRecordExists");
    }
    return parent::isValid($data);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par récupérer l’élément &lt;code&gt;password&lt;/code&gt;, auquel on ajoute notre
&lt;code&gt;validateur personnalisé&lt;/code&gt; en lui donnée comme paramètre le &lt;code&gt;password2&lt;/code&gt; rentré
par l’utilisateur. Ensuite on appelle la méthode « classique ».&lt;/p&gt;

&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Et voilà, on a finit avec notre formulaire. On peut bien sur l’améliorer et
surtout le rendre plus joli. Je vous redonnerai tous les fichiers nécessaires
lors de la deuxième ;) et on peut continuer avec&lt;a href="../zend/zend-framework-formulaire-et-base-de-donnee-partie-2.html" title="Zend Framework, Formulaire et Base de donnée, partie 2"&gt; la 2eme partie : affichage,
modification et suppression&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/EuJe7bKJggI" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-framework-formulaire-et-base-de-donnee-partie-1.html</feedburner:origLink></entry>
        <entry>
        <title>Comment gérer une base de donnée avec le Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/comment-gerer-une-base-de-donnee-avec-le-zend-framework.html</id>
                <updated>2009-10-19T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/GC7vcjAH2tw/comment-gerer-une-base-de-donnee-avec-le-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Alors la on va aborder un chapitre très important. &lt;strong&gt;Les bases de données sont
bien sur très importantes&lt;/strong&gt; pour un site web ou un service web. On va voir
ensemble comment &lt;strong&gt;ajouter, modifier, supprimer des enregistrements (ou tuples)
dans un table, dans une base de donnée&lt;/strong&gt;. On va donc utiliser la gestion &lt;strong&gt;CRUD
du Zend Framework 1.9&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#connection"&gt;Connexion a la base de donnée&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#schemas"&gt;Schémas de la table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#metier"&gt;Préparation de la classe métier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#read"&gt;Obtenir et récupérer des enregistrements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#create"&gt;Ajouter des enregistrements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update"&gt;Modifier des enregistrements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#delete"&gt;Supprimer des enregistrement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#extend"&gt;Etendre la classe métier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="connection"&gt;Connexion a la base de donnée.&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;La connexion à la base de donnée principale se fait toute seule&lt;/strong&gt;. Je
m’explique, c’est le &lt;strong&gt;bootstrap qui va
initialiser notre connexion à la base de donnée.&lt;/strong&gt; En fait le &lt;code&gt;bootstrap&lt;/code&gt;
va charger le fichier de &lt;strong&gt;configuration
de l’application&lt;/strong&gt; et c’est dans ce fichier que l’on va définir les
paramètres de connexion a la &lt;code&gt;BDD&lt;/code&gt;. Il
faut donc éditer le fichier &lt;code&gt;application/configs/application.ini&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;; DATABASE
resources.db.adapter = "MYSQLI"
resources.db.params.host = "localhost"
resources.db.params.username = "budget"
resources.db.params.password = "budget"
resources.db.params.dbname = "budget"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si on veut que notre connexion à la &lt;code&gt;BDD&lt;/code&gt; soit géré automatiquement, le schémas
(ci dessus) est très rigide. En effet &lt;strong&gt;zend&lt;/strong&gt; va chercher automatiquement si
dans le &lt;code&gt;fichier de configuration&lt;/code&gt; il y a des constantes «&lt;code&gt;ressources.db.**&lt;/code&gt; »
de défini, et si oui il va essayé de se connecter à la base de donnée. Il est
bien sur possible d’avoir plusieurs connexions à différente &lt;code&gt;SGBD&lt;/code&gt; (&lt;strong&gt;mysql,
orable, DB2&lt;/strong&gt; …). Si vous utiliser &lt;strong&gt;mysql&lt;/strong&gt;, il suffit de copier / coller le
schémas ci dessus, et de bien remplacer les lignes : &lt;code&gt;host&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;,
&lt;code&gt;password&lt;/code&gt;et &lt;code&gt;dbname&lt;/code&gt; qui signifie respectivement : hôte, nom d’utilisateur,
mot de passe, nom de la BDD. Sinon l’&lt;code&gt;adpater&lt;/code&gt; est le &lt;code&gt;driver&lt;/code&gt; à utiliser pour
se connecter (&lt;code&gt;mysql&lt;/code&gt;, &lt;code&gt;orable&lt;/code&gt;, &lt;code&gt;DB2&lt;/code&gt;… ; se référer a la doc) ; &lt;code&gt;date_format&lt;/code&gt;
est le format de la date ; et &lt;code&gt;isDefaultTableAdapter&lt;/code&gt; est pour savoir si cette
connexion est la principale.&lt;/p&gt;

&lt;h2 id="schemas"&gt;Schémas de la table&lt;/h2&gt;

&lt;p&gt;On va utiliser un exemple pour bien mettre en place ce tuto. On va utiliser une
table d’utilisateur. Voilà le schémas :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CREATE TABLE IF NOT
EXISTS `users` (
  id int(50) NOT NULL auto_increment,
  *name` varchar(50) NOT NULL,
  firstname varchar(50) NOT NULL,
  email varchar(255) NOT NULL,
  *password` varchar(255) NOT NULL,
  phonenumber varchar(20) NOT NULL,
  *enable` int(1) NOT NULL,
  *level` int(1) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY email (email)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On a donc :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un id en auto-increment&lt;/li&gt;
&lt;li&gt;Un nom&lt;/li&gt;
&lt;li&gt;Un prénom&lt;/li&gt;
&lt;li&gt;Une adresse email&lt;/li&gt;
&lt;li&gt;Un mot de passe&lt;/li&gt;
&lt;li&gt;Un numéro de téléphone&lt;/li&gt;
&lt;li&gt;Un booléen pour savoir si l’utilisateur est activé&lt;/li&gt;
&lt;li&gt;Un entier pour avoir le niveau d’administration&lt;/li&gt;
&lt;li&gt;Une clé primaire et un index sur l’id&lt;/li&gt;
&lt;li&gt;Une clé unique et un index sur l’email&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="metier"&gt;Préparation de la classe métier.&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Zend&lt;/code&gt; commence à gérer de façon assez &lt;strong&gt;autonome et automatique les BDD&lt;/strong&gt;. Il y
a maintenant un gestionnaire &lt;strong&gt;CRUD&lt;/strong&gt; (&lt;code&gt;Create&lt;/code&gt;, &lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;=&gt;
Ajouter, Lire, Mettre a jour, Supprimer des enregistrements). Pour se faire il
faut créer une &lt;code&gt;class&lt;/code&gt; php. On est assez libre pour le nom des &lt;code&gt;class&lt;/code&gt; et pour
leurs emplacements, mais je vous recommanderai d’être assez &lt;strong&gt;logique et
rigoureux&lt;/strong&gt;. En fait il va falloir &lt;strong&gt;faire une **class&lt;/strong&gt; par table de
votre base de donnée**. Pour ma part, je mets presque toujours un « s » a la fin
du nom de mes tables, car elles contiennent plusieurs enregistrements. Par
exemple la table &lt;code&gt;users&lt;/code&gt; contient plusieurs utilisateurs. Il faut maintenant
créer une class qui représente cette table. On peut organiser ses &lt;code&gt;class&lt;/code&gt; comme
on veut, mais en général sur le petits projets je mets toutes mes &lt;code&gt;class&lt;/code&gt; dans
le dossier &lt;code&gt;application/models/DbTable/&lt;/code&gt;. De plus je nomme toujours ma class
avec le même nom que la table. A quoi doit ressembler la &lt;code&gt;class&lt;/code&gt; (&lt;a href="../zend/zend-comment-utiliser-un-model.html" title="Zend : Comment utiliser un model ?"&gt;Voir la
convention de nommage des &lt;code&gt;models&lt;/code&gt;&lt;/a&gt;) :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php
class Model_DbTable_Users extends Zend_Db_Table {
    protected $_name = 'users';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour le nom de la &lt;code&gt;class&lt;/code&gt;, il faut se référer au model dans le Zend Framework.
Il faut étendre la &lt;strong&gt;class Zend_Db_Table&lt;/strong&gt;. Enfin il faut ajouter l’attribut
&lt;strong&gt;protected $_name&lt;/strong&gt; qui a pour valeur le &lt;strong&gt;nom de la table dans la base de
donnée&lt;/strong&gt;. Et voilà, le plus dur est fait. On a maintenant une &lt;code&gt;class&lt;/code&gt; qui
possède un bon nombre de méthode &lt;code&gt;CRUD&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="read"&gt;Obtenir et récupérer des enregistrements&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment obtenir tous les tuples d’une table ?&lt;/strong&gt; Si il n’y a pas de close
particulières, c’est super simple , on exécute le petit bout de code suivant :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private function getUsersAll()
{
    $dbUser = new Model_DbTable_Users();
    return $dbUser-&amp;gt;fetchAll()-&amp;gt;toArray();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Donc on instancie un nouveau &lt;code&gt;Model_DbTable_Users&lt;/code&gt;, et on lui demande la
retourner tous les enregistrements
grâce a la méthode &lt;code&gt;fetchAll&lt;/code&gt;, et enfin on convertit le résultats en
tableau. Voilà le tours est joué !
&lt;strong&gt;Comment obtenir que certains enregistrements ?&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private function getUsersByName($name = '')
{
    $dbUser = new Model_DbTable_Users();
    return $dbUser-&amp;gt;fetchAll()-&amp;gt;toArray(array('name = ?'=&amp;gt;
    $name));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voilà, la méthode &lt;code&gt;fetchAll&lt;/code&gt; possède 4 arguments:
&lt;code&gt;$where&lt;/code&gt;, &lt;code&gt;$order&lt;/code&gt;,&lt;code&gt;$count&lt;/code&gt;,&lt;code&gt;$offset&lt;/code&gt; qui représente respectivement la clause
&lt;code&gt;where&lt;/code&gt;, le clause &lt;code&gt;order by&lt;/code&gt; , et la clause &lt;code&gt;limit&lt;/code&gt; (combien d’enregistrement
et à partir de l’enregistrement numéro n ). Pour une utilisation plus poussé, je
vous recommande de lire la doc du Zend Framework.&lt;/p&gt;

&lt;h2 id="create"&gt;Ajouter un enregistrement&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment ajouter un enregistrement dans la base de donnée ?&lt;/strong&gt; Comme dans
l’exemple précédant, on va ajouter un nouvel utilisateur.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new
Model_DbTable_Users();
$row = $users-&amp;gt;createRow();
$row-&amp;gt;name = 'Nom';
$row-&amp;gt;firstname = 'Prenom';
$row-&amp;gt;email = 'email';
$row-&amp;gt;password = md5('password');
$row-&amp;gt;phonenumber = '0102030405';
$row-&amp;gt;enable = 1;
$row-&amp;gt;level = 9;
$result = $row-&amp;gt;save();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence par instanciée un nouveau &lt;code&gt;Model_DbTable_Users&lt;/code&gt;. Ensuite on crée
une ligne, puis on ajoute a cette ligne les différents attributs, et enfin on
sauvegarde cette ligne en table. On peut aussi faire la même chose en donnant a
la méthode &lt;code&gt;createRow&lt;/code&gt; un tableau en argument. :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new Model_DbTable_Users();
$datas = array(
    'name'=&amp;gt;'Nom',
    'firstname'=&amp;gt;'Prenom',
    'email'=&amp;gt;'email2',
    'password'=&amp;gt;md5('password'),
    'phonenumber'=&amp;gt;'0102030405',
    'enable'=&amp;gt;1,
    'level'=&amp;gt;9,
);
$row = $users-&amp;gt;createRow($datas);
$row-&amp;gt;save();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Enfin on peut faire beaucoup plus simple&lt;/strong&gt;. Je ne connais pas bien la
différence entre les deux méthodes (la précédente et la suivante), si quelqu’un
peut m’éclairer, je suis preneur.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new Model_DbTable_Users();
$datas = array(
    'name'=&amp;gt;'Nom',
    'firstname'=&amp;gt;'Prenom',
    'email'=&amp;gt;'email3',
    'password'=&amp;gt;md5('password'),
    'phonenumber'=&amp;gt;'0102030405',
    'enable'=&amp;gt;1,
    'level'=&amp;gt;9,
);
$row = $users-&amp;gt;insert($datas);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bon, c’est assez simple d’ajouter un enregistrement en table ? On va un peu plus
loin. Comment &lt;strong&gt;protéger ses enregistrements en table grâce a une
**transaction SQL&lt;/strong&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new Model_DbTable_Users();
$datas = array(
    'name'=&amp;gt;'Nom',
    'firstname'=&amp;gt;'Prenom',
    'email'=&amp;gt;'email3',
    'password'=&amp;gt;md5('password'),
    'phonenumber'=&amp;gt;'0102030405',
    'enable'=&amp;gt;1,
    'level'=&amp;gt;9,
);
$defaultAdaptateur = Zend_Db_Table::getDefaultAdapter();
$defaultAdaptateur-&amp;gt;beginTransaction();
try {
    $defaultAdaptateur-&amp;gt;insert('users', $datas);
    $defaultAdaptateur-&amp;gt;commit();
} catch (Exception $e) {
    $defaultAdaptateur-&amp;gt;rollBack();
    echo $e-&amp;gt;getMessage();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On commence de la même façon que pour la dernière méthode. Ensuite on récupère
l’&lt;code&gt;adaptateur&lt;/code&gt; de la base de donnée principale puis on commence une
&lt;code&gt;transaction&lt;/code&gt;. Il faut ensuite en-capsuler notre ajout à la base dans un bloque
&lt;code&gt;try-catch&lt;/code&gt;. On essaye d’insérer notre enregistrement puis si ça fonctionne on
&lt;code&gt;commit&lt;/code&gt;. Si ça ne fonctionne pas on fait un &lt;code&gt;rollback&lt;/code&gt;et on affiche les
messages. &lt;strong&gt;Bien sur il est possible de n’utiliser qu’un bloque try-catch&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="update"&gt;Mettre a jour un enregistrement&lt;/h2&gt;

&lt;p&gt;La méthode ici est très similaire à l’ajout d’un enregistrement. On peut mettre
a jour uniquement qu’une seule ligne ou tout un groupes de ligne. Dans cet
exemple on remplace tous les enregistrements ou l’attribut name est « Nom » par
« Nom2 ».&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new Model_DbTable_Users();
$datas = array('name'=&amp;gt;'Nom2');
$users-&amp;gt;update($datas,array('name = ?'=&amp;gt;'Nom'));
$this-&amp;gt;render('index');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici les &lt;code&gt;$datas&lt;/code&gt; sont les données qu’on va mettre a jour. La méthode &lt;code&gt;updates&lt;/code&gt;va tout faire. Le premier arguments est le &lt;strong&gt;tableau de donnée&lt;/strong&gt;, le second
argument correspond aux &lt;strong&gt;conditions de la clause **where&lt;/strong&gt;. Dans ce cas la
on explicite que l’attribut name doit correspondre a Nom.&lt;/p&gt;

&lt;h2 id="delete"&gt;Supprimer un enregistrement&lt;/h2&gt;

&lt;p&gt;Cette dernier action est la plus simple, il suffit de &lt;strong&gt;bien formuler la
clause **where&lt;/strong&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$users = new Model_DbTable_Users();
$users-&amp;gt;delete(array('name = ?'=&amp;gt;'Nom2'));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici on supprimer tous les utilisateurs qui ont pour valeur d’attribut name :
Nom2.&lt;/p&gt;

&lt;h2 id="extend"&gt;Extension de la class métier&lt;/h2&gt;

&lt;p&gt;Bien entendu, on peut ajouter des méthodes particulières a notre &lt;code&gt;class&lt;/code&gt; métier.
Comme par exemple pour avoir le nombre d’enregistrement :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function getUserCount()
{
    $sql = 'select count(1) cnt from users';
    $stmt = $this-&amp;gt;_db-&amp;gt;query($sql);
    $results = $stmt-&amp;gt;fetchAll();
    if ((sizeof($results) &amp;gt; 0) &amp;amp;&amp;amp; (isset($results[0]['cnt']))) {
        return $results[0]['cnt'];
    }
    throw new Exception("Erreur : impossible d'obtenir le nombre
    d'utilisateur");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;On peut bien sur en-capsuler un update, une suppression dans un block try-catch
et de plus on est pas obligé d’utiliser les transaction sql qui sont quand même
plus lourde. On verra dans un prochain tuto comme utiliser les clés étrangères.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/GC7vcjAH2tw" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/comment-gerer-une-base-de-donnee-avec-le-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>Comment mettre en place un systeme de traduction dans Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/mettre-en-place-un-systeme-de-traduction-dans-zend-framework.html</id>
                <updated>2009-10-15T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/_x4iwuplnCE/mettre-en-place-un-systeme-de-traduction-dans-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Avoir un site, c’est bien, mais c’est encore mieux si on peut le &lt;strong&gt;traduire
facilement dans plusieurs langues&lt;/strong&gt;. On va voir ensemble comment mettre en place
un &lt;strong&gt;fichier de traduction **avec **Zend_Translate&lt;/strong&gt; dans notre &lt;code&gt;application&lt;/code&gt;.
Il y a plusieurs moyens de gérer les &lt;strong&gt;traductions&lt;/strong&gt; avec &lt;strong&gt;Zend Framework&lt;/strong&gt;.
Chacun a ses avantages et inconvénients. La je vais utiliser un simple fichier
&lt;code&gt;php&lt;/code&gt; qui va contenir un &lt;code&gt;tableau (array)&lt;/code&gt;avec les traductions. L’avantage du
tableau php : on peut &lt;strong&gt;facilement le mettre a jour&lt;/strong&gt;, il est &lt;strong&gt;lisible par un
humain&lt;/strong&gt;. Par contre il a un inconvénient : Si l’application est énorme, on
&lt;strong&gt;aura des problème de performance&lt;/strong&gt;. A vous de bien choisir la gestion de la
traduction.&lt;/p&gt;

&lt;h2&gt;Le fichier de traduction :&lt;/h2&gt;

&lt;p&gt;Il faut le placer dans le dossier : &lt;code&gt;application/languages/&lt;/code&gt;. Pour le nom on va
être créatif et l’appeler &lt;code&gt;fr.php&lt;/code&gt; pour la traduction en français. Il ressemble
a ça :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php
return array(
    'key_1'=&amp;gt;'Traduction 1',
    'key_2'=&amp;gt;'Traduction 2',
);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Donc quand on va utiliser la &lt;code&gt;pseudo-variable&lt;/code&gt; &lt;strong&gt;key_1&lt;/strong&gt;, l’application
&lt;strong&gt;traduira automatiquement **key_1&lt;/strong&gt; en &lt;strong&gt;Traduction 1&lt;/strong&gt; (bien sur si on est
en &lt;code&gt;français&lt;/code&gt; dans l’application. Sinon j’ai dit &lt;code&gt;pseudo-variable&lt;/code&gt; car on
utilise &lt;strong&gt;key_1&lt;/strong&gt; d’une façon bien particulières. Tout dépend du contexte. On va
y venir...&lt;/p&gt;

&lt;h2&gt;Le bootstrap&lt;/h2&gt;

&lt;p&gt;Il faut bien entendu « dire » à notre application qu’il faut qu’elle utilise les
traductions et il faut aussi lui donner une &lt;strong&gt;langue par défaut&lt;/strong&gt;. On peut même
faire en sorte que l’application choisisse elle même la langue en fonction de la
position géographique de l’utilisateur final, mais la j’y reviendrais dans un
prochain tuto. Voilà, on ajoute ce code dans notre &lt;code&gt;bootstrap&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
* Initialize Translation
*
* @return Zend_Translate
*/
public function _initTranslate()
{
    $translate = new Zend_Translate('array', APPLICATION_PATH . '/languages/fr.php', 'fr');

    return Zend_Registry::set('Zend_Translate', $translate);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;voilà on peut maintenant utiliser notre fichier de traduction :&lt;/p&gt;

&lt;h2&gt;Dans un model :&lt;/h2&gt;

&lt;p&gt;Ici c’est (relativement extrêmement) simple. Par exemple si on veut mettre un
&lt;code&gt;label&lt;/code&gt; a un &lt;code&gt;élément&lt;/code&gt; d’un &lt;code&gt;formulaire&lt;/code&gt;&lt;span style="font-style: normal;"&gt;
(&lt;/span&gt;&lt;code&gt;Zend_Element&lt;/code&gt;, &lt;code&gt;Zend_Form&lt;/code&gt;), et bien sur le traduire il n’y a rien a
faire, il suffit de donner a la méthode &lt;code&gt;setLabel&lt;/code&gt; la &lt;code&gt;clé&lt;/code&gt; de notre tableau qui
est dans le fichier &lt;code&gt;fr.php&lt;/code&gt;. Par exemple pour un champs &lt;code&gt;password&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$password = new Zend_Form_Element_Password(‘password’);
$password-&amp;gt;setLabel(‘form_user_add_password’);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et dans notre fichier fr.php :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;'form_user_add_password'=&amp;gt;'Mot de passe : ',
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;**Petit tips **: Si on a besoin de traduire des messages d'erreurs liés aux
validateurs (&lt;code&gt;Zend_Validate&lt;/code&gt;) d'éléments du formulaire il faut ajouter dans le
fichier de traduction, le message original renvoyé par le validateur. On peu
trouvé &lt;a href="http://framework.zend.com/manual/fr/zend.validate.messages.html"&gt;les messages originaux ici&lt;/a&gt; (merci guiton)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//Pour la validation : valeur requise
'Value is required and can't be empty'=&amp;gt;'la valeur est requise',
//Pour la validation : Le champs values est deja dans la BDD
'A record matching %value% was found'=&amp;gt;'Il y a déja '%value%' dans la BDD',
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Comme on peut le voir sur le deuxième exemple, on peut récupérer le
paramètre %value% directement dans le
message traduit. C'est la valeur qui a été saisi par l'utilisateur.&lt;/p&gt;

&lt;h2&gt;Dans une vue (view) :&lt;/h2&gt;

&lt;p&gt;Si on a besoin d'une traduction dans une vue, la c'est un tout petit peu
plus compliqué :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo $this-&amp;gt;translate('view_user_add')?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et dans notre fichier fr.php :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;'view_user_add'=&amp;gt;'Ajouter un utilisateur',
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voilà, c'est assez simple, si on veut la traduction de '&lt;code&gt;key_1&lt;/code&gt;' il suffit
de faire&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;translate('key_1')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bon voilà on a fait le tours ! Enfin il me semble. Il y a des questions ou
des remarques ?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/_x4iwuplnCE" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/mettre-en-place-un-systeme-de-traduction-dans-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>Comment gérer la navigation de son site avec le Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/gerer-la-navigation-de-son-site-avec-le-zend-framework.html</id>
                <updated>2009-10-08T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/hr3k2a8VDAc/gerer-la-navigation-de-son-site-avec-le-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Dans ce tuto on va voir comment
mettre en place un système automatique de &lt;strong&gt;navigation&lt;/strong&gt; dans le &lt;strong&gt;Zend
Framework&lt;/strong&gt;. C’est a dire que notre &lt;strong&gt;menu de navigation soit dynamique et
flexible&lt;/strong&gt;. On pourra par exemple avoir notre &lt;strong&gt;chemin de navigation ou fil de
navigation&lt;/strong&gt;. On va donc utiliser le composant &lt;strong&gt;Zend_Navigation&lt;/strong&gt;. On a
plusieurs possibilité pour la gestion et le stockage de l’arbre (ou graphe) de
navigation. Moi j’ai choisit le &lt;code&gt;XML&lt;/code&gt; pour le stockage, et la gestion par
&lt;code&gt;module&lt;/code&gt;, &lt;code&gt;controller&lt;/code&gt; et &lt;code&gt;action&lt;/code&gt;. Enfin on utilise aussi la traduction
automatique ;)&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#intro"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bootstrap"&gt;Bootstrap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#layout"&gt;Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hierarchie"&gt;Hiérarchie de pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#css"&gt;Classe css de la page en cours&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fil"&gt;Fil de Navigation ou breadcrumbs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="intro"&gt;Introduction&lt;/h2&gt;

&lt;p&gt;On commence par un aperçu de notre fichier de navigation :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;configdata&amp;gt;
&amp;lt;nav&amp;gt;
    &amp;lt;home&amp;gt;
        &amp;lt;label&amp;gt;nav_home&amp;lt;/label&amp;gt;
        &amp;lt;controller&amp;gt;index&amp;lt;/controller&amp;gt;
    &amp;lt;/home&amp;gt;
&amp;lt;/nav&amp;gt;
&amp;lt;/configdata&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Petite explication : la balise &lt;code&gt;configdata&lt;/code&gt; ne sert que de nœud racine, la
balise &lt;code&gt;nav&lt;/code&gt; sert a repérer notre section de la gestion de la &lt;span style="font-
style: normal;"&gt;navigation&lt;/span&gt;. Dans mon cas je n’utilise le fichier
&lt;code&gt;navigation.xml&lt;/code&gt; que pour gérer la navigation, pour on pourrait envisager de
n’avoir qu’un seul gros fichier xml pour gérer toutes nos données et variables
de l’application. Ensuite on a une balise &lt;code&gt;home&lt;/code&gt;, elle représente un lien du
&lt;strong&gt;menu&lt;/strong&gt;, on lui donne le nom qu’on veut, elle va représenter dans notre cas la
page &lt;code&gt;d’accueil&lt;/code&gt;. Elle a pour classe fille une balise &lt;code&gt;label&lt;/code&gt; qui définit le nom
du lien. J’utilise &lt;code&gt;nav_home&lt;/code&gt; car dans mon fichier de traduction j’ai une clé
&lt;code&gt;nav_home&lt;/code&gt; qui fait référence a &lt;code&gt;home&lt;/code&gt;. Enfin il y a une balise &lt;code&gt;controller&lt;/code&gt; qui
définit sur quel &lt;code&gt;controller&lt;/code&gt; pointe le futur lien. Il est bien sur possible de
sélectionner une &lt;code&gt;action&lt;/code&gt; avec la balise &lt;code&gt;action&lt;/code&gt; et un &lt;code&gt;module&lt;/code&gt; avec la balise
&lt;code&gt;module&lt;/code&gt;. C’est bien fait non ? Sinon il est possible aussi d’avoir un liens
direct grâce a la balise &lt;code&gt;uri&lt;/code&gt;. Un petit exemple qui regroupe tout les cas :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;configdata&amp;gt;
    &amp;lt;nav&amp;gt;
        &amp;lt;home&amp;gt;
            &amp;lt;label&amp;gt;nav_home&amp;lt;/label&amp;gt;
            &amp;lt;controller&amp;gt;index&amp;lt;/controller&amp;gt;
        &amp;lt;/home&amp;gt;
        &amp;lt;page2&amp;gt;
            &amp;lt;label&amp;gt;Page 2&amp;lt;/label&amp;gt;
            &amp;lt;module&amp;gt;mon_module&amp;lt;/module&amp;gt;
            &amp;lt;controller&amp;gt;mon_controller&amp;lt;/controller&amp;gt;
            &amp;lt;action&amp;gt;mon_action&amp;lt;/action&amp;gt;
        &amp;lt;/home&amp;gt;
        &amp;lt;home&amp;gt;
            &amp;lt;label&amp;gt;nav_home&amp;lt;/label&amp;gt;
            &amp;lt;uri&amp;gt;/foo/bar/&amp;lt;/uri&amp;gt;
        &amp;lt;/home&amp;gt;
    &amp;lt;/nav&amp;gt;
&amp;lt;/configdata&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="bootstrap"&gt;Bootstrap&lt;/h2&gt;

&lt;p&gt;Il faut rajouter une méthode a notre &lt;strong&gt;bootstrap&lt;/strong&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * @return Zend_Navigation
 */
protected function _initNavigation() {
    $view =
    $this-&amp;gt;bootstrap('layout')-&amp;gt;getResource('layout')-&amp;gt;getView();
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
    $view-&amp;gt;navigation(new Zend_Navigation($config));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La seule chose a retenir ici est le premier argument de la méthode
&lt;strong&gt;Zend_Config_Xml&lt;/strong&gt; : c’est le chemin de notre &lt;strong&gt;fichier de navigation&lt;/strong&gt; et le
deuxième argument représente la balise mère de notre &lt;code&gt;section de navigation&lt;/code&gt;
dans le fichier &lt;code&gt;xml&lt;/code&gt;. Voilà, on a notre fonction de navigation disponible dans
notre application. Il suffit maintenant de l’utiliser.&lt;/p&gt;

&lt;h2 id="layout"&gt;Layout&lt;/h2&gt;

&lt;p&gt;Histoire de faire le plus simple possible, on va ajouter notre barre de
navigation directement dans le &lt;code&gt;layout&lt;/code&gt;, histoire de le retrouver sur toutes les
pages. Il suffit de rajouter ce bout de code dans le fichier &lt;code&gt;layout.phtml&lt;/code&gt; à
l’endroit ou vous voulez que le menu s’affiche :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo $this-&amp;gt;navigation()-&amp;gt;menu(); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="hierarchie"&gt;Hiérarchie de pages&lt;/h2&gt;

&lt;p&gt;On va voir maintenant un exemple de fichier xml ou il y a plusieurs pages et
sous pages &lt;img class="alignright size-full wp-image-735" title="navigation-
Menu" src="../wp-content/uploads/2009/10/navigation-Menu.png"
alt="navigation-Menu" width="208" height="156" /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;configdata&amp;gt;
&amp;lt;nav&amp;gt;
    &amp;lt;home&amp;gt;
        &amp;lt;label&amp;gt;nav_home&amp;lt;/label&amp;gt;
        &amp;lt;controller&amp;gt;index&amp;lt;/controller&amp;gt;
        &amp;lt;pages&amp;gt;
            &amp;lt;add&amp;gt;
                &amp;lt;label&amp;gt;nav_fact_add&amp;lt;/label&amp;gt;
                &amp;lt;controller&amp;gt;fact&amp;lt;/controller&amp;gt;
                &amp;lt;action&amp;gt;add&amp;lt;/action&amp;gt;
            &amp;lt;/add&amp;gt;
            &amp;lt;list&amp;gt;
                &amp;lt;label&amp;gt;nav_fact_list&amp;lt;/label&amp;gt;
                &amp;lt;controller&amp;gt;fact&amp;lt;/controller&amp;gt;
            &amp;lt;/list&amp;gt;
            &amp;lt;calc&amp;gt;
                &amp;lt;label&amp;gt;nav_calc&amp;lt;/label&amp;gt;
                &amp;lt;controller&amp;gt;calc&amp;lt;/controller&amp;gt;
            &amp;lt;/calc&amp;gt;
            &amp;lt;user&amp;gt;
                &amp;lt;label&amp;gt;nav_user&amp;lt;/label&amp;gt;
                &amp;lt;controller&amp;gt;user&amp;lt;/controller&amp;gt;
            &amp;lt;/user&amp;gt;
            &amp;lt;stats&amp;gt;
                &amp;lt;label&amp;gt;nav_sats&amp;lt;/label&amp;gt;
                &amp;lt;controller&amp;gt;stats&amp;lt;/controller&amp;gt;
            &amp;lt;/stats&amp;gt;
        &amp;lt;/pages&amp;gt;
    &amp;lt;/home&amp;gt;
&amp;lt;/nav&amp;gt;
&amp;lt;/configdata&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voilà, **la balise a retenir **est la balise &lt;code&gt;pages&lt;/code&gt; qui permet de définir des
sous pages ou sous menu. Et bien sur on peut en imbriquer autant qu’on veut.
Enfin il faut savoir que le code &lt;code&gt;html&lt;/code&gt; des liens sur la page suit une
hiérarchie de balise &lt;code&gt;ul/li&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="css"&gt;Classe css de la page en cours&lt;/h2&gt;

&lt;p&gt;Comment ajouter une classe au &lt;code&gt;lien&lt;/code&gt; qui pointe vers &lt;strong&gt;la page en cours&lt;/strong&gt; ? Et
bien il suffit de rajouter ce bout de code en haut de chaque &lt;code&gt;controller&lt;/code&gt; (dans
la méthode &lt;code&gt;init&lt;/code&gt;) :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function init()
{
    /` Initialize action controller here `/
    $activeNav =
    $this-&amp;gt;view-&amp;gt;navigation()-&amp;gt;findByController('index');
    $activeNav-&amp;gt;active = true;
    $activeNav-&amp;gt;setClass("active");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et voilà maintenant quand on est sur une page du &lt;code&gt;controller&lt;/code&gt; &lt;code&gt;index&lt;/code&gt; (dans ce
cas la) et bien le lien aura (entre autre) la classe &lt;code&gt;active&lt;/code&gt;. Il suffit après
de toucher au &lt;code&gt;css&lt;/code&gt; pour ajouter un petit effet ;)&lt;/p&gt;

&lt;p&gt;Vous en voulez encore plus ?&lt;/p&gt;

&lt;h2 id="fil"&gt;Fil de Navigation ou &lt;strong&gt;breadcrumbs&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img class="alignright size-full wp-image-736" title="navigation-fil" src="../wp-content/uploads/2009/10/navigation-fil.png" alt="navigation-
fil" width="296" height="41" /&gt;&lt;/p&gt;

&lt;p&gt;Et bien avec &lt;code&gt;Zend_Navigation&lt;/code&gt;on peut retracer notre &lt;strong&gt;chemin de navigation&lt;/strong&gt;,
qui soit dit en passant est très bon en terme d’ergonomie, mais aussi en terme
de référencement. Donc je vous invite vraiment à le mettre en place. Encore une
fois, il suffit de rajouter une ligne de &lt;code&gt;php&lt;/code&gt; dans le fichier &lt;code&gt;layout.phtml&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo $this-&amp;gt;navigation()-&amp;gt;breadcrumbs()-&amp;gt;setMinDepth(0)-&amp;gt;setLinkLast(true)-&amp;gt;setSeparator(" &amp;gt;&amp;gt; "); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alors on décortique le bousin :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$this-&amp;gt;navigation()-&amp;gt;breadcrumbs()&lt;/code&gt; va afficher le &lt;strong&gt;fil de navigation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&amp;gt;setMinDepth(0)&lt;/code&gt; va définir si il faut ou pas afficher ce fil ; il est
en accord direct avec la profondeur du &lt;code&gt;xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&amp;gt;setLinkLast(true)&lt;/code&gt; définit si il faut ou pas mettre un liens sur le
dernier fils du fil de navigation qui correspond à la page en cours&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&amp;gt;setSeparator( » &amp;gt;&amp;gt; « )&lt;/code&gt; définit par quelle chaine de caractère
est séparer notre liste de liens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà, comme on a pu voir, le plus dur est de faire le fichier &lt;code&gt;xml&lt;/code&gt; ainsi que
le &lt;code&gt;css&lt;/code&gt; des menus. Après c’est un jeux d’enfant pour avoir de beau menu ;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/hr3k2a8VDAc" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/gerer-la-navigation-de-son-site-avec-le-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>Télécharger automatiquement des .torrent sur un PC Ubuntu distant</title>
                <id>http://blog.lyrixx.info/ubuntu/telecharger-automatiquement-des-torrent-sur-un-serveur-distant.html</id>
                <updated>2009-09-27T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/RISK4SshEYA/telecharger-automatiquement-des-torrent-sur-un-serveur-distant.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Il m’arrive souvent de vouloir télécharger quelque chose alors que je suis en
cours ou au boulot, mais c’est souvent difficile pour diverses raisons. Une
solution est d’utiliser un serveur @home et de le configurer pour qu’il
télécharge automatiquement des fichiers .torrent. Voici une façon de bidouiller
ça ;)&lt;/p&gt;

&lt;p&gt;Pour commencez nous allons utiliser le client BitTorrent
&lt;a title="Deluge" href="http://deluge-torrent.org/" target="_blank"&gt;Deluge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pour l’installer :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vistez le &lt;a title="doc ubuntu fr sur deluge" href="http://doc.ubuntu-
fr.org/deluge" target="_blank"&gt;site de la doc ubuntu fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ou si vous avez accès au dépot Universe : &lt;a title="Installer Déluge"
href="apt://deluge-torrent" target="_blank"&gt;deluge-torrent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une fois installé, il faut lancer deluge&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application &gt; Internet &gt; Deluge BitTorrent Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aller dans&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editer &gt; Préférences&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puis cocher la checkox correspondant à :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ajouter automatiquement les .torrent provenant de&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enfin, choisir le dossier dans lequel seront ajoutés les fichiers .torrent que
l’on souhaite  télécharger (par exemple :  &lt;code&gt;/home/user/torrent&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;A partir de là il ne reste plus qu’à trouver un moyen d’envoyer  à distance nos
fichiers torrents dans le bon répertoire.  les moyens sont nombreux….On peut par
exemple  :&lt;/p&gt;

&lt;p&gt;utilisez un &lt;strong&gt;serveur FTP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ou&lt;/strong&gt; utilisez le script suivant, puis éditer afin de changer la variable
&lt;strong&gt;$destination_folder&lt;/strong&gt; en lui donnant le chemin absolu vers le répertoire de
deluge que l’on a choisi précedemment.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    ini_set('display_errors', 1);
    error_reporting(-1);

    $destination_folder = '/home/arnaud/Torrent'; // A CHANGER

    $destination_folder = trim($destination_folder);
    while (strcasecmp(substr($destination_folder, strlen($destination_folder)-1,1),'/') == 0) {
        $destination_folder = substr($destination_folder,0,strlen($destination_folder)-1);
    }
    $extension = '.torrent';
    $file_tmp_name = 'tmp';

    $url = isset($_GET['url']) ? $_GET['url'] : null;

    $form = &amp;lt;&amp;lt;&amp;lt;EOL
&amp;lt;div id="form"&amp;gt;
    &amp;lt;form action="index.php" method="GET"&amp;gt;
        &amp;lt;label&amp;gt;Entrez une URL : &amp;lt;/label&amp;gt;
        &amp;lt;input type="text" name="url" value="'.$_['url'].'"/&amp;gt;&amp;lt;br/&amp;gt;
        &amp;lt;input type="submit" name ="submit" value="Get it ! "/&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
EOL;
?&amp;gt;
&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&amp;gt;
    &amp;lt;html&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;
            &amp;lt;title&amp;gt;Remote Download Section&amp;lt;/title&amp;gt;
            &amp;lt;style&amp;gt;
                .spacer {width:100%; height:30px;}
                #form {width:600px; border:1px solid black;}
                form {padding-top:10px}
            &amp;lt;/style&amp;gt;
        &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;center&amp;gt;
            &amp;lt;?php if (isset($url)) : ?&amp;gt;
                &amp;lt;?php
                    while (file_exists($destination_folder.'/'.$file_tmp_name.$extension)) {
                        $file_tmp_name .= ''.rand(0,9);
                    }
                    $file_name = $file_tmp_name.$extension;
                    $result = copy($post,$destination_folder.'/'.$file_name);
                    if ($result === true) {
                        echo '&amp;lt;h1&amp;gt;Téléchargement du fichier réussi&amp;lt;/h1&amp;gt;';
                    } else {
                         echo '&amp;lt;h1&amp;gt;Téléchargement du fichier échoué&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;L\'url fournie n\'est peut être pas correcte&amp;lt;/p&amp;gt;';
                         &amp;lt;?php echo $form ?&amp;gt;
                         echo '&amp;lt;p&amp;gt;Vous pouvez également utiliser une URL de la forme : http://monserveur/index.php?trt=lien_vers_le_fichier&amp;lt;/p&amp;gt;';
                    }
                ?&amp;gt;
            &amp;lt;?php else: ?&amp;gt;
                &amp;lt;h1&amp;gt;Remote Download Section&amp;lt;/h1&amp;gt;
                    &amp;lt;div class="spacer"&amp;gt;&amp;lt;/div&amp;gt;
                    &amp;lt;?php echo $form ?&amp;gt;
            &amp;lt;?php endif ?&amp;gt;
        &amp;lt;/center&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Il faut que le script est le droit d’écrire dans le répertoire :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chmod a+w mon_repertoire
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Puis copier dans &lt;strong&gt;/var/www/mondossier/&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Et enfin ce script vous permettra de copier  les .torrent dans le bon répertoire
en tapant l’url dans votre navigateur favori :
&lt;code&gt;http://localhost/index.php?trt=url_du_.torrent&lt;/code&gt; et de lancer ainsi le
téléchargement du torrent dans deluge !&lt;/p&gt;

&lt;p&gt;La meilleur solution aurait été à mon avis un petit plugin qui permettrai
d’envoyer directement le .torrent depuis son navigateur internet.&lt;/p&gt;

&lt;p&gt;Pensez également à  lancer automatiquement Déluge au démarrage du PC. Pour ce
faire allez dans &lt;strong&gt;Système &gt; Préférences &gt; Applications au démarrage&lt;/strong&gt; , cliquez
sur ajouter et saisissez &lt;strong&gt;/usr/bin/deluge&lt;/strong&gt; dans le champs « Commande » .&lt;/p&gt;

&lt;p&gt;Voila, on peut maintenant télécharger son film du soir quand on y pense au
boulot :p&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/RISK4SshEYA" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/ubuntu/telecharger-automatiquement-des-torrent-sur-un-serveur-distant.html</feedburner:origLink></entry>
        <entry>
        <title>Zend Framework 1.9 : Comment lier une feuille de style css ou un js au layout</title>
                <id>http://blog.lyrixx.info/zend/zend-framework-1-9-lier-une-feuille-de-style-css-ou-un-js-au-layout.html</id>
                <updated>2009-09-24T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/5Z6O80SuuX8/zend-framework-1-9-lier-une-feuille-de-style-css-ou-un-js-au-layout.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Comment lier un &lt;strong&gt;css&lt;/strong&gt; et un &lt;strong&gt;js&lt;/strong&gt; dans un projet &lt;strong&gt;zend framework&lt;/strong&gt; (a partir
de la 1.9) directement dans le &lt;strong&gt;layout&lt;/strong&gt; ?&lt;/p&gt;

&lt;p&gt;Et bien a partir de la version 1.9, c’est vraiment très simple dans la mesure ou
l’équipe de ZF a intégré un script de vue (view helper) directement dans la
librairie. Du coup il suffit de rajouter la ligne suivante dans le fichier de
layout (&lt;span style="text-decoration:
underline;"&gt;application/layout/scripts/main.phtml&lt;/span&gt;), entre les balises
&lt;head&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel="stylesheet" type="text/css" media="screen,projection" href="&amp;lt;?php echo $this-&amp;gt;baseUrl();?&amp;gt;/styles/design.css"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dans ce cas, mon fichier css est dans le dossier : &lt;code&gt;public/styles/design.css&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Voila, maintenant pour un js c’est le même principe ;) :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script type="text/javascript" src="&amp;lt;?php echo $this-&amp;gt;baseUrl();?&amp;gt;/styles/main.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/5Z6O80SuuX8" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-framework-1-9-lier-une-feuille-de-style-css-ou-un-js-au-layout.html</feedburner:origLink></entry>
        <entry>
        <title>Comment mettre en place un backup sur son serveur dedié ?</title>
                <id>http://blog.lyrixx.info/ubuntu/comment-mettre-en-place-un-backup-sur-son-serveur-dedie.html</id>
                <updated>2009-07-24T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/LRjcnwHVFCU/comment-mettre-en-place-un-backup-sur-son-serveur-dedie.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Comment mettre en place un &lt;strong&gt;système de backup automatique sur son serveur
dédié&lt;/strong&gt; qui tourne sous linux ? Et bien rien de bien compliqué, il suffit de
lire ce qui va suivre pour &lt;strong&gt;s'auvegarder les dossiers que vous voulez&lt;/strong&gt; :
&lt;strong&gt;/home&lt;/strong&gt;,  les svn, &lt;strong&gt;les bases de données&lt;/strong&gt; etc ...&lt;/p&gt;

&lt;p&gt;Il y a un petit outils qui va quasiment faire tout le travail pour nous :
backup-manager &lt;a href="http://doc.ubuntu-fr.org/backup-manager"
target="_blank"&gt; Tuto sur le site d'Ubuntu-Fr&lt;/a&gt;. Je me suis insipiré de ce
tuto pour ecrire celui que vous etes en train de lire.&lt;/p&gt;

&lt;p&gt;Pour utiliser ce logiciel, et facon plus général, il vaut mieux etre en root
pour effectuer toute le prochaine opération. on passe donc en root :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo su
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Comment sauvegarder les répertoires ?&lt;/h2&gt;

&lt;p&gt;Alors on commence par installer backup manager :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get install backup-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ensuite il faut répondre aux différente questions (de tête, je ne m’en souvient
plus) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emplacement du répertoire de sauvergarde&lt;/li&gt;
&lt;li&gt;Emplacement des repertoires a sauvegarder&lt;/li&gt;
&lt;li&gt;Utilisateur qui sauvergarde&lt;/li&gt;
&lt;li&gt;Droit des fichiers sauvegarder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous ne savez pas quoi mettre laissez les options par default. Par contre si
vous voulez modifier ces options, on peut refaire la configuration, de facon
plus complète avec plus d’options :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dpkg-reconfigure backup-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Allez on y va ensemble : donc on saisi :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Le chemin du dossier qui recevra les archives&lt;/li&gt;
&lt;li&gt;L’utilisateur propriétaire du dossier&lt;/li&gt;
&lt;li&gt;Son groupe&lt;/li&gt;
&lt;li&gt;Le type de compression&lt;/li&gt;
&lt;li&gt;La fréquence des sauvegarde&lt;/li&gt;
&lt;li&gt;Si il faut ou pas suivre les liens symbolique. Laisser a non sauf si
vous etes vraiment sur de vous.&lt;/li&gt;
&lt;li&gt;Le format de nommage des archives&lt;/li&gt;
&lt;li&gt;La durée de vie des archives : la ça sert a rien de garder les archives
pendant plus d’une semaine…&lt;/li&gt;
&lt;li&gt;Les répertoires à sauvegarder.&lt;/li&gt;
&lt;li&gt;Les répertoires à exclure (oui oui celui ou y’a des vidéos nsfw)&lt;/li&gt;
&lt;li&gt;Si il faut ou non chiffre les archives, normalement y’en a pas
besoin. Sauf si la sauvegarde est expédié
sur le serveur d’un copain.&lt;/li&gt;
&lt;li&gt;Si il faut envoyer les archives sur un autre serveur (ftp ssh). Je n’ai
pas d’autre serveur, donc non.&lt;/li&gt;
&lt;li&gt;Si il faut graver un cd. Je suis sur un dédié qui est 300km de chez moi,
donc non&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Voila, donc a ce moment la il ne nous sauvegarde que nos repertoire /home et
/etc si vous avez laisser les options par default.&lt;/p&gt;

&lt;h2&gt;Comment sauvegarder les bases de données ?&lt;/h2&gt;

&lt;p&gt;Mais je veux qu’il me sauvegarde aussi mes bases de donnée : Pour ce faire il
suffit d’éditer un fichier :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nano /etc/backup-manager.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et de reperer les lignes suivante et les modifier :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# If you don't want to use any backup method (you don't want to
# build archives) then choose "none"

# Version de base

#export BM_ARCHIVE_METHOD="tarball mysql"

#Pour la gestion de la base de donnée

export BM_ARCHIVE_METHOD="tarball mysql"

## [...] ## =&amp;gt; la suite est vers la fin du fichier. Il suffit de renseigner les déférents champs.

##############################################################
# Backup method: MYSQl
#############################################################

# This method is dedicated to MySQL databases.
# You should not use the tarball method for backing up database
# directories or you may have corrupted archives.
# Enter here the list of databases to backup.
# Wildcard: __ALL__ (will dump all the databases in one archive)
export BM_MYSQL_DATABASES="__ALL__"

# The best way to produce MySQL dump is done by using the "--opt" switch
# of mysqldump. This make the dump directly usable with mysql (add the drop table
# statements), lock the tables during the dump and other things.
# This is recommended for full-clean-safe backups, but needs a
# privileged user (for the lock permissions).
export BM_MYSQL_SAFEDUMPS="true"

# The user who is allowed to read every databases filled in BM_MYSQL_DATABASES
export BM_MYSQL_ADMINLOGIN="root"

# its password
export BM_MYSQL_ADMINPASS=""

# the host where the database is
export BM_MYSQL_HOST="localhost"

# the port where MySQL listen to on the host
export BM_MYSQL_PORT="3306"

# which compression format to use? (gzip or bzip2)
export BM_MYSQL_FILETYPE="bzip2"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et voila, on a maintenant un &lt;strong&gt;backup de notre serveur&lt;/strong&gt; dans le dossier
*/var/archives/`. Il faut savoir qu’on peut aussi sauvegarder des svn. et qu’on
peut exporter le tout sur un autre serveur par exemple. Les protocoles supporter
sont :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scp&lt;/li&gt;
&lt;li&gt;ssh-gpg&lt;/li&gt;
&lt;li&gt;ftp&lt;/li&gt;
&lt;li&gt;rsync&lt;/li&gt;
&lt;li&gt;s3&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Comment je recupere toutes les archives ?&lt;/h2&gt;

&lt;p&gt;Comme je vous l’ai dit, je n’ai pas d’autre serveur sous la main. Donc je me
suis fait un petit script (.sh) que je peux lancer a la main :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash
ssh root@SERVEUR "tar -c /var/archives/`" &amp;gt; /CHEMIN/VERS/LE/DOSSIER/DE/RECEPTION/archives-$(date +%d%m%Y).tar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;et voila on a plus qu’a rendre ce script executable et a l’exécuter, et le tour
et jouer :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chmod +x getBackup.sh
./getBackup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et voila le tour est jouer. on a notre serveur qui fait des backups tout les
jours, et vous du coté client il n’y a plus qu’a exécuter le script tous les
jours...&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/LRjcnwHVFCU" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/ubuntu/comment-mettre-en-place-un-backup-sur-son-serveur-dedie.html</feedburner:origLink></entry>
        <entry>
        <title>Comment mettre en place un Layout avec le Zend-Framework 1.8</title>
                <id>http://blog.lyrixx.info/zend/comment-mettre-en-place-un-layout-avec-le-zend-framework-1-8.html</id>
                <updated>2009-07-23T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/LccYodUhXpY/comment-mettre-en-place-un-layout-avec-le-zend-framework-1-8.html" />
        <content type="html" xml:lang="en">&lt;p&gt;On va voir ensemble comment utiliser les &lt;strong&gt;Layouts&lt;/strong&gt;, &lt;strong&gt;placeholder&lt;/strong&gt;,
&lt;strong&gt;helper&lt;/strong&gt; dans le** Zend Framework** 1.8 (et supérieur). En effet, depuis la
version 1.8, la gestion n’est plus automatique, mais en 2 temps 3 mouvements
c’est réglé.&lt;/p&gt;

&lt;h2&gt;Qu’est ce qu’un Layout ?&lt;/h2&gt;

&lt;p&gt;Un &lt;code&gt;layout&lt;/code&gt; est un template, ou alors un squelette vide de votre site. Il n’y a
aucun contenu, il n’y a presque que du code HTML. Les layouts sont très
pratique, car ils permettent de ne pas avoir copier / coller tout le code html
identique sur chaque pages. On peut donc faire des &lt;code&gt;templates&lt;/code&gt; par defaut pour
un grand nombre de page.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dans tous les cas, un script de &lt;strong&gt;layout&lt;/strong&gt; est nécessaire. Les scripts de
  &lt;strong&gt;layout&lt;/strong&gt; utilisent simplement Zend_View (ou une implémentation particulière
  personnalisée). Les variables de &lt;strong&gt;layout&lt;/strong&gt; sont enregistrées dans le
  &lt;strong&gt;placeholder&lt;/strong&gt; &lt;strong&gt;Layout&lt;/strong&gt;, et peuvent être accédées via l’aide de vue
  &lt;strong&gt;placeholder&lt;/strong&gt; ou directement en tant que propriétés de l’objet &lt;strong&gt;layout&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p style="text-align: right;"&gt;
    D’après la
    &lt;a href="http://framework.zend.com/manual/fr/zend.layout.quickstart.html" target="_blank"&gt;
        documentation de Zend Framework
    &lt;/a&gt;
&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#exemple"&gt;Exemple de layout ou template général&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#layout"&gt;Mise en place du Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#comprendre"&gt;Comprendre les placeholders et les helpers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#helper"&gt;C’est quoi un helpers ou Script de Vue ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#placeholder"&gt;C’est quoi un placeholders ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#useplaceholder"&gt;Comment Utiliser un placeholders ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#changetitle"&gt;Comment faire pour changer le titre de ma page ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#explication"&gt;Explication : Implementation d’un placeholders dans un helper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="exemple"&gt;Exemple de layout ou template général.&lt;/h2&gt;

&lt;p&gt;Voici un exemple de &lt;code&gt;template&lt;/code&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/07/Exemple-de-template.png"
rel="lightbox[562]"&gt;&lt;img class="size-medium wp-image-566" title="Exemple de
template" src="../wp-content/uploads/2009/07/Exemple-de-
template-300x178.png" alt="Exemple de template" width="300" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On voit qu’on a diviser notre gabarit de page en quatre zones (complètement
arbitrairement) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En haut : le Header&lt;/li&gt;
&lt;li&gt;En bas : le Footer&lt;/li&gt;
&lt;li&gt;A gauche : le menu de navigation&lt;/li&gt;
&lt;li&gt;A droite : le contenu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici ce qu’est un &lt;code&gt;layout&lt;/code&gt; : &lt;strong&gt;le layout c’est la partie qui ne change pas :
Header, Footer, Menu.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id="layout"&gt;Mise en place du Layout.&lt;/h2&gt;

&lt;p&gt;Il faut commencer par choisir un emplacement pour les fichiers. Moi j’ai choisit
&lt;code&gt;APPLICATION_PATH "/layouts/scripts"&lt;/code&gt; (par défaut, cf la doc de Zend). Dans ce
dossier on va créer notre premier &lt;code&gt;layout&lt;/code&gt;, qu’on appellera : layouts.phtml.
L’extension &lt;code&gt;.phtml&lt;/code&gt; est l’extension standard pour les &lt;code&gt;layouts&lt;/code&gt; dans zend.&lt;/p&gt;

&lt;p&gt;Une fois ce fichier créé, il faut renseigner à zend qu’on va utiliser un
&lt;code&gt;layout&lt;/code&gt;. On va donc ajouter au fichier de configuration &lt;code&gt;application.ini&lt;/code&gt; ces
quelques lignes :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;LAYOUT
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Grâce a ces deux lignes, Zend va automatiquement chercher le script
&lt;code&gt;/layouts/scripts/layout.phtml&lt;/code&gt; et l’utiliser. A partir de ce moment, le script
de vues devient plus leger, avec seulement un partie du code html. Donc pour
&lt;strong&gt;résumer&lt;/strong&gt; : Dans le &lt;code&gt;layout&lt;/code&gt;, il y a beaucoup de HTML (balise html, head,
title, body) et dans les vues un peu plus de php et peu moins de html. OK ? Si
vous avez un doute &lt;a href="../zend/zend-comment-faire-une-vue.html"&gt;sur les &lt;code&gt;view&lt;/code&gt; (vue) c’est ici&lt;/a&gt;, et sur &lt;a href="../zend/zend-quest-ce-quun-controller.html"&gt;les
&lt;code&gt;controllers&lt;/code&gt; c’est la&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Maintenant on peut encore plus customiser (personnaliser)  notre &lt;code&gt;layout&lt;/code&gt;. Comme
lui mettre une titre par défaut, choisir son encodage, choisir son doc type etc…
Tout ce fait dans le bootstrap :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Initialize session
 *
 * @return Zend_View
 */
protected function _initView()
{
    // Initialize view
    $view = new Zend_View();
    $view-&amp;gt;doctype('XHTML1_STRICT');
    $view-&amp;gt;headTitle('Ma premiere application avec Zend');
    $view-&amp;gt;headMeta()-&amp;gt;appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
    // Add it to the ViewRenderer
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $viewRenderer-&amp;gt;setView($view);
    // Return it, so that it can be stored by the bootstrap

    return $view;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin il faut faire le fichier layouts.phtml&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo $this-&amp;gt;doctype() ?&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;headTitle() ?&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;headLink() ?&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;headStyle() ?&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;headScript() ?&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;headMeta() ?&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;layout()-&amp;gt;content ?&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila on a notre Layout en place. Maintenant, il s’agit de comprendre comment il
fonctionne.&lt;/p&gt;

&lt;h2 id="comprendre"&gt;Comprendre les placeholders et les helpers.&lt;/h2&gt;

&lt;p&gt;Si vous avez bien suivi le Tutos, vous avez vu que dans le bootstrap on a déjà
mis des valeurs par défault. Ces valeurs, normalement c’est la vue (view) qui
les passe aux layouts. Dans notre cas, le &lt;code&gt;bootstrap&lt;/code&gt; crée en avance le &lt;code&gt;layout&lt;/code&gt;
(je rappel que presque tout est objet). Néanmoins il reste bien évidemment
possible de changer ces valeurs.&lt;/p&gt;

&lt;h3 id="helper"&gt;C’est quoi un helpers ou Script de Vue ?&lt;/h3&gt;

&lt;p&gt;D’après la documentation de Zend :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dans vos scripts de vue, il est souvent nécessaire d’effectuer certaines
  actions complexes encore et encore : par exemple, formater une date, générer des
  éléments de formulaire, afficher des liens d’action. Vous pouvez utiliser des
  classes d’aide pour effectuer ce genre de tâches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Petite traduction : un &lt;code&gt;helper&lt;/code&gt; va être une classe que l’on va utiliser souvent
dans les vues. Il évite les taches répétitives. Par exemple une zone pour savoir
si l’utilisateur est loggué. Par contre la je vais vous laisser voir les exemple
directement sur la &lt;a href="http://framework.zend.com/manual/fr/zend.view.helpers.html"
target="_self"&gt;doc de Zend&lt;/a&gt;. D’ailleur on verra prochainement comment faire
un helper pour vérifier si la personne est loggué.&lt;/p&gt;

&lt;h3 id="placeholder"&gt;C’est quoi un placeholders ?&lt;/h3&gt;

&lt;p&gt;D’après la documentation de zend :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;L’aide de vue &lt;code&gt;Placeholder&lt;/code&gt; est utilisé pour faire persister le contenu entre
  les scripts de vues et les instances de vues. Il offre aussi des fonctionnalités
  utiles comme l’agrégation de contenu, la capture de contenu de scripts de vues
  pour une utilisation ultérieure, et l’ajout de texte pré ou post contenu (et la
  personnalisation des séparateurs de contenu).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Petite traduction. Les &lt;strong&gt;Placeholders&lt;/strong&gt; sont des genres de variables. On les
utilises pour faire passer du code HTML mis en forme (la pluspart du temps)
depuis la &lt;code&gt;vue&lt;/code&gt; vers le &lt;code&gt;layout&lt;/code&gt;. Vu que le &lt;code&gt;layout&lt;/code&gt; est générique, il faut
savoir rester général sur les noms des &lt;code&gt;placeholders&lt;/code&gt;. Enfin &lt;code&gt;les placeholders&lt;/code&gt;
sont persistants : c’est a dire qu’on peut les utilisers dans une première
&lt;code&gt;vue&lt;/code&gt;, puis dans une autre &lt;code&gt;vue&lt;/code&gt; ou dans un autre script…&lt;/p&gt;

&lt;h3 id="useplaceholder"&gt;Comment Utiliser un placeholders ?&lt;/h3&gt;

&lt;p&gt;Dans le &lt;code&gt;layout&lt;/code&gt;, le &lt;code&gt;placeholder&lt;/code&gt; s’utilise de cette façon  :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo $this-&amp;gt;placeholder('PH1');?&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;?php echo $this-&amp;gt;placeholder('PH2');?&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;?php echo $this-&amp;gt;placeholder('PH3');?&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour le layout, il n’y a pas 15 000 facon de les utiliser. Par contre dans une
vue, on peut les utilisers de plusieurs facon :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Comme une variable :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;placeholder('PH1')-&amp;gt;set("j'utilise mon placeholder PH1");
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comme un agrégateur de variables, avec plein d’outils mis a disposition.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;placeholder('PH2')-&amp;gt;exchangeArray(array(1,2,3));
$this-&amp;gt;placeholder('PH2')-&amp;gt;setPrefix("&amp;lt;ul&amp;gt;n &amp;lt;li&amp;gt;")
     -&amp;gt;setSeparator("&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;n")
     -&amp;gt;setIndent(4)
     -&amp;gt;setPostfix("&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;n");
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La on decoupe notre tableau gràce a la fonction &lt;code&gt;exchangeArray&lt;/code&gt;. Puis on rajoute
des balise html avant et après. Le code parle de lui même.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Comme un agrégateur de contenu&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php $this-&amp;gt;placeholder('PH3')-&amp;gt;captureStart(); ?&amp;gt;
    La on utilise notre&amp;lt;br&amp;gt;
    Placeholders PH3&amp;lt;br&amp;gt;
    qui est sur plusieurs lignes &amp;lt;br /&amp;gt;
    Et qui contient des balises html, ca ne dérange pas.
&amp;lt;?php  $this-&amp;gt;placeholder('PH3')-&amp;gt;captureEnd(); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La on utilise des méthodes qui vont commencer la capture puis terminer la
capture. Tout ce qui sera entre ces deux méthodes seront contenue par le
&lt;code&gt;placeholder&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Enfin il faut savoir qu’il existe un bon nombre de configurations pour les
&lt;code&gt;placeholders&lt;/code&gt;. Je vous conseil de regarder la doc. On peut y apprendre a
identer le code, ajouter des préfix, suffix etc…&lt;/p&gt;

&lt;h3 id="changetitle"&gt;Comment faire pour changer le titre de ma page ?&lt;/h3&gt;

&lt;p&gt;Voila le code, je vous l’explique après :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;headTitle('Mon nouveau titre','SET');
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="explication"&gt;Explication : Implementation d’un placeholders dans un helper&lt;/h3&gt;

&lt;p&gt;Alors la je vous est perdu sur le titre. en fait ce n’est que pour les puristes
et ceux qui veulent tout savoir que je l’ai ecrit comme ca. &lt;strong&gt;Sinon la on met
met juste le titre de notre page en argument&lt;/strong&gt; de la méthode &lt;code&gt;headTitle&lt;/code&gt;. Mais
d’ou vient ce &lt;code&gt;« SET »&lt;/code&gt;‘. Et bien sans SET, par défault les méthodes head&amp;#42;*|
ajoute le code a la fin de ce qu’il y a deja. Ce qui est extremement pratique
pour les CSS et JS (cf la prochaine note). Mais on peut aussi écraser la valeur
du titre, ajouter le nouveau avant ou après etc… Alors pourquoi « Implementation
d’un placeholders dans un helper ». Et bien en fait dans zend il existe déjà
beaucoup de helper (comme vu plus haut), vous les utiliser mais vous ne le savez
peut etre pas. Ensuite, headtitle par exemple est un placeholders, certe
particulier, mais c’en est un. Voila vous savez tout !!&lt;/p&gt;

&lt;p&gt;&lt;br / &gt;&lt;br / &gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/LccYodUhXpY" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/comment-mettre-en-place-un-layout-avec-le-zend-framework-1-8.html</feedburner:origLink></entry>
        <entry>
        <title>Sortie de la beta 1.9 de Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/sortie-de-la-beta-1-9-de-zend-framework.html</id>
                <updated>2009-07-23T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/9O9DXPAMav0/sortie-de-la-beta-1-9-de-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;&lt;strong&gt;Zend Framework 1.9.0 vient de sortir en beta&lt;/strong&gt;. Youpi. On peut la trouver
la : &lt;a href="http://framework.zend.com/download/latest"&gt;http://framework.zend.com/download/latest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bon en gros ils nous disent quoi les gars de chez Zend ? Que c’est uneversion
&lt;strong&gt;non-stable&lt;/strong&gt;, et qu’on ne la trouve pas encore sur le site. Sinon ils ont
beaucoup travaillé sur la stabilité, les tests etc... Et tant mieux. Sinon pour
les nouveautés : &lt;strong&gt;support de la version 5.3 de php&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Les autres nouveautés en pagaille&lt;/strong&gt; (on aura l’occasion d’y revenir) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Zend_Rest_Route&lt;/code&gt;, &lt;code&gt;Zend_Rest_Controller&lt;/code&gt;, and
&lt;code&gt;Zend_Controller_Plugin_PutHandler&lt;/code&gt;, which aid in providing
RESTful resources via the MVC layer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zend_Feed_Reader&lt;/code&gt;, which provides a common API to RSS and Atom feeds,
as well as extensions to each format,
caching, and a slew of other functionality.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zend_Queue&lt;/code&gt; and &lt;code&gt;Zend_Service_Amazon_Sqs&lt;/code&gt;, which provide the ability to
use local and remote messaging and
queue services for offloading asynchronous processes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zend_Db_Table&lt;/code&gt; updates to allow using &lt;code&gt;Zend_Db_Table&lt;/code&gt; as a concrete class
by passing it one or more table
definitions via the constructor.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zend_Test_PHPUnit_Db&lt;/code&gt;, which provides &lt;code&gt;Zend_Db&lt;/code&gt; support for PHPUnit’s
DBUnit support, allowing developers to
do functional and integration testing against databases using data fixtures.&lt;/li&gt;
&lt;li&gt;Annotation processing support for &lt;code&gt;Zend_Pdf&lt;/code&gt;, as well as performance
improvements.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zend_Dojo&lt;/code&gt; custom build layer support.&lt;/li&gt;
&lt;li&gt;Numerous &lt;code&gt;Zend_Ldap&lt;/code&gt; improvements.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zend_Log_Writer_Syslog&lt;/code&gt;, a &lt;code&gt;Zend_Log&lt;/code&gt; writer for writing to your system log.&lt;/li&gt;
&lt;li&gt;Several new view helpers, including &lt;code&gt;Zend_View_Helper_BaseUrl&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/9O9DXPAMav0" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/sortie-de-la-beta-1-9-de-zend-framework.html</feedburner:origLink></entry>
        <entry>
        <title>Initialisation d'un projet Zend Framework Avec Zend_Tool</title>
                <id>http://blog.lyrixx.info/zend/initialisation-dun-projet-zend.html</id>
                <updated>2009-07-13T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/GnYZLQnTqns/initialisation-dun-projet-zend.html" />
        <content type="html" xml:lang="en">&lt;p&gt;On a deja vu pas mal de chose sur le &lt;strong&gt;Zend Framework&lt;/strong&gt;, mais depuis la version
1.8.`, il y a quelques petites choses qui ont changées, comme l’architecture, et
l’arrivée de &lt;strong&gt;Zend_Tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;C’est quoi &lt;strong&gt;Zend_Tool&lt;/strong&gt; ? c’est un script &lt;code&gt;php&lt;/code&gt; qui s’exécute en mode console
(&lt;code&gt;CLI&lt;/code&gt;) et qui nous &lt;strong&gt;permet de créer une base pour notre application&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L’architecture du projet&lt;/li&gt;
&lt;li&gt;Un nouveau controller&lt;/li&gt;
&lt;li&gt;Une nouvelle action&lt;/li&gt;
&lt;li&gt;Une nouvelle vue&lt;/li&gt;
&lt;li&gt;Un nouveau module&lt;/li&gt;
&lt;li&gt;etc …&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On va donc recréer notre application de gestion de budget grâce aux
&lt;strong&gt;Zend_Tools&lt;/strong&gt;. Pour faire les choses proprement, on va commencer par
télécharger la &lt;a href="http://framework.zend.com/download"
target="_blank"&gt;dernière version de Zend Framework &lt;/a&gt;(1.8.4). Vous la dé-
zipper ou vous voulez sur votre disque dur. Dans mon cas, c’est &lt;span style
="text-decoration:
underline;"&gt;/home/lyrix/Prog/php/2009/ZendFramework-1.8.4&lt;/span&gt;. Maintenant il
va falloir inclure ce path dans notre include path. c’est a dire qu’il nous sera
possible d’appeler zf.sh (ou zf.bat pour les windowsiens) depuis n’importe quels
répertoires depuis notre console favorites. &lt;strong&gt;Sinon sous Linux on peut faire
plus simple&lt;/strong&gt;, on va tout simplement faire un alias :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias zf.sh=/home/lyrix/Prog/php/2009/ZendFramework-1.8.4/bin/zf.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note : Si vous faites ce code directement depuis la console, l’alias sera
temporaire (juste pour cette console), si vous le faite dans le fichier
~/.bashrc, l’alias sera permanent.&lt;/p&gt;

&lt;p&gt;Voila maintenant il nous faut créer ce projet dans le dossier qui va bien. Moi
je veux le mettre la : /home/lyrix/Prog/php/2009/Budget/ donc je me place dans
ma console dans le dossier /home/lyrix/Prog/php/2009/ puis je crée mon projet :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /home/lyrix/Prog/php/2009/ zf.sh create project Budget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila notre projet est crée. On peut aussi faire des modules, pour ce faire il
faut aller se placer dans le projet en question, et créer un module :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /home/lyrix/Prog/php/2009/Budget zf.sh create module Frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila, notre structure du projet est crée. Il faut maintenant coller la
librairie librairie dans /home/lyrix/Prog/php/2009/Budget/library. (On doit
copier tout le dossier Zend). Sous linux on peut aussi faire un lien symbolique
directement vers un autre dossier de son disque dur. :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /home/lyrix/Prog/php/2009/Budget/library
ln -s /home/lyrix/Prog/php/2009/ZendFramework-1.8.4/library/Zend/ Zend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila notre projet fonctionne, on peut se rendre a la page suivante pour voir le
résultat :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://127.0.0.1/monwww/2009/Budget/public/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/07/Installation-de-Zend-Framework-1.8-finit.png" rel="lightbox[449]"&gt;&lt;img class="size-medium wp-image-455" title="Installation de Zend Framework 1.8 - finit" src="../wp-content/uploads/2009/07/Installation-de-Zend-Framework-1.8-finit-300x187.png" alt="Installation de Zend Framework 1.8 - finit" width="300" height="187" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enfin, je rappel qu’il est quand meme possible de creer l’architecture d’un
projet directement dans Zend Studio. Il suffit de faire un nouveau projet et se
laisser guider.&lt;/p&gt;

&lt;p&gt;On peut passer a &lt;a href="../zend/architecture-du-zend-framework-1-10.html" title="Architecture du Zend Framework 1.10 en MVC"&gt;l’architecture de Zend Framework&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/GnYZLQnTqns" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/initialisation-dun-projet-zend.html</feedburner:origLink></entry>
        <entry>
        <title>Architecture de Zend Framework 1.8 en MVC</title>
                <id>http://blog.lyrixx.info/zend/architecture-de-zend-framework-1-8-en-mvc.html</id>
                <updated>2009-07-13T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/hO8WN6VGTaY/architecture-de-zend-framework-1-8-en-mvc.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Voila, on vient de voir comment &lt;a href="../zend/initialisation-dun-projet-zend.html"&gt;faire un nouveau projet avec le
&lt;strong&gt;Zend_Tool&lt;/strong&gt;&lt;/a&gt;. Comme j’expliquai dans le précédant article, l’architecture
de &lt;strong&gt;Zend Framework&lt;/strong&gt; a un petit changé. &lt;strong&gt;Voila la nouvelle Architecture&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/07/zend-framework-Structure-.png"&gt;
  &lt;img class="size-full wp-image-460" title="zend framework : Structure" src="../wp-content/uploads/2009/07/zend-framework-Structure-.png" alt="zend framework : Structure" width="236" height="497" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ZfProject

&lt;ul&gt;
&lt;li&gt;Application : contient toute l’application, en générale ce dossier
ce situe a un endroit de votre serveur
qui n’est pas accessible depuis l’extérieur (comme dans les CGI-BIN)

&lt;ul&gt;
&lt;li&gt;config : Contient tous les fichiers de configuration de
l’application

&lt;ul&gt;
&lt;li&gt;application.ini : on retrouve tous les configuration de votre
application (BDD, php.ini etc)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;controllers : ce sont les controlleurs (le C de MVC). ce sont eux
qui vont creer des models pour excecuter
des actions, des taches ou des opérations, ils founissent ensuite
le ou les résultats à la vue.&lt;/li&gt;
&lt;li&gt;models : ce sont les models de votre application. Ce sont des
class php qui vont faire le « gros »
du travail&lt;/li&gt;
&lt;li&gt;view : ce sont le vues de votre applications. On y retrouve :

&lt;ul&gt;
&lt;li&gt;helpers : des bouts de code commun que l’on peu aussi utiliser
dans les layouts&lt;/li&gt;
&lt;li&gt;scripts : les vrais vues. Ici il faut respecter une structure
precise, en accord avec les controllers,
mais on y reviendra&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;bootstrap.php est le fichier de chargement de
l’application. c’est dans le bootstrap qu’on fait
les connections a la base de donnée par exemple.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;library : ici on a toutes les class dont zend a besoin pour fonctionner,
et on a aussi toutes les autres
class disponible (voir la doc …)&lt;/li&gt;
&lt;li&gt;public : c’est le dossier public qui est accessible depuis
l’extérieur : on y retrouve toutes les
feuilles de style, les fichiers javascripts, les images …&lt;/li&gt;
&lt;li&gt;test : ce dossier contient toutes les class qui servent a faire des
tests unitaire.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ici on est dans une architecture ou l’on utilise pas de modules, avec des
modules, la structure est un tout petit peux différente. Je pense que l’image
parle d’elle même… Sinon je n’ai développer que le dossier modules, le reste
restant identique.&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/07/zend-framework-Structure-Modules.png" rel="lightbox[448]"&gt;
    &lt;img class="size-full wp-image-473" title="zend framework : Structure Modules" src="../wp-content/uploads/2009/07/zend-framework-Structure-Modules.png" alt="zend framework : Structure Modules" width="227" height="417" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut passer au &lt;a href="../zend/zend-framework-1-8-et-son-bootstrap.html"&gt;bootstrap de Zend Framework 1.8&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/hO8WN6VGTaY" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/architecture-de-zend-framework-1-8-en-mvc.html</feedburner:origLink></entry>
        <entry>
        <title>Introduction a Zend Framework 1.8 en MVC</title>
                <id>http://blog.lyrixx.info/zend/introduction-a-zend-framework-1-8-en-mvc.html</id>
                <updated>2009-07-13T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/_qG7M-6AH7k/introduction-a-zend-framework-1-8-en-mvc.html" />
        <content type="html" xml:lang="en">&lt;p&gt;On va voir comment transformer un script php qui n’utilise pas Zend en une
application utilisant le &lt;strong&gt;Framework Zend&lt;/strong&gt;. Pour se faire on va utiliser la
version 1.8 (ou supérieur) de &lt;strong&gt;Zend Framework&lt;/strong&gt;, et on va l’utiliser en mode
&lt;strong&gt;MVC (Model View Controller&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Il va d’abord falloir faire les bases : &lt;a href="../zend/initialisation-dun-projet-zend.html"&gt;création de project&lt;/a&gt;,
&lt;a href="../zend/architecture-de-zend-framework-1-8-en-mvc.html"&gt;structure&lt;/a&gt;, &lt;a href="../zend/zend-framework-1-8-et-son-bootstrap.html"&gt;bootstrap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Voila une fois que le début de l’application est préparer on part sur une base
solide. On va donc voir comment marche les &lt;a href="../zend/zend-quest-ce-quun-controller.html"&gt;Controleurs&lt;/a&gt;, les &lt;a href="../zend/zend-comment-faire-une-vue.html"&gt;Vues&lt;/a&gt;, et
les &lt;a href="../zend/zend-comment-utiliser-un-model.html"&gt;Models&lt;/a&gt;, on pourra aussi voir comment se servir&lt;a href="../zend/css-javascript-et-zend-framework.html" title="Tuto avec Zend Framework 1.7"&gt; des css et du
javascript avec zend&lt;/a&gt; (pour Zend Framework 1.7).&lt;/p&gt;

&lt;p&gt;On va donc partir des sources de l’application que j’ai deja faite pour la
gestion du budget commun dans une colocation, et on va essayé de l’adapté à
Zend.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/_qG7M-6AH7k" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/introduction-a-zend-framework-1-8-en-mvc.html</feedburner:origLink></entry>
        <entry>
        <title>Tuto : Zend Framework 1.8 et son bootstrap</title>
                <id>http://blog.lyrixx.info/zend/zend-framework-1-8-et-son-bootstrap.html</id>
                <updated>2009-07-13T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/Br3DsTtEf6Q/zend-framework-1-8-et-son-bootstrap.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Voila, on va voir comment fonctionne le &lt;code&gt;Boostrap&lt;/code&gt; de la version 1.8 de &lt;strong&gt;Zend
Framework&lt;/strong&gt;. Par default le fichier &lt;code&gt;Bootsrap.php&lt;/code&gt; est presque vide. Il ne
contient que ces quelques lignes :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mais on va voir ensemble &lt;strong&gt;comment construire notre bootstrap&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id="sommaire"&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#sommaire"&gt;Sommaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fonctionne"&gt;Comment fonctionne le bootstrap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#configuration"&gt;Mise en place du fichier de configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bdd"&gt;Connexion a la base de données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#session"&gt;Mise en place des sessions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#module"&gt;Mise en place de modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="fonctionne"&gt;Comment fonctionne le bootstrap ?&lt;/h2&gt;

&lt;p&gt;**Mais a quoi sert le &lt;code&gt;bootstrap** ? Le&lt;/code&gt;bootstrap`, c’est le fichier qui va
être lancé au début de l’application et qui va s’occuper d’exécuter toutes les
petites routines, de faire les connections aux bases de données, d’instancier
toutes les constantes, les sessions, les modules, les layouts etc …&lt;/p&gt;

&lt;p&gt;Par défaut le &lt;code&gt;bootstrap&lt;/code&gt; fonctionne même si il est vide, mais on peut faire en
sorte de le customiser un peu. Comment faire ? Déjà le fichier index.php qui est
le premier a être exécuter (dans le dossier public) va lancer la méthode &lt;code&gt;run&lt;/code&gt;
du &lt;code&gt;bootstrap&lt;/code&gt;. On peut alors créer cette méthode. Ensuite  il faut savoir que
le &lt;code&gt;bootstrap&lt;/code&gt; hérite de &lt;code&gt;Zend_Application_Bootstrap_Bootstrap&lt;/code&gt; qui lui est
magique (On va y revenir). Donc si on redéfinit la méthode &lt;code&gt;run&lt;/code&gt;, il ne faut pas
oublier d’appeler la methode &lt;code&gt;run&lt;/code&gt; de la class :
&lt;code&gt;Zend_Application_Bootstrap_Bootstrap&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function run()
{
    parent::run();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On peut ensuite créer plusieurs méthodes pour par exemple faire les connections
aux bases de données, initialiser les sessions etc. Et c’est la que le
&lt;code&gt;bootstrap&lt;/code&gt; est magique : il suffit de déclarer les méthodes en &lt;code&gt;protected&lt;/code&gt; et
de mettre un underscrore (_) devant le nom de la méthode, et celle-ci sera
directement exécuter.&lt;/p&gt;

&lt;p&gt;Si on regarde le code de la méthode &lt;code&gt;run&lt;/code&gt; de la class
&lt;code&gt;Zend_Application_Bootstrap_Bootstrap&lt;/code&gt;, on voit que par défaut on n’utilise
pas de module. Il est possible d’utiliser les modules, mais on verra ça plus
tard. Donc par défaut il faut respecter l’architecture « normale ».&lt;/p&gt;

&lt;h2 id="configuration"&gt;Mise en place du fichier de configuration.&lt;/h2&gt;

&lt;p&gt;Comme on a vu dans l’architecture du zend framework, il y a deja un fichier de
configuration, mais par défaut il n’est pas vraiment utilisable. Je m’explique :
quand on démarre l’application, celle ci utilise bien le fichier de
configuration. Mais si a un moment ou a un autre on a besoin de ce fichier, il
sera compliqué d’utiliser les constantes définit. Par défaut le fichier de
config ressemble a celui la :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Celui ci est basé sur un model orienté objet. Je vous conseil de lire le manuel
de Zend si vous êtes un peu perdu : &lt;a href="http://zendframework.com/manual/fr/zend.config.adapters.ini.html"
target=" _blank"&gt;http://zendframework.com/manual/fr/zend.config.adapters.ini.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On va donc faire en sorte de pouvoir utiliser ce fichier depuis n’importe ou
depuis l’application. On va utiliser la &lt;code&gt;Zend_Registry&lt;/code&gt;. C’est quoi
&lt;code&gt;Zend_Registry&lt;/code&gt; ? C’est un registre (un zone mémoire sur le serveur) ou l’on va
pouvoir stocker toutes sorte de choses : constante, pointeurs vers des bases de
données etc… On ajoute donc notre fichier de config (qui sont en faites les
options (parametres) du bootstrap) à un registre config :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function run()
{
    // Cela permet d'avoir le fichier de configuration disponible depuis
    n'importe ou dans l'application.
    Zend_Registry::set('config', new Zend_Config($this-&amp;gt;getOptions()));
    parent::run();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="bdd"&gt;Connexion a la base de données&lt;/h2&gt;

&lt;p&gt;Pour se faire on va utiliser les données du fichier de configuration :
&lt;code&gt;application.ini&lt;/code&gt;. On va le convertir en vrai fichier de configuration grâce a
&lt;code&gt;Zend_Config&lt;/code&gt;, puis on va le donnée a &lt;code&gt;Zend_Db&lt;/code&gt; qui va nous faire une factory de
notre base de donnée. C’est grâce a cette factory qu’on pourra excécuter des
requetes directement sur la base de donnée.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;resources.db.adapter ="MYSQLI"
resources.db.params.host = "localhost"
resources.db.params.username = "budget2"
resources.db.params.password = "budget2"
resources.db.params.dbname = "budget2"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour les variables du fichier de configuration, vous pouvez vous référer au
manuel de Zend Framework.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
* Initialize data bases
*
* @return Zend_Db::factory
*/
protected function _initDb()
{
    //on charge notre fichier de configuration
    $config = new Zend_Config($this-&amp;gt;getOptions());
    //On essaye de faire une connection a la base de donnee.
    try{
         $db = Zend_Db::factory($config-&amp;gt;resources-&amp;gt;db);
         //on test si la connection se fait
         $db-&amp;gt;getConnection();
     }catch ( Exception $e ) {
         exit( $e -&amp;gt; getMessage() );
     }
     // on stock notre dbAdapter dans le registre
     Zend_Registry::set( 'dba', $db );

     return $db;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enfin on met cette factory dans un registre de manière a pouvoir l’utiliser
depuis n’importe ou dans l’application.&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/span&gt; : On
créer ici une connection a la base de donnée qui pourra etre utilisé depuis
n’importe quelle partie de l’application. Cependant on verra qu’en regle
général, on ne fait pas directement de requete sur la base de donnée, &lt;a href="../zend/comment-gerer-une-base-de-donnee-avec-le-zend-framework.html" title="Voir le tuto sur la gestion des bases de données"&gt;on
utilise des models pour se faire &lt;/a&gt;…&lt;/p&gt;

&lt;h2 id="session"&gt;Initialisation des sessions :&lt;/h2&gt;

&lt;p&gt;On va mettre en place les sessions tout de suite : c’est assez simple. Je pense
que le code parle de lui meme.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Initialize session
 *
 * @return Zend_Session_Namespace
 */
protected function _initSession()
{
    // On initialise la session
    return new Zend_Session_Namespace('budget', true);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="module"&gt;Mise en place de modules :&lt;/h2&gt;

&lt;p&gt;Une bonne partie de la déclaration d’un module par défault va se faire
directement dans le fichier de configuration :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#initialize front
controller resource
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction = "index"
resources.frontController.defaultModule = "Frontend"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et une autre partie dans le bootstrap :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
* Initialize Module
*
* @return Zend_Application_Module_Autoloader
*/
protected function _initAutoload()
{
    $loader = new Zend_Application_Module_Autoloader(array(
        'namespace' =&amp;gt; '',
        'basePath'  =&amp;gt; APPLICATION_PATH,
    ));

    return $loader;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Note :&lt;/span&gt;&lt;/strong&gt; Cependant, si
quelqu’un connait bien ZF, j’aimerais avoir une renseignement, car il me semble
que le code du bootsrap soit facultatif …&lt;/p&gt;

&lt;h2 id="conclusion"&gt;Conclusion :&lt;/h2&gt;

&lt;p&gt;Voila, on commence a avoir un bon bootstrap qui tient la route, mais on verra
par la suite qu’on peut rajouter beaucoup de chose dans ce bootstrap, comme par
exemple l’utilisation des layouts …&lt;/p&gt;

&lt;p&gt;N’hesitez par a aller faire une tours sur le site de
&lt;a href="http://framework.zend.com/manual/fr/zend.application.html"
target="_blank"&gt;ZF – page application&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On retrouve les deux fichiers :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    public function run()
    {
        // Cela permet d'avoir le fichier de configuration disponible depuis n'importe ou dans l'application.
        Zend_Registry::set('config', new Zend_Config($this-&amp;gt;getOptions()));

        parent::run();
    }

    /**
    * Initialize Module
    *
    * @return Zend_Application_Module_Autoloader
    */
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' =&amp;gt; '',
            'basePath' =&amp;gt; APPLICATION_PATH
        ));

        return $loader;
    }

    /**
    * Initialize data bases
    *
    * @return Zend_Db::factory
    */
    protected function _initDb()
    {
        //on charge notre fichier de configuration
        $config = new Zend_Config($this-&amp;gt;getOptions());

        //On essaye de faire une connection a la base de donnee.
        try{
             $db = Zend_Db::factory($config-&amp;gt;resources-&amp;gt;db);
             //on test si la connection se fait
             $db-&amp;gt;getConnection();
        }catch ( Exception $e ) {
            exit( $e -&amp;gt; getMessage() );
        }

        // on stock notre dbAdapter dans le registre
        Zend_Registry::set( 'dba', $db );

        return $db;
    }

    /**
     * Initialize session
     *
     * @return Zend_Session_Namespace
     */
    protected function _initSession()
    {
        // On initialise la session
        $session = new Zend_Session_Namespace('budget', true);

        return $session;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Et:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

#initialize front controller resource
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction = "index"
resources.frontController.defaultModule = "Frontend"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

#DATABASE
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "budget2"
resources.db.params.password = "budget2"
resources.db.params.dbname = "budget2"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true
&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/Br3DsTtEf6Q" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-framework-1-8-et-son-bootstrap.html</feedburner:origLink></entry>
        <entry>
        <title>Zend framework : Initializer et boot strap</title>
                <id>http://blog.lyrixx.info/zend/zend-framework-initializer-et-boot-strap.html</id>
                <updated>2009-06-30T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/ba35sR7wRrM/zend-framework-initializer-et-boot-strap.html" />
        <content type="html" xml:lang="en">&lt;h2 style="text-align: center;"&gt;
    &lt;span style="text-decoration: underline;color:#ff0000;"&gt;
        &lt;strong&gt;
            UPDATE du 22/07/2009 :
        &lt;/strong&gt;
    &lt;/span&gt;
&lt;/h2&gt;

&lt;p style="text-align: center;"&gt;
    &lt;span style="text-decoration: underline;color:#ff0000;"&gt;
        &lt;strong&gt;
            &lt;a href="../zend/zend-framework-1-8-et-son-bootstrap.html"&gt;
                Il y a une mise a jour de ce tuto ici.
            &lt;/a&gt;
        &lt;/strong&gt;
    &lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;Avant d’aller plus loin dans notre série de tutos, il faut d’abord qu’on règles
les fichier &lt;code&gt;boostrap&lt;/code&gt;, et l’&lt;code&gt;initializer&lt;/code&gt;. Ce sont deux fichiers qui s’occupe
de démarrer notre application. C’est dans ces fichiers qu’on va définir toutes
nos constantes de l’application, comme les paramètres pas défaut de
l’application, les sessions, et surtout la connexion à la base de données.&lt;/p&gt;

&lt;p&gt;Petite précision : l’&lt;code&gt;initializer&lt;/code&gt; et le &lt;code&gt;bootstrat&lt;/code&gt; ne sont plus d’actualité
dans la version 1.8. Cependant cette méthode fonctionne toujours. On va donc
voir la méthode de Zend Framework 1.7. Ca ne pose pas de problème, les deux
méthodes sont très similaire. Dans Zend 1.8, l’&lt;code&gt;initializer&lt;/code&gt; et le &lt;code&gt;bootstrap&lt;/code&gt;
ont été réuni. J’essayerais de faire un update de ce tutos des que possible. De
plus l’architecture de la 1.8 a aussi un peu changé. J’essayerais aussi de
mettre a jour ce tutos.&lt;/p&gt;

&lt;h2&gt;Bootstrap&lt;/h2&gt;

&lt;p&gt;De base notre &lt;code&gt;bootstrat&lt;/code&gt; ressemble a ça :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * My new Zend Framework project
 *
 * @author
 * @version
 */
set_include_path('.' . PATH_SEPARATOR . '../library' . PATH_SEPARATOR . '../application/default/models/' . PATH_SEPARATOR . get_include_path());

require_once 'Initializer.php';
require_once "Zend/Loader.php";

// Set up autoload.
Zend_Loader::registerAutoload();

// Prepare the front controller.
$frontController = Zend_Controller_Front::getInstance();

// Change to 'production' parameter under production environemtn
$frontController-&amp;gt;registerPlugin(new Initializer('development'));

// Dispatch the request using the front controller.
$frontController-&amp;gt;dispatch();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La seule chose importante ici est la ligne :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$frontController-&amp;gt;registerPlugin(new Initializer('development'));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ici on crée un nouvel &lt;code&gt;Initializer&lt;/code&gt; avec comme paramètre, le nom de
l’environnement (par exemple development, production, test etc…)&lt;/p&gt;

&lt;h2&gt;Initializer&lt;/h2&gt;

&lt;p&gt;On peut donc passer a l’&lt;code&gt;initializer&lt;/code&gt; (c’est la version final):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * My new Zend Framework project
 *
 * @author
 * @version
 */

require_once 'Zend/Controller/Plugin/Abstract.php';
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Request/Abstract.php';
require_once 'Zend/Controller/Action/HelperBroker.php';

/**
 *
 * Initializes configuration depndeing on the type of environment
 * (test, development, production, etc.)
 *
 * This can be used to configure environment variables, databases,
 * layouts, routers, helpers and more
 *
 */
class Initializer extends Zend_Controller_Plugin_Abstract
{
    /**
     * @var Zend_Config
     */
    protected static $_config;

    /**
     * @var string Current environment
     */
    protected $_env;

    /**
     * @var Zend_Controller_Front
     */
    protected $_front;

    /**
     * @var string Path to application root
     */
    protected $_root;

    /**
     * Constructor
     *
     * Initialize environment, root path, and configuration.
     *
     * @param string $env
     * @param string|null $root
     * @return void
     */
    public function __construct($env, $root = null)
    {
        $this-&amp;gt;_setEnv($env);
        if (null === $root) {
            $root = realpath(dirname(__FILE__) . '/../');
        }
        $this-&amp;gt;_root = $root;

        $this-&amp;gt;initPhpConfig();

        $this-&amp;gt;_front = Zend_Controller_Front::getInstance();

        // set the test environment parameters
        if ($env == 'test') {
                // Enable all errors so we'll know when something goes wrong.
                error_reporting(E_ALL | E_STRICT);
                ini_set('display_startup_errors', 1);
                ini_set('display_errors', 1);
                $this-&amp;gt;_front-&amp;gt;throwExceptions(true);
        }
    }

    /**
     * Initialize environment
     *
     * @param string $env
     * @return void
     */
    protected function _setEnv($env)
    {
        $this-&amp;gt;_env = $env;
    }

    /**
     * Initialize Data bases
     *
     * @return void
     */
    public function initPhpConfig()
    {

    }

    /**
     * Route startup
     *
     * @return void
     */
    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        $this-&amp;gt;initConfig();
        $this-&amp;gt;initDb();
        $this-&amp;gt;initHelpers();
        $this-&amp;gt;initView();
        $this-&amp;gt;initPlugins();
        $this-&amp;gt;initRoutes();
        $this-&amp;gt;initControllers();
    }

    public function initConfig(){
        // On charge Les configs global de l'application et on les met dans un registre
        $config = new Zend_Config_Ini($this-&amp;gt;_root . '/application/default/config/config.ini');
        // On met notre fichier de config dans un registre.
        Zend_Registry::set('config', $config);
    }

    /**
     * Initialize data bases
     *
     * @return void
     */
    public function initDb()
    {
        //on charge notre fichier de config
        $config = Zend_Registry::get('config');
        try{
            $db = Zend_Db::factory($config-&amp;gt;database);
            //on test si la connection se fait
            $db-&amp;gt;getConnection();
        }catch ( Exception $e ) {
            exit( $e -&amp;gt; getMessage() );
        }
        // on stock notre dbAdapter dans le registre
        Zend_Registry::set( 'dba', $db );
    }

    /**
     * Initialize action helpers
     *
     * @return void
     */
    public function initHelpers()
    {
        // register the default action helpers
        Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper');
    }

    /**
     * Initialize view
     *
     * @return void
     */
    public function initView()
    {
        // Bootstrap layouts
        Zend_Layout::startMvc(array(
            'layoutPath' =&amp;gt; $this-&amp;gt;_root .'/application/default/layouts',
            'layout' =&amp;gt; 'main'
        ));

    }

    /**
     * Initialize plugins
     *
     * @return void
     */
    public function initPlugins()
    {

    }

    /**
     * Initialize routes
     *
     * @return void
     */
    public function initRoutes()
    {

    }

    /**
     * Initialize Controller paths
     *
     * @return void
     */
    public function initControllers()
    {
        $this-&amp;gt;_front-&amp;gt;addControllerDirectory($this-&amp;gt;_root . '/application/default/controllers', 'default');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On a plusieurs variables qui représente des objets important pour zend :
l’environnement, la configuration, le front controller etc. On peux en ajouter a
la main, comme un gestionnaire de session par exemple. On voit que dans
l’&lt;code&gt;initalizer&lt;/code&gt; on peut appeler la méthode &lt;code&gt;initPhpConfig&lt;/code&gt; qui nous permet de
changer au démarrage de l’application les variables ini de php
(ini_set(‘display_startup_errors’, 1);) par exemple. Ensuite on la méthode
&lt;code&gt;routeStartup&lt;/code&gt; qui s’exécute. Qui elle même se charche d’exécuter toutes les
routines de démarrage de l’application. Celle qui nous intéresse en premier va
etre &lt;code&gt;initDb&lt;/code&gt;, mais avant il va falloir qu’on gère un fichier de configuration
(de la BDD entre autre). Cela va se faire grâce a &lt;code&gt;Zend_Config&lt;/code&gt; et grace a
&lt;code&gt;Zend_Registry&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Fichier de configuration, et stockage de celui ci (Zend_Config, Zend Registry)&lt;/h2&gt;

&lt;p&gt;Tout d’abord on crée notre fichier de config dans : &lt;code&gt;Budget/application/default/config&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[database]
adapter = "pdo_mysql"
params.host = "localhost"
params.username = "budget2"
params.password = "budget2"
params.dbname = "budget2"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dans ce fichier on y met les information concernant l’accès a la base de donnée.
Dans mon cas, j’ai &lt;code&gt;budget2se connec&lt;/code&gt;localhostu&lt;code&gt;budget2mot&lt;/code&gt;budget2our
l’adaptateur, si vous êtes sur &lt;code&gt;mysql&lt;/code&gt;, laissez &lt;code&gt;pdo_mysql&lt;/code&gt;, sinon referez vous
a la doc.&lt;/p&gt;

&lt;p&gt;Maintenant il va falloir faire récupérer les informations du fichier de config
et le mettre dans un registre. Un registre est une zone ou l’on peut stocker des
variables de façon persistante, c’est a dire d’une page a l’autre. Attention,
c’est n’est pas une session, il ne faut utiliser les registres que pour les
données de l’application et non les données des utilisateurs.&lt;/p&gt;

&lt;p&gt;On ajoute donc dans la méthode &lt;code&gt;routeStartup&lt;/code&gt; de l’&lt;code&gt;initializer&lt;/code&gt;, en première
ligne, un appel la méthode &lt;code&gt;initConfig&lt;/code&gt; : &lt;code&gt;$this-&amp;gt;initConfig();&lt;/code&gt; Et bien sur on
crée cette méthode :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function initConfig(){
    // On charge Les configs global de l'application et on les met dans un registre
    $config = new Zend_Config_Ini($this-&amp;gt;_root . '/application/default/config/config.ini');
    // On met notre fichier de config dans un registre.
    Zend_Registry::set('config', $config);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On peut maintenant coder notre méthode : &lt;code&gt;initDb&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Configuration de la base de données&lt;/h2&gt;

&lt;p&gt;La on récupère notre fichier de config, et on crée une nouvelle &lt;code&gt;db_factory&lt;/code&gt;. On
teste au passage si la connexion est bien valide. Puis on ajoute ce connecteur a
la base de donné dans un registre qu’on nomera &lt;span style="text-decoration:
underline;"&gt;dba&lt;/span&gt;, comme Data Base Adaptater.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public function initDb()
{
    //on charge notre fichier de config
    $config = Zend_Registry::get('config');
    try{
         $db = Zend_Db::factory($config-&amp;gt;database);
         //on test si la connection se fait
         $db-&amp;gt;getConnection();
     }catch ( Exception $e ) {
         exit( $e -&amp;gt; getMessage() );
     }
     // on stock notre dbAdapter dans le registre
     Zend_Registry::set( 'dba', $db );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila on a notre connexion a la base de donnée, que l’on pourra appeler depuis
n’importe quelle fonction.&lt;/p&gt;

&lt;p&gt;Il est possible de configurer plein d’options dans l’initializer, je ne vais pas
m’attardé dessus, il y a la doc pour ca. Par contre dans la mise a jour de cet
article, j’essayerai d’aller plus loin.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/ba35sR7wRrM" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-framework-initializer-et-boot-strap.html</feedburner:origLink></entry>
        <entry>
        <title>Zend : Comment utiliser un model ?</title>
                <id>http://blog.lyrixx.info/zend/zend-comment-utiliser-un-model.html</id>
                <updated>2009-06-27T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/y01ApTD65A0/zend-comment-utiliser-un-model.html" />
        <content type="html" xml:lang="en">&lt;p&gt;On va voir comment se servir d’un &lt;code&gt;model&lt;/code&gt; dans &lt;strong&gt;Zend framework&lt;/strong&gt;. Un &lt;code&gt;model&lt;/code&gt;
est en fait un objet que vous allez pouvoir utiliser. Il est bien sur possible
d’en utiliser plusieurs, et d’appeler un &lt;code&gt;model&lt;/code&gt; depuis un autre &lt;code&gt;model&lt;/code&gt;. Il est
possible d’utiliser dans les &lt;code&gt;models&lt;/code&gt; des &lt;code&gt;models&lt;/code&gt; du framework zend comme
&lt;code&gt;Zend_Registry&lt;/code&gt;, &lt;code&gt;Zend_ProgressBar&lt;/code&gt;, les &lt;code&gt;Zend_Service_&lt;/code&gt; etc. Il est aussi
possible d’étendre une &lt;code&gt;class&lt;/code&gt; du framework, comme la class &lt;code&gt;Zend_DB&lt;/code&gt;. On peut
se reférer a la &lt;a href="http://framework.zend.com/manual/fr/index.html"
target="_blank"&gt;documentation de Zend&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cependant, les &lt;code&gt;models&lt;/code&gt; doivent respecter une certaine syntaxe pour le nom du
fichier, et aussi pour le nom de la &lt;code&gt;class&lt;/code&gt;. Si un &lt;code&gt;model&lt;/code&gt; est directement dans
la dossier &lt;code&gt;models&lt;/code&gt;, le nom de fichier devra etre :&lt;span style="text-decoration:
underline;"&gt; Nom.php&lt;/span&gt; et le nom de &lt;code&gt;class&lt;/code&gt; devra etre &lt;span style="text-
decoration: underline;"&gt;Nom&lt;/span&gt;. En gros il faut que le nom de &lt;code&gt;class&lt;/code&gt; et le
nom de fichier soient les memes. Par contre, si la &lt;code&gt;class&lt;/code&gt; est dans un sous
dossier du dossier &lt;code&gt;model&lt;/code&gt;, la il faudra que le nom du fichier soit &lt;span style
="text-decoration: underline;"&gt;NomDeFichier.php &lt;/span&gt;et que le nom de la
&lt;code&gt;class&lt;/code&gt; soit &lt;span style="text-decoration:
underline;"&gt;NomDeDossier_NomDeFichier&lt;/span&gt;. En gros, il faut mettre devant le
nom de la &lt;code&gt;class&lt;/code&gt; toute l’arborescense du fichier jusqu’au dossier &lt;code&gt;models&lt;/code&gt;.
Enfin il y a une convention qui veut qu’on commence tous les nom de class par
des majuscules, ce n’est pas obligatoire, mais en général cela permet de s’y
retrouver plus facilement.&lt;/p&gt;

&lt;p&gt;Un petit exemple pour comprendre comment instanciser un nouvel objet, et
l’utiliser :&lt;/p&gt;

&lt;p&gt;Fichier directement dans le dossier models:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Test1 {

    private $nom;

    public function __construct($nom){
        $this-&amp;gt;setNom($nom);
    }

    /**
     * @param $nom the $nom to set
     */
    public function setNom($nom) {
        $this-&amp;gt;nom = $nom;
    }

    /**
     * @return the $nom
     */
    public function getNom() {
        return $this-&amp;gt;nom;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Fichier dans le dossier "dossier1" qui est fans le dossier models:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class dossier1_Test2 {

    private $nom;

    public function __construct($nom){
        $this-&amp;gt;setNom($nom);
    }

    /**
     * @param $nom the $nom to set
     */
    public function setNom($nom) {
        $this-&amp;gt;nom = $nom;
    }

    /**
     * @return the $nom
     */
    public function getNom() {
        return $this-&amp;gt;nom;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;FactureController&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * FactureController
 *
 * @author
 * @version
 */

require_once 'Zend/Controller/Action.php';

class FactureController extends Zend_Controller_Action {
    /**
     * The default action - show the home page
     */
    public function indexAction() {
        // TODO Auto-generated FactureController::indexAction()
        default action
    }

    public function ajouterAction(){
        $obj1 = new Test1('http://blog.lyrixx.info');
        $this-&amp;gt;view-&amp;gt;obj1 = $obj1;
        $obj2 = new dossier1_Test2('http://www.lyrixx.info');
        $this-&amp;gt;view-&amp;gt;obj2 = $obj2-&amp;gt;getNom();
    }

    public function editerAction(){

    }

    public function supprimerAction(){

    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;vue:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Default home page view
 *
 * @author
 * @version
 */

$this-&amp;gt;headTitle('Ajouter une facure');
$this-&amp;gt;placeholder('title')-&amp;gt;set('Ajouter une facture');

echo $this-&amp;gt;obj1-&amp;gt;getNom();
echo '&amp;lt;br /&amp;gt;';
echo $this-&amp;gt;obj2;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On voit bien qu’on peut passer a la vue toute sorte d’objet : un objet, ou le
résultat d’une de ses méthodes.&lt;/p&gt;

&lt;p&gt;La suite : on avance dans le projet &lt;a href="../zend/zend-framework-1-8-et-son-bootstrap.html" title="Tuto : Zend Framework 1.8 et son bootstrap"&gt;le bootstrap, la connection a la base de
donnée&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/y01ApTD65A0" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-comment-utiliser-un-model.html</feedburner:origLink></entry>
        <entry>
        <title>Zend : Comment faire une vue ?</title>
                <id>http://blog.lyrixx.info/zend/zend-comment-faire-une-vue.html</id>
                <updated>2009-06-26T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/J6z0aCsuUB8/zend-comment-faire-une-vue.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Et bien on continue sur notre lancé avec les &lt;code&gt;vues&lt;/code&gt; ou &lt;code&gt;View&lt;/code&gt; dans le &lt;strong&gt;Zend
Framework&lt;/strong&gt;. Après les &lt;a href="../zend/zend-quest-ce-quun-controller.html"&gt;&lt;code&gt;controller&lt;/code&gt;&lt;/a&gt;, maintenant les &lt;code&gt;vues&lt;/code&gt;. &lt;strong&gt;La vue c’est
la partie qui va s’occuper d’afficher vos résultats, vos variables, votre code
html&lt;/strong&gt;. Donc pour re-résumer les design pattern &lt;code&gt;MVC&lt;/code&gt; :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Le &lt;code&gt;controller&lt;/code&gt; est appelé et exécuté&lt;/li&gt;
&lt;li&gt;Le &lt;code&gt;controller&lt;/code&gt; crée et exécute des &lt;code&gt;models&lt;/code&gt; (des objets)&lt;/li&gt;
&lt;li&gt;le &lt;code&gt;controller&lt;/code&gt; passe à la &lt;code&gt;vue&lt;/code&gt; les variables dont la vue a besoin&lt;/li&gt;
&lt;li&gt;la &lt;code&gt;vue&lt;/code&gt; met en page ces variables et les donne au &lt;code&gt;layout&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il faut savoir que par défaut il faut respecter une certaine syntaxe pour les
nom de &lt;code&gt;controller&lt;/code&gt; et de &lt;code&gt;vue&lt;/code&gt;. Si notre &lt;code&gt;controller&lt;/code&gt; s’appelle &lt;span style
="text-decoration: underline;"&gt;facture&lt;/span&gt;, il faudra que dans le dossier
&lt;code&gt;script&lt;/code&gt;, il y est un dossier &lt;span style="text-decoration:
underline;"&gt;facture&lt;/span&gt;. Puis si notre action s’appelle &lt;span style="text-
decoration: underline;"&gt;ajouter&lt;/span&gt;, il faudra que dans le dossier
&lt;code&gt;script&lt;/code&gt;/&lt;span style="text-decoration: underline;"&gt;facture&lt;/span&gt;, il y est un
fichier &lt;span style="text-decoration: underline;"&gt;ajouter.phtml&lt;/span&gt;. Dans ce
cas la, l’application exécutera la &lt;code&gt;vues&lt;/code&gt; &lt;span style="text-decoration:
underline;"&gt;ajouter.phtml&lt;/span&gt; dans le dossier &lt;span style="text-decoration:
underline;"&gt;facture&lt;/span&gt; quand l’action &lt;span style="text-decoration:
underline;"&gt;ajouter&lt;/span&gt; du controller &lt;span style="text-decoration:
underline;"&gt;facture&lt;/span&gt; s’exécutera.&lt;/p&gt;

&lt;p&gt;Tips : Comment faire une vues avec Zend Studio 7:&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/06/Zend-New-View.png"
rel="lightbox[375]"&gt;&lt;img class="size-medium wp-image-404" title="Zend-New View"
src="../wp-content/uploads/2009/06/Zend-New-View-300x273.png"
alt="Comment faire une vue avec Zend Studio" width="300" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/06/Capture-New-Zend-
View2.png" rel="lightbox[375]"&gt;&lt;img class="size-medium wp-image-405" title="New
Zend View (2)" src="../wp-content/uploads/2009/06/Capture-New-
Zend-View2-300x241.png" alt="Comment faire une vue avec Zend Studio" width="300"
height="241" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enfin dans la &lt;code&gt;vue&lt;/code&gt;, on aura pas besoin de mettre tout le code html de la page.
Le &lt;a href="../zend/zend-comment-utiliser-un-layout.html"&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/a&gt; le fait deja. Donc on a juste besoin de mettre le code html
spécifique a cet &lt;code&gt;action&lt;/code&gt; (l’&lt;code&gt;action&lt;/code&gt; de ce &lt;code&gt;controller&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;Comment on fait pour récupérer nos variable du controller dans la vue?&lt;/h2&gt;

&lt;p&gt;et bien c’est vraiment pas compliqué : dans le &lt;code&gt;controller&lt;/code&gt; il suffit de
faire :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * FactureController
 *
 * @author
 * @version
 */

class FactureController extends Zend_Controller_Action {
    /**
     * The default action - show the home page
     */
    public function indexAction() {
        // TODO Auto-generated FactureController::indexAction()
        default action
    }

    public function ajouterAction(){
        $this-&amp;gt;view-&amp;gt;VariableString = "une varible";
        $this-&amp;gt;view-&amp;gt;VariableInt = 10;
        $this-&amp;gt;view-&amp;gt;VariableArray =
        array("n1"=&amp;gt;"a","n2"=&amp;gt;"b");
    }

    public function editerAction(){

    }

    public function supprimerAction(){

    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Donc on passe une variable du &lt;code&gt;controller&lt;/code&gt; a la &lt;code&gt;vue&lt;/code&gt; grâce a la syntaxe
suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;view-&amp;gt;Un_Nom_De_Varible
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ensuite on récupère les variables dans la vue grave à la syntaxe suivante :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$this-&amp;gt;Un_Nom_De_Varible
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ex:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Default home page view
 *
 * @author
 * @version
 */

$this-&amp;gt;headTitle('Ajouter une facure');
$this-&amp;gt;placeholder('title')-&amp;gt;set('Ajouter une facture');

echo $this-&amp;gt;VariableString;
echo '&amp;lt;br /&amp;gt;';
echo $this-&amp;gt;VariableInt;
echo '&amp;lt;br /&amp;gt;';
echo print_r($this-&amp;gt;VariableArray,true);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila. Il faut aussi savoir que les vues et les &lt;code&gt;layouts&lt;/code&gt; sont étroitements
liés. Qu’on peut faire passer des variables et toutes sortes de choses entre la
&lt;code&gt;vue&lt;/code&gt; et le &lt;code&gt;layout&lt;/code&gt;.C’est le cas des &lt;code&gt;placeholders&lt;/code&gt; que l’on peut voir au début
du fichier &lt;code&gt;ajouter.phtml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Et il faut aussi savoir qu’on peut changer dans le &lt;code&gt;controller&lt;/code&gt; la &lt;code&gt;vue&lt;/code&gt; qu’on
veut appelé. C’est très pratique lorsqu’on a plein d’actions, mais qu’on a pas
besoin de &lt;code&gt;vues&lt;/code&gt; différentes a chaque &lt;code&gt;action&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/06/Zend-vues.png"
rel="lightbox[375]"&gt;&lt;img class="size-medium wp-image-406" title="Zend : vues"
src="../wp-content/uploads/2009/06/Zend-vues-300x187.png"
alt="Zend : vues" width="300" height="187" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La suite : &lt;a href="../zend/zend-comment-utiliser-un-model.html"&gt;Comment utiliser un model avec Zend framework&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/J6z0aCsuUB8" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-comment-faire-une-vue.html</feedburner:origLink></entry>
        <entry>
        <title>Zend : Qu'est ce qu'un controller ?</title>
                <id>http://blog.lyrixx.info/zend/zend-quest-ce-quun-controller.html</id>
                <updated>2009-06-19T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/bpPlDVY2JqU/zend-quest-ce-quun-controller.html" />
        <content type="html" xml:lang="en">&lt;h2&gt;Comment utiliser les controllers dans Zend ?&lt;/h2&gt;

&lt;p&gt;En fait, le &lt;strong&gt;controller&lt;/strong&gt; du &lt;strong&gt;Zend Framework&lt;/strong&gt; c’est l’outil qui va
complètement contrôler l’application, c’est a dire que c’est lui qui va
&lt;strong&gt;s’occuper de lancer les calculs de récupérer les résultats et de les envoyer à
la vue&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Donc par exemple si mon application est a l’adresse suivante :
&lt;code&gt;http://www.lyrixx.info/&lt;/code&gt; et que je vais à l’adresse suivante :
&lt;code&gt;http://www.lyrixx.info/controller/action/&lt;/code&gt; j’exécuterais le code du controller
« &lt;code&gt;controller&lt;/code&gt; » et plus précissement la méthode (on dit Action) « &lt;code&gt;action&lt;/code&gt;« .
Par défaut si on ne précisse pas de controller, ni d’action c’est le controller
&lt;code&gt;index&lt;/code&gt; et l’action &lt;code&gt;index&lt;/code&gt; qui sera appelé. Donc l’adresse
&lt;code&gt;http://www.lyrixx.info/&lt;/code&gt; est équivalente a &lt;code&gt;http://www.lyrixx.info/index/&lt;/code&gt; et
est aussi équivalente à &lt;code&gt;http://www.lyrixx.info/index/index/&lt;/code&gt;. Par exemple le
controller par default ressemble a ca :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php

/**
 * IndexController - The default controller class
 *
 * @author
 * @version
 */

class IndexController extends Zend_Controller_Action
{
    /**
     * The default action - show the home page
     */
    public function indexAction()
    {
    // TODO Auto-generated IndexController::indexAction() action
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;De plus les controllers doivent respecter une certaines terminologies :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ils commencent par une majuscule&lt;/li&gt;
&lt;li&gt;Finissent par « &lt;code&gt;Controller.php&lt;/code&gt;« &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De même pour les actions :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elles commencent par une minuscules&lt;/li&gt;
&lt;li&gt;Finissent par « &lt;code&gt;Action&lt;/code&gt;« &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc maintenant il va falloir définir les controllers. La c’est un peu une
question de gout. C’est a travers les controllers qu’on va definir les urls de
notre application (bien qu’il soit quand meme possible de les changer). Il faut
qu’il y ai un bon equilibre entre le nombre de controller et le nombre d’action
dans chaque controller.&lt;/p&gt;

&lt;p&gt;Donc notre cas on a environ 5 types pages :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajouter / Editer / Supprimer une facture&lt;/li&gt;
&lt;li&gt;Ajouter / Editer / Supprimer un utilisateur&lt;/li&gt;
&lt;li&gt;Voir la liste des Facture&lt;/li&gt;
&lt;li&gt;Calculer les sommes dues&lt;/li&gt;
&lt;li&gt;Voir les statistiques&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On va donc faire 5 controllers :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Facture&lt;/code&gt; pour Ajouter / Editer / Supprimer une facture&lt;/li&gt;
&lt;li&gt;&lt;code&gt;User&lt;/code&gt; pour Ajouter / Editer / Supprimer un utilisateur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Factures&lt;/code&gt; pour Voir la liste des Facture&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Calcul&lt;/code&gt; pour Calculer les sommes dues&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stats&lt;/code&gt; pour Voir les statistiques&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et dans chaque controller on aura différente action. Par exemple pour le
controller facture on aura comme action :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ajouter&lt;/li&gt;
&lt;li&gt;editer&lt;/li&gt;
&lt;li&gt;supprimer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;** Truc et Astuces**&lt;/p&gt;

&lt;p&gt;on peut ajouter facilement un controller dans zend studio (que je vous
recommende fortement). Il suffit de faire CTRL+N puis de choisir Zend Controller
:&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/06/New_Controller.png"&gt;
  &lt;img title="New_Controller" src="../wp-content/uploads/2009/06/New_Controller-274x300.png"
  alt="Zend :Ajouter un nouveau controller" width="274" height="300" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voila a quoi ressemble notre controller &lt;code&gt;facture&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Biensur, pour l’instant les actions sont vides. Il va falloir les « remplir » de
code, mais on verra ca par la suite ! Maintenant que notre premier controller
est fait, on peut essayé d’aller dessus. Mais il y a une exception qui est
lancé. C’est normale, c’est qu’il n’y a pas encore de vue associé a ce
controller. Il faut pour ça créer une vue.&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/06/Zend-pas-de-view.png" rel="lightbox[340]"&gt;
  &lt;img class="size-medium wp-image-373" title="Zend pas de view" src="../wp-content/uploads/2009/06/Zend-pas-de-view-300x175.png" alt="Zend : Erruer : pas de vue" width="300" height="175" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut noter l’url pour acceder a cette action : &lt;code&gt;…/facture/ajouter/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Voila maintenant on a plus qu’a &lt;a href="../zend/zend-comment-faire-une-vue.html" title="Zend : Comment faire une vue"&gt;faire une vue pour ce controller&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/bpPlDVY2JqU" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-quest-ce-quun-controller.html</feedburner:origLink></entry>
        <entry>
        <title>Zend : Comment utiliser un layout ?</title>
                <id>http://blog.lyrixx.info/zend/zend-comment-utiliser-un-layout.html</id>
                <updated>2009-06-19T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/of_CiHNvcXg/zend-comment-utiliser-un-layout.html" />
        <content type="html" xml:lang="en">&lt;h3&gt;Comment utiliser un seul layout dans le Zend Framework ?&lt;/h3&gt;

&lt;p&gt;On va continuer d’utiliser la base qu’on avait sur la gestion de compte en
collocation. On va donc reprendre le code de ce script et l’adapté a Zend. Dans
le script de base, on avait deux fichiers : un header (header.php) et un footer
(footer.php). On va donc pouvoir coller le code ou il faut dans le fichier
main.phtml.&lt;/p&gt;

&lt;p&gt;De base ce fichier ressemble a ca :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php

/**
 * Default Layout
 *
 * @author
 * @version
 */

echo '&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;';
echo $this-&amp;gt;doctype()
?&amp;gt;

&amp;lt;html&amp;gt;

    &amp;lt;head&amp;gt;
        &amp;lt;meta http-equiv="Content-Type" content="text/html;
        charset=UTF-8" /&amp;gt;
        &amp;lt;link rel="stylesheet" type="text/css" href="&amp;lt;?php echo
        $this-&amp;gt;baseUrl();?&amp;gt;/styles/design.css" /&amp;gt;
        &amp;lt;?php
        echo $this-&amp;gt;headTitle();
        echo $this-&amp;gt;headScript();
        echo $this-&amp;gt;headStyle();
        ?&amp;gt;
    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $this-&amp;gt;placeholder('title')
        ?&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;layout()-&amp;gt;content ?&amp;gt;

        &amp;lt;br /&amp;gt;
        &amp;lt;br /&amp;gt;
    &amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On va donc rajouter le header entre la balise body et la balise h1 et le footer
juste avant la fin de body, en prenant soin d’enlever les balises en double.
Cependant, on ne prend que le code de la partie après la balise body, zend
s’occupant du reste. De plus on voit qu’il y a du code php dans le header, on
n’en a pas encore besoin, on ne le copie pas encore. on obtient alors ce fichier
:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php

/**
 * Default Layout
 *
 * @author
 * @version
 */

$temps_debut = microtime(true);
echo '&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;';
echo $this-&amp;gt;doctype()
?&amp;gt;

&amp;lt;html&amp;gt;

    &amp;lt;head&amp;gt;
        &amp;lt;meta http-equiv="Content-Type" content="text/html;
        charset=UTF-8" /&amp;gt;
        &amp;lt;link rel="stylesheet" type="text/css" href="&amp;lt;?php echo
        $this-&amp;gt;baseUrl();?&amp;gt;/styles/design.css" /&amp;gt;
        &amp;lt;?php
        echo $this-&amp;gt;headTitle();
        echo $this-&amp;gt;headScript();
        echo $this-&amp;gt;headStyle();
        ?&amp;gt;
    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;div id="header"&amp;gt;
            &amp;lt;h1&amp;gt;&amp;lt;a href="#"&amp;gt;Gestion de
            compte&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
            &amp;lt;ul id="nav"&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href="index.php"&amp;gt;Accueil&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href="add_facture.php"&amp;gt;Ajouter une facture&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href="list_facture.php"&amp;gt;Listes des factures&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href="calcul.php"&amp;gt;Calculer&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href="user.php"&amp;gt;Utilisateurs&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href="stats.php"&amp;gt;Stats&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div id="container"&amp;gt;
            &amp;lt;div id="content"&amp;gt;
            &amp;lt;h1&amp;gt;&amp;lt;?php echo $this-&amp;gt;placeholder('title')
            ?&amp;gt;&amp;lt;/h1&amp;gt;
            &amp;lt;?php echo $this-&amp;gt;layout()-&amp;gt;content ?&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div id="footer"&amp;gt;
            &amp;lt;p class="validate"&amp;gt;&amp;lt;a href="http://validator.w3.org/check?uri=referer"&amp;gt;XHTML&amp;lt;/a&amp;gt;
            |
            &amp;lt;a href="http://jigsaw.w3.org/css-validator/"&amp;gt;CSS&amp;lt;/a&amp;gt;
            | &amp;lt;a href="#content"&amp;gt;Top&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;&amp;lt;a href="www.lyrixx.info"&amp;gt;© Pineau Gr&amp;amp;eacute;goire&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;Temps de chargement : &amp;lt;?php $temps_fin = microtime(true); echo round($temps_fin - $temps_debut, 3);?&amp;gt; secondes | Nombre de requ&amp;amp;egrave;tes sql : &amp;lt;?php echo $nb_req?&amp;gt;
            &amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;br /&amp;gt;
        &amp;lt;br /&amp;gt;
    &amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila on a notre layout tout prêt. Cependant les liens ne fonctionnent pas
encore. C’est normale, il n’y a pas encore de &lt;a href="../zend/zend-quest-ce-quun-controller.html" title="Zend : Qu’est ce qu’un controller ?"&gt;controller&lt;/a&gt; qui va s’occuper
de gerer tout ca.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/of_CiHNvcXg" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/zend-comment-utiliser-un-layout.html</feedburner:origLink></entry>
        <entry>
        <title>Architecture de Zend Framework en MCV</title>
                <id>http://blog.lyrixx.info/zend/architecture-de-zend-framework-en-mcv.html</id>
                <updated>2009-06-17T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/Qix7kTTI9Fk/architecture-de-zend-framework-en-mcv.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Vous êtes nouveaux sur le Zend Framework, et vous êtes un peu perdu avec
l’architecture MCV de ce framework. Pas de panique, je vous explique tout !
Deja, c’est quoi le MVC :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Le Modèle-Vue-Contrôleur (en abrégé MVC, de l’anglais Model-View-Controller)
  est une architecture et une méthode de conception qui organise l’interface
  homme-machine (IHM) d’une application logicielle. Ce paradigme divise l’IHM en
  un modèle (modèle de données), une vue (présentation, interface utilisateur) et
  un contrôleur (logique de contrôle, gestion des événements, synchronisation),
  chacun ayant un rôle précis dans l’interface.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;D’après &lt;a
href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur"
target="_blank"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="../wp-content/uploads/2009/06/Zend-Architecture.png"
rel="lightbox[310]"&gt;&lt;img class="size-full wp-image-312" title="Zend -
Architecture" src="../wp-content/uploads/2009/06/Zend-Architecture.png" alt="Zend -
Architecture" width="328" height="580" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Zend - Architecture&lt;/h2&gt;

&lt;p&gt;Voila, l’architecture typique d’une application Zend. Donc on retrouve tout en
haut de l’achitecture, le dossier du projet : &lt;code&gt;Budget&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Budget

&lt;ul&gt;
&lt;li&gt;Application : contient toute l’application, en générale ce dossier
ce situe a un endroit de votre serveur
qui n’est pas accessible depuis l’extérieur (comme dans les CGI-BIN)

&lt;ul&gt;
&lt;li&gt;default : c’est le nom d’une application, en général on
n’en a qu’une, mais sur de grosse
architecture, on peut en avoir plusieurs.

&lt;ul&gt;
&lt;li&gt;controllers : ce sont les controlleurs (le C de MVC). ce sont
eux qui vont creer des models pour
excecuter des actions, des taches ou des opérations, ils
founissent ensuite le ou les résultats à
la vue.&lt;/li&gt;
&lt;li&gt;helpers : ce sont des bouts de code utilisable dans tous
les controllers&lt;/li&gt;
&lt;li&gt;layouts : c’est le template de votre site&lt;/li&gt;
&lt;li&gt;models : ce sont les models de votre application. Ce sont des
class php qui vont faire le « gros »
du travail&lt;/li&gt;
&lt;li&gt;view : ce sont le vues de votre applications. On y retrouve :

&lt;ul&gt;
&lt;li&gt;filters : des filtres&lt;/li&gt;
&lt;li&gt;helpers : des bouts de code commun que l’on peu aussi
utiliser dans les layouts&lt;/li&gt;
&lt;li&gt;scripts : les vrais vues. Ici il faut respecter une
structure precise, en accord avec les
controllers, mais on y reviendra&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;bootstrap.php et initializer.php sont les fichiers de chargement
de l’application. c’est dans
l’initializer qu’on fait les connections a la base de donnée
par exemple.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;library : ici on a toutes les class dont zend a besoin pour fonctionner,
et on a aussi toutes les autres
class disponible (voir la doc …)&lt;/li&gt;
&lt;li&gt;public : c’est le dossier public qui est accessible depuis
l’extérieur : on y retrouve toutes les
feuilles de style, les fichiers javascripts, les images …&lt;/li&gt;
&lt;li&gt;test : ce dossier contient toutes les class qui servent a faire des
tests unitaire.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On passe a la suite : &lt;a href="../zend/css-javascript-et-zend-framework.html"&gt;Comment ajouter une feuille de style CSS et un fichier Javascript avec Zend Framework&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/Qix7kTTI9Fk" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/architecture-de-zend-framework-en-mcv.html</feedburner:origLink></entry>
        <entry>
        <title>Css, JavaScript et Zend Framework</title>
                <id>http://blog.lyrixx.info/zend/css-javascript-et-zend-framework.html</id>
                <updated>2009-06-17T00:00:00+02:00</updated>
        <author>
            <name>Grégoire Pineau</name>
            <email>lyrixx@lyrixx.info</email>
        </author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lyrixblog/~3/GDp5_4HnYfU/css-javascript-et-zend-framework.html" />
        <content type="html" xml:lang="en">&lt;p&gt;Comment lier une feuille  de style CSS ou un fichier javascript proprement dans
une application utilisant le Framework Zend ?&lt;/p&gt;

&lt;p&gt;Etant donnée qu’on est dans un contexte model vue controller, et que le dossier
public (qui contient les fichier css et js) est à un endroit totalement inconnu
du reste de l’application (en MVC) on va devoir utiliser des helper. Ce sont des
scripts php qui peuvent être utilisé a plusieurs endroit. Dans notre cas, on
utilisera le helper dans le layout, qui definit notre page principale. C’est un
peu le template du site.&lt;/p&gt;

&lt;p&gt;On va creer un &lt;code&gt;View Helper&lt;/code&gt; dans le dossier &lt;code&gt;application/default/views/helpers&lt;/code&gt;
:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Zend_View_Helper_BaseUrl
{
    function baseUrl()
    {
        $fc = Zend_Controller_Front::getInstance();

        return $fc-&amp;gt;getBaseUrl();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Grâce a ce &lt;code&gt;Helper&lt;/code&gt;, on pourra avoir la base de l’url de notre application. Donc
maintenant il ne reste plus qu’a s’en servir dans le layout principale. On va
donc copier notre fichier css dans le répertoire  &lt;code&gt;./public/styles/&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;*{outline:none;margin:0;padding:0;}
html{border:15px solid #f6f6f6;border-left:30px solid #f6f6f6;border-right:30px  solid #f6f6f6;}
body{background:#fff;font:16px/1.95em "Lucida Grande","Lucida Unicode",geneva,verdana,sans-serif;color:#666;padding-top:20px;border:3px solid #eee;margin:0;}
#header{width:100%;margin:0 auto;padding:20px 0;}
#header .right{float:right;}
#header h1{font:290% Times New Roman;letter-spacing:-2px;margin-bottom:5px;margin-left:35px;}
#header h1 a{color:#000;text-decoration:none;}
#header h1 a span{color:#ccc;}
#header h1 a:hover span{color:#A3E800;}
#header h3{font:80% Verdana;color:#999;display:inline;margin-left:35px;}
ul#nav{background:#8EDF53;font-size:80%;border-top:3px solid #6CCC26;border-bottom:3px solid #6CCC26;font-weight:700;margin:45px 0 0;padding:10px;}
ul#nav li{display:inline;list-style:none;margin-right:10px;}
ul#nav li a{color:#fff;text-decoration:none;padding:10px 14px;}
ul#nav li a:hover{background:#7EDB39;color:#fff;}
ul#nav li a.active{background:#fff;color:#333;border-right:2px solid #6CCC26;border-bottom:2px solid #6CCC26;}
#footer{margin-top:50px;clear:both;border-top:2px solid #eee;font:80% Verdana;line-height:25px;padding:20px 50px;}
#footer a{color:#999;}
#footer .validate{float:right;}
#container{width:95%;margin:0 auto;}
#content{width:100%;margin-bottom:50px;}
#content ul{margin:15px 0 15px 25px;}
#content ul li{border-bottom:1px solid #eee;color:#444;padding:10px;}
#content img{background:#fff;padding:1px;border:0px;}
#content h3{margin:20px 0;}
#content p{line-height:30px;word-spacing:2px;margin:20px 0;}
#content p a{color:#222;text-decoration:none;border-bottom:1px solid #ccc;}
#content p a:hover{border-bottom:1px solid #aaa;}
#content h2{font:190% Times;margin-top:45px;}
#content h2 a{color:#333;text-decoration:none;}
blockquote{background:#f6f6f6;border:1px solid #eee;font:100% Georgia;padding:0 10px;}
table{width:100%;border:1px solid #eee;padding:10px;}
th{color:#6CCC26;border-bottom:1px solid #eee;padding:5px;}
td{text-align:center;background:#fafafa;padding:5px;}
.formulaire{width:500px;margin-left:auto;margin-right:auto;border:solid 1px
#c8c8c8;background-color:#fafafa;padding:10px 10px 0;}
.formulaire fieldset{border:solid 1px #dcdcdc;margin:0 0 20px;padding:20px 0 0 !important;}
.formulaire fieldset legend{color:#505050;font-weight:700;font-size:130%;margin:0 0 0 5px !important;padding:0 2px;}
.formulaire label.left{float:left;width:200px;font-size:110%;margin:0 0 0 10px;padding:2px;}
.formulaire select.combo{width:175px;border:solid 1px #c8c8c8;font-family:verdana,arial,sans-serif;font-size:110%;padding:2px;}
.formulaire input.field{width:275px;border:solid 1px #c8c8c8;font-family:verdana,arial,sans-serif;font-size:110%;padding:2px;}
.formulaire textarea{width:275px;height:250px;border:solid 1px #c8c8c8;font-family:verdana,arial,sans-serif;font-size:110%;padding:2px;}
.formulaire input.button{float:right;width:9em;margin-right:20px;background:#e6e6e6;border:solid 1px #969696;text-align:center;font-family:verdana,arial,sans-serif;color:#969696;font-size:110%;padding:1px !important;}
.formulaire input.button:hover{cursor:pointer;border:solid 1px #505050;background:#dcdcdc;color:#505050;}
.info_msg_class{border:1px solid #000;background:#fafafa;text-align:center;padding:10px;}
.button1 a{margin:0 3px;padding:2px 5px;text-decoration:none;background:#eee;border:solid 1px #aaa;color:#aaa;text-align:center;}
.button1 a:hover{cursor:pointer;border:solid 1px #555;background:#dcdcdc;color:#555;}
input.calendar {width:150px;border:solid 1px #c8c8c8;font-family:verdana,arial,sans-serif;font-size:110%;padding:2px; float: left;}
button.calendar {float: left;width: 24px;height: 24px;border: 0;margin-left: 10px;cursor: pointer;background: url('../img/calendar.png');}
button.calendar:hover , button.calendar.active {background-position: left bottom;}
div.calendar{background:#eee;}
.fact_option{width:60px;}
.user_option{width:40px;}
.nowrap{white-space:nowrap}
.barrer &amp;gt; td{text-decoration:line-through;}
.change_payed {border-bottom:2px dotted #6CCC26}
.change_payed2 {white-space:nowrap;}
.calcul{margin:1px 5px;padding:2px 5px;background:#e6e6e6;border:outset 1px #969696;color:#969696;}
.calcul:hover{cursor:pointer;border:inset 1px #505050;background:#dcdcdc;color:#505050;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Puis maintenant il faut editer le fichier
&lt;code&gt;application/default/layouts/main.phtml&lt;/code&gt; qui est le &lt;strong&gt;template&lt;/strong&gt; par default et
on ajoute la notre** feuille de style** :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Default Layout
 *
 * @author
 * @version
 */

echo '&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;';
echo $this-&amp;gt;doctype()
?&amp;gt;

&amp;lt;html&amp;gt;

    &amp;lt;head&amp;gt;
        &amp;lt;meta http-equiv="Content-Type" content="text/html;
        charset=UTF-8" /&amp;gt;
        &amp;lt;link rel="stylesheet" type="text/css" href="&amp;lt;?php echo
        $this-&amp;gt;baseUrl();?&amp;gt;/styles/design.css" /&amp;gt;
        &amp;lt;?php
        echo $this-&amp;gt;headTitle();
        echo $this-&amp;gt;headScript();
        echo $this-&amp;gt;headStyle();
        ?&amp;gt;
    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $this-&amp;gt;placeholder('title')
        ?&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;?php echo $this-&amp;gt;layout()-&amp;gt;content ?&amp;gt;

        &amp;lt;br /&amp;gt;
        &amp;lt;br /&amp;gt;
    &amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voila maintenant il suffit de faire la meme chose pour les fichiers
&lt;strong&gt;JavaScipts&lt;/strong&gt; On peut donc passer a la suite avec : &lt;a href="../zend/zend-comment-utiliser-un-layout.html" title="Zend et les layouts"&gt;Comment mettre en place un
layout ou template avec Zend Framework&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/lyrixblog/~4/GDp5_4HnYfU" height="1" width="1"/&gt;</content>
    <feedburner:origLink>http://blog.lyrixx.info/zend/css-javascript-et-zend-framework.html</feedburner:origLink></entry>
    </feed>
