<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Redpik</title>
	
	<link>http://www.redpik.net</link>
	<description>le développement web à la cool</description>
	<lastBuildDate>Mon, 17 Jun 2013 07:46:56 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/redpik" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="redpik" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>API day : TYPO3 et les emails</title>
		<link>http://www.redpik.net/typo3/api-day-typo3-et-les-emails/</link>
		<comments>http://www.redpik.net/typo3/api-day-typo3-et-les-emails/#comments</comments>
		<pubDate>Wed, 07 Nov 2012 11:45:33 +0000</pubDate>
		<dc:creator>OlivierSC</dc:creator>
				<category><![CDATA[typo3]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[email]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=771</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/11/mailbox-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="mailbox" /></p>L'API TYPO3 regroupe un nombre impressionnant de fonctionnalités dont certaines ne sont pas très connues.
Après avoir passé en revue <a title="API day : TYPO3 et les variables SESSIONS" href="http://www.redpik.net/typo3/api-day-typo3-et-les-variables-sessions/">les variables sessions</a> puis <a title="API day : TYPO3 et les liens (typolink)" href="http://www.redpik.net/typo3/api-day-typo3-et-les-liens-typolink/">la gestion des liens typolink</a>, voici maintenant comment envoyer des emails dans ses développements avec le CMS TYPO3.

Cette partie de l'API a été publiée avec la sortie de TYPO3 v4.5 et à fait l'objet d'un <a title="New mail API for the core" href="http://buzz.typo3.org/teams/core/article/your-first-blog/">article dédié sur buzz.typo3.org</a>.<span id="more-771"></span>
<h3>A) Utilité de cette fonctionnalité</h3>
Pourquoi utiliser cette fonction? pourquoi ne pas utiliser directement la fonction "<a title="Fonction mail de PHP" href="http://php.net/mail">mail</a>" de PHP? PARCE QUE!!!!!

En premier lieu, cette fonction est beaucoup plus facile à utiliser que la fonction "mail" de PHP. Il est assez complexe de gérer les pièces attachées ainsi que les différentes parties de l'email avec la fonction "mail()" de base et les risques d'avoir un mail illisible ou mal formaté sont importants.

De plus, la configuration de l'API mail de TYPO3 est regroupée dans l'install tool, ce qui veut dire qu'un changement de configuration sur son hébergement ne nécessite pas de retouche du code PHP, mais simplement d'adapter la configuration générale via l'install tool.
<h3>B) Fonctionnement de base</h3>
En se basant sur l'article dédié sur buzz.typo3.org, on peut préparer le code minimum pour l'envoi d'un email.

[php]
&lt;?php
  //on prepare les variables
$emailEmetteur='..@...fr';
$nomEmetteur='...';
$emailDestinataire='..@...com';
$nomDestinataire='...';
$sujet='...';
$contenuHTML='contenu &lt;i&gt;email&lt;/i&gt; au format &lt;b&gt;HTML&lt;b&gt;';

  //on declare l'objet mail
$email= t3lib_div::makeInstance('t3lib_mail_Message');
  //on parametre l'emetteur
$email-&gt;setFrom(array($emailEmetteur =&gt; $nomEmetteur));
  //on parametre le destinataire
$email-&gt;setTo(array($emailDestinataire =&gt; $nomDestinataire));
  //on parametre le sujet de l'email
$email-&gt;setSubject($sujet);
  //on ajoute le contenu sans preciser si c'est du texte ou de l'HTML
$email-&gt;setBody($contenuHTML);
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]

Et HOP, il est parti.  Simple, non?
<h3>C) format de l'email (HTML ou texte brut)</h3>
Si on ne précise pas le format du contenu (HTML ou texte brut), le composant email décide à notre place en fonction de la présence ou l'absence de code HTML. Dans cette situation, l'affichage sur un lecteur compatible uniquement "texte brut" n'est pas garanti si le texte envoyé contient du code HTML.

Pour conserver la compatibilité, nous allons forcer la partie HTML et ajouter la prise en compte de l'alternative textuelle. Pour cela on va modifier la dernière partie du script :

[php]
&lt;?php
  //on ajoute le contenu en precisant la version HTML
$email-&gt;setBody($contenuHTML, 'text/html');
  //on ajoute le contenu pour la version texte
$email-&gt;addPart(strip_tags($contenuHTML), 'text/plain');
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]

L'email est maintenant compatible HTML et Texte brut.
<h3>D) Gestion des destinataires</h3>
Après avoir configuré le contenu, nous allons personnaliser les destinataires.

Il existe plusieurs types de destinataires :
- les destinataires "officiels" (fonctions  setTo et addTo)
- les destinataires en "copie" (fonctions setCc et addCc)
- les destinataires en "copie cachée" (fonctions setBcc et addBcc)

Pour chaque type de destinataires, il existe 2 fonctions permettant d'effectuer le paramétrage pour l'email : une fonction "set..." et "add...".
La fonction "set..." permet de définir complètement le destinataire en supprimant le paramétrage précédent s'il existe.
La fonction "add..." permet d'ajouter un nouveau destinataire sans supprimer les destinataires déjà paramétrés.
Pour la suite, nous n'allons utiliser que les fonctions "set..." pour que cela soit plus simple à comprendre.

On peut préciser des destinataires en copie (visible) :

[php]
&lt;?php
  //on prepare les infos du destinataire en copie
$emailDestinataireCopie='..@...net';
$nomDestinataireCopie='...';
[...]
  //on ajoute le destinataire en copie
$email-&gt;setCc(array($emailDestinataireCopie =&gt; $nomDestinataireCopie));
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]

Ainsi que des destinataires en copie cachée (non visible) :

[php]
&lt;?php
  //on prepare les infos du destinataire en copie
$emailDestinataireCopieCachee='..@...org';
$nomDestinataireCopieCachee='...';
[...]
  //on ajoute le destinataire en copie
$email-&gt;setBcc(array($emailDestinataireCopieCachee =&gt; $nomDestinataireCopieCachee));
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]
<h3>E) Ajout de pièces jointes</h3>
Il peut être utile de joindre une pièce jointe à un email, comme le Powerpoint de ses dernières vacances sur la côte d'azur, ou encore une vidéo avec plein de petits lolcats trop mignons:

[php]
&lt;?php
  //on ajoute la piece jointe
$email-&gt;attach(Swift_Attachment::fromPath('fileadmin/mes_super_vacances_en_maillot_de_bain.ppt'));
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]

Il est aussi possible de donner un nom précis à la pièce jointe. Cela peut être utile lorsque l'on ne désire pas montrer le nom d'origine du fichier.

[php]
&lt;?php
  //on ajoute la piece jointe
$email-&gt;attach(Swift_Attachment::fromPath('fileadmin/chat_de_la_voisine.avi')-&gt;setFilename('chat_trop_mignon.avi'));
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]
<h3>F)  l'inclusion d'image dans le corps de l'email</h3>
Pouvoir envoyer une pièce jointe, c'est bien.... mais ajouter une image directement dans le corps du mail c'est bien aussi.
Cela permet par exemple d'ajouter une image dans une signature en bas d'email, ou un logo en haut d'email.
On ne peut pas utiliser la fonction "attach()" car cela mettrait simplement la photo en pièce jointe, on va donc utiliser la fonction"embed()" qui permet d'inclure un élément dans le corps du message.

Nous allons inclure l'image "fileadmin/images/signature‑anime.gif"

[php]
&lt;?php
  //le contenu de l'email pour inserer une image
$contenuHTML='contenu email au format texte ou &lt;b&gt;HTML&lt;b&gt;.&lt;br/&gt; Signature : &lt;img src=&quot;';
  //on appelle la fonction embed() qui va generer le chemin vers l'image
$contenuHTML.= $email-&gt;embed(Swift_Image::fromPath('fileadmin/images/signature‑anime.gif')) ;
  //on fini le reste de la balise img et du mail
$contenuHTML.='&quot; title=&quot;smiley signature anime&quot; alt=&quot;smiley signature anime&quot;/&gt;';
  //on ajoute le contenu en precisant la version HTML
$email-&gt;setBody($contenuHTML, 'text/html');
  //on ajoute le contenu pour la version texte
$email-&gt;addPart(strip_tags($contenuHTML), 'text/plain');
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]

Nous avons fait manuellement le remplacement, mais cela peut vite devenir fastidieux de faire tous ces remplacements à la main...
Et puis pourquoi se fatiguer à le faire nous même quand le code peut le faire à notre place.

Allons y pour un petit coup d'<a title="Les expressions régulières sur php.net" href="http://fr2.php.net/manual/fr/book.pcre.php">expression régulière</a> :

[php]
&lt;?php
  //le contenu de l'email pour inserer une image
$contenuHTML='contenu email au format texte ou &lt;b&gt;HTML&lt;b&gt; avec une image &lt;img src=&quot;fileadmin/images/gif-anime-chat-3.gif&quot; title=&quot;gif anime chat&quot; alt=&quot;gif anime chat&quot;/&gt;.&lt;br/&gt;';
  // on ajoute une signature avec une image
$contenuHTML.=' Signature : &lt;img src=&quot;fileadmin/images/papillonviolet-2.gif&quot; title=&quot;signature email animé&quot; alt=&quot;signature email animé&quot;/&gt;';
  //on va recherche toutes les balises images
