<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://www.e-glop.net/index.php?action=history&amp;feed=atom&amp;title=Sauvegarde%2FRestauration_de_filtres_Symfony</id>
	<title>Sauvegarde/Restauration de filtres Symfony - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="http://www.e-glop.net/index.php?action=history&amp;feed=atom&amp;title=Sauvegarde%2FRestauration_de_filtres_Symfony"/>
	<link rel="alternate" type="text/html" href="http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;action=history"/>
	<updated>2026-05-21T18:11:09Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2433&amp;oldid=prev</id>
		<title>BeTa : /* Lister les filtres existants */</title>
		<link rel="alternate" type="text/html" href="http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2433&amp;oldid=prev"/>
		<updated>2013-12-09T17:14:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Lister les filtres existants&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 9 décembre 2013 à 17:14&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l277&quot;&gt;Ligne 277 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 277 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ainsi, dans le partial _filters.php, qui a déjà accès à une instance de la classe bookmarkGeneratorConfiguration, nous sommes maintenant capables d&amp;#039;afficher en boucle les filtres sauvegardés que nous avons récupéré afin d&amp;#039;en afficher la liste :&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ainsi, dans le partial _filters.php, qui a déjà accès à une instance de la classe bookmarkGeneratorConfiguration, nous sommes maintenant capables d&amp;#039;afficher en boucle les filtres sauvegardés que nous avons récupéré afin d&amp;#039;en afficher la liste :&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;nowiki&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // in apps/backend/modules/bookmark/templates/_filters.php from line 11&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  // in apps/backend/modules/bookmark/templates/_filters.php from line 11&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    [...]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    [...]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      &amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      &amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;        &amp;lt;h3&amp;gt;&amp;lt;?php echo __(&#039;Saved filters&#039;) ?&amp;gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/del&gt;h3&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;        &amp;lt;h3&amp;gt;&amp;lt;?php echo __(&#039;Saved filters&#039;) ?&amp;gt;&amp;lt;h3&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        &amp;lt;?php if (count($savedFilters = $configuration-&amp;gt;getSavedFilters())): ?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        &amp;lt;?php if (count($savedFilters = $configuration-&amp;gt;getSavedFilters())): ?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        &amp;lt;ul&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        &amp;lt;ul&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l300&quot;&gt;Ligne 300 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 301 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &amp;lt;/tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &amp;lt;/tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;/tbody&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;/tbody&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/nowiki&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Maintenant vous êtes donc capable de sauvegarder en base et de lister des filtres, les charger et les faire fonctionner sur votre liste d&amp;#039;objets, et bien entendu, supprimer les filtres existant. Si vous avez suivi méticuleusement les étapes de ce tutoriel, vous devriez voir quelque chose comme cela sous le formulaire de filtres :&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Maintenant vous êtes donc capable de sauvegarder en base et de lister des filtres, les charger et les faire fonctionner sur votre liste d&amp;#039;objets, et bien entendu, supprimer les filtres existant. Si vous avez suivi méticuleusement les étapes de ce tutoriel, vous devriez voir quelque chose comme cela sous le formulaire de filtres :&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>BeTa</name></author>
	</entry>
	<entry>
		<id>http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2359&amp;oldid=prev</id>
		<title>BeTa le 24 octobre 2012 à 11:09</title>
		<link rel="alternate" type="text/html" href="http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2359&amp;oldid=prev"/>
		<updated>2012-10-24T11:09:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 24 octobre 2012 à 11:09&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l316&quot;&gt;Ligne 316 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 316 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ceci est une traduction libre de l&amp;#039;article datant de 2009 de NiKo sur son blog &amp;#039;&amp;#039;Prendre Un Café&amp;#039;&amp;#039;. Merci à lui pour l&amp;#039;original : http://prendreuncafe.com/blog/post/2009/12/02/Saving-Search-Filters-in-Symfony-s-Doctrine-Admin-Generator&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ceci est une traduction libre de l&amp;#039;article datant de 2009 de NiKo sur son blog &amp;#039;&amp;#039;Prendre Un Café&amp;#039;&amp;#039;. Merci à lui pour l&amp;#039;original : http://prendreuncafe.com/blog/post/2009/12/02/Saving-Search-Filters-in-Symfony-s-Doctrine-Admin-Generator&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[Catégorie:Informatique]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>BeTa</name></author>
	</entry>
	<entry>
		<id>http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2356&amp;oldid=prev</id>
		<title>BeTa le 24 octobre 2012 à 11:05</title>
		<link rel="alternate" type="text/html" href="http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2356&amp;oldid=prev"/>
		<updated>2012-10-24T11:05:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 24 octobre 2012 à 11:05&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l312&quot;&gt;Ligne 312 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 312 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  - Allez-y, prouvez le !! :c)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  - Allez-y, prouvez le !! :c)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== Références ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; 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;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Ceci est une traduction libre de l&#039;article datant de 2009 de NiKo sur son blog &#039;&#039;Prendre Un Café&#039;&#039;. Merci à lui pour l&#039;original : http://prendreuncafe.com/blog/post/2009/12/02/Saving-Search-Filters-in-Symfony-s-Doctrine-Admin-Generator&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>BeTa</name></author>
	</entry>
	<entry>
		<id>http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2355&amp;oldid=prev</id>
		<title>BeTa : Page créée avec « Les exemples à venir sont basés sur un modèle simple que pris sur les précédents articles que NiKo a publié précédemment, concernant l&#039;embriquement de relations da... »</title>
		<link rel="alternate" type="text/html" href="http://www.e-glop.net/index.php?title=Sauvegarde/Restauration_de_filtres_Symfony&amp;diff=2355&amp;oldid=prev"/>
		<updated>2012-10-24T11:03:22Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « Les exemples à venir sont basés sur un modèle simple que pris sur les précédents articles que NiKo a publié précédemment, concernant l&amp;#039;embriquement de relations da... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Les exemples à venir sont basés sur un modèle simple que pris sur les précédents articles que NiKo a publié précédemment, concernant l&amp;#039;embriquement de relations dans des formulaires Doctrine, auxquelles il va ajouter des facilitations pour ses marque-pages :&lt;br /&gt;
