<?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>Adrien RUIZ » devblog</title>
	<atom:link href="http://www.adrien-ruiz.fr/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adrien-ruiz.fr/blog</link>
	<description></description>
	<lastBuildDate>Mon, 07 Nov 2011 17:32:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Passer un objet d&#8217;une Activity à une autre</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/10/08/passer-un-objet-dune-activity-a-une-autre/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/10/08/passer-un-objet-dune-activity-a-une-autre/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 09:54:36 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=603</guid>
		<description><![CDATA[Cette astuce peut s&#8217;avérer relativement utile lorsque l&#8217;objet en question est peuplé depuis une source externe comme un flux RSS, ce qui peut parfois demander un temps d&#8217;attente assez long. La méthode utilise le principe de serialization qui va tout simplement transformer nos objets &#8216;Serializable&#8217; en byte[]. Pour cela, nous disposons d&#8217;une classe, à partir [...]]]></description>
			<content:encoded><![CDATA[<p>Cette astuce peut s&#8217;avérer relativement utile lorsque l&#8217;objet en question est peuplé depuis une source externe comme un <strong>flux RSS</strong>, ce qui peut parfois demander un temps d&#8217;attente assez long. La méthode utilise le principe de serialization qui va tout simplement transformer nos objets &#8216;Serializable&#8217; en <strong>byte[]</strong>.</p>
<p>Pour cela, nous disposons d&#8217;une classe, à partir de laquelle, les objets que nous souhaitons sérialiser <strong>devront hériter</strong>. De la sorte, vos objets pourront être passés très simplement d&#8217;une <strong>Activity</strong> à une autre.</p>
<pre name="code" class="java">public class CSerializable implements Serializable {

    public byte[] serialize () throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream ();
        ObjectOutput out = new ObjectOutputStream (bos);
        out.writeObject (this);
        out.close ();
        return bos.toByteArray ();
    } // serialize ();

    public Object unserialize (byte[] b) throws IOException,
            ClassNotFoundException {
        ByteArrayInputStream bis = new ByteArrayInputStream (b);
        ObjectInputStream in = new ObjectInputStream (bis);
        Object object = in.readObject ();
        bis.close ();
        in.close ();
        return object;
    } // unserialize ();

}; // CSerializable;</pre>
<p>Pour continuer, voici un exemple vraiment très simple d&#8217;objet devant hériter de la classe <strong>CSerializable</strong>.</p>
<pre name="code" class="java">public class CTest extends CSerializable {
    protected String title, content;
    protected Date date;

    public void populate (byte[] serialize)
            throws IOException, ClassNotFoundException {
        CTest object = (CTest)unserialize (serialize);
        setTitle (object.getTitle ());
        setContent (object.getContent ());
        setDate (object.getDate ());
    } // populate ();

    public String getTitle () {return title;}
    public void setTitle (String title) {this.title = title;}

    public String getContent () {return content;}
    public void setContent (String content) {this.content = content;}

    public Date getDate () {return date;}
    public void setDate (Date date) {this.date = date;}
}; // CTest;</pre>
<p>Le passage de l&#8217;objet de l&#8217;Activity 1 vers la 2 se résumer alors à ce qui va suivre:</p>
<pre name="code" class="java">// CActivity1
CTest test = new CTest ();
test.setTitle ("Mon titre");
test.setContent ("Mon contenu");
test.setDate (new Date ());
Intent intent = new Intent (getApplicationContext (), CActivity2.class);
intent.putExtra ("test", test.serialize ());
startActivity (intent);</pre>
<pre name="code" class="java">// CActivity2
byte[] testArray = getIntent ().getExtras ().getByteArray ("test");
CTest test = new CTest ();
test.populate (testArray);</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/10/08/passer-un-objet-dune-activity-a-une-autre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evolution du CSS et les vieux navigateurs, quelle méthode choisir ?</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/10/04/evolution-du-css-et-les-vieux-navigateurs-quelle-methode-choisir/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/10/04/evolution-du-css-et-les-vieux-navigateurs-quelle-methode-choisir/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 06:03:47 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[PHP / JS / CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[intégration]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[optimiser]]></category>
		<category><![CDATA[réduire]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=535</guid>
		<description><![CDATA[Durant la phase d&#8217;intégration d&#8217;un projet, il arrive très souvent que l&#8217;on soit tenté d&#8217;utiliser toutes les nouvelles propriétés CSS(3), c&#8217;est plus pratique, c&#8217;est plus beau et surtout c&#8217;est plus efficace qu&#8217;utiliser des images qui feront indéniablement augmenter le temps de chargement de nos pages web. Mais pour un grand nombre d&#8217;entres-nous, se pose directement [...]]]></description>
			<content:encoded><![CDATA[<p>Durant la phase d&#8217;intégration d&#8217;un projet, il arrive très souvent que l&#8217;on soit tenté d&#8217;utiliser toutes les nouvelles propriétés CSS(3), c&#8217;est plus pratique, c&#8217;est plus beau et surtout c&#8217;est plus efficace qu&#8217;utiliser des images qui feront indéniablement augmenter le temps de chargement de nos pages web.</p>
<p>Mais pour un grand nombre d&#8217;entres-nous, se pose directement la question: &laquo;&nbsp;Oui mais, ça donnerait quoi sur les vieux navigateurs ?&nbsp;&raquo; &#8230; pour ne pas citer <strong>Internet Explorer</strong> et ses nombreuses <span style="text-decoration: underline;">tentatives de réajustement</span> (c&#8217;est tellement vrai)! Ceci-dit, il faut tout de même avouer qu&#8217;ils ont fait de très gros progrès depuis IE9, on en serait presque tout émoustillé.</p>
<p>Malheureusement, ces vieux navigateurs occupent une petite part du marché qui titillent encore notre conscience professionnelle pour finalement nous pousser à réaliser l&#8217;effort ultime (ok &#8230; j&#8217;exagère un peu)!</p>
<h2>Cas d&#8217;école: les bords arrondis</h2>
<p>C&#8217;est certainement la propriété que j&#8217;utilise à coup sûr lorsque je commence l&#8217;intégration d&#8217;un projet. Il faut reconnaître, que même très léger, un bord arrondi c&#8217;est toujours plus beau et sympatique qu&#8217;un bord qui ne l&#8217;est pas, en plus les graphistes s&#8217;en donnent à coeur joie.</p>
<p>En décortiquant un peu le CSS mis en place à cette occasion, voilà ce que l&#8217;on peut trouver (rien de bien extraordinaire):</p>
<blockquote><p>border-radius: 5px;<br />
-moz-border-radius: 5px;<br />
-webkit-border-radius: 5px;</p></blockquote>
<p>On distingue très rapidement les propriétés dites &laquo;&nbsp;standards&nbsp;&raquo; de celles qui sont propriétaires <strong>-moz</strong>, <strong>-webkit</strong> et j&#8217;en passe. Oui mais voilà, dans ce cas précis, il n&#8217;existe aucun moyen en CSS d&#8217;appliquer ce type de propriété sous Internet Explorer &lt; 9. C&#8217;est bien dommage mais fort heureusement, au moins deux possibilités s&#8217;ouvrent généreusement à nous: l&#8217;utilisation d&#8217;images et celui du javascript.</p>
<h3>Les images</h3>
<h4>Avantages</h4>
<ul>
<li>Si elles sont bien découpées, elles prendront moins de temps à charger qu&#8217;un script JS ;</li>
<li>Le rendu est scrupuleusement identique à celui fourni par nos graphistes.</li>
</ul>
<h4>Inconvénients</h4>
<ul>
<li>S&#8217;il s&#8217;agit de PNG transparent, sous IE 6 cette option est à bannir &#8230; ou alors il faudrait faire intervenir du JS &#8230; heeuu &#8230;?</li>
<li>Au contraire, si vos images sont mal traitées, le temps de chargement deviendrait alors problèmatique (il n&#8217;y a très rarement qu&#8217;un seul bord arrondi &#8230; donc il y aura forcement plusieurs images).</li>
</ul>
<h3>Le Javascript</h3>
<h4>Avantages</h4>
<ul>
<li>Plus aucune question à se poser, il suffit de lire la doc de la bibliothèque de votre choix, et si elle est correctement développée, le problème de compatibilité ne se posera même pas.</li>
</ul>
<h4>Inconvénients</h4>
<ul>
<li>Le temps de chargement du script, ajouté à cela, son temps d&#8217;exécution ! Il faut penser à remettre les choses dans leurs contextes, les vieux navigateurs n&#8217;étaient pas autant optimisés que maintenant, le javascript était beaucoup plus long à s’exécuter ;</li>
<li>Si le Javascript est désactivé &#8230; ç&#8217;est encore possible ça ? &#8230; hey ho c&#8217;est fini le temps des gifs animés (une période traumatisante) !</li>
</ul>
<h2>Quelle option adopter alors ?</h2>
<p>Personnellement j&#8217;ai choisi de bannir catégoriquement l&#8217;utilisation du JS à cause des inconvénients cités ci-dessus qui laissent trop souvent apparaître un effet désagréable de clipping en fin de chargement des pages. De la même manière, j&#8217;évite au maximum (voir complètement) l&#8217;utilisation d&#8217;images, mais il faut dire que ça peut parfois vous sauver la vie.</p>
<h2>Qu&#8217;elle est la solution miracle ?</h2>
<p>J&#8217;ai pris pour habitude d&#8217;appliquer la méthode de <strong>dégradation passive</strong> &#8230; oula, mais qu&#8217;est-ce qu&#8217;il nous raconte lui ? Le but consiste à intégrer normalement une charte graphique en laissant le rendu se dégrader visuellement sur les anciens navigateurs. Lorsque j&#8217;emploie le terme de dégradation, je parle uniquement du rendu, en aucun cas l&#8217;affichage du site ne doit en être altéré, ou alors la phase d&#8217;intégration aura été un échec (&#8230; mais pourquoi ma colonne s&#8217;affiche-t-elle dans le footer &#8230; ?).</p>
<p>Cela signifie tout simplement qu&#8217;il n&#8217;y aura pas de bord arrondi &#8230; mais est-ce que c&#8217;est si grave lorsqu&#8217;on sait qu&#8217;un très faible pourcentage des internautes en sera affecté ? Est-ce que ça les empêchera de naviguer <span style="text-decoration: underline;">correctement</span> et <span style="text-decoration: underline;">confortablement</span> sans temps de chargement supplémentaire, ou effets visuels désagréables ?</p>
<p>Fort heureusement, on rencontre ce genre de problème uniquement sous Internet Explorer. En règle général il y a très peu de surprises sur les autres navigateurs, je vous conseille au passage <a href="http://www.css3files.com/" target="_blank">ce site</a> qui référence très bien les compatibilités CSS avec tous les navigateurs dans toutes les versions (je suis fan).</p>
<p>Il s&#8217;agit d&#8217;un exemple concret qui peut très bien s&#8217;appliquer à d&#8217;autres propriétés CSS ou <a href="http://www.domassistant.com/" target="_blank">pseudos-selecteurs</a>.</p>
<p>Pour terminer, je pense aussi que laisser croire les internautes qu&#8217;ils sont toujours à la pointe de la technologie par l&#8217;émulation n&#8217;est pas la meilleure des solutions. Libre à vous d&#8217;appliquer la méthode de votre de choix, car l&#8217;avantage du travail d&#8217;intégration, c&#8217;est que chacun peut faire comme il veut même si au final on se pose tous les mêmes questions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/10/04/evolution-du-css-et-les-vieux-navigateurs-quelle-methode-choisir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android:  Contrôler votre PC à l&#8217;aide de votre portable ou votre tablette.</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/09/03/android-controler-votre-pc-a-laide-de-votre-portable-ou-votre-tablette/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/09/03/android-controler-votre-pc-a-laide-de-votre-portable-ou-votre-tablette/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 14:20:40 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[contrôle]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=511</guid>
		<description><![CDATA[Télécharger le logiciel de communication Télécharger l&#8217;application Android Après 3 à 4 bonnes semaines de travail (environ 40h), j&#8217;ai enfin réussi à terminer une première version de ma toute première application sous Android. Son but est de vous permettre de contrôler votre PC depuis une tablette (de préférence car mieux adaptée qu&#8217;un portable avec un [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.adrien-ruiz.fr/dev/java/Touch Control (beta).jar" target="_blank">Télécharger le logiciel de communication<br />
</a><a href="http://www.adrien-ruiz.fr/dev/java/TouchControlAndroid.apk" target="_blank">Télécharger l&#8217;application Android</a></p>
<p>Après 3 à 4 bonnes semaines de travail (environ 40h), j&#8217;ai enfin réussi à terminer <strong>une première version</strong> de ma toute première application sous Android. Son but est de vous permettre de <strong>contrôler votre PC</strong> depuis <strong>une tablette</strong> (de préférence car mieux adaptée qu&#8217;un portable avec un petit écran). En somme, votre tablette devient <strong>votre souris et votre clavier</strong>.</p>
<p>Pour cela, il faut au préalable lancer un programme sur votre ordinateur (pour le moment <strong>uniquement compatible sous Windows</strong>), qui va permettre de réaliser les échanges PC &lt;&gt; Android. Saisir un identifiant, un mot de passe, et d&#8217;activer les communications.</p>
<p><a href="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/09/touchcontrol.jpg"><img class="aligncenter size-medium wp-image-512" title="touchcontrol" src="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/09/touchcontrol-300x210.jpg" alt="" width="300" height="210" /></a></p>
<p>Ensuite, il ne vous reste plus qu&#8217;à lancer l&#8217;application sous Android et de vous connecter au PC pour lequel nous venons juste d&#8217;activer les communications.</p>
<p>Au début, l&#8217;utilisation peut paraître relativement déroutante car j&#8217;ai pour le moment souhaité aller au plus simple. Lorsque vous déplacerez le pointeur depuis votre tablette, <strong>les mouvements se feront de manière proportionnelle avec la résolution de votre écran</strong>. En clair, le coin supérieur-gauche de votre tablette correspond au coin supérieur-gauche de votre écran, et pour le coté droit, c&#8217;est la même chose.</p>
<p>Pour le clic-gauche, il faut <strong>garder une pression</strong> sur la tablette pour le contrôle du pointeur, et en réaliser une <strong>supplémentaire</strong> pour lancer cette action. Le plus simple est d&#8217;utiliser les deux mains, une pour le contrôle du pointeur (tout comme vous le faites en gardant votre main sur la souris), et une autre pour réaliser les actions (clic-gauche / clic-droit). Le clic-droit quant à lui, est réalisé à l&#8217;aide <strong>d&#8217;une troisième pression supplémentaire</strong>.</p>
<p>Il est aussi possible d&#8217;utiliser <strong>le clavier</strong>, pour cela il suffit d&#8217;aller dans le menu (durant la phase de contrôle) et de l&#8217;activer. Attention, dans cette première version <strong>toutes les touches ne sont pas encore supportées</strong>. Pour l&#8217;instant vous pouvez utiliser les lettres (minuscules et non accentuées), les chiffres, ainsi que les touches espace, entrer et supprimer.</p>
<p>Je ne sais pas encore si je vais continuer le développement, mon objectif étant simplement d&#8217;<strong>apprendre à développer</strong> sous Android par le biais de travaux que je publierai très certainement sur mon blog.</p>
<p><strong>Coté serveur (PC):</strong><br />
Développé avec JAVA, utilise SWT pour l&#8217;interface.</p>
<p><strong>Coté client (Tablette):</strong><br />
Développé en JAVA, API 7 (2.1-update1) de Android.</p>
<p>Les communications sont réalisées en TCP pour garder les connexions ouvertes entre les clients et le serveur, et en UDP pour la phase de contrôle.</p>
<p>Uniquement testé depuis ma tablette ASUS EEE Pad Transformer TF101 et mon Galaxy TEOS, ça devrait normalement fonctionner quasiment partout &#8230; à voir!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/09/03/android-controler-votre-pc-a-laide-de-votre-portable-ou-votre-tablette/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Mise à jour d&#8217;une ListView depuis une AsyncTask</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/08/27/mise-a-jour-dune-listview-depuis-une-asynctask/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/08/27/mise-a-jour-dune-listview-depuis-une-asynctask/#comments</comments>
		<pubDate>Sat, 27 Aug 2011 12:44:23 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[asynchrone]]></category>
		<category><![CDATA[AsyncTask]]></category>
		<category><![CDATA[ListView]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=495</guid>
		<description><![CDATA[Le pas est fait! Je me met doucement au développement d&#8217;applications sous Android, et fort heureusement pour moi, tout se passe avec JAVA! En temps que novice en la matière, j&#8217;ai commencé (tout naturellement) par me documenter, et avant de partager ce tutoriel avec vous, je tiens à remercier http://www.tutomobile.fr/ pour ses nombreux exemples et [...]]]></description>
			<content:encoded><![CDATA[<p>Le pas est fait! Je me met doucement au développement d&#8217;applications sous <strong>Android</strong>, et fort heureusement pour moi, tout se passe avec <strong>JAVA</strong>! En temps que novice en la matière, j&#8217;ai commencé (tout naturellement) par me documenter, et avant de partager ce tutoriel avec vous, je tiens à remercier <a href="http://www.tutomobile.fr/">http://www.tutomobile.fr/</a> pour ses nombreux exemples et explications qui m&#8217;ont permis de débuter sans trop me prendre la tête &#8230; tout y est! Je tiens à préciser qu&#8217;il s&#8217;agit là d&#8217;un simple retour d&#8217;expérience et qu&#8217;il existe peut-être une solution plus adaptée voire plus efficace. N&#8217;hésitez donc pas à me faire vos retours.</p>
<p>Une <strong>ListView</strong> va nous permettre d&#8217;ajouter des éléments en liste au moment de l&#8217;exécution de l&#8217;application, mais lorsqu&#8217;on ne connait ni le nombre ni le contenu de ces derniers, notamment lors de la récupération d&#8217;un flux RSS qu&#8217;on souhaite organiser en liste, le développement peut tenir du parcours du combattant (en moins épuisant &#8230; ouf!).</p>
<p>J&#8217;ai trouvé beaucoup d&#8217;exemples sur internet, mais personnellement, je ne voulais pas bloquer l&#8217;utilisateur avec une boîte de chargement, mon souhait était qu&#8217;il puisse utiliser la liste et son contenu, pendant que cette dernière continue à se remplir tranquillement.</p>
<p>La première étape consiste à définir nos <strong>layouts</strong>: <em>main.xml</em> et <em>listentry.xml</em></p>
<ul>
<li>main.xml correspond au layout principal qui va définir l&#8217;organisation des éléments de notre application (ici juste une liste), et listentry.xml celui des éléments de la liste.</li>
<li>Je ne vais pas expliquer l&#8217;organisation des fichiers XML, tout simplement parce que ce n&#8217;est pas l&#8217;objet de cet article, et surtout parce que d&#8217;autres sites le font déjà très bien (cf: le lien que j&#8217;ai donné en tout début d&#8217;article).</li>
</ul>
<p>Ensuite, il ne nous reste plus qu&#8217;à lier le tout sous JAVA, instancier correctement nos objets et lancer la récupération de notre contenu de manière totalement <strong>asynchrone</strong>. Pour cela, nous allons utiliser <strong>AsyncTask</strong>, qui a pour principale fonction de lancer un processus en tâche de fond sans pour autant bloquer le thread principal qui gère l&#8217;application. En somme, si les traitements sont longs, l&#8217;application ne sera pas bloquée.</p>
<p>Voici le profil de la classe que j&#8217;utilise pour mes besoins qui hérite de <strong>AsyncTask</strong>.</p>
<pre name="code" class="java">private class CAsyncTask extends AsyncTask&lt;Void, Void, Void&gt; {
    protected Void doInBackground (Void... unused);
    protected void onPostExecute (final Void unused);
} // CAsyncTask ();</pre>
<p><strong>doInBackground</strong>  parle d&#8217;elle-même, c&#8217;est ici que nous allons réaliser nos traitements susceptibles de prendre du temps.</p>
<p><strong>onPostExecute</strong> sera automatiquement appelée lorsque la tâche aura terminée ses traitements.</p>
<p>Pour plus d&#8217;infos, je vous conseille d&#8217;aller jetter un petit coup d&#8217;oeil par ici : <a href="http://developer.android.com/reference/android/os/AsyncTask.html">http://developer.android.com/reference/android/os/AsyncTask.html</a></p>
<p>Pour terminer il est important de noter qu&#8217;on ne peut pas modifier les éléments du thread principal sans en avoir l&#8217;autorisation, vous ne montez pas dans une voiture alors qu&#8217;elle roule à vive allure (&#8230; j&#8217;éspère), ici c&#8217;est un peu la même chose. Afin de pouvoir modifier la liste pour y ajouter des éléments, il va falloir faire appel à la méthode <strong>runOnUiThread</strong> de notre <strong>Activity</strong> qui attend en paramètre un objet de type <strong>Runnable</strong>.</p>
<pre name="code" class="java">activity.runOnUiThread (new Runnable () {
    public void run () {
        HashMap&lt;String, String&gt; map = new HashMap&lt;String, String&gt; ();
        map.put ("title", it);
        map.put ("description", "Pause de "+ sleep + " ms");
        listItem.add (map);
        adapter.notifyDataSetChanged ();
    } // run ();
});</pre>
<p>Et voilà! Notre liste se met gentillement à jour sans bloquer l&#8217;utilisation de l&#8217;application avec une boite de chargement.</p>
<p><a href="http://www.adrien-ruiz.fr/dev/tuto-java/ListViewAsync.zip">Télécharger les sources</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/08/27/mise-a-jour-dune-listview-depuis-une-asynctask/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d&#8217;un datatype (1ère partie)</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/07/02/creation-dun-datatype-1ere-partie/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/07/02/creation-dun-datatype-1ere-partie/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 13:15:06 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[eZ Publish]]></category>
		<category><![CDATA[PHP / JS / CSS]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[ezpublish]]></category>
		<category><![CDATA[fonction]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=448</guid>
		<description><![CDATA[Tout comme en POO, les classes de contenu sous eZ sont composées d&#8217;attributs typés, on les appelle les datatypes. Il faut savoir que la plateforme en propose nativement un certain nombre qui répondront dans près de 90% des cas à vos besoins. Lorsqu&#8217;il devient nécessaire de créer un contenu à l&#8217;aide d&#8217;une classe eZ, on [...]]]></description>
			<content:encoded><![CDATA[<p>Tout comme en <a href="http://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_objet" target="_blank">POO</a>, les classes de contenu sous eZ sont composées d&#8217;attributs typés, on les appelle les datatypes. Il faut savoir que la plateforme en propose nativement un certain nombre qui répondront dans près de 90% des cas à vos besoins. Lorsqu&#8217;il devient nécessaire de créer un contenu à l&#8217;aide d&#8217;une classe <strong>eZ</strong>, on parle d&#8217;objet <strong>eZ</strong>, nos datatypes deviennent alors des champs à remplir ou des utilitaires beaucoup plus complex (éditeurs de texte riche wysiwyg, matrices etc&#8230;).</p>
<p>Pour plus de clarté dans mon article, les classes et objets créés depuis la plateforme seront suivis par un <strong>eZ</strong>, en revanche, lorsque je parlerai de classe ou d&#8217;objet PHP, il n&#8217;y aura pas de distinction particulière.</p>
<p>Pour la création d&#8217;un datatype, il est donc important de dissocier ce principe de classes/objets <strong>eZ</strong>, car en PHP, un datatype c&#8217;est une classe composée de plusieurs méthodes regroupant tous les traitements qu&#8217;il pourra rencontrer tout au long de son utilisation aussi bien coté classe que objet <strong>eZ</strong>.</p>
<p>Pour illustrer cet article, j&#8217;ai décidé de développer un exemple vraiment très basique utilisant la Google Map. Lors de la création d&#8217;un objet <strong>eZ</strong>, l&#8217;utilisateur pourra choisir un point à positionner sur la carte, les coordonnées seront enregistrées en base pour une utilisation coté front (pas développée dans cette première partie).</p>
<h2>Création de l&#8217;arborescence de l&#8217;extension</h2>
<p>Tout d&#8217;abord, nous devons créer l&#8217;arborescence de notre extension, à suivre scrupuleusement pour éviter tout problème d&#8217;exécution! Attention au nom que vous donnerai à votre extension, il faut absoluement éviter qu&#8217;il entre en conflit avec celui d&#8217;une autre extension. Le mieux est de choisir un préfixe que vous utiliserez dans toutes celles que vous développerez à l&#8217;avenir. Pour notre exemple j&#8217;ai choisi gmapv3.</p>
<p><a href="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/06/gmapv3-arbo.jpg"><img class="aligncenter size-full wp-image-451" title="gmapv3-arbo" src="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/06/gmapv3-arbo.jpg" alt="" width="180" height="217" /></a></p>
<p>Les dossiers ne sont volontairement pas dépliés, comme vous pouvez le constater, on trouve à une exception près les mêmes répertoires que vous avez très certainement déjà rencontrés lors du développement d&#8217;un projet lambda. Et pour cause, une extension peut nécessiter l&#8217;utilisation de CSS, de JavaScript et même d&#8217;images, alors pourquoi changer la logique organisationnelle quand elle marche si bien.</p>
<h3>Les fichiers de configuration</h3>
<p>Il faut commencer par créer les fichiers <strong>content.ini.append.php</strong> et <strong>design.ini.append.php</strong> dans le repertoire <strong>settings</strong>, ajoutez-y respectivement les lignes suivantes:</p>
<p><strong>content.ini.append.php</strong></p>
<pre>&lt;?php /* #?ini charset="utf-8"?

[DataTypeSettings]
ExtensionDirectories[]=gmapv3
AvailableDataTypes[]=gmapv3

*/ ?&gt;</pre>
<p>Ici on indique à la plateforme le chemin vers notre extension, en précisant que dans notre cas, elle contiendra un datatype. Et oui, une extension n&#8217;est pas qu&#8217;un datatype, elle peut contenir des modules, des template operators et bien plus encore!</p>
<p><strong>design.ini.append.php</strong></p>
<pre>&lt;?php /* #?ini charset="utf-8"?

[ExtensionSettings]
DesignExtensions[]=gmapv3

[StylesheetSettings]
CSSFileList[]=gmapv3.css

[JavaScriptSettings]
JavaScriptList[]=jquery-1.6.1.js
JavaScriptList[]=gmapv3.js

*/ ?&gt;</pre>
<p>Dans ce fichier, on informe eZ que notre extension va nécessité l&#8217;utilisation de templates, et de surcroît qu&#8217;elle aura besoin de charger des feuilles de style et du JavaScript pour fonctionner correctement.</p>
<p>Pour terminer, il suffira de créer deux fichiers PHP dans le répertoire <strong>datatypes/gmapv3</strong>: <strong>gmapv3.php</strong> et <strong>gmapv3type.php</strong>. La classe CGmapv3Type (gmapv3type.php) doit impérativement dérivée de eZDataType, de ce fait, elle sera utilisée comme un datatype grâce à la surcharge de certaines méthodes. Pour ce qui est de CGmapv3, elle nous permettra d&#8217;interagir coté template (en frontend), pour en extraire aisément les valeurs stockées (latitude et longitude), nous verrons un peu plus en détail son fonctionnement dans la suite de cet article.</p>
<h2>Un peu d&#8217;intégration</h2>
<p>Le template utilisé par l&#8217;objet <strong>eZ</strong> sera à placer dans le répertoire <strong>template/content/datatype/edit/</strong> et devra porter le nom du datatype en cours de développement (<strong>gmapv3.tpl</strong>).  Ce dernier se compose de deux champs de saisie de type hidden qui  contiendront les coordonnées qui seront mises à jour lorsque l&#8217;utiliseur positionnera son pointeur sur la carte, et d&#8217;un morceau de code JavaScript nécessaire  pour instancier et utiliser la Google Map dans un conteneur HTML. Je ne vais  pas aborder le déroulement du code, mais j&#8217;invite les plus curieux  d&#8217;entre-vous à jeter un coup d&#8217;œil au script (au sens figuré) même s&#8217;il  n&#8217;a rien de bien extraordinaire (merci à <a href="http://code.google.com/intl/fr/apis/maps/documentation/javascript/basics.html" target="_blank">l&#8217;API de Google</a> très bien documentée et illustrée d&#8217;exemples!).</p>
<p>Les deux champs de saisi doivent porter un nom correctement  composé, sans quoi, il deviendrait impossible d&#8217;en récupérer les  valeurs surtout si nous souhaitons créer une classe de contenu <strong>eZ </strong>avec deux attributs de type gmapv3. La meilleure méthode reste celle proposée par la plateforme dans tous ses datatypes, en ajoutant préfixe et suffixe à la valeur des noms que nous souhaitons donner à nos input: <strong> </strong></p>
<pre>&lt;input type="hidden" name="{$attribute_base}_gmapv3_lat_{$attribute.id}" ... /&gt;
&lt;input type="hidden" name="{$attribute_base}_gmapv3_lng_{$attribute.id}" ... /&gt;</pre>
<p>De la sorte, on s&#8217;assure de garder une unicité avec le reste des attributs de l&#8217;objet <strong>eZ</strong>.</p>
<h2>Développement du datatype</h2>
<h3>La classe CGmapv3Type</h3>
<p>Puisque notre classe hérite de eZDataType, vous vous doutez bien qu&#8217;il y aura des méthodes à surcharger qui seront utilisées par le système. Pour ce tutoriel, nous allons uniquement nous interesser à son développement coté objet <strong>eZ</strong>. Pour ce faire, nous aurons besoin d&#8217;utiliser les méthodes suivantes:</p>
<p><strong>public function objectAttributeContent ($contentAttribute);</strong></p>
<p>Le paramètre $contentAttribute est un objet de type <a href="http://pubsvn.ez.no/doxygen/4.0/html/classeZContentObjectAttribute.html" target="_blank">eZContentObjectAttribute</a>, et comme <a title="Tout est objet … et on ne s’en plaint pas!" href="http://www.adrien-ruiz.fr/blog/2011/03/26/notion-objets/">sous eZ tout est objet</a>, tous sont identifiés par un ID, l&#8217;objet est automatiquement passé par la plateforme, il nous appartient de l&#8217;utiliser correctement pour nos besoins. Notez que l&#8217;objet PHP <strong>$contentAttribute</strong> correspond à l&#8217;attribut de l&#8217;objet <strong>eZ </strong>de type gmapv3 en cours d&#8217;utilisation.</p>
<p>Cette méthode doit retourner un objet ou directement le contenu stocké. Pour un eZString, c&#8217;est la chaine de caractères qui sera retournée, pour des datatypes légèrement plus compliqués, il est préférable d&#8217;utiliser un objet que nous verrons plus loin dans le tutoriel, il s&#8217;agit de la classe CGmapv3.</p>
<p>Cette méthode sera appelée à divers moment du code, notamment lorsque vous ferez appel à $contentAttribute-&gt;content (); mais aussi dans vos templates coté front par exemple où {$node.data_map[gmapv3].content} retournera l&#8217;objet CGmapv3 instancié avec les bonnes valeurs (latitude et longitude).</p>
<p><strong>public function validateObjectAttributeHTTPInput ($http, $base, $contentAttribute);</strong></p>
<ul>
<li>$http va nous permettre de récupérer les valeurs passées par le fomulaire à l&#8217;aide de la méthode POST ;</li>
<li> $base contient le début de l&#8217;attribute name qu&#8217;il faudra utiliser dans le template ;</li>
<li>$contentAttribute, tout comme la méthode objectAttributeContent correspondra à un objet PHP de l&#8217;attribut de type gmapv3 de l&#8217;objet <strong>eZ</strong> courant.</li>
</ul>
<p>Cette méthode a pour unique but de retourner un état de validation des valeurs qui ont été transmises par le formulaire. Dans notre cas, les données à enregistrer doivent impérativement être des flottants. Le cas échéant, l&#8217;utilisateur en sera informé par un message d&#8217;erreur, et aucune donnée ne sera enregistrée pour être publiée. Elle est donc appelée avant fetchObjectAttributeHTTPInput que nous utiliserons pour la sauvegarde des données en base.</p>
<p><strong>public function fetchObjectAttributeHTTPInput ($http, $base, $contentAttribute);</strong></p>
<p>Les paramètres sont identiques à ceux de la méthode validateObjectAttributeHTTPInput. Dans notre exemple, elle est appelée en dernier par le système même si la méthode de validation retourne une erreur.</p>
<p>C&#8217;est ici que nous allons récupérer les valeurs du formulaire pour les enregistrer en base, et pour cela eZ met à notre disposition le champ <strong>data_text</strong>. Je ne vais pas expliquer de quelle façon tout est stocké et ni-même dans quelle table, tout d&#8217;abord parce que ce n&#8217;est pas l&#8217;objet de cet article, mais surtout parce qu&#8217;il serait trop long de le faire ici. Pour information, sachez que vous disposez en réalité de 3 champs: data_int, data_float et data_text. Il n&#8217;est pas nécessaire de les utiliser tous les trois, mais il est important de souligner leur existance, car si vous êtes curieux et que vous avez déjà parcouru le code de certains datatypes natifs du système, vous vous apercevrez très vite que eZString utilise data_text, eZInteger data_int, et d&#8217;autres peuvent utiliser 2 voire 3 de ces champs, ça dépend donc de ce que vous aurez besoin de stocker et surtout de quelle manière vous souhaiterez le faire&#8230; alors comment stocker une latitude et une longitude ? En structurant vos données avant de les enregistrer dans le champ <strong>data_text</strong>. Je ne sais pas réellement pourquoi, mais chez eZ, c&#8217;est le XML qui est utilisé dans je pense 100% des cas (je ne suis pas allé vérifier), mais rien ne vous empêche de sérialiser un tableau! Et c&#8217;est précisément ce que je vais faire dans mon exemple. Du coup, notre champ <strong>data_text</strong> contiendra des données facilement exploitables!</p>
<p>Avant d&#8217;enregistrer quoi que ce soit, il est d&#8217;abord nécessaire de récupérer les valeurs transmises par le formulaire:</p>
<pre name="code" class="php">$id = $contentAttribute-&gt;attribute ('id');

$gmapv3 = $contentAttribute-&gt;content ();
$gmapv3-&gt;setLat ($http-&gt;postVariable ($base.'_gmapv3_lat_'.$id));
$gmapv3-&gt;setLng ($http-&gt;postVariable ($base.'_gmapv3_lng_'.$id));
</pre>
<p>Comme je l&#8217;expliquais plus tôt dans l&#8217;article, $contentAttribute contient tout ce dont nous avons besoin pour interagir avec les différentes couches du système.</p>
<ul>
<li>$contentAttribute-&gt;attribute (&#8216;id&#8217;) retourne l&#8217;identifiant de l&#8217;attribut de l&#8217;objet <strong>eZ</strong> de type gmapv3 courant;</li>
<li>$contentAttribute-&gt;content () retourne un objet de type CGmapv3 (voir la méthode objectAttributeContent).</li>
</ul>
<p>Pour terminer il ne nous reste plus qu&#8217;a sérialiser le tout pour le stocker en base dans le champ <strong>data_text</strong>:</p>
<pre>$contentAttribute-&gt;setAttribute ('data_text', $gmapv3-&gt;encode ());</pre>
<h3>La classe CGmapv3</h3>
<pre name="code" class="php">class CGmapv3 {

  private $lat, $lng;

  public function attributes ();
  public function hasAttribute ($name);
  public function attribute ($name);

  public function encode ();
  public function decode ($str);

  public function getLat ();
  public function getLng ();

  public function setLat ($lat);
  public function setLng ($lng);

}; // CGmapv3;
</pre>
<p>Les 3 méthodes suivantes seront nécessaires pour le moteur de template, en effet, comment connaitre le nom des propriétés à récupérer depuis un template si on ne l&#8217;indique pas à la plateforme.</p>
<ul>
<li>public function attributes ();</li>
<li>public function hasAttribute ($name);</li>
<li>public function attribute ($name);</li>
</ul>
<p>La méthode attribute nécessite une attention particulière. En effet, c&#8217;est elle qui aura pour lourde tâche de retourner une valeur lorsque cela sera nécessaire, notamment dans nos templates. Pour récupérer par exemple la latitude, vous aurez besoin de faire {$node.data_map[gmpav3].content.lat}. Rappelez-vous, content est un objet de type CGmapv3 et eZ peut retourner l&#8217;attribut <strong>lat</strong> uniquement parce qu&#8217;il en a eu connaissance à un moment du code, tout dabord parce que vous le lui avez indiqué via la méthode attributes qui retourne un tableau contenant le nom des attributs potentiellement accessibles, et ensuite parce que vous retournez une valeur depuis la méthode attribute:</p>
<pre name="code" class="php">public function attribute ($name) {
  switch ($name) {
    case 'lat': return $this-&gt;getLat ();
    case 'lng': return $this-&gt;getLng ();
  }
  eZDebug::writeError (
    "Attribute '$name' does not exist",
    'CGmapv3::attribute'
  );
  return null;
} // attribute ();
</pre>
<h2>Pour conclure</h2>
<p>Le développement d&#8217;un datatype nécessite de bonnes bases en POO sans quoi il serait difficile de comprendre le mécanisme d&#8217;héritage et de surcharge. Cela dit, ce type de développement mérite une attention particulière sur le déroulement du processus où il est important de comprendre pourquoi et à qu&#8217;elle moment les méthodes sont susceptibles d&#8217;être appelées. Pour le moment, je me suis attaqué uniquement à la partie objet <strong>eZ</strong> du datatype. Dans un prochain article, nous traiterons la partie classe <strong>eZ</strong>, où nous pourrons paramétrer certaines fonctionnalités de la Google Map comme le niveau de zoom, le type d&#8217;affichage etc&#8230;</p>
<p>N&#8217;oubliez pas d&#8217;activer l&#8217;extension en l&#8217;indiquant dans votre fichier <strong>settings/overrides/site.ini.append.php</strong> en ajoutant la ligne suivante à la section [ExtensionSettings]:</p>
<pre>ActiveExtensions[]=gmapv3</pre>
<p>sans oublier de régénérer l&#8217;autoload pour qu&#8217;elle soit correctement prise en compte:</p>
<pre>./bin/php/ezpgenerateautoloads.php -e</pre>
<p><a href="http://www.adrien-ruiz.fr/dev/ezpublish/datatype/gmapv3/gmapv3-partie1.rar" target="_blank">Télécharger les sources</a></p>
<div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 143px; width: 1px; height: 1px; overflow: hidden;">content.ini.append.php</div>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/07/02/creation-dun-datatype-1ere-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fonctionnement d&#8217;une surcharge</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/04/20/fonctionnement-dune-surcharge/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/04/20/fonctionnement-dune-surcharge/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 18:57:46 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[eZ Publish]]></category>
		<category><![CDATA[PHP / JS / CSS]]></category>
		<category><![CDATA[ezpublish]]></category>
		<category><![CDATA[overrides]]></category>
		<category><![CDATA[surcharge]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=380</guid>
		<description><![CDATA[Je vais aborder dans ce tout nouvel article le mode de fonctionnement des surcharges de template adopté par eZ Publish. Nous verrons qu&#8217;il existe trois principaux cas de figure: la surcharge des templates par défauts (ou standards) ; la création d&#8217;un template pour la vue d&#8217;une nouvelle classe de contenu ; la surcharge de vos [...]]]></description>
			<content:encoded><![CDATA[<p>Je vais aborder dans ce tout nouvel article le mode de fonctionnement des surcharges de template adopté par eZ Publish. Nous verrons qu&#8217;il existe trois principaux cas de figure:</p>
<ul>
<li>la surcharge des templates par défauts (ou standards) ;</li>
<li>la création d&#8217;un template pour la vue d&#8217;une nouvelle classe de contenu ;</li>
<li>la surcharge de vos propres templates.</li>
</ul>
<p>Pour ces trois points, le développement d&#8217;un template (avec les <a href="http://doc.ez.no/eZ-Publish/Technical-manual/3.6/Reference/Template-operators" target="_blank">template operators</a>) est identique, mais dans bien des cas, nous verrons qu&#8217;il faudra impérativement modifier un fichier de configuration dédié à ce type d&#8217;entreprise.</p>
<h2>Point sur l&#8217;arborescence</h2>
<p>Il est important de bien comprendre l&#8217;arborescence du répertoire design, car c&#8217;est dans ce dernier que vous passerez la majorité de votre temps de développement!</p>
<p><a href="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/04/path.png"><img class="aligncenter size-medium wp-image-385" title="path" src="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/04/path-115x300.png" alt="Arborescence d'un projet eZ Publish" width="115" height="300" /></a>L&#8217;arborescence qui vous est présentée ci-dessus sera très certainement différente de la vôtre, tout simplement parce que chaque projet est différent, et qu&#8217;il n&#8217;est jamais nécessaire de surcharger tous les templates par défauts. Dans cet exemple, les répertoires nommés &laquo;&nbsp;standard&nbsp;&raquo; et &laquo;&nbsp;website&nbsp;&raquo; sont tous deux des enfants directs du répertoire &laquo;&nbsp;design/&nbsp;&raquo;. Ainsi, tous vos templates devront être créés, soit dans le répertoire &laquo;&nbsp;webiste/templates/&nbsp;&raquo;, soit dans &laquo;&nbsp;website/override/templates/&nbsp;&raquo;.</p>
<p>Quelle est la différence alors ? C&#8217;est justement ce que nous allons voir.</p>
<h2>La surcharge des templates standards</h2>
<p>eZ Publish vous propose un grand nombre de templates par défauts dits &laquo;&nbsp;standards&nbsp;&raquo;. Ils sont tous stockés dans le même répertoire et facilement identifiables par le nom qu&#8217;ils portent. Prenons pour exemple le fichier &laquo;&nbsp;standard/template/pagelayout.tpl&nbsp;&raquo; (pas visible dans l&#8217;arborescence du dessus), il s&#8217;agit du template général de mise en page qui contiendra dans 90% des cas la structure même de votre site, le DOCTYPE, les balises head, body ect&#8230; vous pouvez le comparer à un fichier d&#8217;index, c&#8217;est en quelque sorte le point d&#8217;entrée de votre site internet.</p>
<p>Comme vous pouvez le voir sur l&#8217;image ci-dessus, un fichier de même nom se trouve aussi dans le répertoire &laquo;&nbsp;website/templates/&nbsp;&raquo;, il s&#8217;agit là de notre propre template, et c&#8217;est ainsi qu&#8217;eZ Publish va le prendre en compte pour laisser de coté celui par défaut. On parle alors de surcharge ou d&#8217;écrasement car il va tout simplement être utilisé prioritairement à celui proposé par la plateforme. Notez qu&#8217;il est fortement déconseillé de modifier un template standard, procédez ainsi lorsque vous aurez besoin d&#8217;utiliser un template existant qui ne répond pas complètement à vos attentes.</p>
<h2>Création d&#8217;un nouveau template</h2>
<p>La création d&#8217;un nouveau template intervient lorsqu&#8217;il est nécessaire d&#8217;afficher la vue d&#8217;une classe de contenu. Nous allons prendre pour exemple le développement simple d&#8217;un template de page type contenant les attributs suivants:</p>
<ul>
<li>Nom (name) de type chaine de caractères ;</li>
<li>Nom court (short name) de type chaine de caractères facultative ;</li>
<li>Description court (short_description) de type bloc de texte facultatif;</li>
<li>Corps (body) de type bloc de texte riche.</li>
</ul>
<p>Après avoir créé la classe de contenu depuis le backend de votre site internet [Administration &gt; Classes &gt; Content &gt; Nouvelle classe] (cf le schéma ci-dessous), il devient nécessaire d&#8217;en faire un template et d&#8217;indiquer au système quel fichier utiliser pour afficher sa vue lorsque nécessaire.</p>
<p><a href="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/04/creation-classe-ez.jpg"><img class="aligncenter size-medium wp-image-391" title="creation-classe-ez" src="http://www.adrien-ruiz.fr/blog/wp-content/uploads/2011/04/creation-classe-ez-300x174.jpg" alt="" width="300" height="174" /></a></p>
<p>Voici le template de la vue &laquo;&nbsp;full&nbsp;&raquo; (pleine page) de notre page type:</p>
<pre>&lt;h1&gt;{$node.data_map['name'].content|wash()}&lt;/h1&gt;
{attribute_view_gui attribute = $node.data_map['body']}</pre>
<p>Comme vous pouvez le constater ici, rien de bien compliqué, notre h1 va contenir le titre de la page, et le corps quand a lui sera affiché à l&#8217;aide de &laquo;&nbsp;attribute_view_gui&nbsp;&raquo;. Pour le moment, vous pouvez le voir comme un raccourci syntaxique, on aurait très bien pu écrire {$node.data_map['body'].content|wash()}, mais attribute_view_gui va faire appel à un template tout comme celui-ci, qui pourrait être beaucoup plus complexe et terme de traitement. Ça sera notamment le cas lorsqu&#8217;il faudra afficher les champs d&#8217;un formulaire de contact (article à venir). Ce fichier (template) sera à mettre dans le répertoire &laquo;&nbsp;website/override/templates/full/&nbsp;&raquo; et devra, pour notre exemple, porter le nom &laquo;&nbsp;page.tpl&nbsp;&raquo;.</p>
<p>La dernière étape consiste à modifier le fichier de configuration &laquo;&nbsp;/settings/website/overrides.ini.append.php&nbsp;&raquo; afin d&#8217;indiquer au système quel fichier utiliser pour l&#8217;affichage de notre vue. Pour cela, il suffit d&#8217;ajouter les lignes suivantes:</p>
<pre>[page]
# Source de la surcharge, toutes les vues pleines (full) font appel à ce template.
source=node/view/full.tpl
# Fichier qui sera utilisé en surcharge.
MatchFile=full/page.tpl
# Répertoire racine.
Subdir=templates
# Condition à respecter pour utiliser ce template, page correspond au
# nom donné à la classe de contenu lors de sa création.
Match[class_identifier]=page</pre>
<p>Pour terminer, en backend, il ne vous reste plus qu&#8217;à créer votre page sous le noeud &laquo;&nbsp;Accueil&nbsp;&raquo; et de vider votre cache pour que les modifications apportées à votre fichier de configuration soient bien prises en compte!</p>
<h2>Surcharge de vos propres templates</h2>
<p>Le dernier point qui me semble important de souligner reste celui de la surcharge de vos propres templates. Prenons pour exemple un site avec une colonne latérale composée de plusieurs blocs (le coté a peu d&#8217;importance). Admettons que vous souhaitez afficher dans cette dernière 2 blocs en accueil puis 3 sur le reste du site, pour cela, la surcharge de template répondra parfaitement à nos besoins. En effet, un site contient toujours qu&#8217;une seule page d&#8217;accueil, alors pourquoi ne pas s&#8217;en servir comme référence pour notre surcharge ?</p>
<p>Tout d&#8217;abord, vous aurez besoin de créer votre template de colonne à 3 blocs dans le répertoire &laquo;&nbsp;website/templates/&nbsp;&raquo; portant le nom &laquo;&nbsp;colonne.tpl&nbsp;&raquo; par exemple. Ce fichier devra être inclus depuis un autre template à l&#8217;endroit où vous souhaitez que votre colonne apparaisse dans votre code HTML:</p>
<pre>{include uri="design:colonne.tpl"}</pre>
<p>A cet instant précis, le site contiendra toujours une colonne à 3 blocs, même en page d&#8217;accueil, c&#8217;est alors qu&#8217;entre en jeu la surcharge. On commence par créer un fichier de même nom (plus simple pour l&#8217;exemple, mais vous pouvez très bien le nommer comme bon vous semble) qu&#8217;on placera dans le répertoire &laquo;&nbsp;website/override/templates/&nbsp;&raquo;. Enfin, il ne nous reste plus qu&#8217;à indiquer au système dans quel cas utiliser notre template de colonne à 2 blocs! Pour cela, il suffit simplement d&#8217;ajouter la section suivante dans votre fichier de configuration (/settings/website/overrides.ini.append.php):</p>
<pre>[page]
 # Chemin vers le fichier source à surcharger (indiquer le chemin
 # complet si nécessaire /MON/REPERTOIRE/TEMPLATE.TPL).
 source=colonne.tpl
 # Chemin du fichier utilisé pour la surcharge (indiquer le chemin
 # complet si nécessaire /MON/REPERTOIRE/TEMPLATE.TPL).
 MatchFile=colonne.tpl
 # Nom du répertoire contenant la surcharge.
 Subdir=templates
 # Condition à respecter pour prendre en compte notre surcharge,
 # ici on attend que l'identifiant du nœud soit 2 (homepage).
 Match[node_id]=2</pre>
<p>Après avoir vidé le cache, un petit rafraichissement de notre page d&#8217;accueil s&#8217;impose pour voir que désormais notre colonne contient 2 blocs, et 3 sur le reste du site.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/04/20/fonctionnement-dune-surcharge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tout est objet &#8230; et on ne s&#8217;en plaint pas!</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/03/26/notion-objets/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/03/26/notion-objets/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 13:13:02 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[eZ Publish]]></category>
		<category><![CDATA[PHP / JS / CSS]]></category>
		<category><![CDATA[éditeur]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[ezpublish]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=349</guid>
		<description><![CDATA[Ce nouveau post est une suite logique à mon premier article décrivant, après quelques semaines d&#8217;utilisation, mes impressions sous eZ Publish. Il peut être intéressant de le lire, surtout si vous ne connaissez pas encore l&#8217;outil ou que vous êtes entrain de le découvrir. Ici, je vais aborder certains points techniques pouvant vous aider à [...]]]></description>
			<content:encoded><![CDATA[<p>Ce nouveau post est une suite logique à mon premier article décrivant, après quelques semaines d&#8217;utilisation, <a title="eZ Publish : premières impressions" href="http://www.adrien-ruiz.fr/blog/2011/03/23/ez-publish-premieres-impressions/">mes impressions sous eZ Publish</a>. Il peut être intéressant de le lire, surtout si vous ne connaissez pas encore l&#8217;outil ou que vous êtes entrain de le découvrir. Ici, je vais aborder certains points techniques pouvant vous aider à appréhender l&#8217;organisation même du framework.</p>
<p>Sous eZ Publish l&#8217;arborescence de vos projets s&#8217;organisera toujours autour de <strong>nœuds</strong>. Tout comme sur votre OS favori, un nœud pourra prendre la forme d&#8217;un répertoire ou d&#8217;un fichier qui sera alors appelé un <strong>objet</strong>. Un objet ne peut exister sans nœud, et c&#8217;est pourquoi un nœud fera toujours référence à un objet grâce à son id. Ces notions sont très importantes à assimiler car lors de vos futurs développements vous vous apercevrez très vite que toutes vos vues s&#8217;organiseront toujours autour de ces nœuds. Et mes <strong>classes de contenu</strong> alors ? Par abus de langage, un objet est une classe, à la différence qu&#8217;un objet existe sous un nœud (il a été créé), et qu&#8217;une classe n&#8217;est rien d&#8217;autre qu&#8217;un modèle de données.</p>
<p>Pour schématiser ces notions:</p>
<ul>
<li>Accueil
<ul>
<li>Rubrique 1</li>
<li>Rubrique 2</li>
<li>Page</li>
</ul>
</li>
</ul>
<p>Accueil est un nœud d&#8217;id 2, on l&#8217;appelle le <strong>RootNode</strong> car c&#8217;est le nœud le plus haut dans votre arborescence, il est normalement impossible de le supprimer et il existe par défaut. Ce nœud fait référence à un objet de type homepage, et si vous avez suivi jusqu&#8217;à présent, homepage est une classe de contenu. Un nœud ou plus précisément une classe de contenu pourra adopter le comportement de conteneur, c&#8217;est le cas de notre RootNode capable de contenir des enfants (Rubrique 1, Rubrique 2 etc&#8230;). Ce comportement sera à signaler lors de la création/modification de vos classes de contenu en cochant simplement la case <strong>conteneur</strong>. De ce fait, même un objet de type page pourra avoir des enfants!</p>
<ul>
<li>Un noeud est représenté par son <strong>node_id</strong> et fait référence à un objet grâce à son <strong>object_id</strong> ;</li>
<li>Un objet est représenté par son <strong>object_id</strong> et fait référence à une classe par son <strong>class_id</strong> ;</li>
<li>Une classe de contenu est représentée par son <strong>class_id</strong>, c&#8217;est un modèle de données constitué d&#8217;un ou plusieurs attributs typés (ligne de texte, bloc de texte, champ mail, bloc XML etc&#8230;), on les appelle datatypes.</li>
</ul>
<p>Si vous voulez aller plus loin, sachez que même les datatypes ont un id, donc lorsque vous allez créer les différents attributs qui composeront vos futurs classes de contenu, ils se verront attribuer un identifiant unique. Pour le moment je ne suis pas suffisamment expérimenté dans ce domaine pour vous apporter plus de précisions, mais sachez qu&#8217;il est tout a fait possible de créer vos propres datatypes (en PHP). Ce qui montre bien une fois encore que vous pourrez réellement faire ce que vous voulez avec eZ Publish.</p>
<p>Pour les rubriques et les pages, le raisonnement reste identique en tout point, une classe de contenu pourra être utilisée dans un ou plusieurs nœuds. Il n&#8217;y a en théorie aucune limite, vous avez la possibilité d&#8217;en créer autant que nécessaire, sans même vous soucier de l&#8217;impact que cela pourrait avoir sur votre site et sa gestion &#8230; si ce n&#8217;est son ergonomie, mais là c&#8217;est une autre histoire!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/03/26/notion-objets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eZ Publish : premières impressions</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/03/23/ez-publish-premieres-impressions/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/03/23/ez-publish-premieres-impressions/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 19:52:54 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[eZ Publish]]></category>
		<category><![CDATA[PHP / JS / CSS]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[éditeur]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[ezpublish]]></category>
		<category><![CDATA[optimiser]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wysiwyg]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=258</guid>
		<description><![CDATA[Voilà plus de deux mois que j&#8217;utilise eZ Publish pour les projets qui me sont confiés chez Metycea et je n&#8217;ai pas résisté à l&#8217;envie de partager mes premières impressions. Pour plus d&#8217;informations sur l&#8217;outil, n&#8217;hésitez pas à consulter le site officiel de l&#8217;éditeur : http://ez.no/fr/ Une première approche Le CMS peut paraître relativement indigeste [...]]]></description>
			<content:encoded><![CDATA[<p>Voilà plus de deux mois que j&#8217;utilise eZ Publish pour les projets qui me sont confiés chez <a href="http://www.agence-metycea.com/" target="_blank">Metycea</a> et je n&#8217;ai pas résisté à l&#8217;envie de partager mes premières impressions. Pour plus d&#8217;informations sur l&#8217;outil, n&#8217;hésitez pas à consulter le site officiel de l&#8217;éditeur : <a href="http://ez.no/fr/" target="_blank">http://ez.no/fr/</a></p>
<h2>Une première approche</h2>
<p>Le CMS peut paraître relativement indigeste pour un grand nombre de développeurs non-avertis, tout simplement parce qu&#8217;eZ Publish c&#8217;est avant tout des centaines de fichiers et de dossiers&#8230; très bien organisés! Rassurez-vous, avec le temps on fini par s&#8217;y retrouver très facilement, d&#8217;autant plus que lors d&#8217;un développement lambda, vous passerez près de 90% de votre temps dans ces deux répertoires :</p>
<ul>
<li>design: contient ce qui touche de près comme de loin à l&#8217;élaboration de vos pages (html, css, js, images etc&#8230;) ;</li>
<li>settings: fichiers de configurations (.ini).</li>
</ul>
<p>Il faut savoir qu&#8217;eZ Publish fonctionne en <a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur" target="_blank">Modèle-Vue-Contrôleur</a>, où toutes les vues seront des templates facilement personnalisables à l&#8217;aide de surcharges (selon les cas) définies dans un fichier de configuration bien spécifique. Notez que cette logique s&#8217;applique aussi-bien en front qu&#8217;en backend.</p>
<h2>Sous eZ Publish, tout est objet</h2>
<p>La force du CMS réside dans sa conception même. Admettons que vous souhaitez créer un template de page simple qui comporte un titre principal, une description courte et un corps.</p>
<p>Pour commencer, il suffira de vous rendre dans le manager et d&#8217;y créer une <strong>classe</strong> de contenu nommée &laquo;&nbsp;page&nbsp;&raquo; (<strong>son type</strong>) composée des <strong>attributs</strong> cités précédemment (name, description, body) eux aussi typés (ligne de texte, bloc de texte, éditeur <a href="http://fr.wikipedia.org/wiki/What_you_see_is_what_you_get" target="_blank">wysiwyg</a>). On remarque une forte analogie avec le modèle objet des langages de programmation, c&#8217;est normal puisqu&#8217;il s&#8217;agit réellement d&#8217;une classe comme vous avez très certainement l&#8217;habitude d&#8217;en créer en PHP ou en JAVA. Ensuite, lors de l&#8217;intégration, il faudra simplement créer un fichier page.tpl (dossier design) qui réalise les différents traitements (à l&#8217;aide de <a href="http://doc.ez.no/eZ-Publish/Technical-manual/3.6/Reference/Template-operators" target="_blank">templates operators</a>) pour l&#8217;affichage de nos différents éléments (les attributs cités plus haut). Pour terminer, vous aurez besoin d&#8217;indiquer à la plateforme quel template utiliser pour les objets de type &laquo;&nbsp;page&nbsp;&raquo;, le tout dans d&#8217;un fichier de configuration nommé overrides.append.ini.php (dossier settings). La procédure restera identique pour toutes les classes de contenu que vous aurez besoin de créer par la suite.</p>
<p>En résumé: Création de la classe de contenu » Intégration (template) » Ajout de la classe dans les settings.</p>
<h2>Une histoire de cache !</h2>
<p>Sous eZ Publish, vous vous apercevrez très vite que tout est fait pour optimiser votre temps de développement, mais en contre-partie, votre site pourra parfois afficher des délais de réponses trop élevés pour internet. Pour pallier à ce manque de réactivité, et en vue du grand nombre de fichiers de configuration et de templates que vous aurez besoin de créer pour vos futurs projets, eZ Publish va tout mettre en cache &#8230; ou presque. La conséquence d&#8217;un tel comportement ? Un temps de réponse optimal avec des pages qui s&#8217;affichent très rapidement (sauf au premier chargement des vues qui seront alors mises en cache). Du peu que j&#8217;ai pu constater, le framework va stocker certaines de vos règles de configuration (les fichiers ini), vos templates et les différentes références de vos images, des tailles pré-définies susceptibles d&#8217;être utilisées en front et/ou backend.</p>
<h2>L&#8217;aide au développement</h2>
<p>Pour vous accompagner dans vos différentes phases de développement, eZ Publish propose un mode de débogage qui vous permettra entre autres de dépister les petites comme les plus grosses erreurs. Cet outil s&#8217;avère très pratique lorsque le résultat d&#8217;un traitement n&#8217;est pas celui escompté en vous indiquant précisément l&#8217;origine de l&#8217;erreur. En plus de ça, il affiche le nom des templates utilisés pour vos pages, et pour ma part, c&#8217;est ce qui rend son utilisation incontournable. En effet, lorsqu&#8217;on débute (et même des semaines plus tard), on ne connait pas toujours le chemin complet des templates standards à surcharger pour nos besoins, grâce à cette aide, fini les longues minutes de recherche dans le répertoire des templates par défauts.</p>
<h2>En conclusion</h2>
<p>Avec le recul, on s&#8217;aperçoit vite qu&#8217;eZ Publish a tout ce qu&#8217;il vous faut pour mettre en place des sites administrables robustes et sécurisés. De base, il propose une large palette de classes de contenu modifiables à souhait. Bien entendu, comme nous venons de le voir, il est aussi possible d&#8217;en créer autant que vous le souhaitez en ne partant de rien. Il n&#8217;est pas nécessaire d&#8217;avoir de très lourdes connaissances en PHP, en effet, avec eZ Publish vous devrez vous familiariser avec les <a href="http://doc.ez.no/eZ-Publish/Technical-manual/3.6/Reference/Template-operators" target="_blank">templates operators</a> qui permettent de récupérer les informations d&#8217;un objet à afficher lors du développement de vos templates  (titre d&#8217;une page, son contenu riche etc&#8230;). En revanche, si vous souhaitez développer des extensions, il faudra mettre les mains dans le cambouis. Fort heureusement, rien d&#8217;insurmontable et le site officiel propose de nombreux tutoriaux qui vous permettront d&#8217;arriver à vos fins.</p>
<p>Il faudra faire avec le cache, ne pas oublier de le désactiver lors de vos développements et surtout le vider régulièrement, sans oublier d&#8217;utiliser le mode de débogage et ainsi vous faire gagner un temps précieux.</p>
<p>Pour ma part, à l&#8217;heure où je rédige cet article je suis en plein dans mon 4me projet sous eZ Publish, je me rend compte sans grande surprise qu&#8217;il n&#8217;y a vraiment pas de limites. eZ Publish est développé de tel sorte que vous pourrez réellement faire de l&#8217;outil ce que vous en voulez!</p>
<p>Quelques liens utiles :</p>
<ul>
<li><a href="http://ez.no/fr/" target="_blank">http://ez.no/fr</a></li>
<li><a href="http://share.ez.no/" target="_blank">http://share.ez.no</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/03/23/ez-publish-premieres-impressions/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Upload avec barre de progression sous Flex</title>
		<link>http://www.adrien-ruiz.fr/blog/2011/03/19/upload-avec-barre-de-progression-sous-flex/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2011/03/19/upload-avec-barre-de-progression-sous-flex/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 13:07:36 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[Flex / AS3]]></category>
		<category><![CDATA[as]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[fonction]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[progressbar]]></category>
		<category><![CDATA[progression]]></category>
		<category><![CDATA[requête]]></category>
		<category><![CDATA[transfert]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=270</guid>
		<description><![CDATA[Pour cet article, je me suis efforcé d&#8217;aller à l&#8217;essentiel afin d&#8217;éviter tout traitement superflue qui irait à l&#8217;encontre d&#8217;une compréhension rapide et optimale. Il s&#8217;adresse donc a des développeurs qui ont une certaine maîtrise du langage mais qui ne savent pas réellement comment mettre ne place un tel système de transfert de fichier. 1. [...]]]></description>
			<content:encoded><![CDATA[<p>Pour cet article, je me suis efforcé d&#8217;aller à l&#8217;essentiel afin d&#8217;éviter tout traitement superflue qui irait à l&#8217;encontre d&#8217;une compréhension rapide et optimale. Il s&#8217;adresse donc a des développeurs qui ont une certaine maîtrise du langage mais qui ne savent pas réellement comment mettre ne place un tel système de transfert de fichier.</p>
<h2>1. L&#8217;interface</h2>
<p>L&#8217;interface se compose uniquement de deux éléments:</p>
<ul>
<li>Un bouton &#8216;Parcourir&#8230;&#8217; qui va nous permettre d&#8217;aller récupérer notre fichier ;</li>
<li>Une barre de progression, qui s&#8217;affichera au lancement de l&#8217;upload.</li>
</ul>
<pre name="code" class="java">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();"&gt;
  &lt;mx:Script&gt;
      &lt;![CDATA[
          import aruiz.CUpload;
          private function init ():void {
              new CUpload (browseButton, progressBar);
          } // init ();
      ]]&gt;
  &lt;/mx:Script&gt;
  &lt;mx:Button id="browseButton" label="Parcourir..."&gt;&lt;/mx:Button&gt;
  &lt;mx:ProgressBar id="progressBar" label="" visible="false"&gt;&lt;/mx:ProgressBar&gt;
&lt;/mx:Application&gt;
</pre>
<p>Comme vous pouvez le constater, l&#8217;interface a été volontairement réduite au strict minimum. Pour notre upload, nous utiliserons la classe CUpload qui attend deux paramètres: le bouton &#8216;Parcourir&#8230;&#8217; et la barre de progression (ID des éléments concernés).</p>
<h2>2. La classe CUpload</h2>
<p>Voici la signature de type des différentes méthodes de la classe:</p>
<ul>
<li>private function initListeners ():void;</li>
<li>public function browse (e:MouseEvent):void;</li>
<li>private function selectHandler (e:Event):void;</li>
<li>private function errorHandler (e:IOErrorEvent):void;</li>
<li>private function progressHandler (e:ProgressEvent):void;</li>
<li>private function completeHandler (e:Event):void;</li>
</ul>
<p>La plus importante est <strong>initListeners</strong>, elle va se charger comme son nom l&#8217;indique, d&#8217;initialiser tous les écouteurs d&#8217;événements. Dans ce cas précis on parle de programmation événementielle. Tout simplement parce que lors d&#8217;un upload, il y a différentes phases qu&#8217;il est important de prendre en considérations, sans quoi il serait totalement impossible de lier toutes les actions entre-elles.</p>
<ul>
<li><strong>browse </strong>est appelée lors du click sur le bouton &#8216;Parcourir&#8230;&#8217;, elle a en charge d&#8217;ouvrir une fenêtre qui va permettre aux utilisateurs de choisir un fichier à transférer ;</li>
<li><strong>selectHandler</strong> est appelée lorsqu&#8217;un fichier a été choisi par l&#8217;utilisateur, l&#8217;upload peut alors commencer ;</li>
<li><strong>errorHandler</strong> parle d&#8217;elle même, nous ne sommes pas à l&#8217;abri d&#8217;une erreur, il faut pouvoir la capturer pour stopper tout traitement et en avertir l&#8217;utilisateur ;</li>
<li><strong>progressHandler</strong> va nous permettre de connaître l&#8217;avancement du transfert. Comment ? A l&#8217;aide du paramètre &#8216;e&#8217; de type <strong>ProgressEvent</strong> qui contient toutes les informations nécessaires. Ainsi notre barre de progression sera mise à jour de la sorte: progressBar.setProgress (e.bytesLoaded, e.bytesTotal);</li>
<li><strong>completeHandler</strong> sera appelée en fin d&#8217;upload si tout s&#8217;est correctement déroulé.</li>
</ul>
<h2>3. Coté serveur (PHP)</h2>
<p>Les traitements sont identiques à ceux d&#8217;un upload classique en HTML/PHP. En effet, il suffit juste d&#8217;utiliser la variable globale <strong>$_FILES</strong> (un tableau associatif) qui contient toutes les informations relatifs à notre upload. Là aussi, le code source a été volontairement simplifié pour aller à l&#8217;essentiel. Gardez en tête qu&#8217;un upload quel qu&#8217;il soit reste sensible d&#8217;un point de vu de la sécurité, il faudra donc réaliser une batterie de test afin d&#8217;être sûr que les fichiers répondent bien à certains critères, notamment leur type.</p>
<p>Le script est appelé en fin d&#8217;upload lorsque tout a été entièrement transféré sur le serveur. Si un ajout en base ou l&#8217;envoi d&#8217;un email est nécessaire, c&#8217;est à ce niveau du code qu&#8217;il faudra ajouter des fonctionnalités supplémentaires. Inutile donc de faire appel à un script PHP supplémentaire depuis la méthode <strong>completeHandler</strong>.</p>
<h2>4. Conclusion</h2>
<p>Cet article n&#8217;a rien de bien extraordinaire tellement l&#8217;upload a été vu et revu sur de nombreux blogs à travers le web. Cependant, j&#8217;ai reçu une demande d&#8217;aide de la part d&#8217;un internaute, et c&#8217;est ce qui a motivé ce court développement. Le point fort de Flex, est qu&#8217;il permet de filtrer avant tout upload les types de fichiers autorisés, cela dit, rien n&#8217;empêche de cacher du code malveillant (PHP) dans une image &#8230; Durant la phase de test, j&#8217;ai noté que les fichiers de plus de 2MO n&#8217;étaient pas transférés. C&#8217;est tout à fait normal, si c&#8217;est votre cas, il va falloir changer certaines règles de configuration (php.ini).</p>
<p>Si vous avez des questions, le blog est fait pour ça <img src='http://www.adrien-ruiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://www.adrien-ruiz.fr/dev/upload-flex.zip">Voici les sources</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2011/03/19/upload-avec-barre-de-progression-sous-flex/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Astuce jQuery : resizable avec scrollbar</title>
		<link>http://www.adrien-ruiz.fr/blog/2010/12/17/astuce-jquery-resizable-avec-scrollbar/</link>
		<comments>http://www.adrien-ruiz.fr/blog/2010/12/17/astuce-jquery-resizable-avec-scrollbar/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 12:43:33 +0000</pubDate>
		<dc:creator>Adrien RUIZ</dc:creator>
				<category><![CDATA[PHP / JS / CSS]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[fonction]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[réduire]]></category>
		<category><![CDATA[resizable]]></category>

		<guid isPermaLink="false">http://www.adrien-ruiz.fr/blog/?p=236</guid>
		<description><![CDATA[Récemment, je me suis retrouvé face à un petit problème lors de l&#8217;utilisation du plugin resizable de jQuery. Pour mes besoins, il fallait que je puisse redimensionner une div à taille bornée en overflow:auto, contenant un certain nombre d&#8217;éléments. Or durant mes tests, je me suis rapidement rendu compte que l&#8217;élément html utilisé pour le [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, je me suis retrouvé face à un petit problème lors de l&#8217;utilisation du plugin resizable de jQuery. Pour mes besoins, il fallait que je puisse redimensionner une div à taille bornée en overflow:auto, contenant un certain nombre d&#8217;éléments. Or durant mes tests, je me suis rapidement rendu compte que l&#8217;élément html utilisé pour le redimensionnement (le resizable-handle), se déplaçait lui aussi pendant l&#8217;utilisation de la scrollbar &#8230; pas super ! Du coup il a fallu un peu ruser pour arriver à mes fins&#8230;</p>
<p>HTLM:</p>
<pre name="code" class="java">&lt;div class="list"&gt;
  &lt;div class="child"&gt;
    &lt;div&gt;toto&lt;/div&gt;
    &lt;div&gt;aime&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Javascript:</p>
<pre name="code" class="java">$(document.body).ready (function () {
    $('div.list').resizable ({
        alsoResize: '.child',
        handles: 's',
        minHeight: 150,
        maxHeight: 300,
        minWidth: 230,
        maxWidth: 230
    });
});</pre>
<p>div.list est correctement redimensionnable, c&#8217;est div.child qui va contenir mes éléments en overflow:auto. Si vous avez bien regardé la portion de javascript ci-dessus, la propriété alsoResize permet de définir un autre élément à redimensionner en même temps que div.list&#8230; ouf!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrien-ruiz.fr/blog/2010/12/17/astuce-jquery-resizable-avec-scrollbar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

