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

<channel>
	<title>IDCI-Consulting</title>
	<atom:link href="http://www.idci-consulting.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.idci-consulting.fr</link>
	<description>Ingénierie Développement Conseil Intégration</description>
	<lastBuildDate>Wed, 08 Feb 2012 14:24:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Comment créer un nouveau type Doctrine2 avec Symfony2</title>
		<link>http://www.idci-consulting.fr/comment-creer-un-nouveau-type-doctrine2-avec-symfony2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comment-creer-un-nouveau-type-doctrine2-avec-symfony2</link>
		<comments>http://www.idci-consulting.fr/comment-creer-un-nouveau-type-doctrine2-avec-symfony2/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 09:20:55 +0000</pubDate>
		<dc:creator>Pierre FERROLLIET</dc:creator>
				<category><![CDATA[Symfony 2]]></category>

		<guid isPermaLink="false">http://www.idci-consulting.fr/?p=85</guid>
		<description><![CDATA[Introduction Si vous avez rencontré à un moment donné de votre projet symfony2 la problématique du stockage de médias en base de données vous vous êtes forcément posé la question suivante : Comment créer un nouveau type de données doctrine2 avec symfony2 ? En effet, il n&#8217;existe que peu de types de base avec Doctrine2, [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/symfony2.png" alt="Symfony2 logo" title="Symfony2" /></p>

</div>

<h3 id="h_1">Introduction</h3>

<p>Si vous avez rencontré à un moment donné de votre projet symfony2 la problématique
du stockage de médias en base de données vous vous êtes forcément posé la question
suivante : <em>Comment créer un nouveau type de données doctrine2 avec symfony2 ?</em>
En effet, il n&#8217;existe que peu de types de base avec Doctrine2, pour des soucis de généricité :</p>

<ul>
<li>string</li>
<li>integer</li>
<li>smallint</li>
<li>bigint</li>
<li>boolean</li>
<li>decimal</li>
<li>date</li>
<li>time</li>
<li>datetime</li>
<li>text</li>
<li>object</li>
<li>array</li>
<li>float</li>
</ul>

<p>Comme trame de cet article, nous allons tenter de créer une nouvelle entité Media
qui sera stockée en base de données en type blob.</p>

<h3 id="h_2">Créer un nouveau type de données doctrine2 à symfony2 : le type Blob</h3>

<p>Deux solutions s&#8217;offrent à vous pour créer votre nouveau type :</p>

<ul>
<li><p>Créer un nouveau dossier dans votre bundle dans lequel vous implementerez votre nouveau type :
<span class="special">src/MyApp/MyBundle/ORM</span></p></li>
<li><p>Implémenter votre nouveau type directement dans le vendor dédié :
<span class="special">vendor/doctrine-dbal/lib/Doctrine/DBAL/Types</span></p></li>
</ul>

<p>Sachant que la seconde méthode aura pour avantage de rendre votre type utilisable
par tous les bundles mais l&#8217;inconvénient de ne pas fournir un <em>bundle clé en main</em>,
c&#8217;est à dire un bundle comprenant la déclaration des types dont il a besoin.</p>

<p>Pour notre exemple, nous allons privilégier la première méthode :
<span class="special">src/MyApp/MyBundle/ORM</span></p>

<p>C&#8217;est dans ce dossier que vous allez pouvoir créer vos nouveaux types de données.
Pour notre exemple, réalisez une classe <span class="special">BlobType</span> qui
héritera de la classe <span class="special">AbstractPlatform</span>.
Vous devrez déclarer obligatoirement les fonctions suivantes :</p>

<ul>
<li><span class="special">public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)</span></li>
<li><span class="special">public function convertToDatabaseValue($value, AbstractPlatform $platform)</span></li>
<li><span class="special">public function convertToPHPValue($value, AbstractPlatform $platform)</span></li>
</ul>

<p>Ces fonctions vous permettent de définir un comportement pour vos champs.
Vous pouvez par exemple avoir besoin de crypter un mot de passe avant de l&#8217;enregistrer
en base de données.</p>

<pre><code>&lt;?php
namespace  MyApp\MyBundle\ORM;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

/**
 * Type that maps an Blog SQL to php objects
 */
class BlobType extends Type
{
    const BLOB = 'blob';

    public function getName()
    {
        return self::BLOB;
    }

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return $platform-&gt;getDoctrineTypeMapping('blob');
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return ($value === null) ? null : base64_encode($value);
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return ($value === null) ? null : base64_decode($value);
    }
}
</code></pre>

<h3 id="h_3">Ajouter le nouveau type Doctrine2 à notre bundle Symfony2</h3>

<p>Une fois notre type créé, il faut indiquer à Doctrine2 que celui-ci est disponible
à l&#8217;utilisation. Pour cela, il nous faut enregistrer celui-ci grace à la fonction
<span class="special">registerDoctrineTypeMapping()</span>. Celle-ci permet de charger
notre nouveau type de données dans la fonction <span class="special">boot()</span>
du bootstrap de notre bundle :</p>

<pre><code>&lt;?php
// src/MyApp/MyBundle/MyAppMyBundle.php
namespace MyApp\MyBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Doctrine\DBAL\Types\Type;

class StoreAdBundle extends Bundle
{
    public function boot()
    {
        $em = $this-&gt;container-&gt;get('doctrine.orm.entity_manager');

        // Ajout des nouveaux types à notre entity manager
        Type::addType('blob', 'MyApp\MyBundle\ORM\BlobType');
        $em-&gt;getConnection()-&gt;getDatabasePlatform()-&gt;registerDoctrineTypeMapping('blob', 'blob');
    }
}
</code></pre>

<p>Votre nouveau type est désormais configuré et prêt à l&#8217;emploi dans vos entités.</p>

<h3 id="h_4">Utiliser le nouveau type Doctrine2 dans une entity de notre bundle Symfony2</h3>

<p>Pour terminer notre exemple d&#8217;ajout d&#8217;une entité Media persistée au format blob
en base de données à notre projet, voici ce à quoi pourrait ressembler celle-ci :</p>

<pre><code>&lt;?php
// src/MyApp/MyBundle/Entity/Media.php
namespace MyApp\MyBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="media")
 * @ORM\Entity()
 */
class Media
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;

    // Utilisation de notre nouveau champs blob
    /**
     * @ORM\Column(type="blob")
     */
    protected $file;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $mime_type;

    /**
     * @ORM\Column(type="integer", length=100)
     */
    protected $size;

    /**
     * @ORM\Column(type="string", length=5)
     */
    protected $extension;

    // getters
    // setters
    // ...
}
</code></pre>

<p>En mettant à jour votre base de données via la commande</p>

<pre><code>$ php app/console  doctrine:schema:update --force
</code></pre>

<p>Vous devriez désormais avoir une table media possédant votre nouveau champ blob.</p>