preg_match_all('/&lt;img [^&gt;]*src=[&quot;|']([^&quot;|']+)[^&gt;]*&gt;/i', $contenuHTML, $images);
  //si on a des resultats
if (is_array($images[0])){
    //on supprime les doublons
  $images[0]=array_unique($images[0]);
    //on prepare les tableaux des correspondances
  $remplacement=array();
  $remplacement=array();
    //pour chaque image detectee
  foreach ($images[0] as $key=&gt;$value) {
      //on genere l'url interne a partir de l'image d'origine
    $cid = $email-&gt;embed(Swift_Image::fromPath($images[1][$key]));
      //on remplit les tableaux des correspondances
    $remplacement_from[$cid]=$value;
    $remplacement_to[$cid]=str_replace($images[1][$key], $cid, $value);
  }
    //on effectue le remplacement des images par leur url interne dans le texte de l'email
  $contenuHTML=str_replace($remplacement_from, $remplacement_to, $contenuHTML);
}
  //on ajoute le contenu en precisant la version HTML
$email-&gt;setBody($contenuHTML, 'text/html');
  //on ajoute le contenu pour la version texte
$email-&gt;addPart(strip_tags($contenuHTML), 'text/plain');
  //on envoie l'email
$email-&gt;send();
?&gt;
[/php]

Et voila.... Maintenant il n'y a plus d'excuse pour ne pas envoyer un petit e-mail, depuis son site TYPO3, pour souhaiter un joyeux anniversaire ou une bonne année....
<h3>G) Références</h3>
- <a href="http://buzz.typo3.org/teams/core/article/your-first-blog/">Buzz.typo3.org: New mail API for the core</a>
- <a href="http://swiftmailer.org/docs/messages.html">Documentation SwiftMailer</a>]]></description>
		<wfw:commentRss>http://www.redpik.net/typo3/api-day-typo3-et-les-emails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoFresh: le bookmarklet qui garde les CSS bien frais</title>
		<link>http://www.redpik.net/integration/sofresh-le-bookmarklet-qui-garde-les-fichiers-css-bien-frais/</link>
		<comments>http://www.redpik.net/integration/sofresh-le-bookmarklet-qui-garde-les-fichiers-css-bien-frais/#comments</comments>
		<pubDate>Wed, 26 Sep 2012 11:09:37 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Intégration]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=789</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/09/sofresh-css-bookmarklet-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="sofresh css bookmarklet" /></p>Chers intégrateurs web, si comme moi vous avez la touche F5 facile, si l'envie de rafraîchir votre navigateur vous prend dès que vous venez de rédiger 3 lignes de CSS, alors le bookmarklet SoFresh est fait pour vous.

<span id="more-789"></span>
<h3>Comment ça marche?</h3>
Une fois le bookmarklet chargé sur votre site, un widget magique apparaît. Il va recharger vos fichiers CSS dès leur modification, automatiquement. Ainsi plus besoin d'actualiser votre navigateur ou de vider votre cache: SoFresh s'en charge. Si vous ne voyez pas bien comment utiliser un bookmarklet, <a title="définition de bookmarklet sur Wikipédia" href="http://fr.wikipedia.org/wiki/Bookmarklet">lisez ceci</a>.

Un grand merci à <a title="Jean-Philippe Cabaroc, Graphiste, directeur artistique freelance et prof de webdesign" href="http://www.cabaroc.com">Cabaroc</a> pour le logo, à <a title="Blog de Nicolas Sorosac" href="http://nicolas.sorosac.fr/">Nicolas Sorosac</a> qui a <del>quasiment</del> tout développé, et à <a title="site perso de Sylvain Gougouzian" href="http://sylvain.gougouzian.fr/">Gouz</a> qui s'est occupé du support de <a title="LESS - The dynamic stylesheet language." href="http://lesscss.org/">LESS</a>.

Je vous laisse découvrir SoFresh sur le mini-site dédié: <a title="SoFresh - CSS bookmarklet" href="http://sofresh.redpik.net/">sofresh.redpik.net</a>, si vous avez des <del>critiques</del> remarques n'hésitez pas, ici ou <a href="http://sofresh.redpik.net/#disqus_thread">là</a>. Ha oui, il y a aussi <a title="SoFresh sur Github" href="https://github.com/redpik/Sofresh">Github</a>, en cas de bug(s).]]></description>
		<wfw:commentRss>http://www.redpik.net/integration/sofresh-le-bookmarklet-qui-garde-les-fichiers-css-bien-frais/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[FLUID]ifions nos développements TYPO3</title>
		<link>http://www.redpik.net/typo3/fluidifions-nos-developpements/</link>
		<comments>http://www.redpik.net/typo3/fluidifions-nos-developpements/#comments</comments>
		<pubDate>Wed, 25 Jul 2012 11:38:14 +0000</pubDate>
		<dc:creator>OlivierSC</dc:creator>
				<category><![CDATA[typo3]]></category>
		<category><![CDATA[fluid]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=318</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/07/fluid-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="fluid typo3" /></p>La prochaine version majeure de TYPO3 (qui se fait attendre) sera basée sur un moteur de template appelé <strong>FLUID</strong>.

Beaucoup attendront la sortie de ce nouveau TYPO3 pour s'y mettre, mais comme dirait l'autre l'avenir est déjà parmi nous...

En effet, <a title="Fluid wiki" href="http://wiki.typo3.org/Fluid">FLUID est utilisable depuis la version 4.3 de TYPO3</a>, et depuis la version 4.5 FLUID est utilisable de manière autonome (Standalone View) directement depuis n'importe quel plugin.

<span id="more-318"></span>
<h3>A) Présentation</h3>
Pour ceux qui ne connaissent pas encore FLUID, c'est un moteur de template assez proche de <a title="moteur de template SMARTY" href="http://www.smarty.net/">Smarty</a>.

Cela permet d'inclure des directives directement dans le template HTML, comme par exemple:
- spécifier l'emplacement des variables PHP,
- organiser des boucles dans le template HTML,
- mettre en place des conditions d'affichage de certains éléments,

ainsi que la mise en place de fonctionnalités simples comme par exemple :
- l'alternance des couleurs dans une liste d'éléments,
- l'affichage d'un libellé seulement si le champ associé au libellé n'est pas vide,
- la mise en place d'un lien en fonction des informations de l'enregistrement.

Toutes ces fonctionnalités devaient être prévues dans le code PHP, sans quoi elles ne pouvaient exister.

Ce moteur de template étant lié au noyau TYPO3, il est possible d'accéder aux fonctions internes du CMS comme par exemple :
- les liens typolinks (voir <a title="API day : TYPO3 et les liens (typolink)" href="http://www.redpik.net/typo3/api-day-typo3-et-les-liens-typolink/">article sur le typolink</a>),
- le système de traduction,
- le typoscript,
- le traitement stdWrap (via le typoscript),
- l'élargissement des fonctionnalités de base avec des plugins (ViewHelper).
<h3>B) Mise en situation</h3>
<h4>Présentation d'un cas concret</h4>
Nous allons voir un cas concret d'utilisation avec la méthode "à l'ancienne" (des vieux :) ) puis avec FLUID et enfin faire un tour d'horizon des fonctionnalités de FLUID.

Prenons l'exemple de l'affichage d'une liste de tâches à traiter.
On affichera en premier une liste simple basée sur les éléments d'une table.
On ajoutera ensuite des informations dans la liste.
On ajoutera enfin des informations de contact (téléphone email en fonction de la disponibilité du contact).

Attention, nous ne tiendrons pas compte d'éventuels problèmes de cache, d'encodage, de traduction ou de valeur en dur dans le code, ce n'est qu'un exemple; il faut que cela reste simple à comprendre.
<h3>C) Méthode "à l'ancienne"</h3>
<h4>Étape 1 : Principes et préparation du code PHP</h4>
Pour les "anciens" de TYPO3, le passage par des templates signifiait la création d'un fichier HTML souvent organisé en blocs (subparts) dans lesquels on trouve des marqueurs ou d'autres subparts.
Le but du jeu était de charger le template, de récupérer la subpart correspondant à la fonctionnalité à afficher, et de remplacer les marqueurs par des valeurs utiles (depuis la base de données par exemple).

Concernant le code PHP, il n'y a pas besoin de préparation du code pour pouvoir utiliser la méthode traditionnelle.
La classe du plugin doit simplement hériter de la classe "<strong>tslib_pibase</strong>" qui rend accessible les méthodes de templating.

Pour la simplicité du code, tous les textes ont été laissés en dur... oui c'est mal.
<h4>Étape 2 : affichage minimal</h4>
On va donc essayer d'afficher une liste d'éléments, basée sur des enregistrements dans la base de données.
Cette liste est simplement composée d'un titre.
Le but est d'analyser la composition du template HTML ainsi que le code PHP nécessaire au traitement de cette liste.

<span style="text-decoration: underline;">Template HTML :
</span>

[html]
&lt;!-- ###SUBPART-LISTE### debut --&gt;
  &lt;ul&gt;
    ###LISTE_TACHES###
  &lt;/ul&gt;
&lt;!-- ###SUBPART-LISTE### fin --&gt;

&lt;!-- ###SUBPART-TACHE### debut --&gt;
  &lt;li&gt;###TACHE_TITRE###&lt;/li&gt;
&lt;!-- ###SUBPART-TACHE### fin --&gt;
[/html]

<span style="text-decoration: underline;">Code PHP associé :
</span>

