http://www.e-glop.net/w/index.php?title=Un_hack_des_sfForm_sur_des_mod%C3%A8les_Sluggable&feed=atom&action=historyUn hack des sfForm sur des modèles Sluggable - Historique des versions2024-03-29T00:40:14ZHistorique des versions pour cette page sur le wikiMediaWiki 1.29.1http://www.e-glop.net/w/index.php?title=Un_hack_des_sfForm_sur_des_mod%C3%A8les_Sluggable&diff=2383&oldid=prevBeTa le 22 mars 2013 à 19:562013-03-22T19:56:38Z<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;' lang='fr'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Version précédente</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version du 22 mars 2013 à 19:56</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l59" >Ligne 59 :</td>
<td colspan="2" class="diff-lineno">Ligne 59 :</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Cette solution est basée sur le nom "slug" de la colonne visée. ce n'est donc pas l'idéal. Disons que pour le moment "ça suffira", en attendant de faire ça mieux.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Cette solution est basée sur le nom "slug" de la colonne visée. ce n'est donc pas l'idéal. Disons que pour le moment "ça suffira", en attendant de faire ça mieux.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[Catégorie:Informatique]</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">[</ins>[Catégorie:Informatique<ins class="diffchange diffchange-inline">]</ins>]</div></td></tr>
</table>BeTahttp://www.e-glop.net/w/index.php?title=Un_hack_des_sfForm_sur_des_mod%C3%A8les_Sluggable&diff=2381&oldid=prevBeTa le 22 mars 2013 à 19:562013-03-22T19:56:15Z<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;' lang='fr'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Version précédente</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version du 22 mars 2013 à 19:56</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l58" >Ligne 58 :</td>
<td colspan="2" class="diff-lineno">Ligne 58 :</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Cette solution est basée sur le nom "slug" de la colonne visée. ce n'est donc pas l'idéal. Disons que pour le moment "ça suffira", en attendant de faire ça mieux.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Cette solution est basée sur le nom "slug" de la colonne visée. ce n'est donc pas l'idéal. Disons que pour le moment "ça suffira", en attendant de faire ça mieux.</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[Catégorie:Informatique]</ins></div></td></tr>
</table>BeTahttp://www.e-glop.net/w/index.php?title=Un_hack_des_sfForm_sur_des_mod%C3%A8les_Sluggable&diff=2380&oldid=prevBeTa : Page créée avec « == Constat == Les sfForm bâtis sur des modèles implémentant le behaviour Sluggable plantent si deux objets ont les mêmes données permettant de calculer le slug : en ... »2013-03-22T19:41:53Z<p>Page créée avec « == Constat == Les sfForm bâtis sur des modèles implémentant le behaviour Sluggable plantent si deux objets ont les mêmes données permettant de calculer le slug : en ... »</p>
<p><b>Nouvelle page</b></p><div>== Constat ==<br />
<br />
Les sfForm bâtis sur des modèles implémentant le behaviour Sluggable plantent si deux objets ont les mêmes données permettant de calculer le slug : en effet, avant comparaison dans la base, les calculs des deux slugs donnent le même résultat.<br />
<br />
Pour éviter les slugs dupliqués, Doctrine 1.2 appelle juste avant l'insert/update la fonction Doctrine_Template_Listener_Sluggable::getUniqueSlug() qui va chercher les doublons potentiels dans la base de données et qui offre une alternative unique pour le Doctrine_Record courant.<br />
<br />
Le problème est que Symfony pour sa part, vérifie dans ses sfForm l'unicité du slug pré-calculé mais non (encore) confronté au contenu de la table courante. Cela se passe dans le BaseForm courant, généré automatiquement au moment du ./symfony doctrine:build-forms via le template lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineForm/default/template/sfDoctrineFormGeneratedTemplate.php.<br />
<br />
== Solution ==<br />
<br />
Soit nous optons pour un hack pas très joli, soit on reprend le template. C'est cette seconde option, plus propre (même si elle touche au core de Symfony1), que nous choisissons.<br />
<br />
// lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineForm/default/template/sfDoctrineFormGeneratedTemplate.php<br />
// Ligne 36:<br />
<?php if ($uniqueColumns = $this->getUniqueColumnNames()): ?><br />
$this->validatorSchema->setPostValidator(<br />
<?php if (count($uniqueColumns) > 1): ?><br />
new sfValidatorAnd(array(<br />
<?php foreach ($uniqueColumns as $uniqueColumn): ?><br />
new sfValidatorDoctrineUnique(array('model' => '<?php echo $this->table->getOption('name') ?>', 'column$<br />
<?php endforeach; ?><br />
))<br />
<?php else: ?><br />
new sfValidatorDoctrineUnique(array('model' => '<?php echo $this->table->getOption('name') ?>', 'column' $<br />
<?php endif; ?><br />
<br />
== Modifications à apporter ==<br />
<br />
Index: lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineForm/default/template/sfDoctrineFormGeneratedTemplate.php<br />
===================================================================<br />
--- lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineForm/default/template /sfDoctrineFormGeneratedTemplate.php (révision 33643)<br />
+++ lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineForm/default/template/sfDoctrineFormGeneratedTemplate.php (copie de travail)<br />
@@ -32,7 +32,10 @@<br />
<?php endforeach; ?><br />
));<br />
<br />
+<?php // LIBRINFO: 22/03/2013<br />
<?php if ($uniqueColumns = $this->getUniqueColumnNames()): ?><br />
+<?php foreach ( $uniqueColumns as $key => $ucol ) if ( implode("', '", $ucol) === 'slug' ) unset($uniqueColumns[$key]); ?><br />
+<?php if ( count($uniqueColumns) ): ?><br />
$this->validatorSchema->setPostValidator(<br />
<?php if (count($uniqueColumns) > 1): ?><br />
new sfValidatorAnd(array(<br />
@@ -44,6 +47,7 @@<br />
new sfValidatorDoctrineUnique(array('model' => '<?php echo $this->table->getOption('name') ?>', 'column' => array('<?php echo implode("', '", $uniqueColumns[0]) ?>')))<br />
<?php endif; ?><br />
);<br />
+<?php endif ?><br />
<br />
<?php endif; ?><br />
$this->widgetSchema->setNameFormat('<?php echo $this->underscore($this->modelName) ?>[%s]');<br />
<br />
Et là nous reconstruisons les formulaires :<br />
<br />
./symfony doctrine:build-forms<br />
<br />
== Limites ==<br />
<br />
Cette solution est basée sur le nom "slug" de la colonne visée. ce n'est donc pas l'idéal. Disons que pour le moment "ça suffira", en attendant de faire ça mieux.</div>BeTa