&lt;br /&gt;
 # in ./config/doctrine/schema.yml&lt;br /&gt;
 User:&lt;br /&gt;
   columns:&lt;br /&gt;
     id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       primary: true&lt;br /&gt;
       autoincrement: true&lt;br /&gt;
     name:&lt;br /&gt;
       type: string(255)&lt;br /&gt;
       notnull: true&lt;br /&gt;
   relations:&lt;br /&gt;
     Bookmarks:&lt;br /&gt;
       type: many&lt;br /&gt;
       class: Bookmark&lt;br /&gt;
       local: id&lt;br /&gt;
       foreign: user_id&lt;br /&gt;
       onDelete: CASCADE&lt;br /&gt;
 &lt;br /&gt;
 Bookmark:&lt;br /&gt;
   actAs:&lt;br /&gt;
     I18n:&lt;br /&gt;
       fields: [name]&lt;br /&gt;
       actAs:&lt;br /&gt;
         Sluggable:&lt;br /&gt;
           fields: [name]&lt;br /&gt;
           uniqueBy: [name, lang]&lt;br /&gt;
   columns:&lt;br /&gt;
     id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       primary: true&lt;br /&gt;
       autoincrement: true&lt;br /&gt;
     name:&lt;br /&gt;
       type: string(255)&lt;br /&gt;
       notnull: true&lt;br /&gt;
     url:&lt;br /&gt;
       type: string(255)&lt;br /&gt;
       notnull: true&lt;br /&gt;
     user_id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       notnull: true&lt;br /&gt;
   relations:&lt;br /&gt;
     User:&lt;br /&gt;
       type: one&lt;br /&gt;
       local: user_id&lt;br /&gt;
       foreign: id&lt;br /&gt;
     Tags:&lt;br /&gt;
       class: Tag&lt;br /&gt;
       refClass: BookmarkTag&lt;br /&gt;
       local: bookmark_id&lt;br /&gt;
       foreign: tag_id&lt;br /&gt;
       foreignAlias: Bookmarks&lt;br /&gt;
 &lt;br /&gt;
 Tag:&lt;br /&gt;
   columns:&lt;br /&gt;
     id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       primary: true&lt;br /&gt;
       autoincrement: true&lt;br /&gt;
     name:&lt;br /&gt;
       type: string(255)&lt;br /&gt;
       notnull: true&lt;br /&gt;
 &lt;br /&gt;
 BookmarkTag:&lt;br /&gt;
   columns:&lt;br /&gt;
     bookmark_id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       primary: true&lt;br /&gt;
       notnull: true&lt;br /&gt;
     tag_id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       primary: true&lt;br /&gt;
       notnull: true&lt;br /&gt;