[php]
&lt;?php
//.....
//table à traiter
$table='tx_test_element';

//chargement du template
$this-&gt;template='EXT:'.$this-&gt;extKey.'/pi1/template.html';
$this-&gt;templateCode = $this-&gt;cObj-&gt;fileResource($this-&gt;template);

//on recupere le code HTML d'une seule ligne
$templateLigne = $this-&gt;cObj-&gt;getSubpart($this-&gt;templateCode, &quot;###SUBPART-TACHE###&quot;);

//on lance la requete SQL
$lignes = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows(
  '*',
  $table,
  ' 1 '.$this-&gt;cObj-&gt;enableFields($table)
);

//on prépare la variable de concaténation
$codeLignes='';

//pour chaque enregistrement
foreach($lignes as $uid=&gt;$ligne){

  //on prepare le tableau des marqueurs HTML
  $markerLigne=array();

  //on remplie le tableau de marqueurs
  $markerLigne['###TACHE_TITRE###']=$ligne['titre'];

  //on récupère le code HTML d'une seule ligne
  $codeLignes.=$this-&gt;cObj-&gt;substituteMarkerArray($templateLigne,$markerLigne);

  //on supprime le tableau
  unset($markerLigne);

}

//on récupère le code final
$templateListe = $this-&gt;cObj-&gt;getSubpart($this-&gt;templateCode, &quot;###SUBPART-LISTE###&quot;);

//on remplace la liste
$content=$this-&gt;cObj-&gt;substituteMarkerArray($templateListe,array(
 '###LISTE_TACHES###'=&gt;$codeLignes
));
//.....
?&gt;
[/php]

<span style="text-decoration: underline;">Résultat généré : </span>
<img class="alignnone size-full wp-image-690" src="http://www.redpik.net/wp-content/uploads/2012/07/pibase_etape2.jpg" alt="" width="221" height="74" />
<h4>Étape 3 : ajout d'informations complémentaires</h4>
Imaginons maintenant que l'on souhaite afficher le numéro de chaque tache, le nom du responsable de la tache et mettre en place une alternance de couleur dans la liste.

<span style="text-decoration: underline;">Template HTML :
</span>

[html]
&lt;!-- ###SUBPART-LISTE### debut --&gt;
  &lt;ul&gt;
    ###LISTE_TACHES###
  &lt;/ul&gt;
&lt;!-- ###SUBPART-LISTE### fin --&gt;

&lt;!-- ###SUBPART-TACHE### debut --&gt;
  &lt;li class=&quot;classe###CLASSE###&quot;&gt;###COMPTEUR### - ###TACHE_TITRE### ( ###TACHE_RESPONSABLE### )&lt;/li&gt;
&lt;!-- ###SUBPART-TACHE### fin --&gt;
[/html]

<span style="text-decoration: underline;">Code PHP associé :
</span>

[php]
&lt;?php
//.....
//table a traiter
$table='tx_test_element';

//chargement du template
$this-&gt;template='EXT:'.$this-&gt;extKey.'/pi1/template.html';
$this-&gt;templateCode = $this-&gt;cObj-&gt;fileResource($this-&gt;template);

//on récupère le code HTML d'une seule ligne
$templateLigne = $this-&gt;cObj-&gt;getSubpart($this-&gt;templateCode, &quot;###SUBPART-TACHE###&quot;);

//on lance la requête SQL
$lignes = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows(
  '*',
  $table,
  ' 1 '.$this-&gt;cObj-&gt;enableFields($table)
);

//on prépare la variable de concaténation
$codeLignes='';

//on prépare le compteur de ligne
$compteur=1;

//pour chaque enregistrement
foreach($lignes as $uid=&gt;$ligne){

  //on prépare le tableau des marqueurs HTML
  $markerLigne=array();

  //on remplie le tableau de marqueurs
  $markerLigne['###TACHE_TITRE###']=$ligne['titre'];
  $markerLigne['###TACHE_RESPONSABLE###']=$ligne['responsable'];
  $markerLigne['###COMPTEUR###']=$compteur;
  $markerLigne['###CLASSE###']=$compteur%2;

  //on récupère le code HTML d'une seule ligne
  $codeLignes.=$this-&gt;cObj-&gt;substituteMarkerArray($templateLigne,$markerLigne);

  //on supprime le tableau
  unset($markerLigne);

  //on incrémente le compteur
  $compteur++;
}

//on récupère le code final
$templateListe = $this-&gt;cObj-&gt;getSubpart($this-&gt;templateCode, &quot;###SUBPART-LISTE###&quot;);

//on remplace la liste
$content=$this-&gt;cObj-&gt;substituteMarkerArray($templateListe,array(
  '###LISTE_TACHES###'=&gt;$codeLignes
));
//.....
?&gt;
[/php]

<span style="text-decoration: underline;">Résultat généré : </span>
<img class="alignnone size-full wp-image-691" src="http://www.redpik.net/wp-content/uploads/2012/07/pibase_etape3.jpg" alt="" width="306" height="72" />
<h4>Étape 4 : Ajout d'un lien de contact</h4>
Imaginons maintenant que l'on souhaite afficher une phrase d'introduction, et que le besoin apparaisse d'avoir, en fonction de la disponibilité du responsable, l'affichage de son numéro de téléphone du responsable, ou uniquement un lien vers son email.

<span style="text-decoration: underline;">Template HTML :
</span>

[html]
&lt;!-- ###SUBPART-LISTE### debut --&gt;
  &lt;p&gt;###INTRO###&lt;/p&gt;
  &lt;ul&gt;
    ###LISTE_TACHES###
  &lt;/ul&gt;
&lt;!-- ###SUBPART-LISTE### fin --&gt;

&lt;!-- ###SUBPART-TACHE### debut --&gt;
  &lt;li class=&quot;classe###CLASSE###&quot;&gt;###COMPTEUR### - ###TACHE_TITRE### ( ###TACHE_RESPONSABLE### : ###CONTACT### )&lt;/li&gt;
&lt;!-- ###SUBPART-TACHE### fin --&gt;
[/html]

<span style="text-decoration: underline;">Code PHP associé :
</span>

[php]
&lt;?php
//.....
//table a traiter
$table='tx_test_element';

//chargement du template
$this-&gt;template='EXT:'.$this-&gt;extKey.'/pi1/template.html';
$this-&gt;templateCode = $this-&gt;cObj-&gt;fileResource($this-&gt;template);

//on récupère le code HTML d'une seule ligne
$templateLigne = $this-&gt;cObj-&gt;getSubpart($this-&gt;templateCode, &quot;###SUBPART-TACHE###&quot;);

//on lance la requete SQL
$lignes = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows(
  '*',
  $table,
  ' 1 '.$this-&gt;cObj-&gt;enableFields($table)
);

//on prépare la variable de concaténation
$codeLignes='';

//phrase d'intro
$intro='Liste de taches sur le projet. &lt;br/&gt;Il y a '.count($lignes).' résultat';

//on gere le cas du S en cas de plusieurs resultats
if (count($lignes)&gt;1){
  $intro.='s';
}
$intro.=' à traiter.';

//on prépare le compteur de ligne
$compteur=1;

//pour chaque enregistrement
foreach($lignes as $uid=&gt;$ligne){

  //on prépare le tableau des marqueurs HTML
  $markerLigne=array();

  //on remplie le tableau de marqueurs
  $markerLigne['###TACHE_TITRE###']=$ligne['titre'];
  $markerLigne['###TACHE_RESPONSABLE###']=$ligne['responsable'];
  $markerLigne['###COMPTEUR###']=$compteur;
  $markerLigne['###CLASSE###']=$compteur%2;

  //si l'utilisateur est disponible
  if ($ligne['disponible']==='OUI'){

    //on utilise le téléphone
    $lienContact=$ligne['telephone'];
  }else{

    //sinon on génère un lien vers l'email
    $lienContact = $GLOBALS['TSFE']-&gt;cObj-&gt;typoLink(
      'Il est à la pêche, spammez son email',
      array('parameter'=&gt;$ligne['email'])
    );
  }
  $markerLigne['###CONTACT###']=$lienContact;

  //on récupère le code HTML d'une seule ligne
  $codeLignes.=$this-&gt;cObj-&gt;substituteMarkerArray($templateLigne,$markerLigne);

  //on supprime le tableau
  unset($markerLigne);

  // on incrémente le compteur
  $compteur++;
}

//on récupère le code final
$templateListe = $this-&gt;cObj-&gt;getSubpart($this-&gt;templateCode, &quot;###SUBPART-LISTE###&quot;);

//on remplace la liste
$content=$this-&gt;cObj-&gt;substituteMarkerArray($templateListe,array(
  '###LISTE_TACHES###'=&gt;$codeLignes,
  '###INTRO###'=&gt;$intro
));
//.....
?&gt;
[/php]

<span style="text-decoration: underline;">Résultat généré : </span>
<img class="alignnone size-full wp-image-692" src="http://www.redpik.net/wp-content/uploads/2012/07/pibase_etape4.jpg" alt="" width="549" height="125" />
<h4>Étape 5 : Conclusion pibase:</h4>
Nous voyons que chaque ajout de fonctionnalité nécessite une modification du code PHP.
Une fonctionnalité comme l'affichage conditionnel d'une variable ou rajouter un "S" dans une phrase présentant un nombre de résultats nécessite une modification dans le code PHP, tout comme la mise en place d'une alternance de couleur ou de classe CSS, etc...
Dans un plugin complexe cela peut devenir un casse-tête de ne rien "casser" lorsqu'on ajoute une fonctionnalité.

Un plugin comme le <strong>TT_news</strong>, par exemple, comporte un nombre impressionnant de lignes et prend en compte beaucoup de fonctionnalités, des plus complexes (ex les différents modes de fonctionnement) au plus légères ( formatage des dates). Mais l'ajout de fonctionnalité dans ce code semble complexe si on n'a pas passé des jours à lire le code pour tout comprendre.

Regardons maintenant la même problématique, mais cette fois en utilisant le moteur de template FLUID.
<h3>D) Méthode "Avec FLUID"</h3>
<h4>Étape 1: Principes et préparation du code PHP</h4>
Nous avons vu, dans la première partie, comment utiliser les templates via les fonctions de templating "<em>$this-&gt;cObj-&gt;getSubpart(....)</em>" et "<em>$this-&gt;cObj-&gt;substituteMarkerArray(....)</em>".

Nous allons maintenant repartir de zéro, et utilise les templates FLUID.

Pour pouvoir utiliser les fonctionnalités offertes par FLUID il est nécessaire de (au choix) :
- dépendre des classes extbase et FLUID
- instancier le système FLUID de manière autonome.

On va se baser sur la 2nd possibilité.
tutoriel : <a title="utiliser FLUID sans extbase" href="http://developpeurtypo3.wordpress.com/2011/03/03/fluid-sans-extbase/">utilisation de FLUID sans extbase</a>

<span style="text-decoration: underline;">Le code PHP de base :</span>

[php]
// on fait appelle au fonctionnement en standalone
$view = t3lib_div::makeInstance('Tx_Fluid_View_StandaloneView');

// Emplacement du template
$this-&gt;template = $template = t3lib_extMgm::extPath(strtolower($this-&gt;extKey)) . 'Resources/Private/Layouts/template.html';

//on specifie l'emplacement du template
$view-&gt;setTemplatePathAndFilename($this-&gt;template);

//on assigne une variable
$view-&gt;assign('variable', $variable);

//on genere le rendu HTML
return $view-&gt;render();
[/php]
<h4>Etape 2 : affichage minimal</h4>
On va donc essayer à nouveau d'afficher une liste d'éléments, basée sur des enregistrements dans la base de données.
Cette liste est toujours composée, pour commencer, d'un titre.

<span style="text-decoration: underline;">Template HTML :
</span>

[html]
&lt;ul&gt;
  &lt;f:for each=&quot;{taches}&quot; as=&quot;tache&quot; key=&quot;number&quot;&gt;
    &lt;li &gt;{tache.titre}&lt;/li&gt;
  &lt;/f:for&gt;
&lt;/ul&gt;
[/html]

<span style="text-decoration: underline;">Code PHP associé :
</span>

[php]
&lt;?php
//.....
//table a traiter
$table='tx_test_element';
//on cree l'objet fluid
$view = t3lib_div::makeInstance('Tx_Fluid_View_StandaloneView'); // instanciate standalone view

// Emplacement du template
$this-&gt;template = $template = t3lib_extMgm::extPath(strtolower($this-&gt;extKey)) . 'Resources/Private/Layouts/template.html';

//on specifie l'emplacement du template
$view-&gt;setTemplatePathAndFilename($this-&gt;template);

//on lance la requete SQL
$lignes = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows('*', $table, ' 1 '.$this-&gt;cObj-&gt;enableFields($table) );

//on assigne les donnees dans l'objet tache
$view-&gt;assign('taches', $lignes);

//on genere le rendu HTML
return $view-&gt;render();

?&gt;
[/php]

<span style="text-decoration: underline;">Résultat généré : </span>
<img class="alignnone size-full wp-image-694" src="http://www.redpik.net/wp-content/uploads/2012/07/fluid_etape2.jpg" alt="" width="221" height="74" />
<h4>Etape 3 : ajout d'informations complémentaires</h4>
On va afficher le numéro de chaque tâche, le nom du responsable de la tâche et mettre en place une alternance de couleur dans la liste.

<span style="text-decoration: underline;">Template HTML :
</span>

[html]
&lt;ul&gt;
  &lt;f:for each=&quot;{taches}&quot; as=&quot;tache&quot; key=&quot;tachekey&quot; iteration=&quot;tacheiteration&quot;&gt;
    &lt;li class=&quot;classe&lt;f:cycle values=&quot;{0: '1', 1: '0'}&quot; as=&quot;cycle&quot;&gt;{cycle}&lt;/f:cycle&gt;&quot;&gt;{tacheiteration.cycle} - {tache.titre} ( {tache.responsable} )&lt;/li&gt;
  &lt;/f:for&gt;
&lt;/ul&gt;
[/html]

<span style="text-decoration: underline;">Code PHP associé :
</span>

[php]
&lt;?php
//.....
//table a traiter
$table='tx_test_element';
//on cree l'objet fluid
$view = t3lib_div::makeInstance('Tx_Fluid_View_StandaloneView'); // instanciate standalone view

// Emplacement du template
$this-&gt;template = $template = t3lib_extMgm::extPath(strtolower($this-&gt;extKey)) . 'Resources/Private/Layouts/template.html';

//on specifie l'emplacement du template
$view-&gt;setTemplatePathAndFilename($this-&gt;template);

//on lance la requête SQL
$lignes = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows('*', $table, ' 1 '.$this-&gt;cObj-&gt;enableFields($table) );

//on assigne les données dans l'objet tache
$view-&gt;assign('taches', $lignes);

//on génère le rendu HTML
return $view-&gt;render();

?&gt;
[/php]

<span style="text-decoration: underline;">Résultat généré : </span>
<img class="alignnone size-full wp-image-695" src="http://www.redpik.net/wp-content/uploads/2012/07/fluid_etape3.jpg" alt="" width="306" height="72" />

On peut remarquer qu'il n'y a aucun changement du code PHP.
Les seuls changements sont dans le template HTML avec l'ajout de marqueurs.
<h4>Etape 4 : Ajout d'un lien de contact</h4>
On ajoute une phrase d'introduction avec le nombre de résultats ainsi que l'affichage, en fonction de la disponibilité, du numéro de téléphone du responsable ou uniquement un lien vers son email.

<span style="text-decoration: underline;">Template HTML :
</span>

[html]
&lt;p&gt;Liste de taches sur le projet. &lt;br/&gt;Il y a &lt;f:count subject=&quot;{taches}&quot; /&gt; résultat&lt;f:if condition=&quot;&lt;f:count subject='{taches}' /&gt; &gt; 1&quot;&gt;&lt;f:then&gt;s&lt;/f:then&gt;&lt;/f:if&gt;  à traiter.&lt;/p&gt;
&lt;ul&gt;
  &lt;f:for each=&quot;{taches}&quot; as=&quot;tache&quot; key=&quot;tachekey&quot; iteration=&quot;tacheiteration&quot;&gt;
    &lt;li class=&quot;classe&lt;f:cycle values=&quot;{0: '1', 1: '0'}&quot; as=&quot;cycle&quot;&gt;{cycle}&lt;/f:cycle&gt;&quot;&gt;
      {tacheiteration.cycle} - {tache.titre} ( {tache.responsable} :
      &lt;f:if condition=&quot;{0:tache.disponible} == {0:'OUI'}&quot;&gt;
        &lt;f:then&gt;{tache.telephone}&lt;/f:then&gt;
        &lt;f:else&gt;&lt;f:link.email email=&quot;{tache.email}&quot;&gt;Il est à la pêche, spammez son email&lt;/f:link.email&gt;&lt;/f:else&gt;
      &lt;/f:if&gt;
      )
    &lt;/li&gt;
  &lt;/f:for&gt;
&lt;/ul&gt;
[/html]

<span style="text-decoration: underline;">Code PHP associé :
</span>

[php]
&lt;?php
//.....
//table à traiter
$table='tx_test_element';
//on crée l'objet fluid
$view = t3lib_div::makeInstance('Tx_Fluid_View_StandaloneView'); // instanciate standalone view

// Emplacement du template
$this-&gt;template = $template = t3lib_extMgm::extPath(strtolower($this-&gt;extKey)) . 'Resources/Private/Layouts/template.html';

//on spécifie l'emplacement du template
$view-&gt;setTemplatePathAndFilename($this-&gt;template);

//on lance la requete SQL
$lignes = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows('*', $table, ' 1 '.$this-&gt;cObj-&gt;enableFields($table) );

//on assigne les données dans l'objet tâche
$view-&gt;assign('taches', $lignes);

//on genere le rendu HTML
return $view-&gt;render();

?&gt;
[/php]

<span style="text-decoration: underline;">Résultat généré : </span>
<img class="alignnone size-full wp-image-693" src="http://www.redpik.net/wp-content/uploads/2012/07/fluid_etape4.jpg" alt="" width="549" height="125" />
<h4>Etape 5 : Conclusion FLUID:</h4>
Nous voyons qu'aucun ajout de fonctionnalité ne nécessite une modification du code PHP, tout se passe au niveau du template HTML.

Le but n'est pas de mettre un maximum de code dans le template, mais simplement de placer ce qui relève de l'affichage au niveau du template HTML comme par exemple :
- l'ajout conditionnel d'un "S" à la fin d'un mot
- l'affichage conditionnel d'une variable
- l'alternance de classes CSS ou de valeurs dans une liste
- la mise en place de liens ou de transformations d'affichage (mise en forme HTML, formatage des dates, formatage des numériques, etc).

cela permet de garder le code PHP aussi simple que possible, tout en gardant un résultat complexe.
<h3>E) Évolution "Avec FLUID"</h3>
Nous avons vu qu'avec FLUID il est possible d'avoir un résultat identique à la méthode Pibase avec un code PHP beaucoup plus simple.

Cela impose, à nouveau, une petite remise en cause personnelle pour apprendre les éléments de base de FLUID, mais le jeu en vaut la chandelle comme on dit.
Avoir des codes PHP simples permet une meilleure gestion des développements, et donc de réduire les bugs de fonctionnement.
Les modifications de présentation effectuées suite à une demande client pour adapter l'affichage sont ainsi réduites à de l'édition de template.

Les fonctionnalités de base du moteur de template FLUID permettent de gérer directement dans le template HTML des fonctionnalités intéressantes comme:
<ul>
	<li>Formatage des dates : f:format.date</li>
	<li>Formatage des montants : f:format.currency</li>
	<li>Formatage des liens interne : f:link.page</li>
	<li>Transformation HTML : f:format.html</li>
	<li>Gestion des traductions : f:translate</li>
</ul>
Ensuite, il est aussi possible d'étendre les fonctionnalités de base en créant ses propres fonctions (appelées "ViewHelper") ou d'en récupérer via des extensions sur le <a title="répertoire d'extensions de TYPO3" href="http://typo3.org/extensions/repository/?id=23&amp;L=0&amp;q=ViewHelper">TER de TYPO3</a>.

Enfin, si une extension permet de spécifier l'emplacement du template HTML à utiliser (via typoscript ou flexform par exemple), il est alors possible de rajouter des fonctionnalités complexes dans le rendu final, tout en limitant le risque de casser quelque chose lors de la mise à jour de l'extension d'origine.

Plus besoin de hook, de typoscript complexe ou pire... de <strong>XCLASS</strong>.

Imaginez prendre un plugin d'actualité, y rajouter des éléments propres à votre site comme par exemple la réservation à un évènement en fonction de critères dans la base, tout en conservant le fonctionnement général du plugin d'actualité.... et sans trop de crainte lors de la prochaine mise à jour... au pire cela se limitera à une nouvelle petite modification dans le template FLUID, le top non?]]></description>
		<wfw:commentRss>http://www.redpik.net/typo3/fluidifions-nos-developpements/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>API day : TYPO3 et les liens (typolink)</title>
		<link>http://www.redpik.net/typo3/api-day-typo3-et-les-liens-typolink/</link>
		<comments>http://www.redpik.net/typo3/api-day-typo3-et-les-liens-typolink/#comments</comments>
		<pubDate>Wed, 20 Jun 2012 06:46:54 +0000</pubDate>
		<dc:creator>OlivierSC</dc:creator>
				<category><![CDATA[typo3]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[lien]]></category>
		<category><![CDATA[pivars]]></category>
		<category><![CDATA[typolink]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=611</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/06/links-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="links" /></p><a title="Api TYPO3" href="http://typo3.org/documentation/api/">L’API TYPO3</a> regroupe un nombre impressionnant de fonctionnalités dont certaines ne sont pas très connues.
Voici, par exemple, la gestion des liens dans les plugins Frontend avec le CMS TYPO3.

Les liens sont des éléments importants dans la navigation sur un site internet et dans TYPO3 les liens peuvent avoir plusieurs formes.

<span id="more-611"></span>
<h3>A) Principe des urls dans TYPO3</h3>
Par exemple, pour une url vers la page "29 " (titre "ma page"), au format pdf (type=123), avec une variable dont la valeur est 12 :
<ul>
	<li>Sans réécriture : <em>/index.php?id=29&amp;type=123&amp;tx_monext_pi1[variable]=12</em></li>
	<li>Réécriture du nom de la page : <em>/mapage.html?type=123&amp;tx_monext_pi1[variable]=12</em></li>
	<li>Réécriture de la page et de la variable : <em>/mapage/12.html?type=123</em></li>
	<li>Réécriture de la page, de la variable et du type : <em>/mapage/12.pdf : réécriture complète</em></li>
</ul>
Dans le cadre d'un développement de plugin, et pour ne pas avoir à réinventer la roue, l'API TYPO3 fournie plusieurs fonctions permettant de mettre en forme les liens.

De manière générique (via l'objet cObj) :
<ul>
	<li>$this-&gt;cObj-&gt;currentPageUrl()</li>
	<li>$this-&gt;cObj-&gt;typoLink_URL()</li>
	<li>$this-&gt;cObj-&gt;getTypoLink_URL()</li>
</ul>
Dans le cas d'un plugin qui hérite de pibase :
<ul>
	<li>$this-&gt;pi_getPageLink()</li>
	<li>$this-&gt;pi_linkTP_keepPIvars_url()</li>
</ul>
Pour les développements qui utilisent correctement ces fonctions, la mise en place (ou la désactivation) d'un système de réécriture d'url ne posera aucun problème car l'url aura le même formatage que partout ailleurs dans le site.

Ensuite le lien généré respecte les droits d'accès aux pages, ce qui fait que si une page est cachée, supprimée, ou que l'internaute n'a pas les droits nécessaires pour consulter la page, alors le lien sera désactivé.

Enfin, si la page est renommée ou déplacée dans l'arborescence, le lien réécrit sera automatiquement mis à jour, il ne sera pas nécessaire de modifier quoi que ce soit.
<h3>B) De manière générique (via la classe "tslib_cObj" )</h3>
<h4>1) Fonction currentPageUrl()</h4>
Elle permet de faire rapidement un lien vers la page actuelle ou une page précise dans TYPO3 en lui passant si besoin des paramètres à rajouter dans l'url.

Elle accepte 2 paramètres :
- un tableau de paramétres à ajouter dans l'url
- une page de destination à utiliser en remplacement de l'ID de la page actuelle

[php]
  //id page destination
$idPage=18;
  //tableaux des parametres a inserer dans le lien
$urlParameters=array(
  'etape'=&gt;'details',
  'idDetail'=&gt;12
);
  //generation de l'url
$url = $this-&gt;cObj-&gt;currentPageUrl($urlParameters, $idPage);
[/php]

L'url simple sera : <em>/index.php?id=18&amp;etape=details&amp;idDetail=12</em>
<h4>2) fonction typoLink_URL()</h4>
c'est un peu la même fonction que <strong>currentPageUrl</strong>() sauf que les paramètres doivent être passé sous forme de tableau.

