<?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>Iw2 &#187; Symfony</title>
	<atom:link href="http://www.iw2.fr/category/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iw2.fr</link>
	<description>Veille techno, web 2.0, Symfony, Magento, Drupal, Gestion de projet...</description>
	<lastBuildDate>Tue, 23 Aug 2011 06:46:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Symfony Doctrine NestedSet getTree + useResultCache</title>
		<link>http://www.iw2.fr/2010/06/17/symfony-doctrine-nestedset-gettree-useresultcache/</link>
		<comments>http://www.iw2.fr/2010/06/17/symfony-doctrine-nestedset-gettree-useresultcache/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 23:00:12 +0000</pubDate>
		<dc:creator>jmartin</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[behavior]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[NestedSet]]></category>

		<guid isPermaLink="false">http://www.iw2.fr/?p=313</guid>
		<description><![CDATA[Pour un besoin d&#8217;un site Internet développé sous Symfony, j&#8217;ai décidé d&#8217;utiliser le behavior NestedSet pour gérer des catégories d&#8217;un catalogue produit sous la forme d&#8217;un arbre. Un des inconvénients des arbres avec Doctrine NestedSet, c&#8217;est le nombre important de &#8230; <a href="http://www.iw2.fr/2010/06/17/symfony-doctrine-nestedset-gettree-useresultcache/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pour un besoin d&#8217;un site Internet développé sous Symfony, j&#8217;ai décidé d&#8217;utiliser le behavior NestedSet pour gérer des catégories d&#8217;un catalogue produit sous la forme d&#8217;un arbre.</p>
<p>Un des inconvénients des arbres avec Doctrine NestedSet, c&#8217;est le nombre important de requêtes exécutées pour récupérer la totalité de l&#8217;arbre. Je vais vous montrer comment j&#8217;ai mis en place le cache Doctrine (useResultCache) avec le behavior NestedSet.</p>
<p>Tout d&#8217;abord, dans config/ProjectConfiguration.class.php, vérifiez que vous avez bien activé le cache Doctrine:</p>
<pre class="brush: php; title: ;">
public function configureDoctrine(Doctrine_Manager $manager)
{
  /* Initialisation du cache Doctrine APC */
  $cacheDriver = new Doctrine_Cache_Apc();
  $manager-&gt;setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver);
  $manager-&gt;setAttribute(Doctrine::ATTR_QUERY_CACHE_LIFESPAN, sfConfig::get('app_cache_lifetime')); //mettre cette variable dans app.yml
  $manager-&gt;setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver);
  $manager-&gt;setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, sfConfig::get('app_cache_lifetime'));
}
</pre>
<p>Ensuite au niveau de votre action ou component, pour récupérer la totalité de votre arbre avec le cache d&#8217;activé :</p>
<pre class="brush: php; title: ;">
$this-&gt;categories = Doctrine::getTable('category')-&gt;getTree();
$q = Doctrine::getTable('category')-&gt;createQuery()-&gt;useResultCache();
$this-&gt;categories-&gt;setBaseQuery($q);
$this-&gt;categories = $this-&gt;categories-&gt;fetchTree();
</pre>
<p>Et enfin, au niveau du template, voici le code pour afficher correctement votre arbre sous la forme de menu par exemple :</p>
<pre class="brush: php; title: ;">
&lt;h2&gt;Catégories&lt;/h2&gt;
&lt;ul&gt;
  &lt;?php foreach ($categories as $node) : ?&gt;

    &lt;?php if($node['level'] == 0) continue; ?&gt; //ici on affiche pas la catégorie ROOT
    &lt;?php if($node['level'] == '1'): ?&gt;
    &lt;li&gt;
      &lt;span&gt;&lt;a href=&quot;#&quot;&gt;&lt;?php echo $node['label'] ?&gt;&lt;/a&gt;&lt;/span&gt;
      &lt;?php if($node-&gt;getNode()-&gt;hasChildren()): ?&gt;
        &lt;ul id=&quot;child_&lt;?php echo $node['id']; ?&gt;&quot;&gt;
        &lt;?php foreach($node-&gt;getNode()-&gt;getChildren() as $child): ?&gt;
          &lt;li&gt;&lt;a href=&quot;&lt;?php echo url_for('category', $child); ?&gt;&quot;&gt;&lt;?php echo $child-&gt;getLabel(); ?&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;?php endif; ?&gt;
    &lt;/li&gt;
    &lt;?php endif;?&gt;

  &lt;?php endforeach; ?&gt;