<p>Si vous avez besoin d&#8217;une aide ou d&#8217;une expertise pour vos projets symfony vous pouvez
<a href="http://www.idci-consulting.fr/contact" title="Contactez-nous">nous contacter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/comment-creer-un-nouveau-type-doctrine2-avec-symfony2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction au BackOffice de WordPress</title>
		<link>http://www.idci-consulting.fr/introduction-au-backoffice-de-wordpress/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduction-au-backoffice-de-wordpress</link>
		<comments>http://www.idci-consulting.fr/introduction-au-backoffice-de-wordpress/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 19:31:19 +0000</pubDate>
		<dc:creator>Gabriel BONDAZ</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.idci-consulting.fr/?p=82</guid>
		<description><![CDATA[Cet article présente certaines des nombreuses fonctionnalités disponible de l&#8217;outil WordPress. De nombreuses documentations sur ce sujet sont disponibles sur la toile mais la plus complète se trouve sur le site officiel codex.wordpress.org. L&#8217;idée de cet article est de vous permettre une rapide prise en main des fonctionnalités essentielles et de vous accompagner en vous [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/wordpress-logo.png" alt="Wordpress logo" title="Wordpress logo" /></p>

</div>

<p>Cet article présente certaines des nombreuses fonctionnalités disponible de l&#8217;outil <b>WordPress</b>.
De nombreuses documentations sur ce sujet sont disponibles sur la toile mais la plus complète
se trouve sur le site officiel <a href="http://codex.wordpress.org/Main_Page">codex.wordpress.org</a>.
L&#8217;idée de cet article est de vous permettre une rapide prise en main des fonctionnalités
essentielles et de vous accompagner en vous proposant un fil conducteur simple
dans les coulisses de ce séduisant CMS &#8230;</p>

<p>Pour <a href="installer-wordpress">installer WordPress</a>, si c&#8217;est déjà fait, allons-y !</p>

<h3 id="h_1">A quoi sert le back office de WordPress</h3>

<p>Le back office de WordPress est un espace réservé, accessible par un login et un mot de passe.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_8.png" alt="WP Admin" title="WP Admin" /></p>

<p>Une fois connecté dans cette espace vous pourrez alors:</p>

<ul>
<li>Gérer le contenu de votre site (Articles, Pages, Médias, Liens)</li>
<li>Modérer les commentaires déposés par les internautes</li>
<li>Modifier l&#8217;apparence du site (par l&#8217;utilisation de thèmes)</li>
<li>Ajouter des extensions (plugins) pour enrichir en fonctionnalités votre site</li>
<li>Administrer les utilisateurs</li>
<li>&#8230;</li>
</ul>

<div class="notice question">
<span></span>
Pour accéder à votre back office, ouvrez un navigateur Web, puis renseignez dans
la barre d&#8217;adresse l&#8217;URL de votre site suivi de <strong>/wp-admin</strong> par défaut.
</div>

<p>La navigation s&#8217;effectue par le menu qui est, présent sur la gauche de votre écran,
le contenu des différents liens se chargeant dans la zone principale au centre.
L&#8217;ergonomie de WordPress vous séduira par sa simplicité et sa rapide prise en main.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/backoffice.png" alt="BackOffice" title="BackOffice" /></p>

<h3 id="h_2">Qu&#8217;elle est la différence entre un &#8216;article&#8217; et une &#8216;page&#8217;</h3>

<h4 id="h_2-1">La façon dont sont sauvegardées les données en base:</h4>

<p>Les articles comme les pages sont des informations enregistrées dans la même table <strong>wp_posts</strong>
mais avec une valeur différente pour le champ <strong>post_type</strong> selon si c&#8217;est un article (<strong>post</strong>)
ou une page (<strong>page</strong>). La différence est donc faite dans l&#8217;utilisation.</p>

<h4 id="h_2-2">La façon dont ils sont utilisés:</h4>

<p>Les pages sont utilisées pour afficher des informations pérennes sans réelle limite dans le temps.
Les liens vers les pages sont généralement regroupés sous la forme d&#8217;un menu afin
de proposer une navigation pour votre site. Il est possible de les hiérarchiser afin
de constituer des sous-menus, des sous-sous-menu &#8230;</p>

<p>Les articles sont généralement utilisés pour afficher des informations d&#8217;actualité
sur un sujet précis. Il est possible de les catégoriser.</p>

<p>D&#8217;autres usages sont possibles avec les articles en fonction de votre imagination:</p>

<ul>
<li>Réaliser un encart promotionnel</li>
<li>Réaliser un slideshow</li>
<li>Afficher une &#8216;citation du jour&#8217;</li>
<li>&#8230;</li>
</ul>

<h3 id="h_3">Comment créer un article</h3>

<p>Il suffit de cliquer dans le menu sur l&#8217;item <strong>Articles</strong> > <strong>Ajouter</strong> ou bien
<strong>Articles</strong> > <strong>Tout les articles</strong> > <strong>Ajouter</strong></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/add_post.png" alt="Add post" title="Add post" /></p>

<p>Saisissez un <strong>titre</strong> puis le <strong>contenu</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/new_post.png" alt="New post" title="New post" /></p>

<p>Vous pouvez lui associer des catégories que vous pouvez créer à votre convenance.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/post_categories.png" alt="Post categories" title="Post categories" /></p>

<p>Vous pouvez lui associer des mots-clés pour un meilleur référencement (si vos mots-clés sont pertinents).</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/post_tags.png" alt="Post tags" title="Post tags" /></p>

<p>Une fois votre contenu prêt, vous pourrez alors:</p>

<ul>
<li>L&#8217;enregistrer comme brouillon, puis le retravailler ultérieurement</li>
<li>Visualiser un aperçu dans votre front office</li>
<li>Le publier</li>
</ul>

<p><img src="/wp-content/themes/idci/posts/illustrations/post_actions.png" alt="Post actions" title="Post actions" /></p>

<h3 id="h_4">Comment créer une page</h3>

<p>Il suffit de cliquer dans le menu sur l&#8217;item <strong>Pages</strong> > <strong>Ajouter</strong> ou bien
<strong>Pages</strong> > <strong>Toutes les pages</strong> > <strong>Ajouter</strong></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/add_page.png" alt="Add page" title="Add page" /></p>

<p>Saisissez un <strong>titre</strong> puis le <strong>contenu</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/new_page.png" alt="New page" title="New page" /></p>

<p>Vous pouvez hiérarchiser vos pages en définissant une page parent. Une page ne peut
avoir qu&#8217;un seul parent, mais elle peut avoir plusieurs pages enfants.
Vous pouvez définir un ordre d&#8217;affichage en renseignant le <strong>champ order</strong>.
La plus petite valeur correspond à la première position dans le menu.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/page_attributs.png" alt="Page attributs" title="Page attributs" /></p>

<p>Une fois votre contenu prêt, vous pourrez alors:</p>

<ul>
<li>L&#8217;enregistrer comme brouillon, puis le retravailler ultérieurement</li>
<li>Visualiser un aperçu dans votre front office</li>
<li>Le publier</li>
</ul>

<p><img src="/wp-content/themes/idci/posts/illustrations/post_actions.png" alt="Page actions" title="Page actions" /></p>

<h3 id="h_5">L&#8217;éditeur de WordPress</h3>

<p>Vous pouvez éditer votre contenu à l&#8217;aide de l&#8217;éditeur <strong>WYSIWYG</strong> (What You See Is What You Get)
ou bien directement saisir les balises <strong>HTML</strong>. A vous de choisir le mode d&#8217;édition
qui vous convient le mieux.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/editor_mode.png" alt="Change editor mode" title="Change editor mode" /></p>

<p>Il est également possible d&#8217;utiliser un éditeur disposant de plus de fonctionnalités.
Il suffit pour cela de cliquer sur &laquo;&nbsp;Afficher/cacher les options avancées (touches: Alt+Shift+Z)&nbsp;&raquo;.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/advanced_editor.png" alt="Advanced editor" title="Advanced editor" /></p>

<p>L&#8217;insertion de média (image, vidéo, son) s&#8217;effectue à l&#8217;aide des boutons d&#8217;actions
situés au-dessus de l&#8217;éditeur. Les interfaces pour l&#8217;insertion de média sont très intuitives.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/add_media.png" alt="Add media" title="Add Media" /></p>

<h3 id="h_6">Les permalinks</h3>

<p>Le permalink correspond à l&#8217;URL (Unified Ressource Locator) permettant d&#8217;accèder
à votre page ou votre article. C&#8217;est l&#8217;identifiant Web d&#8217;un contenu bien précis de votre site.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/permalink.png" alt="Permalink" title="Permalink" /></p>

<p>Par défaut le permalink est constitué de l&#8217;URL de votre site suivi de <span class="special">/?p=id-post</span>
Ou &#8216;id-post&#8217; est l&#8217;identifiant du contenu dans votre base de donnée MySQL (Table wp_post).</p>

<p>Si vous souhaitez travailler le référencement Web de vos contenus, il peut être intéressant
d&#8217;optimiser cette URL avec des mots clés au lieu d&#8217;utiliser l&#8217;écriture par défaut.
Pour cela il faut commencer par définir la chaîne de formatage de vos permalinks
dans l&#8217;onglet <strong>Réglages</strong> > <strong>Permaliens</strong></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/permalink_menu.png" alt="Permalink menu" title="Permalink menu" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/permalink_format.png" alt="Permalink format" title="Permalink format" /></p>

<p>Assurer vous d&#8217;avoir mis les bons droits sur votre dossier Web, car les modifications
de ce paramètre entraine la création d&#8217;un fichier <a href="http://fr.wikipedia.org/wiki/Htacces">.htaccess</a>
à la racine de votre site Web.</p>

<div class="notice question">
<span></span>
Pour utiliser les permalink comme bon vous semble, il faudra s&#8217;assurer que votre serveur
Web est capable de faire de la réécriture d&#8217;URL. Dans le cas d&#8217;un serveur Web Apache,
il faut activer le module rewrite. Dans les autres cas il vous faudra faire ces modifications
par vous-même.
</div>

<p>Pour plus d&#8217;informations voici un <a href="http://codex.wordpress.org/Using_Permalinks" title="Using permalinks">lien</a>
sur comment utiliser les permalinks sur le site <a href="http://codex.wordpress.org" title="Wordpress Codex">http://codex.wordpress.org</a></p>

<p>Une fois vos réglages effectués, il ne vous reste plus qu&#8217;à définir les URL de vos
Articles ou de vos Pages directement dans la page d&#8217;édition de ces derniers:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/permalink_rewrite.png" alt="Permalink rewrite" title="Permalink rewrite" /></p>

<h3 id="h_7">Comment fonctionne les commentaires</h3>

<p>Les commentaires sont des messages laissés sur un article ou une page par des internautes.
C&#8217;est une fonctionnalité qui est active par défaut sur l&#8217;ensemble de votre site.
Les commentaires se configure dans <strong>Réglages</strong> > <strong>Discussion</strong></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/manage_comments.png" alt="Manage comments" title="Manage comments" /></p>

<p>Voici une petite FAQ (Foire Aux Questions):</p>

<h4 id="h_7-1">Comment désactiver les commentaires ?</h4>

<p>Vous pouvez activer/désactiver les commentaires de manière globale, c&#8217;est à dire sur tout le site:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/enable_disable_comments.png" alt="Enable/Disable comments" title="Enable/Disable comments" /></p>

<p>Ou bien de manière plus ciblée, c&#8217;est à dire sur une page ou un article bien précis.
Pour cela aller sur l&#8217;édition de la page ou de l&#8217;article pour la/lequel vous souhaitez
régler l&#8217;affichage des commentaires, puis afficher les options d&#8217;écran:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/display_screen_options.png" alt="Display screen options" title="Display screen options" /></p>

<p>et cocher l&#8217;option <strong>discussion</strong></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/screen_options.png" alt="Screen options" title="Screen options" /></p>

<p>Une nouvelle fenêtre pour configurer les discussions liées à votre page ou votre article
est maintenant disponible un peu plus bas sur votre écran. Vous pouvez alors
activer ou non les commentaires sur la page ou l&#8217;article édité.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/discussion_box.png" alt="Discussion box" title="Discussion box" /></p>

<h4 id="h_7-2">Qui peut laisser un commentaire ?</h4>

<p>Vous pouvez imposer ou non le renseignement d&#8217;informations personnelles avant de pouvoir
déposer un commentaire. Autrement dit, acceptez-vous ou non des messages de personnes anonymes.
Par défaut le nom et le mail sont des champs obligatoires. Vous pouvez modifier cela
commme suit:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/comment_user_data.png" alt="Comment user data" title="Comment user data" /></p>

<h4 id="h_7-3">Les commentaires déposés par les internautes sont ils visibles sur mon site ?</h4>

<p>Cela dépend encore une fois de vos réglages, par défaut les commentaires nécessitent
une validation de la part de l&#8217;administrateur du site. Il ne vous reste plus qu&#8217;à
faire vos réglages.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/moderate_comments.png" alt="Moderate comments" title="Moderate comments" /></p>

<div class="notice question">
<span></span>
Une fois votre site en ligne, il est possible que vous receviez des commentaires
saisis par des &#8216;robots&#8217;, c&#8217;est à dire des programmes informatiques. Ces commentaires
sont facilement reconnaissables car souvent leurs contenus sont sans rapport avec
le contenu de la page commentée. Une bonne solution pour lutter contre ces messages
indésirables est l&#8217;utilisation de plugin par exemple <a href="http://akismet.com/" title="Akismet" target="_blank">Akismet</a>
Mais vous pouvez très bien les supprimer manuellement <img src='http://www.idci-consulting.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 
</div>

<h3 id="h_8">Ajouter des Thèmes</h3>

<p>Les thèmes correspondent à un ensemble de fichiers qui définissent la structure HTML
de vos pages ainsi que le design par le biais des feuilles de styles (CSS) et des images.</p>

<p>Vous pouvez télécharger de nombreux thème sur le site officiel de WordPress
<a href="http://wordpress.org/extend/themes/" title="WordPress Themes">http://wordpress.org/extend/themes/</a></p>

<p>Lorsque vous avez téléchargé un thème au format <strong>&#8216;zip&#8217;</strong>, décompresser le, puis
ajouter le dossier ainsi obtenu dans le dossier <strong>wp-content/themes</strong> de votre projet WordPress.
Aller dans l&#8217;onglet <strong>Apparence</strong> > <strong>Thèmes</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/themes.png" alt="Themes" title="Themes" /></p>

<p>Le nouveau thème doit apparaître parmi les thèmes disponibles.
Il ne vous reste plus qu&#8217;à l&#8217;activer.</p>

<p>Pour visualiser ce nouveau thème, rendez-vous sur la partie FrontOffice de votre site Web.</p>

<div class="notice question">
<span></span>
Il est également possible d&#8217;installer des thèmes directement depuis le backoffice.
Cependant Cela nécessite d&#8217;avoir installé et configuré un serveur FTP (ou FTPS) afin
de récupérer les thèmes choisis.
</div>

<h3 id="h_9">Ajouter des Plugins</h3>

<p>Les plugins sont des fonctionnalités supplémentaires qui peuvent être ajoutées à votre site Web.
Il en existe un grand nombre et ce chiffre est en augmentation constante.</p>

<p>Vous pouvez télécharger des plugins sur le site officiel de WordPress
<a href="http://wordpress.org/extend/plugins/" title="WordPress Plugins">http://wordpress.org/extend/plugins/</a></p>

<p>Lorsque vous avez téléchargé un plugin au format <strong>&#8216;zip&#8217;</strong>, décompresser le, puis
ajouter le dossier ainsi obtenu dans le dossier <strong>wp-content/plugins</strong> de votre projet WordPress.
Aller dans l&#8217;onglet <strong>Extensions</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/plugins.png" alt="Plugins" title="Plugins" /></p>

<p>Le nouveau plugin doit apparaître parmi les plugins disponibles.
Il ne vous reste plus qu&#8217;à l&#8217;activer.</p>

<div class="notice question">
<span></span>
Chaque plugin s&#8217;utilise différemment, certain ajoute une entrée dans le menu pour
être configuré, d&#8217;autre s&#8217;utilise via des tags à insérer dans vos contenus, &#8230;<br/>
Afin de savoir comment utiliser un plugin, prenez connaissance de la documentation
fournie avec le plugin:
<ul>
  <li>Directement sur le site de WordPress</li>
  <li>En lisant le fichier <strong>readme.txt</strong> généralement présent dans le dossier du plugin.</li>
</ul>
</div>

<h3 id="h_10">Gérer les utilisateurs</h3>

<p>WordPress est une application <strong>multi-utilisateur</strong> permettant donc à plusieurs personnes
de gérer les contenus diffusés par l&#8217;outil.
Différents niveaux de droits peuvent être associés à un utilisateur à savoir:</p>

<ul>
<li>Administrateur</li>
<li>Abonnée</li>
<li>Editeur</li>
<li>Auteur</li>
<li>Contributeur</li>
</ul>

<p>Pour gérer les utilisateurs aller sur l&#8217;onglet <strong>Utilisateurs</strong> du menu</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/users.png" alt="Users" title="Users" /></p>

<h3 id="h_11">Paramétrage de votre site</h3>

<h4 id="h_11-1">Changer le titre et le slogan</h4>

<p>Pour modifier le titre de votre site/blog ainsi que le slogan, informations souvent
mises en avant côté FrontOffice, Aller dans l&#8217;onglet <strong>Réglages</strong> > <strong>Général</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/general.png" alt="General parameters" title="General parameters" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/general_options.png" alt="General parameters options" title="General parameters options" /></p>

<h4 id="h_11-2">Modifier la page d&#8217;accueil</h4>

<p>Par défaut, WordPress liste les derniers articles publiés sur votre page d&#8217;accueil.
Ceci peut être modifié pour ne lister qu&#8217;un certain nombre d&#8217;articles, ou encore
pour afficher une page &#8216;statique&#8217; à la place. Pour cela aller dans l&#8217;onglet <strong>Réglages</strong> > <strong>Lecture</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/lecture.png" alt="Lecture" title="lecture" /></p>

<div class="notice question">
<span></span>
Il faut avoir créé au moins une page pour pouvoir effectuer ce changement !
</div>

<p><img src="/wp-content/themes/idci/posts/illustrations/homepage_parameters.png" alt="Homepage parameters" title="Homepage parameters" /></p>

<p>Maintenant il ne vous reste plus qu&#8217;a travailler vos contenus !</p>

<p>Après chaque modification réalisée côté backoffice, retournez sur la partie front,
c&#8217;est à dire la partie publique de votre site, et visualisez le rendu.</p>

<div class="notice question">
<span></span>
Si vous utilisez la navigation par onglet et qu&#8217;une fenêtre affiche déjà une
page modifiée. Relancez une requête HTTP depuis votre navigateur afin d&#8217;actualiser
le contenu modifiés (touches: F5 ou ctrl+R).
</div>

<p>N&#8217;hésitez pas à laisser vos commentaires.</p>

<p>Si vous souhaitez une formation plus avancée sur WordPress vous pouvez également
<a href="http://www.idci-consulting.fr/contact" title="Contactez-nous">nous contacter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/introduction-au-backoffice-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FOSUserBundle: Comment gérer les utilisateurs avec Symfony2</title>
		<link>http://www.idci-consulting.fr/fosuserbundle-comment-gerer-les-utilisateurs-avec-symfony2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fosuserbundle-comment-gerer-les-utilisateurs-avec-symfony2</link>
		<comments>http://www.idci-consulting.fr/fosuserbundle-comment-gerer-les-utilisateurs-avec-symfony2/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 18:00:08 +0000</pubDate>
		<dc:creator>Pierre FERROLLIET</dc:creator>
				<category><![CDATA[Symfony 2]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=47</guid>
		<description><![CDATA[Introduction Gérer les utilisateurs inscription, connexion, droits d&#8217;accès, etc.. a toujours été un plaisir avec symfony grâce aux plugins: sfGuardPlugin (propel) sfDoctrineGuardPlugin (doctrine) Ce n&#8217;est pas bien plus dur avec Symfony2 ! Cela est même simplifié au maximum, bien que dépaysant au début. Le bundle FOSUserBundle répond aux mêmes problématiques mais fluidifie les choses, les [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/symfony2.png" alt="Symfony2 logo" title="Symfony2" /></p>

</div>

<h3 id="h_1">Introduction</h3>

<p><strong>Gérer les utilisateurs</strong> inscription, connexion, droits d&#8217;accès, etc.. a toujours 
été un plaisir avec <strong>symfony</strong> grâce aux plugins:</p>

<ul>
<li>sfGuardPlugin (propel)</li>
<li>sfDoctrineGuardPlugin (doctrine)</li>
</ul>

<p>Ce n&#8217;est pas bien plus dur avec <strong>Symfony2</strong> ! Cela est même simplifié au maximum,
bien que dépaysant au début. Le bundle <strong>FOSUserBundle</strong> répond aux mêmes problématiques
mais fluidifie les choses, les rend plus intuitives.</p>

<h3 id="h_2">FOSUserBundle : Installation</h3>

<p>Il vous faut tout d&#8217;abord récupérer les sources du bundle et les placer dans le dossier vendor.
Pour cela, 2 solutions s&#8217;offrent à vous :</p>

<h4 id="h_2-1">1) Installation de FOSUSerBundle en clonant le dépôt git</h4>

<pre><code>$ git clone https://github.com/FriendsOfSymfony/FOSUserBundle.git vendor/bundles/FOS/UserBundle
</code></pre>

<h4 id="h_2-2">2) Installation de FOSUSerBundle via les dépendances git</h4>

<p>Ajoutez les lignes suivantes dans votre fichier <span class="special">deps</span> :</p>

<pre><code>[FOSUserBundle]
    git=git://github.com/FriendsOfSymfony/FOSUserBundle.git
    target=bundles/FOS/UserBundle
</code></pre>

<p>Puis mettez à jour les vendors :</p>

<pre><code>$ php bin/vendors install
</code></pre>

<p>Cette solution a l&#8217;avantage de permettre à n&#8217;importe qui travaillant avec vous sur
le projet de ne pas avoir à se soucier de quelles sont les vendors à installer et
où les trouver. Il lui suffira de mettre à jour les vendors.</p>

<p>Une fois <strong>FOSUserBundle</strong> ajouté aux vendors, il vous faut l&#8217;activer dans le Kernel:</p>

<pre><code>&lt;?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new FOS\UserBundle\FOSUserBundle(),
    );
}
</code></pre>

<p>&#8230; Et ajouter le namespace qui va bien dans l&#8217;autoload:</p>

<pre><code>&lt;?php
// app/autoload.php

$loader-&gt;registerNamespaces(array(
    // ...
    'FOS' =&gt; __DIR__.'/../vendor/bundles',
));
</code></pre>

<p>Si vous avez encore des doutes sur l&#8217;utilité des namespaces ou que vous êtes sceptiques
quant à son utilisation, je vous renvoie à ce très bon article de
<a href="http://blog.pascal-martin.fr/post/php-5.3-namespace-1-espaces-de-noms">Pascal MARTIN sur le sujet</a>.</p>

<h3 id="h_3">Créer votre entity User en surchargeant l&#8217;utilisateur de FOSUserBundle</h3>

<p>Pour hériter d&#8217;un bundle avec Symfony2, il suffit de définir le bundle parent
dans votre classe :</p>

<pre><code>&lt;?php
// src/MyApp/UserBundle/MyAppUserBundle.php

namespace MyApp\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyAppUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}
</code></pre>