Dans le tableau, la case "parameter" est la page de destination et la case "addionalParams" est une chaîne de caractères qui sera ajoutée dans l'url.

[php]
  //id page destination
$idPage=18;
  //tableaux des parametres a inserer dans le lien
$confLink=array(
  'parameter' =&gt; $idPage,
  'additionalParams' =&gt; '&amp;etape=details&amp;idDetail=12'
);
  //generation de l'url
$url = $this-&gt;cObj-&gt;typoLink_URL($confLink);
[/php]

L'url simple sera : <em>/index.php?id=18&amp;etape=details&amp;idDetail=12</em>
<h4>3) fonction getTypoLink_URL()</h4>
c'est un peu la même fonction que <strong>currentPageUrl</strong>() sauf que la page de destination est obligatoire et que l'ordre des paramètres est inversé.

Elle accepte 3 paramètres :
- la page de destination du lien
- un tableau de paramètres à ajouter dans l'url
- la target (mais pas utilisée puisqu'on ne génère que l'url, donc on ne l'utilise pas)

[php]
  //id page destination
$idPage=18;
  //tableaux des parametres a inserer dans le lien
$urlParameters=array(
  'etape'=&gt;'details',
  'idDetail'=&gt;12
);
  //generation de l'url
$url = $this-&gt;cObj-&gt;getTypoLink_URL($idPage, $urlParameters);
[/php]

L'url simple sera : <em>/index.php?id=18&amp;etape=details&amp;idDetail=12</em>
<h3>C) Les plugins héritant de la classe "tslib_pibase"</h3>
<h4>1) fonction  $this-&gt;pi_getPageLink()</h4>
c'est un raccourci vers la fonction <strong>$this-&gt;cObj-&gt;getTypoLink_URL()</strong>, seul l'ordre des paramètres change.

