<?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; Doctrine</title>
	<atom:link href="http://www.iw2.fr/tag/doctrine/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 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>
	</channel>
</rss>