<p>Votre UserBundle hérite maintenant de toutes les vues, actions&#8230;du bundle FOSUserBundle.
Vous pouvez donc créer un nouvel utilisateur héritant de celui de base,
tous les fonctionnalités de FOSUserBundle s&#8217;appliqueront à cet utilisateur :</p>

<pre><code>&lt;?php
// src/MyApp/UserBundle/Entity/User.php

namespace MyApp\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}
</code></pre>

<h3 id="h_4">Configuration de FOSUserBundle</h3>

<p>Il vous faut maintenant configurer le bundle.
Pour cela, éditez votre fichier <span class="special">config.yml</span>:</p>

<pre><code># app/config/config.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    # Permet de renseigner la nouvelle entity utilisateur
    user_class: MyApp\UserBundle\Entity\User
</code></pre>

<p>Votre bundle est désormais operationnel, vous pouvez mettre à jour votre base de données :</p>

<pre><code>$ php app/console doctrine:schema:update --force
</code></pre>

<p>A ce stade là, vous devez normalement avoir une table fos_user dans votre base de données, et un dossier
<span class="special">vendor/bundles/FOS/UserBundle</span>
contenant la hierarchie habituelle d&#8217;un bundle Symfony2.</p>

<p>Générez ensuite les getters et setters de votre nouvelle entity :</p>

<pre><code>$ php app/console doctrine:generate:entities MyAppUserBundle:User
</code></pre>

<p>Vos entités sont operationnelles, il ne vous reste plus
qu&#8217;à gérer vos formulaires. Tout d&#8217;abord, le formulaire utilisateur :</p>

<pre><code>$ php app/console doctrine:generate:form MyAppUserBundle:User
</code></pre>

<p>Maintenant, en lançant la commande</p>

<pre><code>$ php app/console
</code></pre>

<p>Vous avez désormais toute une floppée d&#8217;actions possibles grâce au bundle <strong>FOSUserBundle</strong> :</p>

<pre><code>fos
  fos:user:activate                     Activate a user
  fos:user:change-password              Change the password of a user.
  fos:user:create                       Create a user.
  fos:user:deactivate                   Deactivate a user
  fos:user:demote                       Demote a user by removing a role
  fos:user:promote                      Promotes a user by adding a role
</code></pre>

<p>Un coup d&#8217;oeil à la suite de cet article vous permettra de faire un tour d&#8217;horizon
rapide de ce bundle pour une utilisation optimale.</p>

<h3 id="h_5">Ajoutez des champs à votre entity User</h3>

<p>Vous souhaitez également que l&#8217;utilisateur renseigne nom, prénom, date de naissance,
etc&#8230; lors de son inscription, que faire ?</p>

<p>Avec symfony 1.x, il fallait créer une nouvelle classe Profil qui était embarquée
dans le formulaire de création d&#8217;un utilisateur.</p>

<p>Avec symfony2, nul besoin d&#8217;utiliser une logique aussi complexe que les formulaires embarqués.
Il suffit de créer une nouvelle entity dans <em>votre</em> bundle qui héritera des attributs
et mécanismes inhérents à l&#8217;utilisateur <strong>FOSUserBundle</strong> mais possédant également
<em>vos</em> attributs. Pour fil conducteur nous allons ajouter ensemble un lieu d&#8217;habitat
pour l&#8217;utilisateur. Pour cela, créez un nouveau bundle que vous appelerez
<span class="special">UserBundle</span> qui heritera de <strong>FOSUserBundle</strong>.</p>

<pre><code>&lt;?php
// src/MyApp/UserBundle/Entity/User.php

namespace MyApp\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    // Ajoutez vos attributs ici, un attribut *location* de type *text* pour notre exemple :
    /**
     * @ORM\Column(type="text")
     */
    protected $location;

}
</code></pre>

<p>Il vous faut ensuite modifier le formulaire d&#8217;inscription. Pour cela il vous faut
étendre celui de base fournis par le bundle <strong>FOSUserBundle</strong> en ajoutant vos champs personnalisés.
Pour continuer sur notre exemple, voici comment ajouter notre fameux champ <em>location</em> :</p>

<pre><code>&lt;?php

namespace MyApp\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationFormType extends BaseType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        parent::buildForm($builder, $options);

        // Ajoutez vos champs ici, revoilà notre champ *location* :
        $builder-&gt;add('location');
    }

    public function getName()
    {
        return 'myapp_user_registration';
    }
}
</code></pre>

<p>Il vous faut maintenant préciser à votre fichier de config quel formulaire utiliser
pour l&#8217;inscription des utilisateurs :</p>

<pre><code># app/config/config.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    # Permet de renseigner la nouvelle entity utilisateur
    user_class: MyApp\UserBundle\Entity\User
    # Permet de renseigner le nouveau formulaire d'inscription
    registration:
    form:
        type: myapp_user_registration
</code></pre>

<p>Votre entity est désormais à jour. Vous pouvez désormais actualiser votre base de
données, votre table <span class="special">fos_user</span> contiendra vos nouveaux champs :</p>

<pre><code>$ php app/console doctrine:schema:update --force
</code></pre>

<p><img src="/wp-content/themes/idci/posts/illustrations/Symfony2/manage-users/database.png" alt="Base de données" /></p>

<h3 id="h_6">Routing, actions et templates utilisés par FOSUserBundle</h3>

<p>Vous devez en tout premier lieu importer toutes les routes du bundle :</p>

<pre><code># app/config/routing.yml
fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"

fos_user_profile:
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
    prefix: /profile

fos_user_register:
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
    prefix: /register

fos_user_resetting:
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
    prefix: /resetting

fos_user_change_password:
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
    prefix: /profile
</code></pre>

<p>Découvrons ensemble les routes que <strong>FOSUserBundle</strong> a généré pour nous en utilisant
une commande Symfony2 listant les routes :</p>

<pre><code>$ php app/console router:debug
</code></pre>

<p>Vous devriez voir apparaître (en plus de vos autres routes) les routes suivantes :</p>

<pre><code>fos_user_security_login           ANY      /login
fos_user_security_check           ANY      /login_check
fos_user_security_logout          ANY      /logout
fos_user_profile_show             GET      /profile/
fos_user_profile_edit             ANY      /profile/edit
fos_user_registration_register    ANY      /register/
fos_user_registration_check_email GET      /register/check-email
fos_user_registration_confirm     GET      /register/confirm/{token}
fos_user_registration_confirmed   GET      /register/confirmed
fos_user_resetting_request        GET      /resetting/request
fos_user_resetting_send_email     POST     /resetting/send-email
fos_user_resetting_check_email    GET      /resetting/check-email
fos_user_resetting_reset          GET|POST /resetting/reset/{token}
fos_user_change_password          GET|POST /change-password/change-password
</code></pre>

<p>Vous avez également ces routes dans le routing interne à <strong>FOSUserBundle</strong>, où vous
pouvez voir quelle est l&#8217;action cible de la route.
Par exemple, pour la gestion des profils, jetons un coup d&#8217;oeil au fichier de routing :</p>

<pre><code>&lt;!-- vendor/bundles/FOS/UserBundle/Resources/config/routing/profile.xml --&gt;
&lt;routes xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"&gt;
  &lt;route id="fos_user_profile_show" pattern="/"&gt;
    &lt;default key="_controller"&gt;FOSUserBundle:Profile:show&lt;/default&gt;
    &lt;requirement key="_method"&gt;GET&lt;/requirement&gt;
  &lt;/route&gt;
  &lt;route id="fos_user_profile_edit" pattern="/edit"&gt;
    &lt;default key="_controller"&gt;FOSUserBundle:Profile:edit&lt;/default&gt;
  &lt;/route&gt;
&lt;/routes&gt;
</code></pre>

<p>Comme vous pouvez le remarquer, les fichiers de routing fournis par <strong>FOSUserBundle</strong>
sont au format xml.</p>

<h3 id="h_7">Gérer les droits d&#8217;accès des utilisateurs avec Symfony2</h3>