Elle accepte 3 paramètres :
- la page de destination du lien
- la target (mais pas utilisée puisqu’on ne génère que l’url, donc on laissera vide)
- un tableau de paramètres à ajouter dans l’url

[php]
  //id page destination
$idPage=18;
  //tableaux des paramatres a inserer dans le lien
$urlParameters=array(
  'etape'=&gt;'details',
  'idDetail'=&gt;12
);
  //generation de l'url
$url = $this-&gt;pi_getPageLink ($idPage, '', $urlParameters);
[/php]

L'url simple sera :<em> /index.php?id=18&amp;etape=details&amp;idDetail=12</em>
<h4>2) function pi_linkTP_keepPIvars_url()</h4>
Cette fonction permet de faire un lien mais avec une reprise automatique des <strong>pivars</strong> existants.

Les "<strong>pivars</strong>" sont les variables spécifiques à un plugin qui, dans leur forme brute dans une url, peuvent être identifiées car ils sont de la forme : &amp;tx_+nomplugin+[+nom_variable+].

Dans les plugins, ils ont accessibles simplement et automatiquement via la variable "$this-&gt;piVars[+nom_variable+]".

Cette fonction accepte 4 paramètres :
- un tableau permettant de remplacer les pivars actuels
- un booléen permettant de préciser le mode de mise en cache (avec ou sans cache)
- un booléen permettant de forcer la suppression des pivars actuels
- la page de destination du lien