&lt;br /&gt;
Pas besoin de dire que vous devriez reconstruire votre modèle...&lt;br /&gt;
&lt;br /&gt;
Le fichier de fixtures mis à jour :&lt;br /&gt;
&lt;br /&gt;
 # in ./data/fixtures/fixtures.yml&lt;br /&gt;
 User:&lt;br /&gt;
   niko:&lt;br /&gt;
     name: niko&lt;br /&gt;
 &lt;br /&gt;
 Bookmark:&lt;br /&gt;
   niko_bookmark1:&lt;br /&gt;
     User: niko&lt;br /&gt;
     name: Slashdot&lt;br /&gt;
     url: http://slashdot.org/&lt;br /&gt;
     Tags: [geek_tag, tech_tag, php_tag]&lt;br /&gt;
   niko_bookmark2:&lt;br /&gt;
     User: niko&lt;br /&gt;
     name: Delicious&lt;br /&gt;
     url: http://delicious.com/&lt;br /&gt;
     Tags: [geek_tag, tech_tag]&lt;br /&gt;
   niko_bookmark3:&lt;br /&gt;
     User: niko&lt;br /&gt;
     name: Digg&lt;br /&gt;
     url: http://digg.com/&lt;br /&gt;
     Tags: [geek_tag, php_tag]&lt;br /&gt;
 &lt;br /&gt;
 Tag:&lt;br /&gt;
   geek_tag:&lt;br /&gt;
     name: geek&lt;br /&gt;
   php_tag:&lt;br /&gt;
     name: php&lt;br /&gt;
   tech_tag:&lt;br /&gt;
     name: tech&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Génération de l&amp;#039;admin du modèle Bookmark ==&lt;br /&gt;
&lt;br /&gt;
Générons une application &amp;quot;backend&amp;quot; et un module &amp;quot;Bookmark&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 $ ./symfony generate:app backend&lt;br /&gt;
 $ ./symfony doctrine:generate-admin backend Bookmark&lt;br /&gt;
&lt;br /&gt;
Maintenant améliorons un peu ce module d&amp;#039;admin en modifiant le fichier generator.yml :&lt;br /&gt;
&lt;br /&gt;
 generator:&lt;br /&gt;
   class: sfDoctrineGenerator&lt;br /&gt;
   param:&lt;br /&gt;
     model_class:           Bookmark&lt;br /&gt;
     theme:                 admin&lt;br /&gt;
     non_verbose_templates: true&lt;br /&gt;
     with_show:             false&lt;br /&gt;
     singular:              Bookmark&lt;br /&gt;
     plural:                Bookmarks&lt;br /&gt;
     route_prefix:          bookmark&lt;br /&gt;
     with_doctrine_route:   true&lt;br /&gt;
     actions_base_class:    sfActions&lt;br /&gt;
 &lt;br /&gt;
     config:&lt;br /&gt;
       actions: ~&lt;br /&gt;
       fields:  ~&lt;br /&gt;
       list:&lt;br /&gt;
         display: [=name, url, User]&lt;br /&gt;
       filter:  ~&lt;br /&gt;
       form:    ~&lt;br /&gt;
       edit:    ~&lt;br /&gt;
       new:     ~&lt;br /&gt;
&lt;br /&gt;
Vous devriez à présent pouvoir naviguer dans l&amp;#039;interface d&amp;#039;admin ainsi générée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:generated-bookmarks.png]]&lt;br /&gt;
&lt;br /&gt;
== Enregistrer les filtres dans une table Doctrine dédiée, et les gérer depuis le contrôleur ==&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser Doctrine pour stocker les filtrer à enregistrer, ajoutons donc la définition d&amp;#039;une nouvelle table dans notre schema.yml :&lt;br /&gt;
&lt;br /&gt;
 SavedFilter:&lt;br /&gt;
   columns:&lt;br /&gt;
     id:&lt;br /&gt;
       type: integer(4)&lt;br /&gt;
       primary: true&lt;br /&gt;
       autoincrement: true&lt;br /&gt;
     name:&lt;br /&gt;
       type: string(255)&lt;br /&gt;
     type:&lt;br /&gt;
       type: enum&lt;br /&gt;
       values: [Bookmark, User]&lt;br /&gt;
       notnull: true&lt;br /&gt;
     filter:&lt;br /&gt;
       type: string()&lt;br /&gt;