&lt;/ul&gt;
</pre>
<p>Voilà, votre arbre est maintenant mis en cache!</p>
<p>To be continued&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iw2.fr/2010/06/17/symfony-doctrine-nestedset-gettree-useresultcache/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony et les templates de mail dynamiques</title>
		<link>http://www.iw2.fr/2010/01/24/symfony-et-les-templates-de-mail-dynamiques/</link>
		<comments>http://www.iw2.fr/2010/01/24/symfony-et-les-templates-de-mail-dynamiques/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 08:11:40 +0000</pubDate>
		<dc:creator>jmartin</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[sfMailer]]></category>

		<guid isPermaLink="false">http://www.iw2.fr/?p=169</guid>
		<description><![CDATA[Je vais maintenant aborder un aspect important dans tout bon projet Web : L&#8217;envoi de mails. Tout site internet a, dans 90% des cas (pour ma part) besoin d&#8217;envoyer des mails automatiques : - confirmation d&#8217;inscription - mot de passe &#8230; <a href="http://www.iw2.fr/2010/01/24/symfony-et-les-templates-de-mail-dynamiques/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="clear: both">Je vais maintenant aborder un aspect important dans tout bon projet Web : L&#8217;envoi de mails.</p>
<p style="clear: both">Tout site internet a, dans 90% des cas (pour ma part) besoin d&#8217;envoyer des mails automatiques :<br />
- confirmation d&#8217;inscription<br />
- mot de passe oublié<br />
- notifications pour messages reçus<br />
- etc&#8230;</p>
<p style="clear: both">Pour mes projets, j&#8217;avais plusieurs besoins (ou envies <img src='http://www.iw2.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )<br />
- un jolie template de mail (c&#8217;est toujours agréable de recevoir un jolie mail)<br />
- véhiculer l&#8217;information principale de ce mail<br />
- apporter des informations dynamique pour donner vie au mail.</p>
<p style="clear: both">Avec Symfony 1.3 &amp; 1.4, l&#8217;envoi de mail a été simplifié grâce à l&#8217;apparition de SfMailer. Mais, je voulais aller plus loin, en utilisant le même modèle Symfony -&gt; actions/templates/partials/composants pour les contenus de mail.</p>
<p style="clear: both">Je vais vous présenter cela par un exemple concret : Une confirmation d&#8217;inscription.</p>
<h2 style="clear: both">1. Problématique</h2>
<p style="clear: both">Suite à une inscription sur votre site Internet, vous désirez envoyer un email de remerciement accompagné des derniers membres inscris et la dernière news rédigée.</p>
<h2 style="clear: both">2. Le template de mail</h2>
<p style="clear: both">Créer un fichier apps/frontend/templates/layout_mail.php avec dedans le contenu de votre template :</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
&lt;html&gt;
  &lt;head&gt;...&lt;/head&gt;
  &lt;body&gt;
    &lt;div class='header'&gt; ... Votre haut de mail &lt;/div&gt;
    &lt;div class='content'&gt; &lt;?php echo $sf_content ?&gt;  &lt;/div&gt;
    &lt;div class='footer'&gt; ... Votre pied de mail &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<h2 style="clear: both">3. Centralisation des emails</h2>
<p style="clear: both">L&#8217;idée est de centraliser dans un module tous les différents mails envoyés automatiquement depuis le site Internet. Créer un module mail :</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
symfony generate:module frontend mail
</pre>
<p style="clear: both">Editer le fichier actions.class.php de ce module pour rajouter l&#8217;action pour l&#8217;email d&#8217;inscription :</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
&lt;?php
class mailActions extends sfActions
{
  public function preExecute()
  {
    //On précise ici que tous les mails utiliseront le layout que nous avons spécialement défini pour cela
    $this-&gt;setLayout('layout_mail');
  }
  public function executeInscription(sfWebRequest $request)
  {
    $this-&gt;member = Doctrine::getTable('member')-&gt;find($request-&gt;getParameter('id'));
  }
}
</pre>
<p style="clear: both">
<h2>4. Dynamisation des mails grâce aux components</h2>
<p style="clear: both">Créer le fichier components.class.php dans le module mail :</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
&lt;?php

class mailComponents extends sfComponents
{
  public function executeLastMembers()
  {
    $this-&gt;members = Doctrine::getTable('member')-&gt;getLast();
  }
  public function executeLastNews()
  {
    $this-&gt;news = Doctrine::getTable('news')-&gt;getLast();
  }
}
</pre>
<p style="clear: both">
<p>Créer ensuite les deux templates pour ces components : _lastMembers.php et _lastNews.php avec dedans l&#8217;affichage des derniers membres et de la dernière news comme vous le souhaitez.</p>
<h2 style="clear: both">5. Le template pour le mail d&#8217;inscription</h2>
<p style="clear: both">Créer le fichier inscriptionSuccess.php dans le dossier templates du module mail :</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
&lt;div&gt;
 &lt;?php echo $member-&gt;getFullName() ?&gt;, nous vous remercions pour votre inscription sur www.iw2.fr.
&lt;/div&gt;

&lt;!-- Nous incluons ici les deux components pour afficher les derniers membres et la dernière news --&gt;

&lt;?php include_component('mail', 'lastMembers')?&gt;

&lt;?php include_component('mail', 'lastNews')?&gt;
</pre>
<p style="clear: both">
<h2>6. Une classe mailer pour l&#8217;envoi des mails</h2>
<p style="clear: both">Cette classe se compose de deux méthodes: une pour centraliser les sujets de mails et l&#8217;autre pour l&#8217;envoi. Créer un fichier mailer.class.php dans le dossier lib.</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
class mailer
{
  static public function getSubject($action)
  {
    $subject = array();
    $subject['inscription'] = &quot;Confirmation de votre inscription&quot;;
    //$subject['nom_de_l'action_du_module_mail'] = &quot;Le sujet de ce mail&quot;;
    return $subject[$action];
  }

  static public function send ($dest, $action)
  {
    //En premier paramètre nous avons l'adresse mail du destinataire ou un tableau d'emails. En second paramètre nous avons le nom de l'action du module mail

    //On initialise l'objet mailer avec le destinataire et le sujet.
    $mailer = sfContext::getInstance()-&gt;getMailer()-&gt;compose(
              null,
              $dest,
              mailer::getSubject($action)
    );
    //On initialise le FROM avec des valeurs définie dans le app.yml par exemple
    $mailer-&gt;setFrom(sfConfig::get('app_mailer_from'), sfConfig::get('app_mailer_name'));
    //On précise un rendu de type html
    $mailer-&gt;setContentType(&quot;text/html&quot;);
    //On rajoute le contenu du mail en récupérant le rendu de l'action du module mail
    $mailer-&gt;setBody(sfContext::getInstance()-&gt;getController()-&gt;getPresentationFor('mail', $action));
    //On envoi le mail
    sfContext::getInstance()-&gt;getMailer()-&gt;send($mailer);
  }
}
</pre>
<p style="clear: both">
<p>Penser à faire un symfony cc à ce niveau pour prendre en compte cette nouvelle classe.</p>
<h2 style="clear: both">7. Au niveau de l&#8217;action d&#8217;inscription</h2>
<p style="clear: both">Dans votre action qui enregistre l&#8217;inscription, exemple :</p>
<p style="clear: both">
<pre class="brush: php; title: ;">
public function executeCreate(sfWebRequest $request)
{
  $this-&gt;form = new memberForm();
  if( $request-&gt;isMethod('post') )
  {
    $this-&gt;form-&gt;bind($request-&gt;getParameter( $this-&gt;form-&gt;getName() ), $request-&gt;getFiles($this-&gt;form-&gt;getName()));
    if($this-&gt;form-&gt;isValid()) {
      $member = $this-&gt;form-&gt;save();
      //On passe un paramètre à l'objet Request pour le récupérer au niveau de l'action du module mail
      $this-&gt;getRequest()-&gt;setParameter('id', $member-&gt;getId());
      //On envoi le mail
      mailer::send($pro-&gt;getEmail(), 'inscription');

      $this-&gt;redirect('page/remerciement');
    }
  }
}
</pre>
<h2 style="clear: both">8. Exemple de rendu</h2>
<p><a class="highslide" href="http://www.iw2.dev/wp-content/uploads/2010/01/mail-keldeco.png"><img class="aligncenter size-medium wp-image-197" title="mail-keldeco" src="http://www.iw2.fr/wp-content/uploads/2010/01/mail-keldeco-300x244.png" alt="mail-keldeco" width="300" height="244" /></a></p>
<h2 style="clear: both">9. Conclusion</h2>
<p style="clear: both">N&#8217;ayant rien trouvé sur internet pour répondre à mes besoins en matière d&#8217;envoi de mail &laquo;&nbsp;dynamique&nbsp;&raquo;, j&#8217;ai décidé de partager avec vous ma solution. Je conçois que celle-ci ne répond peut être pas à tous les critères de BEST PRACTICES Symfony pour le moment, mais c&#8217;est une première ébauche qui remplie 100% son rôle. N&#8217;hésitez pas si vous avez des questions ou des commentaires.</p>
<p style="clear: both">To be continued&#8230;</p>
<p style="clear: both">
<p><br class="final-break" style="clear: both" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iw2.fr/2010/01/24/symfony-et-les-templates-de-mail-dynamiques/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony &#8211; Forcer le téléchargement</title>
		<link>http://www.iw2.fr/2009/10/28/symfony-forcer-le-telechargement/</link>
		<comments>http://www.iw2.fr/2009/10/28/symfony-forcer-le-telechargement/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 19:29:00 +0000</pubDate>
		<dc:creator>jmartin</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[download]]></category>

		<guid isPermaLink="false">http://www.iw2.fr/?p=12</guid>
		<description><![CDATA[Voici un petit article rapide pour apporter une solution à cette question : &#171;&#160;Comment forcer le téléchargement d&#8217;un fichier avec Symfony&#160;&#187;. Je devais mettre en place aujourd&#8217;hui cette fonctionnalité pour un site et plus précisement pour une messagerie avec pièce &#8230; <a href="http://www.iw2.fr/2009/10/28/symfony-forcer-le-telechargement/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Voici un petit article rapide pour apporter une solution à cette question : &laquo;&nbsp;Comment forcer le téléchargement d&#8217;un fichier avec Symfony&nbsp;&raquo;.</p>
<p><a class="highslide" href="http://www.iw2.dev/wp-content/uploads/2009/11/symfony-logo1.gif"><img class="alignright size-full wp-image-90" title="symfony-logo" src="http://www.iw2.dev/wp-content/uploads/2009/11/symfony-logo1.gif" alt="symfony-logo" width="160" height="43" /></a></p>
<p>Je devais mettre en place aujourd&#8217;hui cette fonctionnalité pour un site et plus précisement pour une messagerie avec pièce jointe.</p>
<p>Après quelques essais personnels qui ont été un échec pour forcer le download de mon fichier, j&#8217;ai tenté de trouver des réponses sur le web. Bien évidement et comme toujours, plusieurs personnes avaient le même problème que moi <img src='http://www.iw2.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Mais les réponses proposées n&#8217;étaient pas à la hauteur de mes espérances&#8230; cela ne fonctionnait toujours pas.</p>
<p>Et finalement, je suis tombé sur ce site : <a href="http://howto.landure.fr/symfony/loadertool-une-classe-symfony-specialisee-dans-le-telechargement" target="_blank">LoaderTool</a></p>
<p>Ils mettent à disposition une classe PHP pour symfony permettant de forcer le téléchargement très simplement et efficacement.</p>
<p>Il suffit de copier cette classe <a href="http://www.iw2.dev/wp-content/uploads/2009/11/loadertool-class.php_.zip">loadertool-class.php</a> dans un de vos dossier dans le répertoire lib de votre projet Symfony, et ensuite créé une action de téléchargement sur un de vos modules :</p>
<pre class="brush: php; title: ;">
public function executeDownload(sfWebRequest $request)
{
  //Dans mon cas, je récupère ici mon objet message.
  $this-&gt;forward404Unless($message = Doctrine::getTable('messenger')-&gt;find($request-&gt;getParameter('id'));

  //J'initialise la variable $file avec le chemin vers mon fichier
  $file = sfConfig::get('sf_upload_dir').'/messenger_pj/'.$message-&gt;getAttachment();

  //Je lance le téléchargement avec LoaderTool
  LoaderTool::downloadContent($file);
  exit();
}
</pre>
<p>Rien de plus simple. Il existe d&#8217;autres options pour cette classe que je vous laisse découvrir.</p>
<p>To be continued&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iw2.fr/2009/10/28/symfony-forcer-le-telechargement/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony unsetAllExcept + i18n = unsetAllExceptI18n</title>
		<link>http://www.iw2.fr/2009/09/15/symfony-unsetallexcept-i18n-unsetallexcepti18n/</link>
		<comments>http://www.iw2.fr/2009/09/15/symfony-unsetallexcept-i18n-unsetallexcepti18n/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 19:06:00 +0000</pubDate>
		<dc:creator>jmartin</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[formulaire]]></category>
		<category><![CDATA[YAML]]></category>

		<guid isPermaLink="false">http://www.iw2.fr/?p=11</guid>
		<description><![CDATA[Suite au commentaire de eddie sur l&#8217;article &#171;&#160;Symfony &#8211; Formulaire en plusieurs étapes&#160;&#187; voici un exemple d&#8217;un formulaire multilangue en plusieurs étapes. Petit rappel du contexte: symfony 1.2 + Doctrine Dans le fichier schema.yml Projet1Exemple: tableName: projet1_exemple actAs: I18n: fields: &#8230; <a href="http://www.iw2.fr/2009/09/15/symfony-unsetallexcept-i18n-unsetallexcepti18n/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Suite au commentaire de eddie sur l&#8217;article &laquo;&nbsp;Symfony &#8211; Formulaire en plusieurs étapes&nbsp;&raquo; voici un exemple d&#8217;un formulaire multilangue en plusieurs étapes.</p>
<p><img class="size-full wp-image-88 alignright" title="symfony-logo" src="http://www.iw2.dev/wp-content/uploads/2009/11/symfony-logo.gif" alt="symfony-logo" width="160" height="43" /></p>
<p>Petit rappel du contexte: symfony 1.2 + Doctrine</p>
<p>Dans le fichier schema.yml</p>
<pre class="brush: php; title: ;">
Projet1Exemple:
  tableName: projet1_exemple
  actAs:
    I18n:
      fields: [titre, description, mots]
  columns:
    id:
      type: integer(4)
      primary: true
      unsigned: true
      notnull: true
      autoincrement: true
    fichier:
      type: string(255)
      unique: true
      notnull: true
    type:
      type: enum
      values: ['image', 'video', 'audio', 'document']
      notnull: true
      default: image
    titre:
      type: string(255)
      description:
      type: string(4000)
    mots:
      type: string(4000)
</pre>
<p>Nous avons donc deux champs communs à toutes les langues : fichier et type. Et trois champs multilangues : titre, description mots.</p>
<p>L&#8217;idée consisterait à mettre dans une première étape uniquement les champs : fichier (commun), titre (multilangue) et description (multilangue).</p>
<p>Dans le fichier actions.class.php</p>
<pre class="brush: php; title: ;">
public function executeIndex(sfWebRequest $request) {
  $this-&gt;form = new Projet1ExempleForm()
}
</pre>
<p>Dans le fichier /lib/form/doctrine/BaseFormDoctrine.class.php, ajouter la fonction suivante :</p>
<pre class="brush: php; title: ;">
public function unsetAllExceptI18n($keepFields = array(), $cultures = array(), $keepFieldsI18n = array()) {
  $keepFields[] = $cultures;
  foreach ($this as $key =&gt; $value)
    $baseFields[] = $key;
  $temp = array_diff($baseFields, $keepFields);
  foreach ($temp as $unsetField)
    unset($this[$unsetField]);
  $embeds = $this-&gt;getEmbeddedForms();
  foreach ($cultures as $culture)
    $formsI18n[$culture] = $embeds[$culture];
  foreach ($formsI18n as $culture =&gt; $formI18n)
  {
    foreach ($formI18n as $key =&gt; $value)
      $baseFieldsI18n[] = $key;
    $temp = array_diff($baseFieldsI18n, $keepFieldsI18n);
    foreach ($temp as $unsetField)
      unset($formI18n[$unsetField]);
    unset($this[$culture]);
    $this-&gt;embedForm($culture, $formI18n);
  }
}
</pre>
<p>Explication des paramètres :</p>
<ul>
<li>- &nbsp;&raquo;$keepFieds&nbsp;&raquo; : un tableau des champs &#8216;commun&#8217; que vous souhaitez &laquo;&nbsp;garder&nbsp;&raquo;.</li>
<li>- &nbsp;&raquo;$cultures&nbsp;&raquo; : un tableau des différentes cultures que vous voulez utiliser.</li>
<li>- &nbsp;&raquo;$keepFieldsI18n&nbsp;&raquo; : un tableau des champs &#8216;multilangues&#8217; que vous souhaitez &laquo;&nbsp;garder&nbsp;&raquo;.</li>
</ul>
<p>Et enfin dans le fichier /lib/form/doctrine/Projet1ExempleForm.class.php</p>
<pre class="brush: php; title: ;">
class Projet1ExempleForm extends BaseProjet1ExempleForm {
  public function configure() {
    //Introduire les formulaires multilangues dans un premier temps
    $this-&gt;embedI18n(array('fr'));
    $this-&gt;embedI18n(array('en'));
    //Garder uniquement les champs dont vous avez besoin
    $this-&gt;unsetAllExceptI18n(array('fichier'), array('fr', 'en'), array('titre', 'description'));
  }
}
</pre>
<p>Et enfin dans votre template</p>
<pre class="brush: php; title: ;">
//Soit tout simplement
&lt;?php echo $form;?&gt;

//ou
&lt;?php echo $form['fichier']-&gt;renderLabel()?&gt;
&lt;?php echo $form['fichier']-&gt;render()?&gt;
&lt;?php echo $form['fr']['description']-&gt;renderLabel()?&gt;
&lt;?php echo $form['fr']['description']-&gt;render()?&gt;
//...
</pre>
<p>Voici un aperçu du résultat : <a class="highslide" href="http://www.iw2.dev/wp-content/uploads/2009/11/Capture_d_ecran_2009-09-15_a_19.25.01.png"><img class="aligncenter size-thumbnail wp-image-97" title="Capture_d_ecran_2009-09-15_a_19.25.01" src="http://www.iw2.fr/wp-content/uploads/2009/09/Capture_d_ecran_2009-09-15_a_19.25.01-150x150.png" alt="Capture_d_ecran_2009-09-15_a_19.25.01" width="150" height="150" /></a></p>
<p>Vous pouvez ensuite continuer de la même manière pour les prochaines étapes de votre formulaire.</p>
<p>N&#8217;hésitez pas à me solliciter pour plus d&#8217;explications.</p>
<p>To be continued&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iw2.fr/2009/09/15/symfony-unsetallexcept-i18n-unsetallexcepti18n/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Symfony &#8211; Formulaire en plusieurs étapes</title>
		<link>http://www.iw2.fr/2009/08/28/symfony-formulaire-en-plusieurs-etapes/</link>
		<comments>http://www.iw2.fr/2009/08/28/symfony-formulaire-en-plusieurs-etapes/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 14:35:00 +0000</pubDate>
		<dc:creator>jmartin</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[formulaire]]></category>

		<guid isPermaLink="false">http://www.iw2.fr/?p=10</guid>
		<description><![CDATA[Comment mettre en place un formulaire en plusieurs étapes avec Symfony 1.2 et Doctrine? Je vais tenter de vous expliquer cela par un exemple concret. Nous allons réaliser une inscription de membre en plusieurs étapes: - Etape 1 : Identification &#8230; <a href="http://www.iw2.fr/2009/08/28/symfony-formulaire-en-plusieurs-etapes/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Comment mettre en place un formulaire en plusieurs étapes avec Symfony 1.2 et Doctrine? Je vais tenter de vous expliquer cela par un exemple concret.</p>
<p><img class="alignright size-full wp-image-90" title="symfony-logo" src="http://www.iw2.dev/wp-content/uploads/2009/11/symfony-logo1.gif" alt="symfony-logo" width="160" height="43" /></p>
<p>Nous allons réaliser une inscription de membre en plusieurs étapes:</p>
<ul>
<li>- Etape 1 : Identification &nbsp;&raquo;(pseudo, mail, password)&nbsp;&raquo;</li>
<li>- Etape 2 : Informations complémentaires &nbsp;&raquo;(nom, prenom, adresse, cp, ville)&nbsp;&raquo;</li>
</ul>
<p>Dans le fichier /config/doctrine/schema.yml :</p>
<pre class="brush: php; title: ;">
membre:
  columns:
    id: { type: integer(4), primary: true, notnull: true, autoincrement: true }
    pseudo: { type: string(255) }
    mail: { type: string(255) }
    password: { type: string(255) }
    nom: { type: string(255) }
    prenom: { type: string(255) }
    adresse: { type: string(255) }
    cp: { type: string(255) }
    ville: { type: string(255) }
</pre>
<p>Lancer ensuite la commande :</p>
<pre class="brush: php; title: ;">
symfony doctrine:build-all
</pre>
<p>Editer le fichier /lib/form/doctrine/BaseFormDoctrine.class.php et ajouter cette fonction :</p>
<pre class="brush: php; title: ;">
public function unsetAllExcept ($keepFields = array()) {
  foreach ($this as $key =&gt; $value)
    $baseFields[] = $key;
    $temp = array_diff($baseFields, $keepFields);
    foreach ($temp as $unsetField)
      unset($this[$unsetField]);
}
</pre>
<p>Nous allons maintenant créer deux formulaires &#8216;membre&#8217; pour les deux étapes du formulaire.</p>
<p>Créer le fichier /lib/form/doctrine/membreEtape1Form.class.php</p>
<pre class="brush: php; title: ;">
class membreEtape1Form extends BasemembreForm {
  public function configure () {
    $this-&gt;unsetAllExcept(array( 'pseudo', 'mail', 'password' ) );
  }
}
</pre>
<p>Créer maintenant le fichier /lib/form/doctrine/membreEtape2Form.class.php</p>
<pre class="brush: php; title: ;">
class membreEtape2Form extends BasemembreForm {
  public function configure ()   {
    $this-&gt;unsetAllExcept(array( 'nom', 'prenom', 'adresse', 'cp', 'ville' ) );
  }
}
</pre>
<p>Lancer ensuite la commande pour vider le cache :</p>
<pre class="brush: php; title: ;">
symfony cc
</pre>
<p>Vous pouvez maintenant initialiser vos formulaires dans actions.class.php</p>
<pre class="brush: php; title: ;">
public function executeInscriptionEtape1(sfWebRequest $request) {
  $this-&gt;form = new membreEtape1Form();
}
public function executeInscriptionEtape2(sfWebRequest $request) {
  $this-&gt;form = new membreEtape2Form();
}
</pre>
<p>Vous pouvez dès à présent vous inspirer de cette base pour vos propres besoins.</p>
<p>N&#8217;hésitez pas à me contacter par commentaire pour plus d&#8217;explications.</p>
<p>To be continued&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iw2.fr/2009/08/28/symfony-formulaire-en-plusieurs-etapes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Framework Symfony</title>
		<link>http://www.iw2.fr/2009/08/04/framework-symfony/</link>
		<comments>http://www.iw2.fr/2009/08/04/framework-symfony/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 12:42:00 +0000</pubDate>
		<dc:creator>jmartin</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[YAML]]></category>

		<guid isPermaLink="false">http://www.iw2.fr/?p=9</guid>
		<description><![CDATA[Présentation Symfony est un framework PHP 5 qui permet d&#8217;accélérer les temps de développement d&#8217;applications Web. Il permet d&#8217;avoir un site robuste, évolutif, et sécurisé, garantissant la pérennité de votre application dans le temps. Spécifications Voici une liste non exhaustive &#8230; <a href="http://www.iw2.fr/2009/08/04/framework-symfony/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Présentation</h2>
<p>Symfony est un framework PHP 5 qui permet d&#8217;accélérer les temps de développement d&#8217;applications Web. Il permet d&#8217;avoir un site robuste, évolutif, et sécurisé, garantissant la pérennité de votre application dans le temps.</p>
<p><img class="aligncenter size-full wp-image-90" title="symfony-logo" src="http://www.iw2.dev/wp-content/uploads/2009/11/symfony-logo1.gif" alt="symfony-logo" width="200" height="54" /></p>
<h2>Spécifications</h2>
<p>Voici une liste non exhaustive de ce que propose le framework Symfony :</p>
<ul>
<li>- Model MVC</li>
<li>- Générateur de back-office</li>
<li>- Internationalisation</li>
<li>- ORM (Mapping objet-relationnel) embarqué : Doctrine ou Propel.</li>
<li>- Création et utilisation de plugins</li>
<li>- Système de cache</li>
<li>- Moteur d&#8217;URL rewriting performant</li>
<li>- Fichiers de configuration (Langage YAML)</li>
</ul>
<h2>Pourquoi le choix de ce framework?</h2>
<p>Je travaille actuellement dans une agence Web qui disposait jusqu&#8217;à présent de son propre framework maison. Actuellement en pleine expansion, nous avons pris la décision de migrer vers le framework Symfony pour plusieurs raisons:</p>
<ul>
<li>- Accélérer nos temps de développement.</li>
<li>- DRY (Don&#8217;t Repeat Yourself) : Ne pas réinventer la roue.</li>
<li>- Capitaliser notre expérience en exportant certaines briques de code sous forme de Plugins pour d&#8217;autres projets.</li>
<li>- Se concentrer plus sur l&#8217;aspect métier des applications à développer.</li>
<li>- Recruter plus facilement des développeurs utilisant ou connaissant Symfony plutôt que perdre du temps pour les former sur notre framework maison.</li>
</ul>
<h2>Prise en main de Symfony</h2>
<p>Je développe depuis quelques mois sous Symfony, et le chemin n&#8217;a pas toujours été facile&#8230; Je découvre et j&#8217;apprends tous les jours avec de framework qui ne cessera jamais de m&#8217;étonner. Voici quelques conseils à ceux qui souhaiterais se lancer dans ce framework :</p>
<ul>
<li>- Suivre le tutoriel Jobeet présent sur le site de Symfony (je vous conseille l&#8217;ORM Doctrine pour la simple et bonne raison qu&#8217;il sera en standard dans les nouvelles versions de Symfony). <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/" target="_blank">Tutoriel pour démarrer avec Symfony</a></li>
<li>- Pour le développement de vos applications, je vous conseille fortement l&#8217;utilisation d&#8217;un outil de débugger tel que xdebug ou zend debugger, permettant de comprendre la logique de Symfony notamment pour tout ce qui concerne la soumission des formulaires.</li>
<li>- Et enfin n&#8217;hésitez pas à faire appel à la communauté Symfony très active : <a href="http://groups.google.com/group/symfony-fr?pli=1" target="_blank">Groupe Google Symfony</a> et également <a href="irc://irc.freenode.net/symfony" target="_blank">Canal IRC Fr</a></li>
</ul>
<h2>Liens utiles</h2>
<p><a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/" target="_blank">Site officiel Symfony<br />
Symfony sur Wikipedia<br />
Tutoriel pour démarrer avec Symfony</a><a href="http://fr.symfonians.net/" target="_blank"><br />
Centralisation des réalisations faites avec le framework Symfony </a></p>
<p>to be continued&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iw2.fr/2009/08/04/framework-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