[php]
  //id page destination
$idPage=18;
  //tableau des variables de remplacement des pivars actuel
$piVars=array(
 'etape'=&gt;'details',
 'idDetail'=&gt;12
);
  //generation de l'url
$url = $this-&gt;pi_linkTP_keepPIvars_url($piVars,1,0,$idPage);
[/php]

Si l'url actuelle est :
<em>/index.php?id=18&amp;tx_monext[etape]=liste&amp;tx_monext[message]=OK</em>
Alors l'url simple sera :
<em>/index.php?id=18&amp;tx_monext[etape]=details&amp;tx_monext[idDetail]=12&amp;tx_monext[message]=OK</em>
Avec :
- le pivars "etape" qui passe de "liste" à "details" (remplacement du pivars),
- ajout du pivars "idDetail"
- et conservation (automatique) du pivar "message".
<h3>D) Encore... Encore...</h3>
Il existe d'autres possibilités pour faire des liens depuis un plugin, comme par exemple l'utilisation de <a title="moteur de template FLUID" href="http://wiki.typo3.org/Fluid">FLUID</a>.

Ce moteur de template (qui ressemble à <a title="moteur de template Smarty - documentation FR" href="http://www.smarty.net/docsv2/fr/">SMARTY</a>), étroitement lié au <strong>typoscript</strong> et aux fonctionnalités du noyau de TYPO3, permet de faire des liens via des marqueurs spécifiques dans un template HTML.

Un article a été rédigé pour présenter <a title="[FLUID]ifions nos développements TYPO3" href="http://www.redpik.net/typo3/fluidifions-nos-developpements/">l'utilisation de FLUID dans les développements PHP</a>.
<h3>F) Conclusion</h3>
Il est important de toujours utiliser les fonctionnalités de l'API dans le but d'avoir un fonctionnement stable sur le long terme, mais surtout la garantie que les urls mises en place reflètent le fonctionnement du site dans son ensemble.

En utilisant ces fonctions il est possible de mettre en place des urls propres, utilisable par exemple :
<ul>
	<li>pour fournir un lien pour passer d'un écran à un autre</li>
	<li>pour rediriger l'internaute sur une page précise après la création d'un enregistrement en base de données</li>
	<li>pour gérer les différents liens d'une navigation multi-page sans avoir à surveiller l'ensemble des paramètres de l'url</li>
	<li>etc….</li>