<p>Tout est désormais fonctionnel, vous n&#8217;avez plus qu&#8217;à restreindre l&#8217;accès aux pages souhaitées.
Cela se passe dans le fichier de configuration <span class="special">security.yml</span> :</p>

<pre><code>security:
    providers:
        fos_userbundle:
            id: fos_user.user_manager

    encoders:
        "FOS\UserBundle\Model\UserInterface": sha512

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true

    # C'est ici que tout se passe : qui a accès à quoi ?
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN
</code></pre>

<p>La partie importante à bien comprendre est celle de l&#8217;<strong>access_control</strong> :
Toutes les routes prefixées par /admin/ necessiteront le rôle <strong>ROLE_ADMIN</strong>,</p>

<p>Il vous suffit de préfixer les routes à protéger par /admin/ et le mécanisme de sécurité se mettra en oeuvre.
Là ou il vous fallait faire un backend sécurisé et un frontend avec symfony 1.x,
ou encore user du fichier security.yml pour une gestion plus fine des accès.
Vous pouvez désormais gérer au cas par cas les espaces sécurisés simplement grâce
à leurs routes !</p>

<h3 id="h_8">Récupérer et utiliser l&#8217;utilisateur dans une action avec Symfony2</h3>

<p>L&#8217;utilisateur est stocké en session, dans le contexte de l&#8217;application. Mais récupérer
celui-ci sous forme d&#8217;objet dans une action peut vite devenir un casse-tête,
bien que cela soit utile dans de nombreuses situations.
Voici une bonne façon de faire :</p>

<pre><code>$user = $this-&gt;container-&gt;get('security.context')-&gt;getToken()-&gt;getUser()
</code></pre>

<p>Vous pouvez ensuite manipuler cet objet comme bon vous semble et récupérer vos attributs nouvellement créés :</p>

<pre><code>$user-&gt;getlocation()
</code></pre>

<h3 id="h_9">Gérer l&#8217;utilisateur et ses droits d&#8217;accès dans un template twig avec Symfony2</h3>

<p>Comment tester si l&#8217;utilisateur possède les bons droits d&#8217;accès dans un template avec Symfony2?
Un jeu d&#8217;enfant avec twig ! En effet, twig dispose d&#8217;une kyrielle de fonctions de base :</p>