&lt;br /&gt;
Bien entendu, pas besoin de rappeler qu&amp;#039;il faut reconstruire votre modèle...&lt;br /&gt;
&lt;br /&gt;
Ok, maintenant nous allons enregistrer les valeurs sérialisées du filtre dans la colonne &amp;quot;filter&amp;quot; de la table et la colonne &amp;quot;name&amp;quot; sera pratique pour donner un nom aux filtres. La colonne &amp;quot;type&amp;quot; va référencer la table Doctrine dont fait référence le filtre. Rien de difficile ici.&lt;br /&gt;
&lt;br /&gt;
Dans le module d&amp;#039;admin, les filtres sont stockés dans l&amp;#039;attribut tableName.filters de la session utilisateur (où tableName est le nom du module d&amp;#039;admin d&amp;#039;où les paramètres du filtre sont donnés).&lt;br /&gt;
&lt;br /&gt;
Donc ajoutons maintenant une méthode executeSaveFilter() dans le controlleur bookmarkActions. Et tant que nous seront là-dessus, ajoutons également les méthodes executeLoadFilter() et executeDeleteFilter()...&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 # in apps/backend/modules/bookmark/actions/actions.class.php&lt;br /&gt;
 class bookmarkActions extends autoBookmarkActions&lt;br /&gt;
 {&lt;br /&gt;
   public function executeDeleteFilter(sfWebRequest $request)&lt;br /&gt;
   {&lt;br /&gt;
     $this-&amp;gt;forward404Unless($filter = Doctrine::getTable(&amp;#039;SavedFilter&amp;#039;)-&amp;gt;findOneByTypeAndId(&amp;#039;Bookmark&amp;#039;, $request-&amp;gt;getParameter(&amp;#039;id&amp;#039;)), sprintf(&amp;#039;Bookmark filter #%d not found&amp;#039;, $request-&amp;gt;getParameter(&amp;#039;id&amp;#039;))) ;&lt;br /&gt;
     &lt;br /&gt;
     $filter-&amp;gt;delete();&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;getUser()-&amp;gt;setFlash(&amp;#039;notice&amp;#039;, sprintf(&amp;#039;Bookmark saved filters &amp;quot;%s&amp;quot; deleted&amp;#039;, $filter-&amp;gt;getName()));&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;redirect(&amp;#039;bookmark&amp;#039;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public function executeLoadFilter(sfWebRequest $request)&lt;br /&gt;
   {&lt;br /&gt;
     $this-&amp;gt;forward404Unless($filter = Doctrine::getTable(&amp;#039;SavedFilter&amp;#039;)-&amp;gt;findOneByTypeAndId(&amp;#039;Bookmark&amp;#039;, $request-&amp;gt;getParameter(&amp;#039;id&amp;#039;)));&lt;br /&gt;
     $this-&amp;gt;setFilters(unserialize($filter-&amp;gt;getFilter()));&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;getUser()-&amp;gt;setFlash(&amp;#039;notice&amp;#039;, sprintf(&amp;#039;Bookmark saved filters &amp;quot;%s&amp;quot; loaded&amp;#039;, $filter-&amp;gt;getName()));&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;redirect(&amp;#039;bookmark&amp;#039;);&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   public function executeSaveFilter(sfWebRequest $request)&lt;br /&gt;
   {&lt;br /&gt;
     $name = trim($request-&amp;gt;getGetParameter(&amp;#039;name&amp;#039;));&lt;br /&gt;
     $savedFilter = new SavedFilter();&lt;br /&gt;
     $savedFilter-&amp;gt;fromArray(array(&lt;br /&gt;
       &amp;#039;name&amp;#039;   =&amp;gt; $name ? $name : &amp;#039;Untitled filter&amp;#039;,&lt;br /&gt;
       &amp;#039;type&amp;#039;   =&amp;gt; &amp;#039;Bookmark&amp;#039;,&lt;br /&gt;
       &amp;#039;filter&amp;#039; =&amp;gt; serialize($this-&amp;gt;getUser()-&amp;gt;getAttribute(&amp;#039;bookmark.filters&amp;#039;, array(), &amp;#039;admin_module&amp;#039;)),&lt;br /&gt;
     ));&lt;br /&gt;
     $savedFilter-&amp;gt;save();&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;getUser()-&amp;gt;setFlash(&amp;#039;notice&amp;#039;, &amp;#039;Bookmark filters saved&amp;#039;);&lt;br /&gt;
     &lt;br /&gt;
     $this-&amp;gt;redirect(&amp;#039;bookmark&amp;#039;);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Bien entendu, nous allons avoir besoin d&amp;#039;ajouter les routes correspondantes dans le fichier routing.yml de l&amp;#039;application (app/YOURAPP/config/routing.yml) :&lt;br /&gt;
&lt;br /&gt;
 # in apps/backend/config/routing.yml&lt;br /&gt;
 bookmark_filter_delete:&lt;br /&gt;
   url: /bookmark/filter/:id/delete&lt;br /&gt;
   param: { module: bookmark, action: deleteFilter }&lt;br /&gt;
   requirements:&lt;br /&gt;
     id: \d+&lt;br /&gt;
 &lt;br /&gt;
 bookmark_filter_load:&lt;br /&gt;
   url: /bookmark/filter/:id/load&lt;br /&gt;
   param: { module: bookmark, action: loadFilter }&lt;br /&gt;
   requirements:&lt;br /&gt;
     id: \d+&lt;br /&gt;
 &lt;br /&gt;
 bookmark_filter_save:&lt;br /&gt;
   url: /bookmark/filter/save&lt;br /&gt;
   param: { module: bookmark, action: saveFilter }&lt;br /&gt;
 &lt;br /&gt;
Attendez, nous n&amp;#039;avons aucun lien pour enregistrer un filtre depuis l&amp;#039;interface d&amp;#039;admin ! Ajoutons-en un près du bouton Reset de la partie Filtres, en réécrivant le partial _filters.php (dont l&amp;#039;original se trouve dans cache/YOURAPP/YOURENV/modules/autoBookmark/templates/_filters.php) :&lt;br /&gt;
&lt;br /&gt;
 // in apps/backend/modules/bookmark/templates/_filters.php from line 11&lt;br /&gt;
 [...]&lt;br /&gt;
 &amp;lt;tfoot&amp;gt;&lt;br /&gt;
   &amp;lt;tr&amp;gt;&lt;br /&gt;
     &amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;?php echo $form-&amp;gt;renderHiddenFields() ?&amp;gt;&lt;br /&gt;
       &amp;lt;a href=&amp;quot;&amp;lt;?php echo url_for(&amp;#039;@bookmark_filter_save&amp;#039;) ?&amp;gt;&amp;quot; onclick=&amp;quot;document.location = this.href+&amp;#039;?name=&amp;#039;+prompt(&amp;#039;Enter a name:&amp;#039;);return false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;?php echo __(&amp;#039;Save&amp;#039;) ?&amp;gt;&lt;br /&gt;
       &amp;lt;/a&amp;gt;&lt;br /&gt;
       &amp;lt;?php echo link_to(__(&amp;#039;Reset&amp;#039;, array(), &amp;#039;sf_admin&amp;#039;), &amp;#039;bookmark_collection&amp;#039;, array(&amp;#039;action&amp;#039; =&amp;gt; &amp;#039;filter&amp;#039;), array(&amp;#039;query_string&amp;#039; =&amp;gt; &amp;#039;_reset&amp;#039;, &amp;#039;method&amp;#039; =&amp;gt; &amp;#039;post&amp;#039;)) ?&amp;gt;&lt;br /&gt;
       &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;&amp;lt;?php echo __(&amp;#039;Filter&amp;#039;, array(), &amp;#039;sf_admin&amp;#039;) ?&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;/tfoot&amp;gt;&lt;br /&gt;
 [...]&lt;br /&gt;
&lt;br /&gt;
Notez qu&amp;#039;un prompt javascript va vous demander un nom pour votre filtre avant de le sauvegarder...&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Prompt.png]]&lt;br /&gt;
&lt;br /&gt;
Ainsi nous pouvons enregistrer un filtre en base de donnée. Maintenant, listons-les après le formulaire de filtres !&lt;br /&gt;
&lt;br /&gt;
== Lister les filtres existants ==&lt;br /&gt;
&lt;br /&gt;
Pour moi, le meilleur endroit pour retrouver des filtres enregistrés c&amp;#039;est la classe bookmarkGeneratorConfiguration, qui a été générée dans le sous-répertoire lib/ du module Bookmark d&amp;#039;admin. Ajoutons-y une nouvelle méthode getSavedFilters() :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 # in apps/backend/modules/bookmark/lib/bookmarkGeneratorConfiguration.class.php&lt;br /&gt;
 class bookmarkGeneratorConfiguration extends BaseBookmarkGeneratorConfiguration&lt;br /&gt;
 {&lt;br /&gt;
   public function getSavedFilters()&lt;br /&gt;
   {&lt;br /&gt;
     return Doctrine::getTable(&amp;#039;SavedFilter&amp;#039;)&lt;br /&gt;
       -&amp;gt;createQuery()&lt;br /&gt;
       -&amp;gt;where(&amp;#039;type = ?&amp;#039;, &amp;#039;Bookmark&amp;#039;)&lt;br /&gt;
       -&amp;gt;execute()&lt;br /&gt;
     ;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Ainsi, dans le partial _filters.php, qui a déjà accès à une instance de la classe bookmarkGeneratorConfiguration, nous sommes maintenant capables d&amp;#039;afficher en boucle les filtres sauvegardés que nous avons récupéré afin d&amp;#039;en afficher la liste :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // in apps/backend/modules/bookmark/templates/_filters.php from line 11&lt;br /&gt;
   [...]&lt;br /&gt;
   &amp;lt;tr&amp;gt;&lt;br /&gt;
     &amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;h3&amp;gt;&amp;lt;?php echo __(&amp;#039;Saved filters&amp;#039;) ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
       &amp;lt;?php if (count($savedFilters = $configuration-&amp;gt;getSavedFilters())): ?&amp;gt;&lt;br /&gt;
       &amp;lt;ul&amp;gt;&lt;br /&gt;
       &amp;lt;?php foreach ($savedFilters as $filter): ?&amp;gt;&lt;br /&gt;
         &amp;lt;li&amp;gt;&lt;br /&gt;
           &amp;lt;a href=&amp;quot;&amp;lt;?php echo url_for(&amp;#039;@bookmark_filter_load?id=&amp;#039;.$filter[&amp;#039;id&amp;#039;]) ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;?php echo $filter[&amp;#039;name&amp;#039;] ?&amp;gt;&lt;br /&gt;
           &amp;lt;/a&amp;gt;&lt;br /&gt;
           (&amp;lt;a href=&amp;quot;&amp;lt;?php echo url_for(&amp;#039;@bookmark_filter_delete?id=&amp;#039;.$filter[&amp;#039;id&amp;#039;]) ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;)&lt;br /&gt;
         &amp;lt;/li&amp;gt;&lt;br /&gt;
       &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
       &amp;lt;/ul&amp;gt;&lt;br /&gt;
       &amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
         &amp;lt;p&amp;gt;No filters saved&amp;lt;/p&amp;gt;&lt;br /&gt;
       &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
     &amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;/tbody&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant vous êtes donc capable de sauvegarder en base et de lister des filtres, les charger et les faire fonctionner sur votre liste d&amp;#039;objets, et bien entendu, supprimer les filtres existant. Si vous avez suivi méticuleusement les étapes de ce tutoriel, vous devriez voir quelque chose comme cela sous le formulaire de filtres :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Withlist.png]]&lt;br /&gt;
&lt;br /&gt;
20 minutes, le boulot est fait. Même si ce fût rapide et même un peu trop parfois.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Oui, je peux vous entendre, vous les Symfony nerds : on peut faire vraiment mieux, mieux écrit, mieux inclus dans la structure de Symfony, et probablement abstrait pour offrir une solution générique de stockage de filtres à travers l&amp;#039;ensemble des modules admin-generated... mais en 20 minutes ? Vraiment ? ;c) Mais alors je dirais :&lt;br /&gt;
&lt;br /&gt;
 - Allez-y, prouvez le !! :c)&lt;/div&gt;</summary>
		<author><name>BeTa</name></author>
	</entry>
</feed>