</ul>]]></description>
		<wfw:commentRss>http://www.redpik.net/typo3/api-day-typo3-et-les-liens-typolink/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Placeholder : Tout savoir sur cet Attribut HTML5</title>
		<link>http://www.redpik.net/integration/placeholder-tout-savoir-sur-cet-attribut-html5/</link>
		<comments>http://www.redpik.net/integration/placeholder-tout-savoir-sur-cet-attribut-html5/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 12:24:09 +0000</pubDate>
		<dc:creator>MrManchot</dc:creator>
				<category><![CDATA[Intégration]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=489</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/04/HML5-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="HML5" /></p>Le Placeholder est un nouvel <strong>attribut HTML5</strong> qui a pour but de décrire brièvement un champs. La valeur du Placeholder s'affiche à l'intérieur du champs lorsque celui-ci est vide.

Voici ce que ça donne sur les principaux navigateurs :

<img class="alignnone size-full wp-image-569" title="placeholder" src="http://www.redpik.net/wp-content/uploads/2012/04/placeholder.png" alt="" width="459" height="64" />

Pour l'utiliser il suffit d’insérer l'attribut <em>placeholder</em> dans une balise <em>input</em> ou <em>textarea</em>. Cela fonctionne pour les champs de type <em>text</em>, <em>password</em>, mais aussi les nouveaux types d'input HTML 5 à savoir : <em>search</em>, <em>url</em>, <em>tel</em>, <em>email</em>.<span id="more-489"></span>

Voici un exemple simple d'intégration:

[html]
&lt;input type=&quot;text&quot; placeholder=&quot;rechercher...&quot; /&gt;
[/html]
<h3>Compatibilité navigateur</h3>
Comme d'habitude le Placeholder est supporté par tous les navigateurs récents... à l'exception d'Internet Explorer. Pour être plus précis voici les versions minimales de support :
<ul>
	<li>Firefox 4.0+</li>
	<li>Opera 11.01+</li>
	<li>Chrome 3.0+</li>
	<li>Safari 3.0+</li>
	<li>Internet Explorer 10+</li>
</ul>
<h3>Rendre son Placeholder compatible via jQuery</h3>
En attendant Internet Explorer 10, il est donc nécessaire d'utiliser jQuery, si l'utilisation du placeholder est importante.

La meilleure solution que j'ai pu trouver est celle de <a title="HTML5 Placeholder Input Fields Fixed with jQuery - hagenburger.net" href="http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html">Nico Hagenburger</a> qui a pour avantage d'ajouter une classe <em>.placeholder</em> sur le champs mais aussi de vider ce champs avant la soumission du formulaire. Voici le code en question:

[js]
$('[placeholder]').focus(function() {
   var input = $(this);
   if (input.val() == input.attr('placeholder')) {
      input.val('');
      input.removeClass('placeholder');
   }
}).blur(function() {
   var input = $(this);
   if (input.val() == '' || input.val() == input.attr('placeholder')) {
      input.addClass('placeholder');
      input.val(input.attr('placeholder'));
   }
}).blur().parents('form').submit(function() {
   $(this).find('[placeholder]').each(function() {
      var input = $(this);
      if (input.val() == input.attr('placeholder')) {
         input.val('');
      }
   })
});

[/js]
<h3>Style CSS du Placeholder</h3>
L’attribut Placeholder peut être stylé en CSS un peu à la manière de l'attribut<em> :hover</em>

[css]
input::-webkit-input-placeholder { color: #999; }
input:-moz-placeholder { color: #999; }
/* A tester pour IE10, mais logiquement: */
input:-ms-placeholder { color: #999; }
[/css]

Il est aussi possible de styler un élément précis, comme d'habitude en CSS :

[css]
#my_field::-moz-placeholder { color:#999; }
[/css]

Si vous utilisez la méthode jQuery fournie précédemment, l’élément peut alors être stylé simplement comme ceci :

[css]
#my_field.placeholder { color:#999; }
[/css]]]></description>
		<wfw:commentRss>http://www.redpik.net/integration/placeholder-tout-savoir-sur-cet-attribut-html5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>API day : TYPO3 et les variables SESSIONS</title>
		<link>http://www.redpik.net/typo3/api-day-typo3-et-les-variables-sessions/</link>
		<comments>http://www.redpik.net/typo3/api-day-typo3-et-les-variables-sessions/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 06:23:31 +0000</pubDate>
		<dc:creator>OlivierSC</dc:creator>
				<category><![CDATA[typo3]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=506</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/04/typo3_screenshot-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="typo3.org screenshot" /></p><a title="Api TYPO3" href="http://typo3.org/documentation/api/">L'API TYPO3</a> regroupe un nombre impressionnant de fonctionnalités dont certaines ne sont pas très connues.
Voici, par exemple, la gestion des variables sessions dans les plugins Frontend avec le CMS TYPO3.<span id="more-506"></span>
<h3>Différents types de variables sessions</h3>
En premier lieu, il existe plusieurs types de variables sessions pour les plugins Frontend :

- les variables "<strong>session</strong>"

- les variables "<strong>utilisateur</strong>"

Les variables de type "<strong>session</strong>" ont un fonctionnement identique aux variables sessions de PHP, c'est à dire qu'elles suivent l'utilisateur pendant toute sa navigation.
Elles sont supprimées lorsque l'internaute quitte le site ou après une longue période d’inactivité.

Les variables de type "<strong>utilisateur</strong>" sont liées à l'utilisateur frontend connecté (le <em>fe_user</em>). Elles sont stockées de manière permanente dans la table des utilisateurs frontend du site et elles sont accessibles dès que l'utilisateur est identifié sur le site. Cela permet par exemple de se rappeler des préférences de navigation d'un utilisateur après son identification.
Ces variables ne sont pas supprimées, par contre elles ne peuvent pas être utilisées pour gérer des variables pour les utilisateurs non identifiés.
<h3>Différents types de données</h3>
Il est possible de stocker n'importe quel type de données dans les variables sessions.
Les variables sont automatiquement "<a title="Désérialisation PHP" href="http://fr2.php.net/manual/fr/function.unserialize.php">désérialisées</a>"  lors de l'initialisation des sessions par le framework TYPO3.
Elles sont automatiquement "<a title="Sérialisation PHP" href="http://fr2.php.net/manual/fr/function.serialize.php">sérialisées</a>" lors de l'enregistrement des variables dans la session (via la fonction <em>storeSessionData(...)</em> ).
Cela permet de stocker des tableaux comme des variables simples (du texte ou des valeurs numériques).
<h3>PHP - l'affectation d'une variable de session</h3>
Exemple de code PHP qui permet l'affectation et la prise en compte des variables sessions depuis un plugin Frontend.

[php]
//preparation des données à mettre en session
$tabSession=array();
$tabSession['texte']='joh';
$tabSession['numerique']=316;

//préparation du nom de la variable dans la session de l'utilisateur
$nomVariableSession='tx_monext_pi1';

//on utilise ici la clé &quot;ses&quot; pour affecter
//une variable session qui ne nécessite pas d'identification
$GLOBALS[&quot;TSFE&quot;]-&gt;fe_user-&gt;setKey('ses', $nomVariableSession, $tabSession);

//on valide toutes les variables dans la session
//cette fonction est normalement appelée automatiquement par le framework
//à la fin de la génération de la page.
//mais si on coupe le processus avant la fin (redirection php par exemple)
//il faut valider les sessions.
$GLOBALS['TSFE']-&gt;fe_user-&gt;storeSessionData();
[/php]
<h3>PHP - la récupération d'une variable de session</h3>
Exemple de code PHP qui permet la récupération des variables sessions depuis un plugin Frontend.

[php]
//préparation du nom de la variable dans la session de l'utilisateur
$nomVariableSession='tx_monext_pi1';

//on utilise ici la clé &quot;ses&quot; pour récupérer
//une variable session qui ne nécessite pas d'identification
$tabDonneSession=$GLOBALS[&quot;TSFE&quot;]-&gt;fe_user-&gt;getKey('ses', $nomVariableSession);

//la variable $tabDonneSession contient maintenant
//les informations stockées dans la session du visiteur
print_r($tabDonneSession);
[/php]
<h3>Conclusion</h3>
En utilisant ces fonctions il est possible de mettre en place tous les mécanismes liés aux sessions comme :
<ul>
	<li>le développement de panier de commande</li>
	<li>le stockage de préférences utilisateur</li>
	<li>l'analyse de la navigation</li>
	<li>etc....</li>
</ul>]]></description>
		<wfw:commentRss>http://www.redpik.net/typo3/api-day-typo3-et-les-variables-sessions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimiser le chargement de ses images</title>
		<link>http://www.redpik.net/integration/optimiser-le-chargement-de-ses-images/</link>
		<comments>http://www.redpik.net/integration/optimiser-le-chargement-de-ses-images/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 11:48:44 +0000</pubDate>
		<dc:creator>MrManchot</dc:creator>
				<category><![CDATA[Intégration]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[sprite]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=421</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/03/loading-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="loading" /></p>Quand on parle d'optimiser le chargement de son site on pense généralement à son code ou à son serveur, mais un autre paramètre influe au niveau de l'affichage : <strong>les images</strong>. Il s'agit d'un critère important qu'il est possible d'améliorer grâce à deux techniques : <strong>réduire le nombre d'accès serveur</strong> &amp; <strong>optimiser le poids de ses images</strong>.

<span id="more-421"></span>
<h3>1 - Réduire le nombre d'accès serveur</h3>
<h4>Sprites CSS</h4>
Comme le conseille <a title="Combine images using CSS sprites" href="http://code.google.com/intl/fr/speed/page-speed/docs/rtt.html#SpriteImages">Google Page Speed</a> il est important de limiter autant que possible le nombre de requêtes HTTP.  En effet les navigateurs ne pouvant télécharger que deux à quatre éléments en parallèle, plus le nombre d'éléments est important plus le temps de latence du serveur est important (<a title="http://www.yuiblog.com/blog/2006/11/28/performance-research-part-1/" href="What the 80/20 Rule Tells Us about Reducing HTTP Requests">plus d'informations à ce sujet</a>). Il est donc nécessaire de limiter le nombre d'image a charger, et il existe une solution : <strong>les Sprites CSS</strong>.

Cela consiste simplement a combiner plusieurs images en une seule. L'affichage de la "sous-image" en question se fera ensuite dans le CSS, via la propriété <em>background-position</em>. C'est en théorie là ou vous vous demandez : "O<em>ui mais comment-faire concrètement</em> ?". Et bien il existe des générateurs comme <a title="CSS Sprites - Online CSS Sprite Builder / Generator" href="http://css-sprit.es/">Css-Sprit.es</a> qui permettent en quelques clics d'uploader toutes vos images, et d'en ressortir un beau sprite avec son CSS associé. Attention cette technique n'est adapté que pour des images de petite taille, généralement en <em>.gif</em> ou <em>.png</em>

Passons à un cas concret, je viens de réaliser un <a href="http://www.redpik.net/wp-content/uploads/2012/03/index.png">sprite des icônes du thèmes par défaut de Prestashop</a>. On se retrouve ainsi une seule image, évitant par conséquent une quarantaine d'accès serveur. Pour ne rien gâcher le poids total est passé de 123 ko à 18 ko !

<img class="aligncenter size-full wp-image-462" title="Test de Sprites" src="http://www.redpik.net/wp-content/uploads/2012/03/test_sprite.png" alt="" width="636" height="297" />
<h4></h4>
<h4></h4>
<h4>Encodage base64 des images</h4>
L’encodage des images en <a title="Définition Base64 sur Wikipedia" href="http://fr.wikipedia.org/wiki/Base64">base64</a> permet de transformer un fichier image en une suite de caractères. L’intérêt ? La chaîne peux être ensuite insérée dans votre CSS ou HTML, on passe donc de 1 à 0 accès serveur supplémentaire. Youpi. Attention toutefois, même si l'on gagne un accès, une fois encodé une image peux "prendre du poids" (<a title="Une chaîne encodée base64 prend environ 33 % de plus que les données initiales. " href="http://php.net/manual/fr/function.base64-encode.php">+33% en théorie</a>). La technique est donc réservée aux images légères. Cette méthode reste malgré tout expérimental pour la simple <del>et bonne</del> raison qu'IE6 et IE7 (<a href="http://gs.statcounter.com/#browser_version-FR-monthly-201112-201202-bar">encore 4% du trafic à ce jour</a>) ne supportent pas l'affichage des images encodées.

Si malgré cela vous souhaitez tester cette méthode, je vous conseille <a href="http://www.base64-image.de/step-1.php">Base64 Image</a>, convertisseur en ligne.

Voila par exemple ce que ça donne pour ce picto <img class="alignnone size-full wp-image-464" title="delete" src="http://www.redpik.net/wp-content/uploads/2012/03/delete.gif" alt="" width="11" height="13" /> :

[css]background-image: url('data:image/gif;base64,R0lGODlhCwANAKIAAP///8rKypqammVlZTU1NQAAAAAAAAAAACH5BAEHAAAALAAAAAALAA0AAAMsCArUyy3KFmoQWIzJCQNVtimeEAwCMX4mqnrsma6l/JJAO8O1S4MXDK3jSQAAOw==');[/css]
<h3>2 - Optimiser le poids de ses images</h3>
Le poids d'une image se détermine au moment où elle est enregistrée : Quel format (png,gif...)? Quelle qualité de compression jpeg ?

Cette étape est évidemment la plus importante, mais il reste tout de même la possibilité de grappiller quelques ko(s). Pour cela je vous suggère <a title="Yahoo! Smush.it" href="http://www.smushit.com/ysmush.it/">Smush.it</a> service de Yahoo permettant de réduire le poids de vos images sans perte de qualité. Smush.it se contente de supprimer toutes les données inutiles du fichier. Il suffit d'uploder ses images et ressort après quelques secondes un zip content toutes vos images optimisées. On connaît même le nombre et le pourcentage de bytes gagnés. Petit test avec le thème par défaut de <a href="http://www.prestashop.com/fr/" target="_blank">Prestashop</a>:
<blockquote>Smushed <strong>22.12%</strong> or <strong>31.52 KB</strong> from the size of your image(s).</blockquote>
Pas mal! Voilà une bonne pratique à adopter une fois son découpage terminé ;)