<pre><code>{# L'utilisateur est-il connecté ? #}
{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
    {# L'utilisateur est connecté ! #}
    &lt;a href="{{ path('fos_user_security_logout') }}"&gt;Déconnexion&lt;/a&gt;

    {# L'utilisateur est-il admin ? #}
    {% if is_granted('ROLE_ADMIN') %}
        {# L'utilisateur est admin ! #}
        &lt;a href="{{ path('admin') }}"&gt;Administration&lt;/a&gt;
    {% endif %}
{% else %}
    {# L'utilisateur n'est pas connecté ! #}
    &lt;a href="{{ path('fos_user_security_login') }}"&gt;Connexion&lt;/a&gt;
    &lt;a href="{{ path('fos_user_registration_register') }}"&gt;Inscription&lt;/a&gt;
{% endif %}
</code></pre>

<p>Twig vous permet également de récupérer l&#8217;utilisateur facilement :</p>

<pre><code>{% if is_granted("ROLE") %}
    Bien le bonjour {{ app.user.username }} !
{% endif %}
</code></pre>

<h3 id="h_10">Utilisez vos propres templates pour décorer FOSUserBundle</h3>

<p>Pour utiliser vos templates, il va falloir surcharger les templates existant du bundle
<strong>FOSUserBundle</strong> en respectant la hierarchie imposée par celui-ci.
Pour notre exemple, nous allons modifier le template d&#8217;inscription d&#8217;un nouvel utilisateur.
Pour respecter la hierarchie du bundle, créez un template <span class="special">register.html.twig</span>
dans un nouveau dossier <span class="special">Registration</span> de votre UserBundle :</p>

<pre><code>#src/MyApp/UserBundle/Resources/views/Registration/register.html.twig
{% extends "::base.html.twig" %}

{% block content %}
    &lt;form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register"&gt;
        {{ form_widget(form) }}
        &lt;div&gt;
            &lt;input type="submit" value="{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}" /&gt;
        &lt;/div&gt;
    &lt;/form&gt;
{% endblock %}
</code></pre>

<p>Le template d&#8217;inscription sera dorénavant décoré par le template de base.
Ce mécanisme vous permet d&#8217;utiliser une des grandes forces de
<a href="http://twig.sensiolabs.org/">Twig</a>: l&#8217;héritage de templates !</p>

<h3 id="h_11">Envoyez un email de confirmation pour la création d&#8217;un utilisateur</h3>

<p>Vous rêviez de pouvoir valider automatiquement vos utilisateurs en leur envoyant
un email de confirmation avec un lien à cliquer pour valider ladite inscription ?
FOSUSerBundle l&#8217;a fait !</p>

<p>En effet, il existe une fonctionnaltié toute prête permettant cet envoi d&#8217;email et validation
de compte au-to-ma-tique. Cependant, celle-ci est désactivée par défaut.
Pour l&#8217;activer,rien de plus simple :</p>

<pre><code># app/config/config.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    # Permet de renseigner la nouvelle entity utilisateur
    user_class: MyApp\UserBundle\Entity\User
    # Permet de définir quel service de mail utiliser
    # On utilise twig_swift pour pouvoir envoyer un email en HTML
    service:
        mailer: fos_user.mailer.twig_swift
    # Permet de renseigner le nouveau formulaire d'inscription
    registration:
        form:
            type: myapp_user_registration
        # Permet la validation automatique du compte par envoi d'un email
        confirmation:
            enabled:    true
            from_email:
                # Adresse de l'expediteur
                address:        noreply@monsiteweb.com
                # Nom de l'expediteur
                sender_name:    Admin de monsiteweb.com
        # Permet de définir le template de l'email à envoyer (en html)
        email:
            template: MyAppMonBundle:User:registration.email.twig
</code></pre>

<p>Il ne vous reste plus ensuite qu&#8217;à définir le template que vous souhaitez utiliser pour l&#8217;envoi d&#8217;email :</p>

<pre><code>{# src/MyApp/MonBundle/Resources/views/User/registration.email.twig #}

{% block subject %}Confirmation d'inscription{% endblock %}

{% block body_text %}
{% autoescape false %}
Bonjour {{ user.username }} !

Vous devez confirmé voter inscription [....] en cliquant sur le lien suivant : {{ confirmationUrl }}

Amicalement,
Administrateur de monsiteweb.com
{% endautoescape %}
{% endblock %}

{% block body_html %}
{#
    Vous pouvez ici définir le HTML que vous souhaitez ou même utiliser la force de twig, à savoir l'inclusion de template : 
    include 'MyAppMonBundle:User:registration_email.html.twig'
#}
{% endblock %}
</code></pre>

<h3 id="h_12">Utiliser la ligne de commande pour gérer vos utilisateurs avec FOSUserBundle</h3>

<p>Le bundle FOSUSerBundle vous propose toute une kyrielle de commandes permettant de gérer vos utilisateurs :</p>

<h4 id="h_12-1">1) Création &amp; activation</h4>

<pre><code>$ php app/console fos:user:create monutilisateur test@example.com motdepasse
$ php app/console fos:user:activate monutilisateur
$ php app/console fos:user:deactivate monutilisateur
</code></pre>

<h4 id="h_12-2">2) Gestion des rôles</h4>

<pre><code>$ php app/console fos:user:promote monutilisateur ROLE_ADMIN
$ php app/console fos:user:demote testuser ROLE_ADMIN
</code></pre>

<h4 id="h_12-3">3) Changement de mot de passe</h4>

<pre><code>$ php app/console fos:user:change-password monutilisateur nouveaumotdepasse
</code></pre>

<h3 id="h_13">Erreurs courantes avec FOSUserBundle</h3>

<h4 id="h_13-1">1) Problèmes de configuration de FOSUserBundle</h4>

<p><strong>Problème :</strong></p>

<pre><code>The child node "user_class" at path "fos_user" must be configured.
The child node "db_driver" at path "fos_user" must be configured.
The child node "firewall_name" at path "fos_user" must be configured.
</code></pre>

<p><strong>Solution :</strong> Vous n&#8217;avez pas configuré l&#8217;un des éléments
<em>necessaire</em> au bon fonctionnement de FOSUserBundle, à savoir :</p>

<pre><code>fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    user_class: MyApp\UserBundle\Entity\User
</code></pre>

<p><strong>Problème :</strong></p>

<pre><code>ErrorException: Warning: class_parents(): Class MyApp\Entity\User does not exist and could not be loaded in */vendor/doctrine/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php line 223
</code></pre>

<p><strong>Solution :</strong> Vous avez mal configuré votre user_class
dans <span class="special">app/config/config.yml</span>. Vérifiez que votre namespace
est bon, que votre classe se situe bien là ou vous l&#8217;avez définie.</p>

<h4 id="h_13-2">2) Problèmes de surcharge de l&#8217;entity User de FOSUserBundle</h4>

<p><strong>Problème :</strong> Vous n&#8217;arrivez pas à surcharger le formulaire d&#8217;édition
de profil de FOSUserBundle, rien à y faire vous avez cette erreur :</p>

<pre><code>Neither property "username" nor method "getUsername()" nor method "isUsername()" exists in class "FOS\UserBundle\Form\Model\CheckPassword"
</code></pre>

<p><strong>Solution :</strong> La surcharge du formulaire d&#8217;édition de profil de 
FOSUserBundle est un peu différente de celle du formulaire d&#8217;inscription. En effet,
la fonction à surcharger dans le cas du formulaire d&#8217;inscription est buildForm(), or
pour l&#8217;édition de profil, c&#8217;est la fonction <em>buildUserForm()</em> qu&#8217;il faut surcharger !</p>

<pre><code>&lt;?php
namespace MyApp\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\ProfileFormType as BaseType;

class ProfileFormType extends BaseType
{
    public function buildUserForm(FormBuilder $builder, array $options)
    {
        parent::buildUserForm($builder, $options);
        // On ajoute nos champs :
        $builder-&gt;add('location');
    }

    public function getName()
    {
        return 'myapp_user_profile';
    }
}
</code></pre>

<h3 id="h_14">Conclusion</h3>

<p><strong>Symfony2</strong> est amélioré par rapport à son predecesseur vieillissant. Là où <strong>symfony</strong>
proposait un plugin agreable d&#8217;utilisation mais rendant les choses vite complexe
pour une utilisation avancée, Symfony2 propose une approche plus pragmatique du problème :
Faites ce que vous voulez, comme vous le voulez et où vous le voulez en héritant du bundle de base.
Ce framework ainsi que ses bundles sont des outils de grande qualité !
N&#8217;hésitez pas à nous faire vos retours.</p>

<p>Si vous souhaitez une formation sur les frameworks <strong>symfony</strong> ou <strong>Symfony2</strong>
<a href="http://www.idci-consulting.fr/contact">contactez-nous</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/fosuserbundle-comment-gerer-les-utilisateurs-avec-symfony2/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Installer WordPress</title>
		<link>http://www.idci-consulting.fr/installer-wordpress/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installer-wordpress</link>
		<comments>http://www.idci-consulting.fr/installer-wordpress/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 21:00:26 +0000</pubDate>
		<dc:creator>Gabriel BONDAZ</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=45</guid>
		<description><![CDATA[Avant d&#8217;installer WordPress, je vous recommande la lecture de cet article sur comment mettre en place un environnement de développement pour réaliser un site avec php et mysql. Récupérer les sources de WordPress Commencez par créer un dossier de travail (si ce n&#8217;est pas déjà fait). Puis récupérez les sources de WordPress en les téléchargeants: [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/wordpress-logo.png" alt="Wordpress logo" title="Wordpress logo" /></p>

</div>

<p>Avant d&#8217;installer WordPress, je vous recommande la lecture de cet article sur comment
<a href="mettre-en-place-un-environnement-de-développement-pour-réaliser-un-site-avec-php-et-mysql">mettre en place un environnement de développement pour réaliser un site avec php et mysql</a>.</p>

<h3 id="h_1">Récupérer les sources de WordPress</h3>

<p>Commencez par créer un dossier de travail (si ce n&#8217;est pas déjà fait). Puis récupérez
les sources de WordPress en les téléchargeants:</p>

<ul>
<li><a href="http://wordpress.org/download/">Version anglaise</a></li>
<li><a href="http://fr.wordpress.org/">Version française</a></li>
</ul>

<p>Décompressez l&#8217;archive ainsi récupérée dans votre dossier de travail. Assurez-vous
de bien avoir positionné les bons droits sur le dossier contenant les fichiers sources
de WordPress.</p>

<p>Pour les systèmes Debian et dérivés (Ubuntu, &#8230;), exécutez les commandes suivantes:</p>

<pre><code>$ sudo chgrp www-data -R WORKSPACE/WP_PROJECT
$ sudo chmod 775 -R WORKSPACE/WP_PROJECT
</code></pre>

<p>Remplacez WORKSPACE par l&#8217;emplacement de votre répertoire de travail et WP_PROJECT
par le nom de votre projet. Pour vérifier que les droits sont correctement positionnés,
vous pouvez lancer la commande suivante:</p>

<pre><code>$ ls -l WORKSPACE
</code></pre>

<p>Vous devez obtenir le résultat suivant:</p>

<pre><code>drwxrwxr-x  6 USER www-data 4096 2011-01-23 10:45 WP_PROJECT
</code></pre>

<h3 id="h_2">Installer WordPress</h3>

<p>Ouvrez un navigateur puis accéder à l&#8217;URL que vous avez défini pour votre site (ex: <strong>http://local.domain/</strong>)
L&#8217;application détecte alors que c&#8217;est votre première connexion (par l&#8217;absence de configuration)
et vous propose alors de procéder à l&#8217;installation de WordPress. Le processus d&#8217;installation
de WordPress est simple et intuitif. Les informations qu&#8217;il vous faudra fournir sont:</p>

<ul>
<li>les paramètres d&#8217;accès à la base de donnée MySQL</li>
<li>le titre de votre site</li>
<li>le login, le mot de passe et le mail de l&#8217;administrateur</li>
</ul>

<p>Voici une serie d&#8217;écran vous présentant l&#8217;installation de WordPress 3.2.1</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_1.png" alt="WP Install 1" title="Etape 1" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_2.png" alt="WP Install 2" title="Etape 2" /></p>

<p>Durant cette étape, il vous faudra renseigner les informations de connexion à la base de donnée.
<img src="/wp-content/themes/idci/posts/illustrations/wp_install_3.png" alt="WP Install 3" title="Etape 3" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_4.png" alt="WP Install 4" title="Etape 4" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_5.png" alt="WP Install 5" title="Etape 5" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_6.png" alt="WP Install 6" title="Etape 6" /></p>

<p>Voilà vous venez d&#8217;installer WordPress !</p>

<h3 id="h_3">Accèder à l&#8217;espace d&#8217;administration (Back-Office)</h3>

<p>Pour l&#8217;administration de votre site il faudra aller à l&#8217;adresse suivante <strong>http://local.domain/wp-admin</strong>
puis saisir vos login et mot de passe définis durant la phase d&#8217;installation pour
pouvoir accéder à l&#8217;espace d&#8217;administration de votre site.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_8.png" alt="WP Install 8" title="Etape 8" /></p>

<h3 id="h_4">Visualiser votre site (Front-Office)</h3>

<p>Pour visualiser votre site, rendez-vous à l&#8217;adresse <strong>http://local.domain</strong></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/wp_install_7.png" alt="WP Install 7" title="Etape 7" /></p>

<p>Bonne découverte !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/installer-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symposium un outil pour réussir l’organisation de vos événements</title>
		<link>http://www.idci-consulting.fr/symposium-un-outil-pour-reussir-lorganisation-de-vos-evenements/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=symposium-un-outil-pour-reussir-lorganisation-de-vos-evenements</link>
		<comments>http://www.idci-consulting.fr/symposium-un-outil-pour-reussir-lorganisation-de-vos-evenements/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 19:00:37 +0000</pubDate>
		<dc:creator>Frédéric BONDAZ</dc:creator>
				<category><![CDATA[Symposium]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=43</guid>
		<description><![CDATA[Réussir et pérenniser son évènement (congrès, salons, séminaires, manifestations culturelles, &#8230;) La réussite d&#8217;un évènement est multifactorielle : choix du lieu, des intervenants, des commanditaires, fluidité dans le déroulement des manifestations, communication ciblée et efficace. Elle est le fruit d&#8217;une réflexion à laquelle l&#8217;organisateur se doit de consacrer toute son énergie. En outre, se concentrer [...]]]></description>
			<content:encoded><![CDATA[<h3 id="h_1">Réussir et pérenniser son évènement (congrès, salons, séminaires, manifestations culturelles, &#8230;)</h3>

<p>La réussite d&#8217;un <strong>évènement</strong> est multifactorielle : choix du lieu, des intervenants,
des commanditaires, fluidité dans le déroulement des manifestations, communication
ciblée et efficace. Elle est le fruit d&#8217;une réflexion à laquelle <strong>l&#8217;organisateur</strong>
se doit de consacrer toute son énergie. En outre, se concentrer sur son coeur de métier,
c&#8217;est aussi apprendre à gagner du temps sur les tâches à moindre valeur ajoutée.
L&#8217;informatique et l&#8217;automatisation des processus a déjà permis de gagner en efficacité
dans de nombreux domaines. Dans celui de <strong>l&#8217;évènementiel</strong>, il s&#8217;agit de gérer des centaines,
parfois des milliers de participants de plus en plus exigeants en matière de contenu et de prestations.
Pour inscrire un évènement dans la durée il est également essentiel de convaincre
les intervenants (scientifiques, politiques, business, artistiques&#8230;) de sa reconnaissance et de sa pérennité.</p>

<p>Ainsi un participant satisfait communiquera, reviendra, et sera un vecteur de notoriété et d&#8217;influence.
Celles-ci permettront de solliciter les meilleurs intervenants et ainsi de suite.</p>

<p><strong>IDCI consulting</strong>, en collaboration avec <strong>le service FOCAL de l&#8217;Université Claude Bernard Lyon 1</strong>,
s&#8217;est intéressé au sujet et à répondu à cette problématique par la création de <strong>Symposium</strong>.</p>

<h3 id="h_2">Symposium : De la communication à la logistique, un ensemble de fonctionnalités intégrées !</h3>

<p>Cet outil Web est idoine pour tout <strong>organisateur</strong> ambitieux puisqu&#8217;en plus de
proposer une automatisation des processus logistiques :</p>

<ul>
<li>inscription,</li>
<li>relance,</li>
<li>génération et envoi de documents,</li>
<li>affectation des inscrits aux diverses manifestations</li>
<li>&#8230;</li>
</ul>

<p>il permet, en quelques clics, de <strong>générer un support de communication (Site Web)</strong>,
que ce soit en amont pour lui donner une visibilité sur la toile et diffuser en temps réel
l&#8217;information ou en aval pour retrouver, via un espace personnalisé, des publications,
des supports postés par les intervenants ou tout type de document (factures, reçus, attestations de présence, badges, certifications, &#8230;)</p>

<h3 id="h_3">Les avantages de Symposium</h3>

<p>Outre son efficacité opérationnelle, <strong>Symposium</strong>, de par sa <strong>licence GNU GPL</strong>
garantit aux utilisateurs une évolution constante grâce à leur collaboration et à
leur convergence vers un objectif commun :
maintenir l&#8217;outil à niveau maximum de performance par la mise à jour de fonctionnalités toujours plus <strong>innovantes</strong>.</p>

<p>C&#8217;est le retour vers une concurrence pure et parfaite telle que décrite par les économistes d&#8217;avant-garde,
la capacité d&#8217;accession à des <strong>outils</strong> performants n&#8217;étant plus un critère de différenciation.
<strong>Les organisateurs de congrès</strong> se devront d&#8217;être innovants et performants sur leur coeur de métier,
et ce, quelle que soit leur taille ou leur influence. Ainsi l&#8217;utilisation collaborative
de <strong>Symposium</strong> contribuera à dynamiser le marché de <strong>l&#8217;organisation d&#8217;évènements</strong>
par l&#8217;innovation et la créativité dans ce domaine</p>

<p>Des vidéos de présentation sont en cours d&#8217;élaboration. Dans cette attente, n&#8217;hésitez pas
à nous <a href="http://www.idci-consulting.fr/contact" title="Contactez-nous">contacter</a>.
pour que nous vous proposions une séance de démonstration à distance</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/symposium-un-outil-pour-reussir-lorganisation-de-vos-evenements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mettre en place un environnement de développement pour réaliser un site avec PHP et MySQL</title>
		<link>http://www.idci-consulting.fr/mettre-en-place-un-environnement-de-developpement-pour-realiser-un-site-avec-php-et-mysql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mettre-en-place-un-environnement-de-developpement-pour-realiser-un-site-avec-php-et-mysql</link>
		<comments>http://www.idci-consulting.fr/mettre-en-place-un-environnement-de-developpement-pour-realiser-un-site-avec-php-et-mysql/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 19:00:01 +0000</pubDate>
		<dc:creator>Gabriel BONDAZ</dc:creator>
				<category><![CDATA[Tutos et astuces]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=41</guid>
		<description><![CDATA[Pourquoi mettre en place un environnement de développement ? Afin de vous faciliter la prise en main et la compréhension du fonctionnement de la plupart des applications réalisées avec les technologies PHP et MySQL (WordPress, Joomla, Drupal, PrestaShop, Magento, &#8230;) je vous recommande de travailler localement c&#8217;est à dire directement sur votre ordinateur. Celui-ci devra [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/apache-mysql-php-phpmyadmin.png" alt="AMPP logos" /></p>

</div>

<h3 id="h_1">Pourquoi mettre en place un environnement de développement ?</h3>

<p>Afin de vous faciliter la prise en main et la compréhension du fonctionnement de la plupart
des applications réalisées avec les technologies <strong>PHP</strong> et <strong>MySQL</strong> (WordPress, Joomla, Drupal, PrestaShop, Magento, &#8230;)
je vous recommande de travailler localement c&#8217;est à dire directement sur votre ordinateur.
Celui-ci devra être configuré pour pouvoir faire fonctionner:</p>

<ul>
<li>Un serveur Web interprétant le langage PHP</li>
<li>Le SGBDR MySQL pour stocker les données de votre application.</li>
</ul>

<p>Ainsi vous pourrez plus facilement:</p>

<ul>
<li>Développer le site (modifier les templates et vos fichiers css) sans avoir
à synchroniser vos fichiers sur un serveur.</li>
<li>Tester des plugins et des thèmes rapidement et sans impacter votre site une fois
celui-ci en ligne.</li>
<li>Ne pas vous soucier d&#8217;une éventuelle mauvaise manipulation qui pourrait porter
atteinte à vos données.</li>
</ul>

<p>Idéalement utiliser un <a href="http://fr.wikipedia.org/wiki/Gestion_de_versions">outil de gestion de version</a> (revision control software en Anglais)
afin de garder l&#8217;historique de vos changements apportés à votre site (révisions).
Si vous devez travailler en équipe, c&#8217;est un outil indispensable à mettre en place
dès le début de votre projet (<a href="http://subversion.tigris.org/">Subversion</a>, <a href="http://git-scm.com/">Git</a>).
Enfin, dans le cas d&#8217;un projet professionnel, je vous recommande vivement l&#8217;utilisation
d&#8217;un <a href="http://fr.wikipedia.org/wiki/Logiciel_de_suivi_de_probl%C3%A8mes">logiciel de suivi de problèmes</a> (bug tracker en Anglais)</p>

<h3 id="h_2">Choisir le serveur HTTP</h3>

<p>Il existe différents serveur HTTP que vous pouvez installer sur votre ordinateur.
Voici une liste non exhaustive:</p>

<ul>
<li><a href="http://httpd.apache.org/">Apache</a></li>
<li><a href="http://www.lighttpd.net/">Lighttpd</a></li>
<li><a href="http://www.cherokee-project.com/">Cheeroke</a></li>
<li><a href="http://nginx.org/">NGNIX</a></li>
<li>&#8230;</li>
</ul>

<p>Voici <a href="http://en.wikipedia.org/wiki/Comparison_of_web_server_software">un comparatif des différents serveurs HTTP</a>.
Pour commencer je vous recommande d&#8217;utiliser le <strong>serveur HTTP Apache</strong> dans sa version 2.x.
C&#8217;est le serveur HTTP le plus repandu au monde (<a href="http://news.netcraft.com/archives/category/web-server-survey/">netcraft</a>),
il dispose de nombreux modules et c&#8217;est certainement l&#8217;un des plus complet en terme de fonctionnalités.
De plus il est packagé prêt à l’emploi sur de nombreux systèmes d&#8217;exploitations.</p>

<ul>
<li><a href="http://www.wampserver.com/en/">WAMP</a> ou <a href="http://www.easyphp.org/">EasyPHP</a> sous Windows</li>
<li><a href="http://www.mamp.info/en/index.html">MAMP</a> sous MacOs</li>
<li>Depuis des dépôts (apt, yum) sous linux</li>
</ul>

<p>Sous système Debian et dérivés (Ubuntu, &#8230;) voici la commande pour pouvoir installer
tout ce dont vous aurez besoin pour pouvoir faire fonctionner WordpPress:</p>

<pre><code>$ sudo apt-get install apache2 mysql-server php5 php5-mysql phpmyadmin
</code></pre>

<p>Une fois que vous aurez installé votre serveur HTTP sur votre ordinateur, vous pourrez
alors consulter la page Web par défaut délivrée par celui-ci en requêtant votre
<a href="http://fr.wikipedia.org/wiki/Localhost">localhost</a>. Pour cela ouvrez un navigateur
web puis renseignez l&#8217;url suivante: <strong>http://localhost</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/it_works_apache.png" alt="phpinfo" /></p>

<div class="notice question">
<span></span>
Il est parfois nécessaire de préciser le port lorsqu&#8217;il est différent de celui par
défaut à savoir le port 80. C&#8217;est le cas pour MAMP par exemple sur MacOS ou il vous
faudra renseigner l&#8217;adresse suivante: http://localhost:8888
</div>

<h3 id="h_3">Configuration du serveur WEB pour interpréter le langage PHP</h3>

<p>Pour pouvoir faire fonctionner votre application PHP, il faut que votre serveur HTTP
soit capable d’interpréter ce langage. Dans le cas du serveur Apache vous avez le choix
entre deux méthodes:</p>

<ul>
<li>PHP en module Apache</li>
<li>PHP en CGI</li>
</ul>

<p>De nombreux sites exposent les différences entre ces deux méthodes. Par défaut,
le serveur Apache interprétera le code PHP par la méthode &laquo;&nbsp;module Apache&nbsp;&raquo;, mais
ceci est paramétrable. Pour vérifier que votre serveur HTTP est bien configuré pour
exécuter du code PHP, vous pouvez créer un fichier nommé phpinfo.php est le déposer
à la racine Web de votre serveur HTTP:</p>

<ul>
<li>c:\wamp\www\ avec WAMP sous Windows</li>
<li>c:\EasyPHP\www avec EasyPHP sous Windows</li>
<li>/Applications/MAMP/htdocs avec MAMP sous MacOS</li>
<li>/var/www sous Linux</li>
<li>&#8230;</li>
</ul>

<p>Dans ce fichier écrire le code PHP suivant:</p>

<pre><code>&lt;?php phpinfo(); ?&gt;
</code></pre>

<p>Puis requêter l&#8217;URL <strong>http://localhost/phpinfo.php</strong>. Vous devez obtenir le résultat suivant:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/phpinfo.png" alt="phpinfo" /></p>

<h3 id="h_4">Utiliser les VirtualHosts</h3>

<p>Virtual hosting ou hébergement virtuel est une méthode qui permet d&#8217;héberger plusieurs
<a href="http://fr.wikipedia.org/wiki/Nom_de_domaine">noms de domaine</a> sur un serveur physique
utilisant une seule <a href="http://fr.wikipedia.org/wiki/Adresse_IP">adresse IP</a>. Cela permet
de mieux exploiter les ressources (mémoire, processeur) du serveur en les partageant
pour les besoins de plusieurs sites.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/virtual_hosting.png" alt="Virtual Hosting" /></p>

<p>C&#8217;est également une bonne pratique à mettre en place lorsque vous travaillez localement.
Cela permet de choisir des noms de domaines différents pour chacun de vos sites 
par exemple:</p>

<ul>
<li>http://mon_site1</li>
<li>http://mon_site2</li>
<li>&#8230;</li>
</ul>

<p>au lieu des URLs du type</p>

<ul>
<li>http://localhost/mon_site1</li>
<li>http://localhost/mon_site2</li>
<li>&#8230;</li>
</ul>

<p>Cela vous permet également de stocker des sites web sans respecter une arborescence stricte.
C&#8217;est à vous d&#8217;associer à un nom de domaine, un emplacement physique d&#8217;un site sur
le système de fichiers du serveur.</p>

<p>Voici à quoi ressemble la déclaration d&#8217;un Virtual Host pour apache.
Remplacer <strong>local.domain</strong> par le nom de domaine que vous souhaitez utiliser et
<strong>domain_path</strong> par l&#8217;emplacement physique du dossier contenant les fichiers du
site web à associer.</p>

<pre><code>&lt;VirtualHost *:80&gt;
    ServerName local.domain
    ServerAdmin webmaster@local.domain.fr

    DocumentRoot /home/user/workspace/domain_path

    &lt;Directory /home/user/workspace/domain_path&gt;
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
   &lt;/Directory&gt;

    ErrorLog /var/log/apache2/error_local.domain.log
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn
    CustomLog /var/log/apache2/access_local.domain.log combined
&lt;/VirtualHost&gt;
</code></pre>

<div class="notice question">
<span></span>
Après chaque modifications dans les fichiers de configuration d&#8217;apache, pensez à
redémarrer le service pour que les nouveaux paramètres soient pris en compte.
</div>

<p>Pour redémarrer le <strong>service apache</strong> sur système Debian et dérivés (Ubuntu, &#8230;)</p>

<pre><code>$ sudo /etc/init.d/apache2 restart
</code></pre>

<p>ou</p>

<pre><code>$ sudo service apache2 restart
</code></pre>

<h3 id="h_5">Modifier une entrée DNS localement: Ajouter une ligne dans le fichier hosts</h3>

<p>Le Domaine Name System <a href="http://fr.wikipedia.org/wiki/Domain_Name_System">DNS</a> est
un service permettant d&#8217;établir une correspondance entre une adresse IP et un nom de domaine.
Lorsque vous saisissez une URL dans votre navigateur, votre ordinateur va réaliser
une résolution de nom c&#8217;est à dire récupérer l&#8217;adresse IP associée au domaine demandé.
Cette adresse IP ainsi obtenue va permettre ensuite d&#8217;envoyer une requête HTTP 
à destination du bon serveur. Il est également possible de définir localement des
couples <strong>Adresse IP <-> Nom de domaine</strong>.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/dns_resolution.png" alt="DNS resolution" title="DNS resolution" /></p>

<p>Lors d&#8217;une résolution DNS votre ordinateur va commencer par faire une <strong>1] Resolution local</strong>,
c&#8217;est à dire rechercher si l&#8217;entrée DNS recherchée est définie localement. Si oui,
utilisation de cette adresse, sinon il va effectuer une <strong>2] Résolution distante</strong>.
Le serveur DNS interrogé retournera la reponse si il connait l&#8217;association recherchée,
sinon il interrogera un autre serveur DNS et ainsi de suite jusqu&#8217;à l&#8217;obtention de
<strong>3] La réponse</strong>. L&#8217;ordinateur à l&#8217;origine de la demande mettra <strong>4] En cache la réponse</strong>
ainsi obtenue pour d&#8217;éventuelles futures requêtes et pourra ainsi contacter le serveur
corespondant au domaine recherché.</p>

<p>Pour définir localement une association entre une adresse IP et un nom de domaine
il faut ajouter une entrée dans <a href="http://fr.wikipedia.org/wiki/Hosts">le fichier &#8216;hosts&#8217;</a>.</p>

<p>Dans le cas d&#8217;un développement local, pour associer l&#8217;adresse <strong>local.domain</strong> à votre
propre machine c&#8217;est à dire le <a href="http://fr.wikipedia.org/wiki/Localhost">localhost</a>
il faut ajouter l&#8217;entrée <strong>127.0.0.1  local.domain</strong>.</p>

<p>Sous système Debian et dérivés (Ubuntu, &#8230;), éditer <strong>le fichier hosts</strong>:</p>

<pre><code>$ sudo vi /etc/hosts
</code></pre>

<p>Puis ajouter l&#8217;association Adresse IP <-> Nom de domaine souhaitée.</p>

<pre><code>127.0.0.1       local.domain
</code></pre>

<p>Pour vérifier la prise en compte de votre changement par votre système, effectuer
une requête ping. Vous devez obtenir le résultat suivant:</p>

<pre><code>$ ping local.domain
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.033 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.027 ms
....
</code></pre>

<p>Si vous obtenez le message suivant:</p>

<pre><code>$ ping local.domain
ping: unknown host local.domain
</code></pre>

<p>C&#8217;est que vous n&#8217;avez pas ajouté correctement l&#8217;entrée dans votre fichier hosts.</p>

<h3 id="h_6">Paramètrer MySQL</h3>

<p><a href="http://fr.wikipedia.org/wiki/MySQL">MySQL</a> est un SGBDR (Système de Gestion de Base de Donnée Relationnelle).
C&#8217;est un logiciel libre développé sous double licence en fonction de l&#8217;utilisation
qui en est faite :</p>

<ul>
<li>Dans un produit libre: <strong>licence publique générale GNU (GPL)</strong></li>
<li>Dans un produit propriétaire: <strong>licence payante</strong></li>
</ul>

<p>Pour les applications comme WordPress, Joomla, Drupal, PrestaShop, Magento, &#8230; 
il faudra renseigner, durant la phase d&#8217;intallation, les informations pour la connexion
à la base de donnée MySQL.</p>

<p>Une bonne pratique consiste à créer un utilisateur avec des accès bien définis sur une base,
plutôt que d&#8217;utiliser le même compte sur toutes les bases (par exemple le compte root).
Cela permet un meilleur cloisonnement et offre ainsi une meilleure sécurité. Ce n&#8217;est
pas une obligation dans un environnement de développement mais vivement recommandé
dans un environnement &#8216;dit&#8217; de production.
Pour cela vous pouvez utiliser l&#8217;outil <a href="http://fr.wikipedia.org/wiki/PhpMyAdmin">phpMyAdmin</a>,
accessible depuis un navigateur, et procéder comme suit:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/pma_privileges.png" alt="Privileges" title="Aller sur l'onglet privilège" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/pma_new_user.png" alt="Nouveau utilisateur" title="Nouveau utilisateur" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/pma_add_new_user.png" alt="Ajouter utilisateur" title="Ajouter un nouveau utilisateur" /></p>

<p><img src="/wp-content/themes/idci/posts/illustrations/pma_go.png" alt="Go" title="Valider" /></p>

<div class="notice question">
<span></span>
L&#8217;URL d&#8217;accès à votre phpMyAdmin est différente suivant votre système d&#8217;exploitation
ou suivant votre configuration. Sous système Debian ou dérivés (Ubuntu, &#8230;) il
est accessible depuis l&#8217;URL suivante: http://localhost/phpmyadmin
</div>

<p>Vous pouvez également exécuter les requêtes SQL suivantes en replaçant <strong>user</strong>
par le nom de l&#8217;utilisateur que vous voulez créer et *** par le mot de passe</p>

<pre><code>CREATE USER 'user'@'%' IDENTIFIED BY '***';

GRANT USAGE ON * . * TO 'user'@'%' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

CREATE DATABASE IF NOT EXISTS `user` ;

GRANT ALL PRIVILEGES ON `user` . * TO 'user'@'%';
</code></pre>

<p>En résumé vous venez de créer une base nommée <strong>user</strong> et vous avez créé un utilisateur
<strong>user</strong> avec le mot de passe <strong>user</strong> disposant de tous les droits sur cette base.</p>

<p>host: localhost<br />
nom de la base de donnée: user<br />
utilisateur: user<br />
mot de passe: user</p>

<p>Ces informations vous seront demandées lors de l&#8217;installation d&#8217;une application PHP
qui utilise le SGBDR MySQL pour stocker des données.</p>

<p>Si vous souhaitez une assistance pour la mise en place d&#8217;un environnement de développement
pour vos équipes ou encore une aide pour le déploiement et la migration de votre site,
vous pouvez nous <a href="http://www.idci-consulting.fr/contact" title="Contactez-nous">contacter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/mettre-en-place-un-environnement-de-developpement-pour-realiser-un-site-avec-php-et-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Présentation de WordPress</title>
		<link>http://www.idci-consulting.fr/presentation-de-wordpress/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=presentation-de-wordpress</link>
		<comments>http://www.idci-consulting.fr/presentation-de-wordpress/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:00:15 +0000</pubDate>
		<dc:creator>Gabriel BONDAZ</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=39</guid>
		<description><![CDATA[A quoi sert WordPress WordPress est un CMS (Content Management System : système de gestion de contenu), qui vous permet de facilement rédiger du contenu sur le ou les sujets de votre choix et de les mettre à disposition (ou non d&#8217;ailleurs) sur le Web. Historiquement WordPress fut créé pour répondre à la problématique du [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/wordpress-logo.png" alt="Wordpress logo" title="Wordpress logo" /></p>

</div>

<h3 id="h_1">A quoi sert WordPress</h3>

<p>WordPress est un <strong>CMS</strong> (Content Management System : système de gestion de contenu), 
qui vous permet de facilement rédiger du contenu sur le ou les sujets de votre choix et 
de les mettre à disposition (ou non d&#8217;ailleurs) sur le Web.</p>

<p>Historiquement WordPress fut créé pour répondre à la problématique du <a href="http://fr.wikipedia.org/wiki/Blog">Blog</a>.
C&#8217;est un conteneur de &#8216;posts&#8217;, c&#8217;est à dire des articles agglomérés au fil du temps sur différents sujets.</p>

<p>Depuis sa création en 2003, WordPress a beaucoup évolué et offre aujourd&#8217;hui de nombreuses fonctionnalités, sa communauté
est très active et elle propose de nombreux plugins et extensions.</p>

<p>De plus WordPress est un outil gratuit développé sous licence <strong>Open Source</strong> GPLv2+ avec le langage <strong>PHP</strong>.</p>

<p>WordPress est devenu une formidable boite à outils pour la réalisation de site web.
Cependant d&#8217;autres solutions existent et dans certain cas se montre plus intéressante que WordPress.
Par exemple, si vous souhaitez réaliser une boutique en ligne, il vaudra mieux s&#8217;orienter 
vers une solution métier ou des outils de type prestashop.</p>

<h3 id="h_2">Comment fonctionne WordPress</h3>

<p>WordPress est une application PHP qui est destinée à fonctionner sur le Web.
Pour pouvoir utiliser WordPress il faut un <a href="http://fr.wikipedia.org/wiki/Serveur_HTTP">serveur HTTP</a> 
configuré pour pouvoir interpréter le langage PHP et un Système de Gestion de 
Base de Donnée Relationnelle (SGBDR) : <a href="http://www.mysql.fr/">MySQL</a>.</p>

<p>Voici un schéma mettant en scène chaque application dans le traitement d&#8217;une requête HTTP reçue par un serveur web
hébergeant un site fait sous WordPress:</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/web_server.png" alt="Wordpress web request" title="Wordpress web request" /></p>

<p>Quand une <strong>1] requette HTTP</strong> est reçue par le <strong>server Web</strong>, celui-ci récupère le fichier
&#8216;index&#8217; de <strong>WordPress</strong> défini dans <strong>2] le Virtual Host</strong>. Ce fichier PHP ainsi 
que tous ceux inclus par ce dernier sont interprétés par <strong>3] le moteur de rendu PHP</strong>.
Les contenus stockés dans la base de données <strong>MySQL</strong> sont <strong>4] Requêtés par SQL</strong>.
Le rendu <strong>HTML</strong> une fois réalisé est envoyé en <strong>5] réponse HTTP</strong> au client web (= navigateur : Firefox, chromium, etc).</p>

<p>L&#8217;application se compose de:</p>

<ul>
<li><p>Un <a href="http://fr.wikipedia.org/wiki/Front_office_%28informatique%29">Front-Office</a>.
qui sera la partie visible des internautes lorsque ceux-ci navigueront sur votre
site web accessible par une <a href="http://fr.wikipedia.org/wiki/url">URL</a> bien définie.</p></li>
<li><p>Un <a href="http://fr.wikipedia.org/wiki/Back_office_%28informatique%29">Back-Office</a>
dédié à l&#8217;administration de votre site Web accessible par l&#8217;URL d&#8217;accueil de votre
site web suivi de <strong>/wp-admin</strong> (par défaut). Cet espace est réservé et nécessitera
de vous authentifier par un login et un mot de passe.</p></li>
</ul>

<h3 id="h_3">Avantages et inconvénients de WordPress</h3>

<p>Avantages:</p>

<ul>
<li>Un <strong>Back-Office complet</strong>, facile à prendre en main.</li>
<li>Un <strong>Front-Office</strong> très facilement <strong>personnalisable</strong> grâce aux thèmes.</li>
<li>De nombreux <strong>thèmes</strong> et <strong>plugins</strong> téléchargeables gratuitement.</li>
<li>C&#8217;est un outil <strong>Open Source</strong> et gratuit soutenu par une <strong>communauté</strong> très active.</li>
</ul>

<p>Inconvénients:</p>

<ul>
<li>La réalisation d&#8217;un thème nécessite des connaissances basiques dans les langages:
HTML CSS et PHP.</li>
<li>Ce n&#8217;est pas la solution miracle pour la réalisation de tout type de site, il est
spécialisé dans la mise en ligne de contenus facilement éditables (CMS).</li>
</ul>

<h3 id="h_4">Dans quels cas utiliser WordPress ?</h3>

<p>L&#8217;utilisation de WordPress peut être un bon choix pour:</p>

<ul>
<li>La réalisation d&#8217;un <strong>blog</strong>.</li>
<li>La réalisation d&#8217;un <strong>site vitrine</strong>.</li>
<li>La réalisation d&#8217;un <strong>site d&#8217;information</strong>.</li>
</ul>

<p>Dans les cas suivants il est souvent préférable de choisir une autre solutions:</p>

<ul>
<li>La réalisation d&#8217;un site e-commerce (ventes de produits en ligne).</li>
<li>Plus généralement, la réalisation d&#8217;une application web orienté métier.</li>
</ul>

<p>Si vous avez un projet web à réaliser et que vous souhaitez un avis extérieur dans
le choix de la technologie à utiliser, n&#8217;hésitez pas à nous <a href="http://www.idci-consulting.fr/contact" title="Contactez-nous">contacter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/presentation-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer un projet Symfony 1.x depuis la sandbox sous Ubuntu</title>
		<link>http://www.idci-consulting.fr/creer-un-projet-symfony-1-x-depuis-la-sandbox-sous-ubuntu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creer-un-projet-symfony-1-x-depuis-la-sandbox-sous-ubuntu</link>
		<comments>http://www.idci-consulting.fr/creer-un-projet-symfony-1-x-depuis-la-sandbox-sous-ubuntu/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 18:00:29 +0000</pubDate>
		<dc:creator>Gabriel BONDAZ</dc:creator>
				<category><![CDATA[symfony 1]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=37</guid>
		<description><![CDATA[Introduction Ce tutoriel explique comment mettre en place un projet Symfony depuis la sandox sous Ubuntu. Le but de ce post est de proposer une recette clé en main pour ne rien oublier lors de la création de vos nombreux projets avec le framework PHP Symfony. Si vous ne savez pas encore ou stocker votre [...]]]></description>
			<content:encoded><![CDATA[<h3 id="h_1">Introduction</h3>

<p>Ce tutoriel explique comment mettre en place un projet Symfony depuis la sandox sous Ubuntu. 
Le but de ce post est de proposer une recette clé en main pour ne rien oublier lors de la création de vos nombreux projets avec le framework PHP Symfony.</p>

<p>Si vous ne savez pas encore ou stocker votre projet, je vous recommande de créer un dossier workspace à la racine de votre Home Directory</p>

<pre><code>mkdir $HOME/workspace
</code></pre>

<h3 id="h_2">Téléchargement de la sandox de Symfony</h3>

<p>Vous pouvez récupérer la sandox depuis la page &#8216;installation&#8217; sur le site du projet <a href="http://www.symfony-project.org/installation">Symfony</a>
puis télécharger la version sandbox pour Symfony 1.4.</p>

<p>Ou bien directement par ces liens pour télécharger la sandox avec la dernière version du framework Symfony 1.4x</p>

<ul>
<li><a href="http://www.symfony-project.org/get/sf_sandbox_1_4.tgz">symfony-1.4.x.tgz</a></li>
<li><a href="http://www.symfony-project.org/get/sf_sandbox_1_4.zip">symfony-1.4.x.zip</a></li>
</ul>

<p>Ou enfin</p>

<pre><code>wget http://www.symfony-project.org/get/sf_sandbox_1_4.tgz  $HOME/workspace
</code></pre>

<h3 id="h_3">Extraction de Symfony</h3>

<p>Décompresser l&#8217;archive récupérée.</p>

<pre><code>tar -zxvf $HOME/workspace/sf_sandbox_1_4.tgz
</code></pre>

<p>Puis renommer ce dossier en PROJECT_NAME.</p>

<pre><code>cp -R $HOME/workspace/sf_sandbox_1_4 $HOME/workspace/PROJECT_NAME
</code></pre>

<h3 id="h_4"> Configurer un vhost apache</h3>

<p>Nous allons créer (ou éditer si vous l&#8217;avez déjà créé) un fichier vhost. Dans notre cas nous avons un fichier vhost nommé sfProject dans lequel nous déclarons tous les projets Symfony que nous développons. Vous pouvez également créer un fichier vhost par projet afin de plus facilement les activer/désactiver au niveau d&#8217;Apache.</p>

<pre><code>sudo gedit /etc/apache2/sites-available/sfProject
</code></pre>

<p>Puis déclarer votre vhost pour votre nouveau projet comme suit:</p>

<pre><code>&lt;VirtualHost *:80&gt;
ServerName local.PROJECT_NAME

DocumentRoot /home/USER_NAME/workspace/PROJECT_NAME/web
&lt;Directory /home/USER_NAME/workspace/PROJECT_NAME/web&gt;
  Options Indexes FollowSymLinks
  AllowOverride All
&lt;/Directory&gt;

Alias /sf /home/USER_NAME/workspace/PROJECT_NAME/lib/vendor/symfony/data/web/sf
&lt;Directory /home/USER_NAME/workspace/PROJECT_NAME/lib/vendor/symfony/data/web/sf&gt;
  Order Allow,Deny
  Allow from all
&lt;/Directory&gt;

# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
ErrorLog /var/log/apache2/PROJECT_NAME_error.log
CustomLog /var/log/apache2/PROJECT_NAME_access.log combined
&lt;/VirtualHost&gt;
</code></pre>

<p>Puis activer votre vhost si vous venez de le créer:</p>

<pre><code>sudo a2ensite sfProject
</code></pre>

<p>Cette commande créer un lien symbolic depuis votre fichier /etc/apache2/sites-available/sfProject vers /etc/apache2/sites-enabled/sfProject.
Pour vérifier si votre fichier est bien déclaré comme &laquo;&nbsp;à activer&nbsp;&raquo; au chargement d&#8217;apache, regarder si il est bien présent dans le dossier /etc/apache2/sites-enabled/</p>

<pre><code>ls -l /etc/apache2/sites-enabled/
</code></pre>

<p>Vous devez avoir cette ligne</p>

<pre><code>lrwxrwxrwx 1 root root 28 2010-07-05 18:24 sfProject -&gt; ../sites-available/sfProject
</code></pre>

<p>Enfin pensez à redémarrer votre serveur Apache si vous avez apporté des modifications ou venez de créer le vhost ou encore de l&#8217;activer/désactiver.</p>

<pre><code>sudo /etc/init.d/apache2 restart
</code></pre>

<h3 id="h_5">Ajouter une entrée dans votre host</h3>

<p>Pour pouvoir utiliser votre vhost Apache nouvellement créée il faut envoyer vos requêtes HTTP vers votre serveur (en local) avec le bon host en paramètre, pour cela le plus simple c&#8217;est de modifier votre fichier host afin d&#8217;envoyer toutes les requêtes vers votre serveur Apache.</p>

<pre><code>sudo gedit /etc/hosts
</code></pre>

<p>puis ajouter la correspondance suivante:</p>

<pre><code>127.0.0.1 local.PROJECT_NAME
</code></pre>

<p>Pour tester si vous avez correctement configuré votre fichier host, exécuter une simple commande ping:</p>

<pre><code>ping local.PROJECT_NAME
</code></pre>

<p>Vous devez obtenir le résultat suivant:</p>

<pre><code>64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms
...
</code></pre>

<h3 id="h_6">Projet créé !</h3>

<p>Le projet Symfony doit maintenant être créé
Vous devez avoir le résultat suivant affiché dans votre navigateur à l&#8217;adresse http://local.PROJECT_NAME.</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/sf_project_created.png" alt="Symfony Project Created" title="Symfony Project Created" /></p>

<p>Il ne vous reste plus qu&#8217;a faire votre projet avec Symfony.
Pour tout de suite vous familiariser avec les commandes, définissez l&#8217;auteur du code source</p>

<pre><code>cd $HOME/workspace/PROJECT_NAME
</code></pre>

<p>puis</p>

<pre><code>php symfony configure:author "FirstName LastName &lt;name@mail.com&gt;"
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/creer-un-projet-symfony-1-x-depuis-la-sandbox-sous-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installer les Behaviors Doctrine2 sous Symfony2</title>
		<link>http://www.idci-consulting.fr/installer-les-behaviors-doctrine2-sous-symfony2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installer-les-behaviors-doctrine2-sous-symfony2</link>
		<comments>http://www.idci-consulting.fr/installer-les-behaviors-doctrine2-sous-symfony2/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 17:00:27 +0000</pubDate>
		<dc:creator>Gabriel BONDAZ</dc:creator>
				<category><![CDATA[Symfony 2]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=35</guid>
		<description><![CDATA[Voici un exemple sur comment implémenter les Behaviors via l&#8217;EventListener de Doctrine2 dans Symfony2. Dans cet exemple, nous allons mettre en place le Behavior Timestampable sur un objet Entity du model. Récupérer les extensions de Doctrine2 Placez vous dans le dossier /vendor de votre projet Symfony $ cd vendor Cloner le repository git des extensions [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/symfony2.png" alt="Symfony2 logo" title="Symfony2" /></p>

</div>

<p>Voici un exemple sur comment implémenter les <strong>Behaviors</strong> via l&#8217;<strong>EventListener</strong> de <strong>Doctrine2</strong> dans <strong>Symfony2</strong>.
Dans cet exemple, nous allons mettre en place le <strong>Behavior Timestampable</strong> sur un objet <strong>Entity</strong> du model.</p>

<h3 id="h_1">Récupérer les extensions de Doctrine2</h3>

<p>Placez vous dans le dossier <code>/vendor</code> de votre projet Symfony</p>

<pre><code>$ cd vendor
</code></pre>

<p>Cloner le repository git des extensions doctrine</p>

<pre><code>git clone https://github.com/l3pp4rd/DoctrineExtensions.git doctrine-extensions
</code></pre>

<p>Vous devez avoir maintenant le dossier suivant <code>/vendor/doctrine-extensions</code>.</p>

<h3 id="h_2">Paramétrer l&#8217;autoloader pour charger les extensions Doctrine2</h3>

<p>Editer le fichier <code>/app/autoload.php</code>, et ajouter les lignes suivantes</p>

<pre><code>&lt;?php

use Symfony\Component\ClassLoader\UniversalClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = new UniversalClassLoader();
$loader-&gt;registerNamespaces(array(
    ...
    'Gedmo'            =&gt; __DIR__.'/../vendor/doctrine-extensions/lib',
    ...
));
...
$loader-&gt;register();
</code></pre>

<h3 id="h_3">Utiliser les annotations pour définir les champs Timestampable dans votre Entity</h3>

<p>Dans l&#8217;exemple suivant, nous allons ajouter les champs <code>created_at</code> et <code>updated_at</code> à l&#8217;objet <code>Product</code>.</p>

<pre><code>&lt;?php
namespace ...\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
...

class Product
{
    ...

    /**
     * @var datetime $created_at
     *
     * @ORM\Column(name="created_at", type="datetime")
     * @Gedmo\Timestampable(on="create")
     */
    protected $created_at;

    /**
     * @var datetime $updated_at
     *
     * @ORM\Column(name="updated_at", type="datetime")
     * @Gedmo\Timestampable(on="update")
     */
    protected $updated_at;

    ...
}
</code></pre>

<h3 id="h_4">Ajouter le listener</h3>

<p>Il faut maintenant ajouter le <strong>listener</strong> pour effectuer la mise à jour des champs <code>created_at</code> lors de la création,
et <code>updated_at</code> lors de la mise à jour, et ceci automatiquement lorsque l&#8217;Entity est persisté.</p>

<p>Editer votre class Bundle et ajouter ou mettre à jour la fonction <code>boot()</code></p>

<pre><code>public function boot()
{
    $em = $this-&gt;container-&gt;get('doctrine.orm.entity_manager');
    $evm = $em-&gt;getEventManager();
    // Timestampable
    $evm-&gt;addEventSubscriber(new \Gedmo\Timestampable\TimestampableListener());
}
</code></pre>

<p>Voici des liens pour plus d&#8217;information sur les extensions de Doctrine2 :</p>

<p><a href="http://symfony.com/doc/2.0/cookbook/doctrine/common_extensions.html">http://symfony.com/doc/2.0/cookbook/doctrine/common_extensions.html</a><br />
<a href="http://www.doctrine-project.org/blog/doctrine2-behavioral-extensions">http://www.doctrine-project.org/blog/doctrine2-behavioral-extensions</a></p>

<p>Ici vous trouverez un lien vers un Bundle pour les Doctrine Extensions:<br />
<a href="https://github.com/stof/StofDoctrineExtensionsBundle">https://github.com/stof/StofDoctrineExtensionsBundle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/installer-les-behaviors-doctrine2-sous-symfony2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Installer PHPillow pour couchDB sur Symfony2</title>
		<link>http://www.idci-consulting.fr/installer-phpillow-pour-couchdb-sur-symfony2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installer-phpillow-pour-couchdb-sur-symfony2</link>
		<comments>http://www.idci-consulting.fr/installer-phpillow-pour-couchdb-sur-symfony2/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 15:00:53 +0000</pubDate>
		<dc:creator>Pierre FERROLLIET</dc:creator>
				<category><![CDATA[Symfony 2]]></category>

		<guid isPermaLink="false">http://local.idci_new.fr/?p=32</guid>
		<description><![CDATA[Vous êtes bloqué pour installer le client php phpillow pour couchdb dans Symfony2 ? Vous êtes tombés au bon endroit ! Si les mots couchdb, Symfony2 et phpillow ne vous semblent pas issus du fin fond des montagnes sibériques, vous pouvez passez directement à la 2ème partie ! PHPillow, couchDB, Symfony2 : petit mémo PHPillow [...]]]></description>
			<content:encoded><![CDATA[<div class="header-post">

<p><img src="/wp-content/themes/idci/posts/illustrations/Symfony2/phpillow/phpillow.png" alt="Phpillow" /></p>

</div>

<p>Vous êtes bloqué pour installer le client php phpillow pour couchdb dans Symfony2 ?
Vous êtes tombés au bon endroit !</p>

<p class="notice question">
<span></span>
Si les mots couchdb, Symfony2 et phpillow ne vous semblent pas issus du fin fond 
des montagnes sibériques, vous pouvez passez directement à la 2ème partie !
</p>

<h3 id="h_1">PHPillow, couchDB, Symfony2 : petit mémo</h3>

<p>PHPillow est une librairie populaire permettant d&#8217;accéder facilement – et en php
s&#8217;il vous plait ! &#8211; à couchDB. C&#8217;est un système de gestion de bdd orienté document 
(et donc NO-SQL) qui permet de répondre à des problématiques complexes avec un sgbdr classique.
En effet, chacun de vos documents possède les champs que vous voulez bien lui renseigner,
comme dans la vie réelle. Pour une liste de contacts par exemple, vous ne connaissez
pas forcément l&#8217;adresse email, l&#8217;adresse postale, le nom, le numéro de fixe, etc&#8230;
de chacun, seulement quelques infos pour chaque personne. Mais vous avez pourtant
bien une base de contacts, chaque contact étant une même entité à quelques attributs
près (c&#8217;est à dire que la liste des contacts forme bien une base de données).</p>

<p>CouchDB fonctionne sur ce principe :</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/Symfony2/phpillow/couchdb-document.png" alt="CouchDB document" /></p>

<p>Vous trouverez bientôt un article consacré à CouchDB, en attendant, pour plus d&#8217;informations,
<a href="http://guide.couchdb.org/editions/1/en/why.html">rendez vous ici</a>.</p>

<h3 id="h_2">Comment intégrer phpillow à Symfony2 ?</h3>

<p>Pour en revenir à nos moutons, si vous avez téléchargé phpillow, vous devez avoir
sous les yeux une structure assez complexe :</p>

<p><img src="/wp-content/themes/idci/posts/illustrations/Symfony2/phpillow/vendor-paths.png" alt="CouchDB vendor arborescence" /></p>

<p>La partie qui nous intéresse est la partie src. C&#8217;est ici que se situe la libraire
PHPillow à proprement parler, c&#8217;est à dire toutes les classes répondant à la problématique
d&#8217;échange de données / flux avec couchDB. C&#8217;est le cœur du projet.</p>

<p>Pour rappel dans Symfony2 vos projets sont découpés de telle sorte :</p>

<ul>
<li>app: configuration de votre application</li>
<li>src: le code source php de votre projet (=vos applications contenant vos bundles)</li>
<li>vendor: les librairies tierces utilisables par Symfony</li>
<li>web: racine des ressources de votre site web (images, css, js, etc..)</li>
</ul>

<p class="notice question">
<span></span>
Phpillow est une librairie tierce, au même titre que doctrine (l&#8217;ORM installé par défaut dans Symfony2),
ou encore twig (le moteur de rendu par défaut conseillé dans Symfony2).
Celle-ci doit donc se placer dans le dossier vendor.
</p>

<p>L&#8217;une des forces de Symfony2 est son autoloader, et c&#8217;est aussi là que ça se complique
pour nous les amis. En effet, phpillow comporte également un autoloader situé au
chemin /src/classes/autoload.php. Heureusement pour nous, nous n&#8217;avons pas à connaître
le fonctionnement de cet autoloader interne car les développeurs de phpillow ont eu
la délicate attention de nous fournir un <strong>bootstrap</strong> (comprenez programme d&#8217;amorçage)
qui permet d&#8217;<strong>autoloader les classes</strong> automatiquement. C&#8217;est donc cette classe
qu&#8217;il nous faut inclure à notre autoloader Symfony</p>

<pre><code>&lt;php
registerNamespaces(array([...]));
$loader-&gt;registerPrefixes(array([...]));
$loader-&gt;registerPrefixFallbacks(array([...]));
$loader-&gt;registerNamespaceFallbacks(array([...]));
$loader-&gt;register();

[…]

// Autoload PHPillow classes thanks to the boostrap
include __DIR__.'/../vendor/phpillow/src/bootstrap.php';
</code></pre>

<p>Si vous êtes toujours là, vous avez peut-être essayé (tout impatient que vous êtes)
d&#8217;instancier une connexion PHPillow, persuadé qu&#8217;à partir de maintenant tout allait fonctionner</p>

<pre><code>phpillowConnection::createInstance();
</code></pre>

<p>En faisant ceci vous avez eu droit à l&#8217;erreur vous indiquant que la classe phpillowConnection
n&#8217;était pas trouvée. Bien essayé !</p>

<p>Bon c&#8217;est de ma faute (<em>sifflote</em>), je ne vous avais pas encore informé de la dernière
nouveauté implémentée par php 5.3 et dans sf2 : les namespaces (i.e. espaces de nommage).</p>

<h3 id="h_3">Comprendre les namespace sous Symfony2 : une étape nécessaire pour y intégrer PHPillow</h3>

<p>Un peu complexe à appréhender, les espaces de nom sont une avancée importante dans le monde du PHP !</p>

<p>Pour cela, je vous renvoi à cet excellent article en 2 parties (compter 1h pour la
compréhension des subtilités des namespaces, c&#8217;est primordial pour se familiariser
avec le fonctionnement interne de sf2) :</p>

<ul>
<li><a href="http://blog.pascal-martin.fr/post/php-5.3-namespace-1-espaces-de-noms">http://blog.pascal-martin.fr/post/php-5.3-namespace-1-espaces-de-noms</a></li>
<li><a href="http://blog.pascal-martin.fr/post/php-5.3-namespace-2-espaces-de-noms">http://blog.pascal-martin.fr/post/php-5.3-namespace-2-espaces-de-noms</a></li>
</ul>

<p>Vous revoilà déjà ? Si vous avez bien compris, maintenant vous savez que pour vous
connecter à couchdb via PHPillow vous devez écrire :</p>

<pre><code>phpillowConnection::createInstance();
</code></pre>

<p>En effet, phpillow ne disposant pas de namespace, ses classes se trouvent dans l&#8217;espace global;
celles-ci sont donc accessibles en les faisant précéder d&#8217;un antislash. Si elles avaient été
dans un espace de nommage X il aurait fallu y accéder via X\ phpillowConnection</p>

<p>Mais cela, vous l&#8217;avez déjà bien compris n&#8217;est-ce-pas ? <img src='http://www.idci-consulting.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<p class="notice question">
<span></span>
Ces namespaces sont valables pour toutes les classes de votre projet ne disposant pas d&#8217;un namespace;
vous devrez toujours les instancier de cette façon.
</p>

<p><strong>Voilà, vous savez désormais tout sur l&#8217;ajout de la librairie PHPillow sur symfony2 !</strong></p>

<p>Comme mentionné en intro de cet article, Je reviendrai prochainement avec un article
tout neuf sur couchDB et les quelques difficultés que l&#8217;on peut avoir à l&#8217;appréhender au début.</p>

<p>Bon courage à vous, vous pouvez désormais suivre cet article expliquant comment
utiliser phpillow&#8230;en y apportant les modifications dues aux namespaces bien entendu ! <img src='http://www.idci-consulting.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<h3 id="h_4">Bonne pratique: charger une librairie tierce en créant un service dans Symfony2</h3>

<p>Cette partie est en cours d&#8217;écriture, n&#8217;hésitez pas à revenir bientôt !
Pour être tenu au courant de cette partie, envoyez moi un petit <a href="mailto:pierre.ferrolliet@idci-consulting.fr">email</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.idci-consulting.fr/installer-phpillow-pour-couchdb-sur-symfony2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

