<?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>Nanane - Dév. Web et Actu.</title>
	<atom:link href="http://www.nanane.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nanane.fr</link>
	<description>Nanane - Développement web et actualités</description>
	<lastBuildDate>Thu, 27 Jan 2011 17:11:30 +0000</lastBuildDate>
	<language></language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>jQuery Return top</title>
		<link>http://www.nanane.fr/2011/01/jquery-return-top/</link>
		<comments>http://www.nanane.fr/2011/01/jquery-return-top/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 17:11:30 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Animate]]></category>
		<category><![CDATA[Returntop]]></category>
		<category><![CDATA[scroll]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1474</guid>
		<description><![CDATA[Je vous partage ici un petit code permettant de créer facilement un retour en haut de page qui est vachement lol. Le principe est que ce dernier ne doit s&#8217;afficher que si on scroll suffisamment au sein de notre page. Je ne vais pas détailler le code javascript car il est d&#8217;une simplicité exemplaire, le ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1491" title="model_illustration" src="http://www.nanane.fr/wp-content/uploads/2011/01/model_illustration3.jpg" alt="" width="570" height="99" /></p>
<p>Je vous partage ici un petit code permettant de créer facilement un retour en haut de page qui est vachement lol.<br />
Le principe est que ce dernier ne doit s&#8217;afficher que si on scroll suffisamment au sein de notre page.</p>
<div class="tuto"><a class="source" href="http://www.nanane.fr/includes_for_examples/returntop/returntop.rar"></a><a class="demo" href="http://www.nanane.fr/includes_for_examples/returntop/index.html" target="_blank"></a></div>
<p>Je ne vais pas détailler le code javascript car il est d&#8217;une simplicité exemplaire, le voici :</p>
<pre class="brush: jscript; title: ;">
function return_to_top(){
	jQuery(window).scroll(function () {
		if(jQuery(window).scrollTop() &gt; 500){
			jQuery('div#my_return_to_top').show('slide');
		}else{
			jQuery('div#my_return_to_top').hide('slide');
		}
	});

	jQuery('div#my_return_to_top').click(function(){
		jQuery('html, body').animate({scrollTop:0}, 'slow');
		return false;
	});
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/jquery-return-top/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento : Requête SQL</title>
		<link>http://www.nanane.fr/2011/01/magento-requete-sql/</link>
		<comments>http://www.nanane.fr/2011/01/magento-requete-sql/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 17:09:49 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1470</guid>
		<description><![CDATA[Petit tips rapidos, voici comment utiliser l&#8217;instance de la DB Magento pour exécuter une requête SQL : $resource = Mage::getSingleton('core/resource'); $read= $resource-&#62;getConnection('core_read'); $select = $read-&#62;select() -&#62;from('le_nom_de_ma_table') -&#62;where('mon_champ = ?', $ma_valeur) -&#62;where('mon_autre_champ = ?', $mon_autre_valeur); $retour = $select-&#62;query(); $rows = $retour-&#62;fetchAll(); foreach($rows as $rec): $sauvegarder = $rec['nom_du_champ']; endforeach]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1489" title="illu_requete" src="http://www.nanane.fr/wp-content/uploads/2011/01/illu_requete.jpg" alt="" width="570" height="99" /></p>
<p>Petit tips rapidos, voici comment utiliser l&#8217;instance de la DB Magento pour exécuter une requête SQL :</p>
<pre class="brush: php; title: ;">
$resource = Mage::getSingleton('core/resource');
$read= $resource-&gt;getConnection('core_read');
$select = $read-&gt;select()
-&gt;from('le_nom_de_ma_table')
-&gt;where('mon_champ = ?', $ma_valeur)
-&gt;where('mon_autre_champ = ?', $mon_autre_valeur);
$retour = $select-&gt;query();
$rows = $retour-&gt;fetchAll();

foreach($rows as $rec):
  $sauvegarder = $rec['nom_du_champ'];
endforeach;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/magento-requete-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS : Rotation d&#8217;éléments sous IE</title>
		<link>http://www.nanane.fr/2011/01/css-rotation-delements/</link>
		<comments>http://www.nanane.fr/2011/01/css-rotation-delements/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 12:53:17 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Css]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[rotate]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1418</guid>
		<description><![CDATA[Lors d&#8217;un développement récent, je cherchai à effectuer une rotation sur un ensemble d&#8217;éléments. Je suis tombé en farfouillant sur les forums sur un post de Calou où il présentait une solution à un autre soucis de rotation qu&#8217;il avait lui-même trouvé ailleurs (Thx Calou, t&#8217;es un Caïd). J&#8217;ai de ce fait exploité davantage la ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1449" title="model_illustration" src="http://www.nanane.fr/wp-content/uploads/2011/01/model_illustration1.jpg" alt="" width="570" height="99" /></p>
<p>Lors d&#8217;un développement récent, je cherchai à effectuer une <strong>rotation </strong>sur un ensemble d&#8217;éléments. Je suis tombé en farfouillant sur les forums sur un post de <strong>Calou </strong>où il présentait une solution à un autre soucis de rotation qu&#8217;il avait lui-même trouvé ailleurs (Thx Calou, t&#8217;es un Caïd).</p>
<p>J&#8217;ai de ce fait exploité davantage la chose ( ce qui m&#8217;a pris pas mal de temps, car franchement c&#8217;est pas simple ) afin de trouver des correspondances pour effectuer cet effet sous <strong>Internet Explorer</strong> (bah oui, sinon ce serait trop simple).<br />
Ci-dessous vous trouverez comme d&#8217;habitude une <strong>démonstration </strong>ainsi que les <strong>sources </strong> de l&#8217;exemple.</p>
<div class="tuto"><a class="source" href="http://www.nanane.fr/includes_for_examples/rotate/rotate.rar"></a><a class="demo" href="http://www.nanane.fr/includes_for_examples/rotate/index.html" target="_blank"></a></div>
<p><span id="more-1418"></span></p>
<p>Donc, pour les rotations sous ie, voici le principe :</p>
<pre class="brush: css; title: ;">
.ma_rotation{
  -moz-transform: rotate(30deg); /* FF3.5 */
  -o-transform: rotate(30deg); /* Opera 10.5 */
  -webkit-transform: rotate(30deg); /* Saf3.1 , Chrome */
  filter: progid:DXImageTransform.Microsoft.Matrix(
            sizingMethod='auto expand',
            M11=0.699,
            M12=-0.630,
            M21=0.630,
            M22=0.699
    ); /* IE6,IE7 */
  -ms-filter: &quot;progid:DXImageTransform.Microsoft.Matrix(
           SizingMethod='auto expand',
           M11=0.699,
           M12=-0.630,
           M21=0.630,
           M22=0.699
   )&quot;;  /* IE8 */
  zoom: 1;
}
</pre>
<p>Pas besoin de détailler les transform des navigateurs supportant le <strong>CSS3</strong>, ils sont on ne peut plus intuitifs.</p>
<p>En revanche, pour IE, c&#8217;est une toute autre paire de manches ! Il s&#8217;agit en fait de faire appel aux <strong>propriétés matricielles du navigateur </strong>afin de <strong>déformer </strong>notre image (attention, ceci entraine également un déplacement de l&#8217;image et un réajustement du design global est alors nécessaire).<br />
Malgré le temps important que j&#8217;ai passé dessus, je ne suis pas encore en complète mesure de vous expliquer l&#8217;intérêt de chaque <strong>propriété</strong>, mais ai néanmoins réussi à créer toute une série d&#8217;<strong>angles </strong>pour placer mes éléments, ainsi les <strong>sources </strong>ici proposées peuvent servir de références afin de placer vos propres éléments.</p>
<p>Le <strong>hic </strong>(car il y en a toujours un avec IE) réside dans l&#8217;apparition d&#8217;une <strong>bordure noire</strong> autour de votre image, rendant ainsi ce script pas vraiment exploitable pour un module que vous souhaiteriez faire facturer, vous imposant donc de créer votre images déjà inclinées..</p>
<p>Bon, ça fait toujours un début si certains veulent poursuivre dans cette logique afin d&#8217;obtenir un rendu &#8220;parfait&#8221; :)<br />
Merci donc de me faire signe si vous arrivez à virer ces bordures :p (Sans javascript).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/css-rotation-delements/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Magento : Surcharger un Controller</title>
		<link>http://www.nanane.fr/2011/01/magento-surcharger-un-controller/</link>
		<comments>http://www.nanane.fr/2011/01/magento-surcharger-un-controller/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 10:34:48 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[extends]]></category>
		<category><![CDATA[surcharge]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1420</guid>
		<description><![CDATA[La surcharge d&#8217;un controller sous Magento n&#8217;est pas très compliquée, mais nécessite tout de même de suivre une démarche précise. Dans cet exemple, nous allons surcharger un  controller étendant la gestion du compte client. Bien, cet exemple part du principe que vous ayez déjà mis en place votre module qui aura pour vocation d&#8217;étendre ce controller. J&#8217;appellerai ici ce ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1461" title="model_illustration" src="http://www.nanane.fr/wp-content/uploads/2011/01/model_illustration2.jpg" alt="" width="570" height="99" /></p>
<p>La surcharge d&#8217;un <strong>controller </strong>sous <strong>Magento </strong>n&#8217;est pas très compliquée, mais nécessite tout de même de suivre une démarche précise. Dans cet exemple, nous allons surcharger un  controller étendant la gestion <strong>du compte client</strong>.</p>
<p><span id="more-1420"></span>Bien, cet exemple part du principe que vous ayez déjà mis en place votre module qui aura pour vocation d&#8217;étendre ce controller. J&#8217;appellerai ici ce module &#8216;Etendu&#8217;, qui serait placé dans <code>app/code/local/Charlous/Etendu</code> (Charlous, c&#8217;est moi :p).</p>
<p>Nous créons donc notre <strong>AccountController.php </strong>qui se trouve dans <code>app/code/local/Charlous/Etendu/controllers/Customer/</code> et qui contient le code suivant :</p>
<pre class="brush: php; title: ;">
&lt;?php
require_once 'app/code/community/Auguria/Sponsorship/controllers/Customer/AccountController.php';
class Charlous_Etendu_Customer_AccountController extends Auguria_Sponsorship_Customer_AccountController
{
   public function indexAction(){
        die('ça marche');
   }
}
</pre>
<p>Vous constaterez que je force <strong>l&#8217;include </strong>du <strong>controller </strong>source, ceci pour que toutes les fonctions non étendues aient tout de même leur petit effet.<br />
Ensuite, je crée au sein de mon controller toutes les fonctions que je souhaite étendre et qui remplaceront donc celles initialement prévues. Pour l&#8217;exemple, je claque juste un <code>die()</code> sur l&#8217;action d&#8217;index. Donc si ça plante quand vous accédez à l&#8217;url votre_site.com/customer/account, vous devez avoir une jolie page blanche, témoignant de la réussite de votre surcharge.</p>
<p>Pour l&#8217;instant bien sur, rien ne se produit, il vous auparavant correctement renseigner votre <strong>config.xml</strong> &#8211; celui de votre module perso et donc sité dans <code>app/code/local/Charlous/Etendu/etc/</code>- de la manière suivante :</p>
<pre class="brush: xml; title: ;">
&lt;!-- ... --&gt;
&lt;global&gt;
   &lt;rewrite&gt;
    	&lt;Charlous_Etendu_customer_account&gt;
          &lt;from&gt;&lt;![CDATA[#^/customer/account/#]]&gt;&lt;/from&gt;
          &lt;to&gt;/Charlous_Etendu/customer_account/&lt;/to&gt;
        &lt;/Charlous_Etendu_customer_account&gt;
   &lt;/rewrite&gt;
   &lt;!-- ... --&gt;
&lt;/global&gt;
&lt;!-- ... --&gt;
</pre>
<p>Dans  vous insérez ces quelques lignes qui spécifient dont que désormais, tout pointage effectué vers le controller d&#8217;account sera redirigé vers votre AccountController perso.<br />
Et voilà pour le controller, rien de très compliqué.</p>
<h3>Étendre un Model</h3>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/magento-surcharger-un-controller/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Magento : Rendu d&#8217;affichage des adresses</title>
		<link>http://www.nanane.fr/2011/01/magento-rendu-daffichage-des-adresses/</link>
		<comments>http://www.nanane.fr/2011/01/magento-rendu-daffichage-des-adresses/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 14:31:15 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Address]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1424</guid>
		<description><![CDATA[L&#8217;affichage du rendu html ou texte des adresses de livraison ne se fait pas dans un template. Pourquoi faire simple ? Bah en fait je pense qu&#8217;ils ont voulu optimiser le tout pour ne pas avoir à dispatcher davantage le code en fonction du rendu souhaité (Rendu HTML, PDF ou Text). Ce qui fait que ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1446" title="magento_address" src="http://www.nanane.fr/wp-content/uploads/2011/01/magento_address.jpg" alt="" width="570" height="99" /></p>
<p>L&#8217;affichage du rendu html ou texte des <strong>adresses </strong>de <strong>livraison </strong>ne se fait pas dans un template.</p>
<p>Pourquoi faire simple ? Bah en fait je pense qu&#8217;ils ont voulu optimiser le tout pour ne pas avoir à dispatcher davantage le code en fonction du rendu souhaité (Rendu HTML, PDF ou Text).</p>
<p>Ce qui fait que le model fait appel à une structure xml.<br />
Le contenu à modifier se trouve dans le <strong>config.xml</strong> situé à cet emplacement : <code>/app/code/core/Mage/Customer/etc/config.xml</code>.</p>
<p><span id="more-1424"></span></p>
<pre class="brush: xml; title: ;">
&lt;customer&gt;
            &lt;address&gt;
                &lt;formats&gt;
                    &lt;text translate=&quot;title&quot; module=&quot;customer&quot;&gt;
                        &lt;title&gt;Text&lt;/title&gt;
                        &lt;defaultFormat&gt;&lt;![CDATA[
{{depend intitule_address}}{{var intitule_address}} : {{/depend}}{{depend prefix}}{{var prefix}} {{/depend}}{{var firstname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var lastname}}{{depend suffix}} {{var suffix}}{{/depend}}
{{depend company}}{{var company}}{{/depend}}
{{if street1}}{{var street1}}
{{/if}}
{{depend street2}}{{var street2}}{{/depend}}
{{depend street3}}{{var street3}}{{/depend}}
{{depend street4}}{{var street4}}{{/depend}}
{{if city}}{{var city}},  {{/if}}{{if region}}{{var region}}, {{/if}}{{if postcode}}{{var postcode}}{{/if}}
{{var country}}
T: {{var telephone}}
{{depend fax}}F: {{var fax}}{{/depend}}
                        ]]&gt;&lt;/defaultFormat&gt;
                    &lt;/text&gt;
                    &lt;oneline translate=&quot;title&quot; module=&quot;customer&quot;&gt;
                        &lt;title&gt;Text One Line&lt;/title&gt;
                        &lt;htmlEscape&gt;true&lt;/htmlEscape&gt;
                        &lt;defaultFormat&gt;
&lt;![CDATA[{{depend intitule_address}}{{var intitule_address}} : {{/depend}}{{depend prefix}}{{var prefix}} {{/depend}}{{var firstname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var lastname}}{{depend suffix}} {{var suffix}}{{/depend}}, {{var street}}, {{var city}}, {{var region}} {{var postcode}}, {{var country}}]]&gt;
                        &lt;/defaultFormat&gt;
                    &lt;/oneline&gt;
                    &lt;html translate=&quot;title&quot; module=&quot;customer&quot;&gt;
                        &lt;title&gt;HTML&lt;/title&gt;
                        &lt;htmlEscape&gt;true&lt;/htmlEscape&gt;
                        &lt;defaultFormat&gt;&lt;![CDATA[
{{depend intitule_address}}&lt;strong&gt;{{var intitule_address}}&lt;/strong&gt;&lt;br /&gt;{{/depend}}
{{depend prefix}}{{var prefix}} {{/depend}}{{var firstname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var lastname}}{{depend suffix}} {{var suffix}}{{/depend}}&lt;br/&gt;
{{depend company}}{{var company}}&lt;br /&gt;{{/depend}}
{{if street1}}{{var street1}}&lt;br /&gt;{{/if}}
{{depend street2}}{{var street2}}&lt;br /&gt;{{/depend}}
{{depend street3}}{{var street3}}&lt;br /&gt;{{/depend}}
{{depend street4}}{{var street4}}&lt;br /&gt;{{/depend}}
{{if city}}{{var city}},  {{/if}}{{if region}}{{var region}}, {{/if}}{{if postcode}}{{var postcode}}{{/if}}&lt;br/&gt;
{{var country}}&lt;br/&gt;
{{depend telephone}}Tel: {{var telephone}}{{/depend}}
{{depend fax}}&lt;br/&gt;Fax: {{var fax}}{{/depend}}
            ]]&gt;&lt;/defaultFormat&gt;
                    &lt;/html&gt;
                    &lt;pdf translate=&quot;title&quot; module=&quot;customer&quot;&gt;
                        &lt;title&gt;PDF&lt;/title&gt;
                        &lt;defaultFormat&gt;&lt;![CDATA[
{{depend intitule_address}}{{var intitule_address}} : {{/depend}}{{depend prefix}}{{var prefix}} {{/depend}}{{var firstname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var lastname}}{{depend suffix}} {{var suffix}}{{/depend}}|
{{depend company}}{{var company}}|{{/depend}}
{{if street1}}{{var street1}}
{{/if}}
{{depend street2}}{{var street2}}|{{/depend}}
{{depend street3}}{{var street3}}|{{/depend}}
{{depend street4}}{{var street4}}|{{/depend}}
{{if city}}{{var city}},  {{/if}}{{if region}}{{var region}}, {{/if}}{{if postcode}}{{var postcode}}{{/if}}|
{{var country}}|
{{depend telephone}}T: {{var telephone}}{{/depend}}|
{{depend fax}}&lt;br/&gt;F: {{var fax}}{{/depend}}|
            ]]&gt;&lt;/defaultFormat&gt;
                    &lt;/pdf&gt;
                    &lt;js_template template=&quot;title&quot; module=&quot;customer&quot;&gt;
                        &lt;title&gt;Javascript Template&lt;/title&gt;
                        &lt;defaultFormat&gt;&lt;![CDATA[#{prefix} #{firstname} #{middlename} #{lastname} #{suffix}&lt;br/&gt;#{company}&lt;br/&gt;#{street0}&lt;br/&gt;#{street1}&lt;br/&gt;#{street2}&lt;br/&gt;#{street3}&lt;br/&gt;#{city}, #{region}, #{postcode}&lt;br/&gt;#{country_id}&lt;br/&gt;T: #{telephone}&lt;br/&gt;F: #{fax}]]&gt;&lt;/defaultFormat&gt;
                    &lt;/js_template&gt;
                &lt;/formats&gt;
            &lt;/address&gt;
        &lt;/customer&gt;
</pre>
<p>Je ne pense pas qu&#8217;il soit nécessaire de détailler davantage la logique ici exposée tant elle est intuitive :)<br />
Vous constaterez tout de même que sont présents <strong>3 affichages</strong> différents, un pour l&#8217;html, le pdf et le dernier pour un rendu texte (appelé notamment dans le <strong>select </strong>de choix de l&#8217;adresse lors de la validation d&#8217;une commande).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/magento-rendu-daffichage-des-adresses/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Magento : Désactiver Recurring Profiles</title>
		<link>http://www.nanane.fr/2011/01/magento-desactiver-recurring-profiles/</link>
		<comments>http://www.nanane.fr/2011/01/magento-desactiver-recurring-profiles/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 14:29:32 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[recurring_profiles]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1414</guid>
		<description><![CDATA[Bon alors j&#8217;ai pas mal cherché comment retirer du menu du compte client le recurring profiles en vain. J&#8217;ai finalement trouvé cette info sur un forum que je me permet de vous retransmettre ici : Il suffit de, dans le fichier app/design/frontend/votre_theme/default/layout/sales/recurring_profile.xml, mettre en commentaire les lignes suivantes. &#60;!-- &#60;customer_account&#62; &#60;reference name=&#34;customer_account_navigation&#34; &#62; &#60;action method=&#34;addLink&#34; ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1452" title="rerereon" src="http://www.nanane.fr/wp-content/uploads/2011/01/rerereon.jpg" alt="" width="570" height="99" /></p>
<p>Bon alors j&#8217;ai pas mal cherché comment retirer du menu du compte client le <strong>recurring profiles</strong> en vain.</p>
<p>J&#8217;ai finalement trouvé cette info sur un <a href="http://www.magentocommerce.com/boards/viewthread/199511/#t254946">forum </a>que je me permet de vous retransmettre ici :</p>
<p>Il suffit de, dans le fichier app/design/frontend/<strong>votre_theme</strong>/default/layout/sales/recurring_profile.xml, mettre en commentaire les lignes suivantes.</p>
<pre class="brush: xml; title: ;">
&lt;!-- &lt;customer_account&gt;
&lt;reference name=&quot;customer_account_navigation&quot; &gt;
&lt;action method=&quot;addLink&quot; translate=&quot;label&quot;&gt;&lt;name&gt;recurring_profiles&lt;/name&gt;&lt;path&gt;sales/recurring_profile/&lt;/path&gt;&lt;label&gt;Recurring Profiles&lt;/label&gt;&lt;/action&gt;
&lt;/reference&gt;
&lt;/customer_account&gt; --&gt;
</pre>
<p>Et voilà, il a disparu :p</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/magento-desactiver-recurring-profiles/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Magento : Observer</title>
		<link>http://www.nanane.fr/2011/01/magento-observer/</link>
		<comments>http://www.nanane.fr/2011/01/magento-observer/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 10:14:00 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Observer]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1400</guid>
		<description><![CDATA[Nous allons ici voir comment créer un Observer sous Magento. A quoi sert donc un Observer ? Et bien c&#8217;est très simple ! Vous avez peut être déjà remarqué que Magento &#8220;diffuse&#8221; des évènements au cours des différentes actions que vous pouvez réaliser au sein du code. Cette même diffusion peut être utilisée afin de lancer l’exécution d&#8217;un ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://www.nanane.fr/includes_for_examples/demo_magento_observer/model_illustration.jpg" alt="" width="570" height="99" /></p>
<p>Nous allons ici voir comment créer un <strong>Observer </strong>sous <strong>Magento</strong>.</p>
<p>A quoi sert donc un <strong>Observer </strong>? Et bien c&#8217;est très simple ! Vous avez peut être déjà remarqué que Magento &#8220;diffuse&#8221; des <strong>évènements </strong>au cours des différentes actions que vous pouvez réaliser au sein du code. Cette même <strong>diffusion </strong>peut être utilisée afin de lancer l’exécution d&#8217;un script spécifique. Dans cet exemple, nous allons créer un observer sur la validation (le paiement) d&#8217;une commande.<br />
( Une liste relativement exhaustive des différents évènements Magento est disponible <strong>en fin de post</strong>).</p>
<p><span id="more-1400"></span></p>
<p>Tout d&#8217;abord, nous devons implémenter une petite config au sein du config.xml du module qui aura vocation à contenir le code exécuté. Il s&#8217;agit en fait de dire à Magento &#8220;Quand cet évènements se déclenchera, tu exécuteras le code suivant&#8221;.</p>
<pre class="brush: xml; title: ;">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;config&gt;
&lt;!-- ..... --&gt;
&lt;global&gt;
 &lt;events&gt;
   &lt;sales_order_invoice_pay&gt;
	&lt;observers&gt;
    	    &lt;Charlous_Module_Observer&gt;
		   &lt;type&gt;singleton&lt;/type&gt;
		   &lt;class&gt;Charlous_Flux_Model_Observer&lt;/class&gt;
		   &lt;method&gt;export&lt;/method&gt;
 	    &lt;/Charlous_Flux_Observer&gt;
	&lt;/observers&gt;
    &lt;/sales_order_invoice_pay&gt;
  &lt;/events&gt;
  &lt;!-- ... --&gt;
 &lt;/global&gt;
&lt;/config&gt;
</pre>
<p>Cette configuration se fait donc entre les balises <code>global</code> puis <code>events</code>. Vous ouvrez une entrée  au sein de laquelle vous allez déclarer le ou les évènements que vous souhaitez utiliser comme &#8220;écouteur&#8221;. L’évènement que j&#8217;utilise ici est <code>sales_order_invoice_pay</code>, il s&#8217;agit donc comme son nom l&#8217;indique, du moment où la commande est payée.</p>
<p>Comme vous pouvez le constater, lors de l&#8217;activation de l’évènement <strong>sales_order_invoice_pay</strong>, mon module &#8220;Charlous/Flux&#8221; sera appelé pour exécuter la méthode &#8220;export&#8221; de mon <strong>Observer </strong>se trouvant dans <strong>app/code/local/Charlous/Flux/Model/Observer.php</strong></p>
<p>Il ne nous reste plus qu&#8217;à créer notre model <strong>Observer.php</strong></p>
<p>Nous créons donc notre Observer.php dans le répertoire <strong>Model </strong>de notre module Magento, qui contient le code suivant :</p>
<pre class="brush: php; title: ;">
class Charlous_Flux_Model_Observer extends Varien_Event_Observer{
	public function __construct(){}

	public function export($observer){
		/*Cette fonction sera appelé lorsqu'une commande sera payée*/
               die('ça marche !');
	}
</pre>
<p>Et voilà, ça marche :D<br />
Enfin ça plante plutôt, bah oui avec un <code>die()</code> après une commande, il n&#8217;y a pas grand intérêt &#8230;<br />
Bon sinon, je vous file ici un module qui reprend ce même code, ça pourra ainsi vous servir d&#8217;exemple :)<br />
(Contenu à décompresser et à copier à la racine de l&#8217;apply Magento, comme n&#8217;importe quel module)</p>
<div class="tuto"><a class="onlysource" href="http://www.nanane.fr/includes_for_examples/demo_magento_observer/app.rar"></a></div>
<p>Voilà, maintenant vous avez compris comment implémenter un Observer :)<br />
Pour vous aider, je vous donne ci-dessous une liste plus ou moins complète des différents événements :</p>
<h3>Controller Routing Events</h3>
<pre class="brush: xml; title: ;">
controller_action_layout_render_before_'.$this-&gt;getFullActionName
controller_action_layout_render_before
controller_action_nocookies
controller_action_noroute
controller_action_postdispatch
controller_action_predispatch
controller_front_init_before
controller_front_init_routers
</pre>
<h3>Generic Object Saving Events</h3>
<pre class="brush: xml; title: ;">
$this-&gt;_eventPrefix.'_add_is_active_filter
$this-&gt;_eventPrefix.'_delete_after
$this-&gt;_eventPrefix.'_delete_after_done
$this-&gt;_eventPrefix.'_delete_before
$this-&gt;_eventPrefix.'_delete_commit_after
$this-&gt;_eventPrefix . '_load_after
$this-&gt;_eventPrefix.'_load_after
$this-&gt;_eventPrefix . '_load_before
$this-&gt;_eventPrefix.'_move_after
$this-&gt;_eventPrefix.'_move_before
$this-&gt;_eventPrefix.'_'.$process.'_process_run_after
$this-&gt;_eventPrefix.'_'.$process.'_process_run_before
$this-&gt;_eventPrefix.'_save_after
$this-&gt;_eventPrefix.'_save_before
$this-&gt;_eventPrefix.'_save_commit_after
$this-&gt;_eventPrefix.'_validate_after
$this-&gt;_eventPrefix.'_validate_before
</pre>
<h3>All Other Events</h3>
<pre class="brush: xml; title: ;">
adminhtml_banner_edit_tab_content_before_prepare_form
adminhtml_block_eav_attribute_edit_form_init
adminhtml_block_html_before
adminhtml_catalog_category_tabs
adminhtml_catalog_category_tree_is_moveable
adminhtml_catalog_product_attribute_set_main_html_before
adminhtml_catalog_product_attribute_set_toolbar_main_html_before
adminhtml_catalog_product_edit_element_types
adminhtml_catalog_product_edit_prepare_form
adminhtml_catalog_product_edit_tab_attributes_create_html_before
adminhtml_catalog_product_form_prepare_excluded_field_list
adminhtml_cms_page_edit_tab_content_prepare_form
adminhtml_cms_page_edit_tab_design_prepare_form
adminhtml_cms_page_edit_tab_main_prepare_form
adminhtml_cms_page_edit_tab_meta_prepare_form
adminhtml_cmspage_on_delete
adminhtml_controller_action_predispatch_start
adminhtml_controller_catalogrule_prepare_save
adminhtml_controller_salesrule_prepare_save
adminhtml_customer_prepare_save
adminhtml_customer_save_after
adminhtml_product_attribute_types
adminhtml_sales_order_create_process_data
adminhtml_sales_order_creditmemo_register_before
adminhtml_staging_backup_edit_tab_rollback_after_prepare_columns
adminhtml_widget_container_html_before
adminhtml_widget_grid_filter_collection
admin_permissions_role_prepare_save
admin_session_user_login_failed
admin_session_user_login_success
admin_system_config_changed_section_{$section
admin_user_authenticate_after
api_user_authenticated
application_clean_cache
bundle_product_view_config
catalog_block_product_list_collection
catalog_category_change_products
catalog_category_prepare_save
catalog_category_tree_init_inactive_category_ids
catalog_category_tree_move_after
catalog_category_tree_move_before
catalog_controller_category_delete
catalog_controller_category_init_after
catalog_controller_category_init_before
catalog_controller_product_delete
catalog_controller_product_init
catalog_controller_product_init_after
catalog_controller_product_init_before
catalog_controller_product_view
catalog_helper_output_construct
catalogindex_get_minimal_price
catalogindex_plain_reindex_after
catalogindex_prepare_price_select
catalog_model_product_duplicate
catalog_prepare_price_select
catalog_product_collection_apply_limitations_after
catalog_product_collection_before_add_count_to_categories
catalog_product_collection_load_after
catalog_product_collection_load_before
catalog_product_compare_add_product
catalog_product_compare_item_collection_clear
catalog_product_compare_remove_product
catalog_product_edit_action
catalog_product_flat_prepare_columns
catalog_product_flat_prepare_indexes
catalog_product_flat_rebuild
catalog_product_flat_update_product
catalog_product_get_final_price
catalog_product_import_after
catalog_product_is_salable_after
catalog_product_is_salable_before
catalog_product_new_action
catalog_product_prepare_index_select
catalog_product_prepare_save
catalog_product_status_update
catalog_product_to_website_change
catalog_product_upsell
catalog_product_view_config
catalog_product_website_update
catalog_product_website_update_before
catalogrule_after_apply
catalogrule_before_apply
catalogsearch_reset_search_result
category_move
checkout_allow_guest
checkout_cart_add_product_complete
checkout_cart_info_item_unset_product_before
checkout_cart_product_add_after
checkout_cart_save_after
checkout_cart_update_items_after
checkout_cart_update_items_before
checkout_controller_onepage_save_shipping_method
checkout_multishipping_controller_success_action
checkout_onepage_controller_success_action
checkout_quote_destroy
checkout_quote_init
checkout_type_multishipping_set_shipping_items
checkout_type_onepage_save_order
checkout_type_onepage_save_order_after
cms_controller_router_match_before
cms_page_get_available_statuses
cms_page_prepare_save
cms_wysiwyg_config_prepare
core_block_abstract_prepare_layout_after
core_block_abstract_prepare_layout_before
core_block_abstract_to_html_after
core_block_abstract_to_html_before
core_collection_abstract_load_after
core_collection_abstract_load_before
core_layout_update_updates_get_after
core_locale_set_locale
customer_customer_authenticated
customer_login
customer_logout
customer_registration_is_allowed
customer_session_init
eav_attribute_get_backend_type_by_input
eav_attribute_get_default_value_by_input
eav_collection_abstract_load_before
enterprise_catalog_permissions_is_allowed_category
enterprise_giftcardaccount_add
enterprise_giftcardaccount_charge
enterprise_giftcardaccount_create
enterprise_staging_controller_staging_delete
http_response_send_before
log_log_clean_after
log_log_clean_before
log_visitor_collection_load_before
model_delete_after
model_delete_before
model_delete_commit_after
model_load_after
model_save_after
model_save_before
model_save_commit_after
on_enterprise_staging_merge
on_enterprise_staging_save
on_view_report
payment_method_is_active
prepare_catalog_product_index_select
prepare_catalog_product_price_index_table
resource_get_tablename
review_controller_product_init
review_controller_product_init_after
review_controller_product_init_before
review_review_collection_load_before
rss_catalog_category_xml_callback
rss_catalog_new_xml_callback
rss_catalog_special_xml_callback
rss_catalog_tagged_item_xml_callback
rss_order_new_collection_select
rule_environment_collect
sales_convert_order_item_to_quote_item
sales_convert_order_to_quote
sales_convert_quote_address_to_order
sales_convert_quote_address_to_order_address
sales_convert_quote_item_to_order_item
sales_convert_quote_payment_to_order_payment
sales_convert_quote_to_order
sales_order_creditmemo_cancel
sales_order_creditmemo_refund
sales_order_invoice_cancel
sales_order_invoice_pay
sales_order_item_cancel
sales_order_payment_cancel
sales_order_payment_cancel_creditmemo
sales_order_payment_cancel_invoice
sales_order_payment_capture
sales_order_payment_pay
sales_order_payment_place_end
sales_order_payment_place_start
sales_order_payment_refund
sales_order_payment_void
sales_order_place_after
sales_order_place_before
sales_quote_add_item
sales_quote_address_discount_item
sales_quote_item_collection_products_after_load
sales_quote_item_qty_set_after
sales_quote_item_set_product
sales_quote_remove_item
salesrule_rule_condition_combine
salesrule_validator_process
sales_sale_collection_query_before
sendfriend_product
staging_edit_action
staging_website_create_after
store_delete
store_group_save
tag_tag_product_collection_load_after
tax_rate_data_fetch
tax_settings_change_after
websiterestriction_frontend
wishlist_add_product
wishlist_items_renewed
wishlist_share
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/magento-observer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Magento : Lister les valeurs d&#8217;un attribut</title>
		<link>http://www.nanane.fr/2011/01/magento-lister-les-valeurs-dun-attribut/</link>
		<comments>http://www.nanane.fr/2011/01/magento-lister-les-valeurs-dun-attribut/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 12:27:14 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Attributs]]></category>
		<category><![CDATA[eav]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1389</guid>
		<description><![CDATA[Petit tips sous Magento, voici comment lister les valeurs d&#8217;un attribut : public function get_attribute_values($attribute_code){ $attribute = Mage::getModel('eav/config')-&#62;getAttribute('catalog_product', $attribute_code); foreach ( $attribute-&#62;getSource()-&#62;getAllOptions(true, true) as $option){ $attributeArray[] = Array($option['value'],$option['label']); } return $attributeArray; } Cette fonction retourne les valeurs ainsi que le label (Admin label) de l&#8217;attribut dont le code (ex: &#8220;color&#8221;) est passé en paramètre]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-1391" href="http://www.nanane.fr/2011/01/magento-lister-les-valeurs-dun-attribut/magento_1/"><img class="aligncenter size-full wp-image-1391" title="magento_1" src="http://www.nanane.fr/wp-content/uploads/2011/01/magento_1.jpg" alt="" width="570" height="99" /></a></p>
<p>Petit tips sous Magento, voici comment lister les <strong>valeurs </strong>d&#8217;un <strong>attribut </strong>:</p>
<pre class="brush: php; title: ;">
public function get_attribute_values($attribute_code){
    $attribute = Mage::getModel('eav/config')-&gt;getAttribute('catalog_product', $attribute_code);
    foreach ( $attribute-&gt;getSource()-&gt;getAllOptions(true, true) as $option){
		$attributeArray[] = Array($option['value'],$option['label']);
    }
    return $attributeArray;
}
</pre>
<p>Cette fonction retourne les <strong>valeurs </strong>ainsi que le <strong>label </strong>(Admin label) de l&#8217;attribut dont le code (ex: &#8220;color&#8221;) est passé en paramètre.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/magento-lister-les-valeurs-dun-attribut/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Éditeur de Tags pour image avec jQuery</title>
		<link>http://www.nanane.fr/2011/01/editeur-de-tags-pour-image-avec-jquery/</link>
		<comments>http://www.nanane.fr/2011/01/editeur-de-tags-pour-image-avec-jquery/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 09:58:19 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Editeur]]></category>
		<category><![CDATA[Tag]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1372</guid>
		<description><![CDATA[Salut tout le monde ! Alors ici nous allons rapidement voir comment réaliser un éditeur de Tag en javascript. Bon celui que je présente ici est assez simple, il permet simplement de placer des indicateurs révélant une information au survol. Vous trouverez, comme d&#8217;hab&#8217;, une démo et les sources ci-dessous. Pour les explications, merci de ]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://www.nanane.fr/includes_for_examples/demo_tag/model_illustration.jpg" alt="" width="570" height="99" /></p>
<p>Salut tout le monde !<br />
Alors ici nous allons rapidement voir comment réaliser un éditeur de <strong>Tag</strong> en <strong>javascript</strong>. Bon celui que je présente ici est assez simple, il permet simplement de placer des indicateurs révélant une information au survol.<br />
Vous trouverez, comme d&#8217;hab&#8217;, une <strong>démo</strong> et les <strong>sources</strong> ci-dessous. Pour les explications, merci de lire la suite :)</p>
<div class="tuto"><a class="source" href="http://www.nanane.fr/includes_for_examples/demo_tag/tagg_example.rar"></a><a class="demo" href="http://www.nanane.fr/includes_for_examples/demo_tag/index.html" target="_blank"></a></div>
<p><span id="more-1372"></span><br />
Allez c&#8217;est parti !<br />
Bon dans un premier temps, vous constaterez que j&#8217;utilise toujours <code>jQuery</code> au lieu de <code>$</code>, en fait j&#8217;ai pris l&#8217;habitude de systématiquement utiliser le <code>jQuery.noConflict()</code> à force de faire évoluer des applys web ayant tournées sous Scripaculous ou Prototype que je ne peux totalement bannir pour des raisons propres à chacune des apply, (pas envie de me retaper tout le code). Donc pour ceux qui ne le savent pas, <code>jQuery.noConflict()</code> permet une cohabitation parfaite des deux librairies.</p>
<p>Voyons maintenant comment nous allons réaliser notre éditeur de Tag.<br />
Je rappelle ce que nous voulons faire : Créer un module permettant de générer des éléments qui au survol, révéleront une information spécifiée lors de leur sauvegarde.</p>
<h3>Voyons le HTML :</h3>
<pre class="brush: xml; title: ;">
&lt;div id=&quot;main_container&quot;&gt;
	&lt;div style=&quot;display:none;&quot; id=&quot;hidden_cross_url&quot;&gt;tick.png&lt;/div&gt;
	&lt;div id=&quot;tag_new_product&quot;&gt;
		&lt;input type=&quot;text&quot; name=&quot;product_autosuggest&quot; id=&quot;product_autosuggest&quot; /&gt;
		&lt;input type=&quot;hidden&quot; name=&quot;input_tag_x&quot; id=&quot;input_tag_x&quot; /&gt;
		&lt;input type=&quot;hidden&quot; name=&quot;input_tag_y&quot; id=&quot;input_tag_y&quot; /&gt;
		&lt;div id=&quot;hidden_validation_product&quot;&gt;
			&lt;a id=&quot;submit_product_confirm&quot; class=&quot;info_span&quot;&gt;
				&lt;img src=&quot;submit_product.png&quot; alt=&quot;&quot; /&gt;
				&lt;span&gt;Tagger&lt;/span&gt;
			&lt;/a&gt;
			&lt;a id=&quot;submit_product_cancel&quot; class=&quot;info_span&quot;&gt;
				&lt;img src=&quot;cancel_product.png&quot; alt=&quot;&quot; /&gt;
				&lt;span&gt;Annuler&lt;/span&gt;
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/div&gt;
        &lt;div id=&quot;content_tags&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Très simple !<br />
<code>div#content_tags</code> aura pour background notre image et <code>div#tag_new_product</code> sera notre &#8220;Taggeur&#8221;, il se présentera comme un formulaire et stockera les informations suivantes :<br />
- Texte à afficher<br />
- Coordonnées X et Y pour notre Tag<br />
<code>a#submit_product_confirm</code> et <code>a#submit_product_cancel</code> sont ni plus ni moins que des boutons homemade. En fait c&#8217;est une image qui révèle, au survol de souris, le <code><span> </span></code> contenu dans le lien, grâce au petit bout de javascript suivant :</p>
<pre class="brush: jscript; title: ;">
function load_info_bulles(){
	var public_timeout_hide = null;
	var children = null;
	jQuery('a.info_span span').hide();
	jQuery('a.info_span').die('mousenenter');
	jQuery('a.info_span').die('mouseleave');
	jQuery('a.info_span').live('mouseenter',function(){
			children = jQuery(this).children('span');
			children.show();
		});
	jQuery('a.info_span').live('mouseleave',function(){
			children = jQuery(this).children('span');
			children.hide();
		});
	jQuery('.info_span span').corner('2px');
}
</pre>
<p>Maintenant je vais expliquer un peu comment fonctionne le générateur de tag avant de détailler les différentes <strong>fonctions</strong>.</p>
<p>1- On charge les tags déjà présents pour la photo</p>
<p>2- On place un <strong>écouteur</strong> sur l’évènement <strong>Click</strong> qui réagit de la manière suivante :</p>
<p style="padding-left: 30px;">- Il affiche un pointeur à l&#8217;emplacement du <strong>Click</strong></p>
<p style="padding-left: 30px;">- Il affiche le formulaire de spécification du texte et y stocke les coordonnées de notre Tag (Auxquelles nous avons préalablement retiré les coordonnées de notre <code>div#content_tags</code>). Ce formulaire possède également un écouter sur les deux liens &#8220;<strong>Tagger</strong>&#8221; et &#8220;<strong>Annuler</strong>&#8220;.</p>
<p style="padding-left: 60px;">- <strong>Tagger</strong> : &#8220;Valide&#8221; le formulaire, crée un rendu visuel du Tag et le stocke en Base via appel Ajax, puis réinitialise le formulaire.</p>
<p style="padding-left: 60px;">- <strong>Annuler</strong> : &#8220;Annule&#8221; l&#8217;action, supprime le pointeur et réinitialise le formulaire.</p>
<p>Je précise que la partie <strong>php</strong> n&#8217;est pas présente ici, néanmoins j&#8217;ai préparé les appels <strong>Ajax</strong> dans les sources (ils sont en commentaire). Voyons maintenant plus en détail les différentes fonctions.</p>
<p>La première fonction que j&#8217;appelle au chargement de la page est la suivante :</p>
<pre class="brush: jscript; title: ;">
/*Fonction préparant les événements*/
function make_it_ready(){
	load_tags();
	make_tag(jQuery('div#content_tags'));
	bind_taggeur();
	load_info_bulles();
}
</pre>
<p>Cette dernière appelle la fonction chargeant les tags déjà présents, &#8220;Bind&#8221; le conteneur de tag, &#8220;Bind&#8221; le formulaire Taggeur et prépare mes infos bulles.</p>
<h3>Affichage des Tags présents</h3>
<pre class="brush: jscript; title: ;">
function load_tags(){
	tag_saved_exemple1_x = 19;
	tag_saved_exemple1_y = 19;
	tag_saved_exemple1_text = &quot;Mon tag d'exemple&quot;;

	/*J'applique la position en MARGIN-TOP et non en TOP, sinon l'element n'aura pas la même position en fonction de l'emplacement du conteneur*/
	rendu_tag_exemple = '&lt;a style=&quot;position:absolute;margin-top:'+tag_saved_exemple1_x+'px;margin-left:'+tag_saved_exemple1_y+'px;&quot; class=&quot;it_is_tagged&quot;&gt;&lt;img src=&quot;'+jQuery(&quot;div#hidden_cross_url&quot;).html()+'&quot; alt=&quot;&quot; /&gt;&lt;span&gt;'+tag_saved_exemple1_text+'&lt;/span&gt;&lt;/a&gt;'
	jQuery('div#content_tags').append(rendu_tag_exemple);
	jQuery('a.it_is_tagged').hover(function(){
		jQuery(this).find('span').show();
	},function(){
		jQuery(this).find('span').hide();
	});
}
</pre>
<p>Normalement ici vous devez avoir un appel Ajax qui vous renvoie l&#8217;ensemble des tags déjà positionnés, mais pour l&#8217;exemple, j&#8217;ai créé un Tag en dur.<br />
Vous noterez que le Tag est en Absolute et que je le positionne avec Margin-top et Margin-left. Tout simplement parce que si je le positionne avec Top et Left, sa position variera en fonction de la résolution de votre écran.</p>
<h3>Écouteur principal</h3>
<pre class="brush: jscript; title: ;">
function make_tag(content_cible){
	reset_tagger();
	content_cible.click(function(e){
	/* je vérifie que la cible est bien la zone de tag et non un élement superposé (comme mon taggeur)*/
	if(e.target.id == &quot;content_tags&quot;){
	var public_timeout = null;
	//console.log(e);
	if(jQuery('div#tag_new_product').is(':visible')){

	/*si le taggeur est visible, je dois d'abord le valider ou l'annuler pour mettre un autre tag*/
	jQuery('div#tag_new_product').effect('highlight');

	}else{

	var position_y_choisie=e.pageY-content_cible.position().top-18;
	var position_x_choisie=e.pageX-content_cible.position().left-18;
	console.log(position_x_choisie+&quot;;&quot;+position_y_choisie);
	/*Je place ces informations dans mon taggeur*/
	jQuery('input#input_tag_x').val(position_x_choisie);
	jQuery('input#input_tag_y').val(position_y_choisie);
	var cross_tag = &quot;&lt;a id='currently_pointed' style='position:absolute; margin-left:&quot;+position_x_choisie+&quot;px; margin-top:&quot;+position_y_choisie+&quot;px;'&gt;&lt;img src='&quot;+jQuery(&quot;div#hidden_cross_url&quot;).html()+&quot;' alt='Cross' /&gt;&lt;/a&gt;&quot;;
	jQuery('div#content_tags').append(cross_tag);

	/*je place correctement mon taggeur*/
	jQuery(&quot;div#tag_new_product&quot;).css({
		&quot;margin-top&quot; : 27 + parseInt(position_y_choisie) + &quot;px&quot;,
		&quot;margin-left&quot; : 29  + parseInt(position_x_choisie) + &quot;px&quot;
	});

	/*Puis je l'affiche*/
	jQuery('div#tag_new_product').show();

	}
	}
	});
	jQuery('div#content_tags').animate({opacity:0.5},function(){jQuery('div#content_tags').animate({opacity:1});});
}
</pre>
<p>Ici je récupère la position choisie, je la stocke dans le formulaire et le révèle au bon endroit ainsi qu&#8217;un pointeur (mon image Tick.png). Notez que je soustrais au préalable des coordonnées de mon Tag celles de son conteneur. Les chiffres présents sont tout simplement des correctifs pour que ça tombe niquel par rapport à la taille de Tick.png.<br />
Enfin j&#8217;affiche mon <code>div#tag_new_product</code></p>
<h3>Écouteur du formulaire</h3>
<pre class="brush: jscript; title: ;">
/*Fonction créant le Tag configuré*/
function bind_taggeur(){
	jQuery('a#submit_product_confirm').die('click');
	jQuery('a#submit_product_confirm').live('click',function(){
	/*Ci dessous un exemple d'appel ajax pour sauvegarder votre produit en base*/
	/*
	jQuery.ajax({
		type: &quot;POST&quot;,
		url: get_base_url+&quot;fr/slider/index/tagsomething/text/&quot;+jQuery('input#product_autosuggest').val()+&quot;/x/&quot;+jQuery('input#input_tag_x').val()+&quot;/y/&quot;+jQuery('input#input_tag_y').val(),
		success: function(html){
			apply_validation();
			}
		});
	*/

	 apply_validation(jQuery('input#product_autosuggest').val(),jQuery('input#input_tag_x').val(),jQuery('input#input_tag_y').val());
	});
	jQuery('a#submit_product_cancel').die('click');
	jQuery('a#submit_product_cancel').live('click',function(){
		jQuery('div#tag_new_product').hide();
		jQuery('a#currently_pointed').remove();
		reset_tagger();
	});
}
</pre>
<p>Ici j&#8217;ai deux écouteurs, un pour annuler, l&#8217;autre pour confirmer la création du Tag. En cas de création du tag j&#8217;appelle ma fonction <code>apply_validation()</code> où je passe en paramètres les informations suivantes : Valeur de l&#8217;input text, coordonnées X et Y.</p>
<h3>Validation du Tag</h3>
<pre class="brush: jscript; title: ;">
function apply_validation(text,x,y){
	jQuery('div#tag_new_product').hide();
	reset_tagger();

	jQuery('a#currently_pointed').append('&lt;span&gt;'+text+'&lt;/span&gt;');
	jQuery('a#currently_pointed').hover(function(){
		jQuery(this).find('span').show();
	},function(){
		jQuery(this).find('span').hide();
	});
	jQuery('a#currently_pointed').addClass('it_is_tagged');
	jQuery('a#currently_pointed').attr('id','');
	jQuery('div#content_tags').animate({opacity:0.5},function(){jQuery('div#content_tags').animate({opacity:1});});
}
</pre>
<p>Pas besoin de détailler, c&#8217;est très simple.<br />
Normalement cette fonction n&#8217;a pas lieu d&#8217;être, initialement je ré-appelle ma fonction de chargement des tags déjà présents, mais pour l&#8217;exemple je crée un rendu visuel.</p>
<p>Voilà le tutoriel est achevé, j&#8217;espère qu&#8217;il vous plaira.<br />
J&#8217;ai utilisé ce script pour administrer un Slider en Home Page sur un E-Commerce au sein duquel ils voulaient voir figurer sur chacune des images du Slider les prix des différents produits y étant représentés ainsi qu&#8217;au survol un lien vers ce dernier.</p>
<p>Ha oui, j&#8217;ai remarqué que le &#8220;Taggeur&#8221; est buggé sous IE, franchement j&#8217;avais la méga flemme de corriger ce bug.. Mes excuses aux fous utilisateurs d&#8217;internet explorer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/editeur-de-tags-pour-image-avec-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nouvelle robe pour un nouveau départ</title>
		<link>http://www.nanane.fr/2011/01/nouvelle-robe-pour-un-nouveau-depart/</link>
		<comments>http://www.nanane.fr/2011/01/nouvelle-robe-pour-un-nouveau-depart/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 16:52:36 +0000</pubDate>
		<dc:creator>Lesny</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false">http://www.nanane.fr/?p=1351</guid>
		<description><![CDATA[L&#8217;heure est au renouveau ! Je viens juste de terminer l&#8217;intégration du  nouveau design du site (il y a encore surement quelques bugs éparpillés, je les corrigerai au fur et à mesure des différents retours ^^). Le temps a passé depuis la fin de nos études respectives et l&#8217;entrée dans la vie active ne nous ]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.nanane.fr/2011/01/nouvelle-robe-pour-un-nouveau-depart/"><img class="aligncenter size-full wp-image-1352" src="http://www.nanane.fr/wp-content/uploads/2011/01/model_illustration.jpg" alt="" width="570" height="99" /></a></p>
<p style="text-align: justify;">L&#8217;heure est au <strong>renouveau</strong> ! Je viens juste de terminer l&#8217;intégration du  nouveau design du site (il y a encore surement quelques bugs éparpillés, je les corrigerai au fur et à mesure des différents retours ^^).</p>
<p style="text-align: justify;">Le temps a passé depuis la fin de nos études respectives et l&#8217;entrée dans la vie active ne nous permettait plus de trouver un peu de temps pour venir parfaire le contenu de ce blog, ce qui m&#8217;a personnellement toujours un peu attristé.</p>
<p style="text-align: justify;">Désormais je dispose d&#8217;un emploi du temps assez fixe qui me permet de reprendre un peu mon activité de rédacteur novice pour à nouveau vous proposer quelques trucs pas bien glorieux :) (Qui par la même me servent également de notes pour des développements futurs).</p>
<p style="text-align: justify;">Vous avez surement remarqué le<strong> nouveau design</strong> général du site. Bon soyez indulgent, ceci est mon premier design &#8220;recherché&#8221;, je n&#8217;ai pas la prétention d&#8217;être designer, mon boulot à moi c&#8217;est du dev&#8217;. J&#8217;aimerai quand même avoir votre avis à son sujet, ce que vous en pensez. Je l&#8217;ai intitulé &#8220;<strong>Nanane Falling Rabbits</strong>&#8220;, plutôt cool comme nom, non ?</p>
<p style="text-align: justify;">Bon bon, parlons un peu maintenant de ce <strong>contenu</strong> à venir.. Je travaille depuis quelques temps sous <strong>Magento</strong>, un &#8220;CMS&#8221; eCommerce relativement abouti et j&#8217;ai été fort peiné de constater que très peu d&#8217;informations, d&#8217;exemples ou tutoriels circulent sur le Web à ce sujet. J&#8217;ai, au cours du développement des 3 sites sur lesquels je travaille actuellement,  noté les différents points sur lesquels j&#8217;avais péché niveau connaissance et vous proposerai toute une série de rédactions traitants de ces différents points. Ces dernières iront d&#8217;une simple astuce ou découverte personnelle, jusqu&#8217;à des tutoriels élaborés.</p>
<p style="text-align: justify;">En dehors de l&#8217;arrivée de Magento dans mon travail quotidien, j&#8217;utilise toujours autant la librairie javascript <strong>jQuery</strong>, et ai quelques petits trucs à pondre également, notamment un <strong>générateur de tags</strong> pour un slider promotionnel (à voir sous peu).</p>
<p style="text-align: justify;">Bon et bien voilà pour cette entrée en matière, j&#8217;espère que vous serez satisfait du contenu à venir et vous souhaite, par la même occasion, une excellente année 2011 :)</p>
<p style="text-align: justify;">A fort bientôt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nanane.fr/2011/01/nouvelle-robe-pour-un-nouveau-depart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