Pour aller encore plus vite, il existe aussi de bons logiciels "desktop" de compression lossless :  <a href="http://trimage.org/">Trimage</a> (Linux) et <a href="http://imageoptim.com/">ImageOptim</a> (Mac)]]></description>
		<wfw:commentRss>http://www.redpik.net/integration/optimiser-le-chargement-de-ses-images/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Top 15 des aberrations Prestashop</title>
		<link>http://www.redpik.net/developpement/top-15-des-aberrations-prestashop/</link>
		<comments>http://www.redpik.net/developpement/top-15-des-aberrations-prestashop/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 12:42:47 +0000</pubDate>
		<dc:creator>MrManchot</dc:creator>
				<category><![CDATA[Développement web]]></category>
		<category><![CDATA[prestashop]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=388</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2012/03/presta-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="presta" /></p>Voici un post légèrement <em>#troll</em>, ou nous vous présentons les différents points surprenant que nous avons pu trouver sur <a title="Prestashop - solution e-commerce Open-source" href="http://www.prestashop.com/fr/">PrestaShop</a>. Attention, ne me faites pas dire ce que je n'ai pas dit : <strong>PrestaShop est une excellente solution e-commerce</strong>, il s'agit plus là d'un petit clin d’œil. Personne n'est parfait ;)<span id="more-388"></span>

En espérant tout de même que la majorité de cette liste soit obsolète à la sortie de <a title="Milestones PrestaShop v1.5" href="http://www.prestashop.com/fr/milestones-1-5">Prestashop 1.5</a> :
<ol>
	<li><strong>Le tri de liste déroulante pour greffer un Hook.</strong>
Bonne idée que de trier la liste des <strong>85 Hooks</strong> par "id", assez pratique pour se retrouver. <a id="key-val" href="http://forge.prestashop.com/browse/PSCFI-1387" rel="18597">PSCFI-1387</a></li>
	<li><strong>L'id des colonnes dans le template product.</strong>
#pb-right-column pour la colonne de gauche / #pb-left-column pour celle de droite. Eurf. <a id="key-val" href="http://forge.prestashop.com/browse/PSFV-43" rel="20275">PSFV-43</a></li>
	<li><strong>La gestion des Tags.</strong>
Gérés parfaitement en back, aucune utilisation en front. <em>(Edit via Samy : il existe un module "nuage de tags")</em></li>
	<li><strong>Module BlockNewsletter dans le Core</strong>
Un passage en Hook aurait été peut-être réalisable ?</li>
	<li><strong>Gestion des .png renommés en .jpg
</strong>Depuis la 1.4 Prestashop gère les PNG24, ils sont par contre systématiquement renommés en .jpg<strong>
</strong></li>
	<li><strong>Block adverstising</strong>
L'image à uploader doit faire <span style="text-decoration: underline;">exactement</span> 155px X 163px sinon elle est scalée à la cochon. Quasi-inutilisable donc. Les dimensions sont en dur dans le .tpl et dans le .php.</li>
	<li><strong>Surcharge des tpl : problème de traduction</strong>
La surcharge fonctionne bien, mais la traduction pose problème si on ne surcharge pas TOUS les tpl d'un module.</li>
	<li><strong>Ordre des attributs impossible à gérer
</strong>Maintes fois débattu, pas pratique l'ordre alphabétique quand on vend du textile : L - M - S - XS... Cela sera amélioré en 1.5, Cool :)<strong>
</strong></li>
	<li><strong>URL des catégories ouvertes
</strong>Pas top niveau SEO, il faut surcharger la classe Link pour pouvoir modifier ce comportement.<strong>
</strong></li>
	<li><strong>Css des modules dans le global
</strong>Alors que tout est bien découpé, puis minifié. A voir en bas du globals.css: paypalapi / productcomments / reversoform / wishlish...<strong>
</strong></li>
	<li><strong>Écrasement des images lors de la MàJ</strong>
La mise à jour du répertoire /img/ est un vrai casse tête, parfois il y a de nouvelles images, mais il ne faut surtout pas uploader /img/c/ ni img/p/ etc...</li>
	<li><strong>Impossibilité de mettre de l'HTML dans un descriptif de catégorie</strong>
Je croise les doigts, ça serait quand même bien pratique : <a id="key-val" href="http://forge.prestashop.com/browse/PSCFI-2850" rel="20220">PSCFI-2850</a></li>
	<li><strong>Template mail</strong>
Pas de gestion de header ni de footer, et une couleur rose fluo à enlever de partout à la main!</li>
	<li><strong>Traductions des modules</strong>
Souhaitez bon courage à votre client qui souhaite traduire lui même ses éléments... Dur de s'y retrouver dans ces <span style="text-decoration: underline;">immenses</span> listes (c'est un module? c'est dans Front office?)</li>
	<li><strong>Greffer un module où bon vous semble</strong>
Très étrange... On peut greffer blockcart à gauche, mais pas en haut du site. On peut greffer blocknewsletter à droite... mais pas dans le footer.</li>
</ol>
Si <a title="Twitter PrestaShop" href="https://twitter.com/#!/prestashop" target="_blank">@PrestaShop</a> a quelques remarques sur ces différents points, nous sommes preneurs :)

En attendant vous avez de quoi compléter la liste ?]]></description>
		<wfw:commentRss>http://www.redpik.net/developpement/top-15-des-aberrations-prestashop/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Gérer l’ordre des META et du TITLE sur TYPO3</title>
		<link>http://www.redpik.net/typo3/gerer-lordre-des-meta-et-du-title-sur-typo3/</link>
		<comments>http://www.redpik.net/typo3/gerer-lordre-des-meta-et-du-title-sur-typo3/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 11:41:16 +0000</pubDate>
		<dc:creator>OlivierSC</dc:creator>
				<category><![CDATA[typo3]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=274</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2011/09/header_title-620x200.jpg" class="attachment-post-thumbnail wp-post-image" alt="header-title" /></p>Une demande qui revient souvent chez les SEO (spécialistes du référencement) est de mettre la balise TITLE en toute première position dans la partie HEAD (c'est à dire avant les autres balises META).

En dehors du mythe que représente l'idée que "plus le TITLE sera haut dans la page, plus on gagnera de place sur Google",  <a title="Site du CMS TYPO3" href="http://typo3.org/">TYPO3</a> permet, grâce à une bonne configuration, de gérer l'ordre des éléments présents dans le HEAD

<span id="more-274"></span>Par défaut TYPO3 ne génère pas le titre de page tout en haut du HEAD, la balise &lt;title&gt; est en effet ajoutée après plusieurs ligne de code.

En fait cette organisation est gérée dans un template HTML.

Par défaut :
<pre>/typo3/sysext/cms/tslib/templates/tslib_page_frontend.html</pre>
Partie du contenu de ce fichier :
<pre>	###METACHARSET###
	###INLINECOMMENT###
	###BASEURL###
	###SHORTCUT###
	<strong>###TITLE###</strong>
	###META###
	###CSS_INCLUDE###
	###CSS_INLINE###</pre>
Il est possible d'utiliser son propre fichier template en spécifiant l'emplacement de ce template via le typoscript suivant :
<pre>config.pageRendererTemplateFile=...</pre>
<a title="TSREF pour l'objet config" href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.5.0/view/1/6/#id2626485">Voir la TSREF et la partie "config" ( rechercher pageRendererTemplateFile ).</a>

Il suffit alors faire une copie du fichier de base et de le placer dans fileadmin et de mettre en place la configuration :
<pre>config.pageRendererTemplateFile=fileadmin/perso_page_frontend.html</pre>
On peut alors paramétrer l'ordre en fonction de ses préférences et de ses croyances.]]></description>
		<wfw:commentRss>http://www.redpik.net/typo3/gerer-lordre-des-meta-et-du-title-sur-typo3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Encoder des accents sans toucher aux balises HTML</title>
		<link>http://www.redpik.net/developpement/encoder-des-accents-sans-toucher-aux-balises-html/</link>
		<comments>http://www.redpik.net/developpement/encoder-des-accents-sans-toucher-aux-balises-html/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 12:34:16 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Développement web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.redpik.net/?p=256</guid>
		<description><![CDATA[<p><img width="620" height="200" src="http://www.redpik.net/wp-content/uploads/2011/08/headache.jpg" class="attachment-post-thumbnail wp-post-image" alt="PHP: encoder les accents" /></p><strong>...Et surtout sans tableau de conversion!</strong>
Cette opération (à priori très simple) peut poser problème, notamment à cause de l'encodage des caractères.<span id="more-256"></span>

Faisons le test avec une chaîne de caractères contenant des balises HTML et des accents.

[php]
$chaine = &quot;Le &lt;em&gt;péHpé&lt;/em&gt; çaÿ &lt;strong&gt;biên&lt;/strong&gt;.&quot;;
[/php]

Nous souhaitons obtenir la chaîne suivante:

[php]
Le &lt;em&gt;p&amp;eacute;Hp&amp;eacute;&lt;/em&gt; &amp;ccedil;a&amp;yuml; &lt;strong&gt;bi&amp;ecirc;n&lt;/strong&gt;.
[/php]

Commençons donc par faire appel à la fonction <a title="fonction htmlentities sur php.net" href="http://www.php.net/manual/fr/function.htmlentities.php">htmlentities</a>. Pour rappel, cette fonction "convertit tous les caractères éligibles en entités HTML". Donc les accents seront effectivement encodés... ainsi que les balises HTML (contrairement à la fonction <a title="fonction htmlspecialchars sur php.net" href="http://www.php.net/manual/fr/function.htmlspecialchars.php">htmlspecialchars</a> qui elle n'aurait pas encodé les accents). N'oubliez pas de préciser le "jeu de caractères", exemple si vous êtes comme moi en <a title="UTF-8 - définition sur Wikipedia" href="http://fr.wikipedia.org/wiki/UTF-8">UTF-8</a>:

[php]
//encodage des accents ET des balises
 echo htmlentities($chaine, ENT_NOQUOTES, 'UTF-8');
 [/php]

Heureusement il existe une fonction capable de faire l'inverse, <strong>sans toucher aux accents</strong>: <a title="fonction htmlspecialchars_decode sur php.net" href="http://www.php.net/manual/fr/function.htmlspecialchars-decode.php">htmlspecialchars_decode</a>. Nous obtenons donc:

[php]
echo htmlspecialchars_decode(htmlentities($chaine, ENT_NOQUOTES, 'UTF-8'));
[/php]

Et le tour est joué!
<h3>Et si je veux obtenir l'effet inverse?</h3>
Là c'est plus simple:

[php]
//convertir les &amp;eacute; en é sans toucher aux balises HTML
echo html_entity_decode($chaine, ENT_NOQUOTES, &quot;UTF-8&quot;);
[/php]]]></description>
		<wfw:commentRss>http://www.redpik.net/developpement/encoder-des-accents-sans-toucher-aux-balises-html/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
