<?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>Blog Symfony - Lexik Montpellier &#187; thomas</title>
	<atom:link href="http://www.lexik.fr/blog/symfony/author/thomas/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lexik.fr/blog/symfony</link>
	<description>Blog sur le développement Web PHP</description>
	<lastBuildDate>Mon, 09 Aug 2010 11:33:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Validation d&#8217;un numéro siret : sfValidatorSiret</title>
		<link>http://www.lexik.fr/blog/symfony/symfony/1-4-x/validation-dun-numero-siret-sfvalidatorsiret-1159</link>
		<comments>http://www.lexik.fr/blog/symfony/symfony/1-4-x/validation-dun-numero-siret-sfvalidatorsiret-1159#comments</comments>
		<pubDate>Tue, 25 May 2010 06:30:00 +0000</pubDate>
		<dc:creator>thomas</dc:creator>
				<category><![CDATA[1.4.x]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[siret]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[validator]]></category>

		<guid isPermaLink="false">http://www.lexik.fr/blog/symfony/?p=1159</guid>
		<description><![CDATA[Bonjour, comme vous avez pu le voir avec les récents posts, nous avons eu pas mal de gestion de facturation: conversion de devises, validation d&#8217;un numéro de tva intracommunautaire. Pour continuer sur la lancée, nous allons faire un petit validator sur les numéros siret. Un numéro siret correspond à un petit algorithme assez simple expliqué [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>comme vous avez pu le voir avec les récents posts, nous avons eu pas mal de gestion de facturation: <a title="conversion de devises" href="http://www.lexik.fr/blog/symfony/symfony/tips-conversions-de-devises-1137" target="_blank">conversion de devises</a>, <a title="tva intracommunautaire" href="http://www.lexik.fr/blog/symfony/symfony/un-validator-tva-bien-pratique-1123" target="_blank">validation d&#8217;un numéro de tva intracommunautaire</a>.</p>
<p>Pour continuer sur la lancée, nous allons faire un petit validator sur les numéros siret.</p>
<p><span id="more-1159"></span>Un numéro siret correspond à un petit algorithme assez simple <a title="algorithme numéro siret" href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_d%E2%80%99identification_du_r%C3%A9pertoire_des_%C3%A9tablissements#Calcul_et_validit.C3.A9_d.27un_num.C3.A9ro_SIRET" target="_blank">expliqué ici</a> (<a title="Luhn" href="http://fr.wikipedia.org/wiki/Luhn" target="_blank">algorithme de Luhn</a>)<br />
Le principe est le suivant : on multiplie les chiffres de rang impair à partir de la droite par 1, ceux de rang pair par 2 ; la somme des chiffres obtenus doit être congrue au modulo 10, c&#8217;est-à-dire qu&#8217;elle doit être multiple de 10.<br />
Un numéro siret comporte 14 chiffre.</p>
<p>Voici le code du validator: sfValidatorSiret.class.php</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1159code2'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p11592"><td class="code" id="p1159code2"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> sfValidatorSiret <span style="color: #000000; font-weight: bold;">extends</span> sfValidatorBase 
<span style="color: #009900;">&#123;</span>
  protected <span style="color: #000000; font-weight: bold;">function</span> doClean<span style="color: #009900;">&#40;</span><span style="color: #000088;">$values</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$siret</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$values</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$siret</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$siret</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      throw <span style="color: #000000; font-weight: bold;">new</span> sfValidatorError<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Le numéro siret est invalide'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">14</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">%</span><span style="color:#800080;">2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$tmp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$siret</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$tmp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tmp</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">9</span> ? <span style="color: #000088;">$tmp</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">9</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$tmp</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">else</span>
      <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$tmp</span><span style="color: #339933;">=</span> <span style="color: #000088;">$siret</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$sum</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$tmp</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sum</span><span style="color: #339933;">%</span><span style="color:#800080;">10</span> <span style="color: #339933;">!==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      throw <span style="color: #000000; font-weight: bold;">new</span> sfValidatorError<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Le numéro siret est invalide'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$siret</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Pour expliquer rapidement:<br />
1. si la valeur est vide ou de longueur différente de 14 on retourne une exception.<br />
2. on parcours les 14 chiffres, si le chiffre est paire alors on le multiplie par 2 et si ce résultat est supérieur à  9 alors on retranche 9.<br />
ex: 7 =&gt; 7&#215;2 = 14 =&gt; 14 &#8211; 9 = 5.<br />
faire 14 -9  reviens à additionner les 2 chiffres: 1 + 4 = 5.<br />
3. On additionne tous les chiffres paires x2 et les chiffres impaires.<br />
4. si le résultat est divisible par 10 alors c&#8217;est un numéro siret.</p>
<p>Attention ceci indique que le numéro fourni peut être un numéro siret, MAIS PAS que ce numéro est réellement un numéro siret inscrit à L&#8217;INSEE, actif et correspond à une société.</p>
<p><a href="http://www.lexik.fr/blog/symfony/wp-content/uploads/2010/05/sfValidatorSiret.tar.gz">Vous pouvez télécharger le validator ici.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lexik.fr/blog/symfony/symfony/1-4-x/validation-dun-numero-siret-sfvalidatorsiret-1159/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>se connecter du backend vers le frontend avec un utilisateur</title>
		<link>http://www.lexik.fr/blog/symfony/non-classe/se-connecter-du-backend-vers-le-frontend-avec-un-utilisateur-1018</link>
		<comments>http://www.lexik.fr/blog/symfony/non-classe/se-connecter-du-backend-vers-le-frontend-avec-un-utilisateur-1018#comments</comments>
		<pubDate>Fri, 11 Dec 2009 13:56:02 +0000</pubDate>
		<dc:creator>thomas</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.lexik.fr/blog/symfony/?p=1018</guid>
		<description><![CDATA[Pour certains projets, il peut être pratique de se connecter sur le compte d&#8217;un utilisateur parce qu&#8217;il est bloqué, pour vérifier que tout fonctionne bien, pour tester son application. Cependant les mots de passe sont cryptés en bases de données et sans connaître les identifiants il va être difficile de se connecter. Donc ce petit [...]]]></description>
			<content:encoded><![CDATA[<p>Pour certains projets, il peut être pratique de se connecter sur le compte d&#8217;un utilisateur parce qu&#8217;il est bloqué, pour vérifier que tout fonctionne bien, pour tester son application. Cependant les mots de passe sont cryptés en bases de données et sans connaître les identifiants il va être difficile de se connecter.<br />
Donc ce petit tuto est là pour nous aider.<br />
Le but est simple: dans le backend, on liste l&#8217;ensemble des utilisateurs du site et à coté de chaque nom on va rajouter un bouton &laquo;&nbsp;se connecter en tant que&nbsp;&raquo;.<br />
<span id="more-1018"></span><br />
Ainsi il suffit d&#8217;appuyer sur le bouton pour se retrouver sur le frontend, connecté avec cet user.</p>
<p>Tout d&#8217;abord nous créons un partial _connectWith.php dans le module souhaité dans le backend, par exemple le module sf_guard_user.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1018code7'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p10187"><td class="code" id="p1018code7"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$link_connect_with</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://www.monsite.fr/connect_by_admin/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$sf_guard_user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSalt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$sf_guard_user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPassword</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$sf_request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCookie</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nomdemasessionbackend'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">echo</span> link_to<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SE CONNECTER EN TANT QUE'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$link_connect_with</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'target'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'_blank'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>le $link_connect_with est défini à coté pour plus de lisibilité.<br />
connect_by_admin est le nom de ma route.<br />
getSalt et getPassword sont les méthodes de sf_guard_user pour récupérer les données correspondantes.<br />
$sf_request->getCookie(&#8216;nomdemasessionbackend&#8217;)  avec nomdemasessionbackend qui doit être défini dans le fichier backend/config/factories.yml, on verra après son utilité.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1018code8'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p10188"><td class="code" id="p1018code8"><pre class="php" style="font-family:monospace;">all<span style="color: #339933;">:</span>
  storage<span style="color: #339933;">:</span>
    <span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">:</span> sfSessionStorage
    param<span style="color: #339933;">:</span>
      <span style="color: #990000;">session_name</span><span style="color: #339933;">:</span> nomdemasessionbackend</pre></td></tr></table></div>

<p>pour simplifier, ici je n&#8217;ai pas utilisé de routing ou de fonction spéciale qui va récupérer automatiquement les routes du frontend, j&#8217;ai écris directement l&#8217;url souhaitée. C&#8217;est pas très beau mais plus facile pour ce tuto.<br />
c&#8217;est tout pour le backend.</p>
<p>maintenant sur le frontend:<br />
routing.yml je rajoute ma route appelée via le backend</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1018code9'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p10189"><td class="code" id="p1018code9"><pre class="php" style="font-family:monospace;">connect_with<span style="color: #339933;">:</span>
  url<span style="color: #339933;">:</span> <span style="color: #339933;">/</span>connect_by_admin<span style="color: #339933;">/:</span>salt<span style="color: #339933;">/:</span>password<span style="color: #339933;">/:</span>admin
  param<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> module<span style="color: #339933;">:</span> connect<span style="color: #339933;">,</span> action<span style="color: #339933;">:</span> Admin<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>mon action:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1018code10'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p101810"><td class="code" id="p1018code10"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeAdmin<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #666666; font-style: italic;">//etape 1</span>
    <span style="color: #000088;">$salt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'salt'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$admin_session</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">//etape 2</span>
    <span style="color: #000088;">$cookie</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCookie</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nomdemasessionbackend'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$admin_session</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$cookie</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">forward404</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//etape 3</span>
    <span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sfGuardUser'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findOneBySaltAndPassword</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$salt</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">forward404Unless</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">//etape 4</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">signin</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@homepage'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>étape 1: je récupère les informations de l&#8217;url<br />
étape 2: je vérifie si le cookie nomdemasessionbackend correspond à celui passé en paramètre, sinon ERREUR404.<br />
Ceci oblige l&#8217;administrateur à être authentifié dans le backend pour pouvoir &laquo;&nbsp;se connecter en tant que&nbsp;&raquo;.<br />
étape 3: je récupère l&#8217;utilisateur qui à ce salt et ce mot de passe, sinon ERREUR404.<br />
étape 4: je connecte cet utilisateur sur le site et je redirige vers la homepage.</p>
<p>Nous avons rajouté lé vérification de la session du backend pour sécurisée cette url, mais cela implique que votre frontend et votre backend n&#8217;utilise pas les mêmes nom de sessions: <a href="http://www.lexik.fr/blog/symfony/symfony/utilisation-de-sfsessionstorage-dans-symfony-901">voir http://www.lexik.fr/blog/symfony/symfony/utilisation-de-sfsessionstorage-dans-symfony-901</a></p>
<p>Un petit tips tout simple mais assez pratique.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lexik.fr/blog/symfony/non-classe/se-connecter-du-backend-vers-le-frontend-avec-un-utilisateur-1018/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Générer des thumbs lors de l&#8217;affichage d&#8217;une image</title>
		<link>http://www.lexik.fr/blog/symfony/symfony/generer-des-thumbs-lors-de-laffichage-dune-image-781</link>
		<comments>http://www.lexik.fr/blog/symfony/symfony/generer-des-thumbs-lors-de-laffichage-dune-image-781#comments</comments>
		<pubDate>Thu, 09 Jul 2009 16:11:13 +0000</pubDate>
		<dc:creator>thomas</dc:creator>
				<category><![CDATA[1.2.x]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[helper]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[sfImageTransformPlugin]]></category>
		<category><![CDATA[thumbnail]]></category>
		<category><![CDATA[vignette]]></category>

		<guid isPermaLink="false">http://www.lexik.fr/sfblog/?p=781</guid>
		<description><![CDATA[Nous allons voir ici comment générer facilement des thumbs lors de l&#8217;affichage d&#8217;une image sur le site, plutôt que lors de l&#8217;upload de cette image. L&#8217;intérêt: une fois que le site est lancé, qu&#8217;il y a des images déjà uploadées, il est beaucoup plus facile de changer dans le code la taille d&#8217;affichage et de [...]]]></description>
			<content:encoded><![CDATA[<p>Nous allons voir ici comment générer facilement des thumbs lors de l&#8217;affichage d&#8217;une image sur le site, plutôt que lors de l&#8217;upload de cette image.<br />
L&#8217;intérêt: une fois que le site est lancé, qu&#8217;il y a des images déjà uploadées, il est beaucoup plus facile de changer dans le code la taille d&#8217;affichage et de regénérer automatiquement les images, plutôt que de devoir tout réuploader une seconde fois, voir +.<span id="more-781"></span></p>
<p>Afin d&#8217;optimiser l&#8217;affichage des pages, il est recommandé de généré plusieurs thumb (vignettes) pour une même image. Il y a l&#8217;image d&#8217;origine, puis une version en 200&#215;200, une en 150&#215;100 et une 50&#215;50, suivant leur position sur le site.<br />
Une première solution est de générer ces thumbs lors de l&#8217;upload, c&#8217;est très efficace, le travail ce fait une fois lors de la sauvegarde et est opérationnel directement. Mais on a tous eu un projet où finalement il faut créer un nouveau thumb ou changer le 150&#215;100 en 100&#215;100 et là c&#8217;est le drame: il faut re-uploader toutes les images une par une (enfin si le site est déjà en prod, le mieux c&#8217;est de s&#8217;en rendre compte du problème avant).</p>
<p>Bref, la deuxième solution est d&#8217;uploader une image source, et lors de l&#8217;affichage demander la taille souhaitée. Là on vérifie si le thumb existe, si oui on l&#8217;affiche, sinon , on le crée et on l&#8217;affiche.<br />
<strong>Voila ce que je vous propose aujourd&#8217;hui, un petit helper tout fait qui s&#8217;occupe de cette deuxième solution. </strong><br />
Il est basé sur le plugin <a href="http://www.symfony-project.org/plugins/sfImageTransformPlugin">sfImageTransformPlugin</a> qui est excellent et dont vous avez toute la doc ici: <a href="http://www.symfony-project.org/plugins/sfImageTransformPlugin">http://www.symfony-project.org/plugins/sfImageTransformPlugin</a>.</p>
<p>Pour installer le helper rien de plus simple, vous créez le répertoire lib/helper, et vous placez le fichier dedans.<br />
lors de l&#8217;appel il faut penser à le loader avec la fonction suivante dans une action sfProjectConfiguration::getActive()->loadHelpers(&#8216;Thumb&#8217;);<br />
ou</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p781code12'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p78112"><td class="code" id="p781code12"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> use_helper<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Thumb'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p> dans la vue.</p>
<p>il y a deux fonctions:</p>
<p>une pour générer le thumb:<br />
<strong>doThumb($image_name, $folder, $options = array(), $resize = &#8216;scale&#8217;, $default = &#8216;default.jpg&#8217;)</strong><br />
   @param <string> $image_name : le nom de l&#8217;image donc généralement le $object->getImage(), pas de répertoire<br />
   @param <string> $folder : le nom du répertoire dans uploads où est stocké l&#8217;image : uploads/object/source => $folder = object<br />
   @param <array> $options : la taille de l&#8217;image: width et height<br />
   @param <string> $resize : l&#8217;opération sur le thumb: &laquo;&nbsp;scale&nbsp;&raquo; pour garder les proportions, &laquo;&nbsp;center&nbsp;&raquo; pour tronquer l&#8217;image<br />
   @param <string> $default : l&#8217;image par défaut si image_name n&#8217;existe pas<br />
le thumb est créé dans uploads/object/thumb/<br />
le  réslutat retourné est le lien vers l&#8217;image : /uploads/object/thumb/mon-image.jpg </p>
<p>une autre fonction :<br />
<strong>showThumb($image_name, $folder, $options = array(), $resize = &#8216;scale&#8217;, $default = &#8216;default.jpg&#8217;)</strong><br />
elle appelle la précédente avec les même paramètres.<br />
elle retourne l&#8217;image tag directement. donc un seul paramètre change:<br />
@param <array> $options : les parametres à passer à l&#8217;image: width, height, alt, title, class, id&#8230;<br />
<strong><br />
Vous pouvez télécharger le helper <a href='http://www.lexik.fr/blog/symfony/wp-content/uploads/2009/07/thumbhelper.zip'>ici</a>: <a href='http://www.lexik.fr/blog/symfony/wp-content/uploads/2009/07/thumbhelper.zip'>thumbhelper</a></strong></p>
<p>Merci de me contacter en cas de soucis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lexik.fr/blog/symfony/symfony/generer-des-thumbs-lors-de-laffichage-dune-image-781/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Upload de fichier avec Symfony</title>
		<link>http://www.lexik.fr/blog/symfony/symfony/upload-de-fichier-376</link>
		<comments>http://www.lexik.fr/blog/symfony/symfony/upload-de-fichier-376#comments</comments>
		<pubDate>Tue, 17 Mar 2009 08:59:00 +0000</pubDate>
		<dc:creator>thomas</dc:creator>
				<category><![CDATA[1.2.x]]></category>
		<category><![CDATA[Admingenerator 1.2.x]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[fichier]]></category>
		<category><![CDATA[modifier]]></category>
		<category><![CDATA[nom]]></category>
		<category><![CDATA[sfValidatedFile]]></category>
		<category><![CDATA[sfWidgetFormInputFile]]></category>
		<category><![CDATA[upload]]></category>
		<category><![CDATA[uploadé]]></category>

		<guid isPermaLink="false">http://www.lexik.fr/sfblog/?p=376</guid>
		<description><![CDATA[Un petit post pour expliquer l&#8217;upload de fichier via symfony 1.2 et surtout la gestion du nom du fichier upload&#233;. Pour uploader un fichier rien de plus simple, et tout est expliqu&#233; ici: http://www.symfony-project.org/jobeet/1_2/Doctrine/en/10 le schema.yml ?View Code YAMLImage: tableName: table_image columns: name: { type: string(255), notnull: true } image: { type: string(255) } dans [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit post pour expliquer l&#8217;upload de fichier via symfony 1.2 et surtout la gestion du nom du fichier upload&eacute;.</p>
<p><span id="more-376"></span></p>
<p>Pour uploader un fichier rien de plus simple, et tout est expliqu&eacute; ici: <a target="_blank" href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/10" title="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/10">http://www.symfony-project.org/jobeet/1_2/Doctrine/en/10</a> le schema.yml</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p376code16'); return false;">View Code</a> YAML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p37616"><td class="code" id="p376code16"><pre class="yaml" style="font-family:monospace;">Image:
  tableName: table_image
  columns:
    name: { type: string(255), notnull: true }
    image: { type: string(255) }</pre></td></tr></table></div>

<p>dans le fichier ImageForm.class.php, on modifie le widget pour lui dire que c&#8217;est un input File, et le validator qui correspond</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p376code17'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p37617"><td class="code" id="p376code17"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ImageForm <span style="color: #000000; font-weight: bold;">extends</span> BaseImageForm
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> configure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widgetSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'image'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfWidgetFormInputFile<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                                        <span style="color: #0000ff;">'label'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Image'</span><span style="color: #339933;">,</span>
                                         <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validatorSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'image'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfValidatorFile<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                                        <span style="color: #0000ff;">'required'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'path'</span> <span style="color: #339933;">=&gt;</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sf_upload_dir'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/images'</span><span style="color: #339933;">,</span>
                                        <span style="color: #0000ff;">'mime_types'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'web_images'</span><span style="color: #339933;">,</span>
                               <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Donc &agrave; partir de maintenant dans mon backend, je peux uploader les images MAIS elles sont renomm&eacute;es en md5.extension, ce qui est bien, mais pas top.  Pour y remedier, je vais dans le model Image.class.php</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p376code18'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p37618"><td class="code" id="p376code18"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Image <span style="color: #000000; font-weight: bold;">extends</span> BaseImage
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> generateImageFilename<span style="color: #009900;">&#40;</span>sfValidatedFile <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> Sanitize<span style="color: #339933;">::</span><span style="color: #004000;">stripText</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_logo'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>getOriginalExtension<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>en cr&eacute;ant une fonciton generateMonChampsFilename(), je peux choisir le nomdu me fichier upload&eacute;, fichier qui passe en parametre de cette fonciton.  Ici je lui donne la valeur de mon champs name.  Pour l&#8217;API correspondante: <a target="_blank" href="http://www.symfony-project.org/api/1_2/sfValidatedFile" title="http://www.symfony-project.org/api/1_2/sfValidatedFile">http://www.symfony-project.org/api/1_2/sfValidatedFile</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lexik.fr/blog/symfony/symfony/upload-de-fichier-376/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
