<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Armetiz - Thomas Tourlourat - CV Ingénieur Informatique</title>
	
	<link>http://www.armetiz.info</link>
	<description>Ingénieur Informatique - Lyon</description>
	<lastBuildDate>Thu, 09 Sep 2010 13:31:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/armetiz" /><feedburner:info uri="armetiz" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Installer FMS 4 sur Debian 5.0</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/4isQYc752Dc/</link>
		<comments>http://www.armetiz.info/installer-fms-4-sur-debian-5-0/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 13:31:46 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Didacticiel]]></category>
		<category><![CDATA[P2P]]></category>
		<category><![CDATA[Serveur]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1820</guid>
		<description><![CDATA[Pour annoncer la sortie de Flash Media Server 4. Voici un petit tutoriel présentant l&#8217;installation de FMS 4 sur Debian Lenny.
Cette version sera disponible pour un plus grand nombre de machine avec le support du 64Bits. Elle permettra de réduire considérablement les coûts de bande passante pour la VoD grâce au P2P mais aussi pour [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://www.adobe.com/ubi/globalnav/include/adobe-lq.png" title="Adobe" class="alignleft" width="43" height="72" />Pour annoncer la sortie de Flash Media Server 4. Voici un petit tutoriel présentant l&#8217;installation de <strong>FMS 4</strong> sur <strong>Debian Lenny</strong>.</p>
<p>Cette version sera disponible pour un plus grand nombre de machine avec le <strong>support du 64Bits</strong>. Elle permettra de <strong>réduire considérablement les coûts</strong> de bande passante pour la <strong>VoD grâce au P2P</strong> mais aussi pour le live grâce au <strong>Multicast</strong>.</p>
<h3>Installation</h3>
<p>L&#8217;installation se déroule sur une <a href="http://www.debian.org/distrib/">Debian 5.0</a> où il n&#8217;y a que le système de base.</p>
<p>FMS 4 nécessite la librairie <a href="http://packages.debian.org/fr/lenny/libnspr4-dev">libnspr4</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">apt-get install libnspr4-dev</pre></div></div>

<p>Ensuite, <a href="http://www.adobe.com/go/tryflashmediaserver_fr">récupérer FMS 4</a> pour Linux.<br />
Dé-zipper le fichier : <strong>FlashMediaServer_4_all.zip</strong> fraichement téléchargé.<br />
Il existe deux versions pour Linux, la <strong>32bits</strong> et la <strong>64bits</strong>. A vous de choisir celle qui convient à votre architecture.</p>
<p>Pour décompresser et extraire l&#8217;archive.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">tar -xzvf FlashMediaServer4.tar.gz</pre></div></div>

<p>Lancer le script d&#8217;installation FMS qui se trouve dans le répertoire où vous avez extrait l&#8217;archive du dessus.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">./installFMS</pre></div></div>

<p>A un moment, on vous demandera un licence. Nous souhaitons utiliser la version de développement, donc nous passons cette étape en appuyant sur <strong>ENTREE</strong> et en répondant non à la question :<br />
<blockquote><em>You have not entered a serial number.  Falling back to<br />
the Adobe Flash Media Development Server!<br />
Would you like to try again?</em></p></blockquote>
<h3>Options par défaut</h3>
<ul>
<li>Répertoire d&#8217;installation : /opt/adobe/fms</li>
<li>Adobe FMS Server port : 1935 &#038; 80</li>
<li>Adobe FMS Admin Server port : 1111</li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/LcFCW201tozTXnm_bBjHnRkRAhI/0/da"><img src="http://feedads.g.doubleclick.net/~a/LcFCW201tozTXnm_bBjHnRkRAhI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/LcFCW201tozTXnm_bBjHnRkRAhI/1/da"><img src="http://feedads.g.doubleclick.net/~a/LcFCW201tozTXnm_bBjHnRkRAhI/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/4isQYc752Dc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/installer-fms-4-sur-debian-5-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/installer-fms-4-sur-debian-5-0/</feedburner:origLink></item>
		<item>
		<title>Authentification et Autorisation avec Zend AMF</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/CHkDYD0DYaU/</link>
		<comments>http://www.armetiz.info/authentification-autorisation-zend-amf/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 08:23:10 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[AMF]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Service]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1786</guid>
		<description><![CDATA[Nous allons voir comment mettre en place l&#8217;authentification et l&#8217;autorisation lorsque l&#8217;on souhaite travailler avec Zend et le protocole AMF.
Au niveau des pré-requit, vous devez avoir une architecture Zend et AMF opérationnelle.
Aussi, je vous conseils de lire la documentation sur Zend_Auth et Zend_Acl.
Vous devez avoir compris la notion de rôle et de ressource.
Objectifs
Si vous fournissez [...]]]></description>
			<content:encoded><![CDATA[<p>Nous allons voir comment mettre en place <strong>l&#8217;authentification</strong> et <strong>l&#8217;autorisation</strong> lorsque l&#8217;on souhaite travailler avec Zend et le protocole AMF.</p>
<p>Au niveau des pré-requit, vous devez avoir une architecture <strong>Zend et AMF opérationnelle</strong>.<br />
Aussi, je vous conseils de lire la documentation sur <a href="http://framework.zend.com/manual/fr/zend.auth.introduction.html">Zend_Auth</a> et <a href="http://framework.zend.com/manual/fr/zend.acl.introduction.html">Zend_Acl</a>.<br />
Vous devez avoir compris la notion de <strong>rôle</strong> et de <strong>ressource</strong>.</p>
<h3>Objectifs</h3>
<p>Si vous fournissez des services à travers le réseau, et qu&#8217;ils peuvent avoir un impact sur la cohérence des données, vous vous devez de sécuriser l&#8217;accès à ces services.</p>
<p>Sécurisé l&#8217;accès signifie restreinte l&#8217;accès, mais aussi chiffrer les communications.<br />
Nous ne traiterons pas la partie chiffrement des échanges, pour cela je vous laissez chercher de la documentation sur HTTPS.</p>
<h3>Point de départ</h3>
<p>Ci-dessous, un exemple de contrôleur Zend offrant des services AMF.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ServiceController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> init<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>_helper<span style="color: #339933;">-&gt;</span><span style="color: #004000;">viewRenderer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setNoRender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_helper<span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">disableLayout</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: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> amfAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$server</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Amf_Server<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Liste des services</span>
	<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Service_User&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Service_Book&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClass</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;ZendAmfServiceBrowser&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Mapping des objets PHP avec les objets ActionScript		</span>
	<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClassMap</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'UserDTO'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Model_DTO_User'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setClassMap</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BookDTO'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Model_DTO_Book'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setProduction</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	ZendAmfServiceBrowser<span style="color: #339933;">::</span><span style="color: #000088;">$ZEND_AMF_SERVER</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$server</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">echo</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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></div></div>

<p>Nous avons donc <u>deux services</u>, et <u>deux types d&#8217;objets</u> pouvant être utilisés.</p>
<p>Vous remarquerez l&#8217;utilisation de <a href="www.zamfbrowser.org/">ZamfBrowser</a>, ce service couplé avec une application Adobe AIR permet de travailler facilement avec les services.</p>
<p>Voici à quoi ressemble les prototypes d&#8217;un de mes services.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Service_Book
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createBook <span style="color: #009900;">&#40;</span>Model_DTO_Book <span style="color: #000088;">$oBook</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> readBook <span style="color: #009900;">&#40;</span>Model_DTO_Book <span style="color: #000088;">$oBook</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> updateBook <span style="color: #009900;">&#40;</span>Model_DTO_Book <span style="color: #000088;">$oBook</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> deleteBook <span style="color: #009900;">&#40;</span>Model_DTO_Book <span style="color: #000088;">$oBook</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> isRentBy <span style="color: #009900;">&#40;</span>Model_DTO_User <span style="color: #000088;">$oUser</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<blockquote><p>L&#8217;autre service est composé lui aussi des méthodes <strong>CRUD</strong> (Create, Read, Update, Delete), ainsi que d&#8217;autres fonctions métiers.</p></blockquote>
<p>Sachant que mon application cliente Flash utilise ces services, il est très facile à un utilisateur de découvrir <strong>l&#8217;URI de la passerelle AMF</strong>.<br />
En l&#8217;état, une personne ayant l&#8217;accès à ma passerelle AMF pourrai utiliser toutes les fonctions de mes services. Ce qui implique qu&#8217;il puisse modifier ma base de données.</p>
<p><em>Remarquer que si l&#8217;on supprime le service de ZamfBrowser, l&#8217;utilisateur n&#8217;aura pas accès à la liste exhaustive des services. Si vous êtes en production, je vous conseils donc de supprimer ce service pour des raisons de sécurité.</em></p>
<h3>Mise en place de l&#8217;authentification</h3>
<p>Nous allons commencer par mettre en place l&#8217;authentification,<br />
Sachant que nous utilisons un client Flash, il est logique d&#8217;utiliser <strong>Zend_Amf_Adobe_Auth</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$authAdapter</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Amf_Adobe_Auth<span style="color: #009900;">&#40;</span>APPLICATION_PATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/config/password.xml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAuth</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$authAdapter</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Avec ces deux lignes, nous avons mis en place l&#8217;authentification au niveau du serveur.<br />
Il vous reste à définir le fichier password.xml</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;roles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;editor&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;stephane&quot;</span> <span style="color: #000066;">password</span>=<span style="color: #ff0000;">&quot;P@ssword01&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;robert&quot;</span> <span style="color: #000066;">password</span>=<span style="color: #ff0000;">&quot;P@ssword01&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/role<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/roles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Le fichier password.xml contient les identifiants et les mots de passe des utilisateurs.<br />
C&#8217;est à ce niveau que vous définissez les affectations d&#8217;identifiants à un rôle.</p>
<p>Si vous avez besoin de plus de souplesse au niveau de la gestion des identifiants, je vous conseils la lecture de <a href="http://framework.zend.com/manual/fr/zend.auth.adapter.dbtable.html">Authentification avec une table de base de données</a>.</p>
<p><em>Il est à noter, que si vous ne spécifier aucun identifiant lors de votre connexion au serveur AMF vous serez considéré comme un invité : <strong>Zend_Amf_Constants::GUEST_ROLE</strong></em></p>
<h3>Mise en place de l&#8217;autorisation</h3>
<p>Maintenant que nous avons correctement définit l&#8217;authentification, passons à l&#8217;autorisation.<br />
C&#8217;est maintenant que nous allons donner les autorisations ou refus d&#8217;accès aux services.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$acl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAcl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Avec ces deux lignes, vous avez définit une <strong>Acces Control List</strong>.<br />
Vous le constatez, aucune autorisation n&#8217;est définit; mais il est important de noter que maintenant, <strong>plus personne n&#8217;a accès à vos services</strong>.</p>
<p>Pour donner l&#8217;accès à nos deux services à n&#8217;importe qui, nous allons procéder comme suit :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$acl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addResource</span> <span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl_Resource<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Service_User'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addResource</span> <span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl_Resource<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Service_Book'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addResource</span> <span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl_Resource<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ZendAmfServiceBrowser'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Service_User'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Service_Book'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ZendAmfServiceBrowser);
$server-&gt;setAcl($acl);</span></pre></div></div>

<p>Ci-dessus, nous avons une liste explicite des autorisations.<br />
Si nous avions voulu faire dans l&#8217;implicite, nous aurions procédé ainsi :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$acl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAcl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pour aller plus loin dans l&#8217;explication, nous allons maintenant définir l&#8217;ensemble de nos autorisations.</p>
<blockquote><p>Nous souhaitons que le rôle administrateur est accès à tout, et nous souhaitons que les utilisateurs non authentifiés n&#8217;est pas accès aux fonctions de mise à jour.</p></blockquote>
<p>Rappelez-vous, nous avons vu plus haut que vous étiez connecter avec le rôle invité lorsque vous ne spécifiez aucun identifiant.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$acl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Définition les rôles.</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addRole</span> <span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Acl_Role<span style="color: #009900;">&#40;</span>Zend_Amf_Constants<span style="color: #339933;">::</span><span style="color: #004000;">GUEST_ROLE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Définition des autorisations</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span> <span style="color: #009900;">&#40;</span>Zend_Amf_Constants<span style="color: #339933;">::</span><span style="color: #004000;">GUEST_ROLE</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;create&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span> <span style="color: #009900;">&#40;</span>Zend_Amf_Constants<span style="color: #339933;">::</span><span style="color: #004000;">GUEST_ROLE</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;update&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span> <span style="color: #009900;">&#40;</span>Zend_Amf_Constants<span style="color: #339933;">::</span><span style="color: #004000;">GUEST_ROLE</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;delete&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$server</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAcl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><u>Premièrement,</u><br />
Nous avons dû définir le rôle invité pour pouvoir travailler ses autorisations.</p>
<p><u>Deuxièmement,</u><br />
Nous avons utilisé le principe des listes noires. Si nous avions utilisez un système de liste blanche, nous aurions du définir l&#8217;ensemble des rôles, et l&#8217;ensemble des autorisations.<br />
C&#8217;est donc en partant du principe que tout le monde a accès à tout, que nous avons fermé les portes aux anonymes.</p>
<p><u><strong>Explication des fonctions Deny &#038; Allow :</strong></u><br />
<strong>Zend_Acl::deny</strong> et <strong>Zend_Acl::allow</strong> utilisent les mêmes arguments.<br />
Le premier paramètre correspond à un rôle, cela ne change pas des ACL Zend classique.<br />
Le deuxième paramètre correspond à une ressource. Avec Zend AMF, une ressource correspond à un Service.<br />
Le troisième paramètre correspond ici à la fonction d&#8217;un service AMF.</p>
<p>Nous avons utiliser <strong>null</strong> au niveau du deuxième paramètre pour dire : <strong>tout les services</strong>.</p>
<h3>initAcl</h3>
<p>Ce dernier paragraphe pour vous parlez de mon opposition face aux spécifications de la documentation <a href="http://framework.zend.com/manual/1.10/en/zend.amf.server.html">Zend_AMF_Server</a> :</p>
<blockquote><p><em>If the ACL object is set, and the class being called defines initAcl() method, this method will be called with the ACL object as an argument. The class then can create additional ACL rules and return TRUE, or return FALSE if no access control is required for this class.</em></p></blockquote>
<p>En gros, il existe une autre manière de définir les autorisations,<br />
Si vous avez définit un ACL au niveau de votre Serveur AMF. Ce dernier vérifiera l&#8217;existence d&#8217;une fonction <strong>initAcl</strong> sur les services lorsqu&#8217;ils seront appelés.</p>
<p>Cette fonction est ce que l&#8217;on appel un <a href="http://fr.wikipedia.org/wiki/Hook_%28informatique%29">Hook</a>, et vous permets de définir les autorisations et refus au sein de la définition même de vos services.<br />
Autant vous dire que <strong>niveau maintenance et centralisation de l&#8217;information c&#8217;est très moyen</strong>..<br />
De plus, si l&#8217;on pend l&#8217;exemple de <strong>ZendAmfServiceBrowser</strong>, vous allez devoir modifier la définition de ce service, et cela à chaque fois qu&#8217;il y aura une nouvelle version ?</p>
<p>Voici un exemple de fonctionnement</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Service_Book
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> initAcl <span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'editor'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Services_Book'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'create'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'editor'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Services_Book'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'update'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'editor'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Services_Book'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'delete'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<p><a href="http://feedads.g.doubleclick.net/~a/vPTcLnwvx9f3xcWkvfRTtZLrFMI/0/da"><img src="http://feedads.g.doubleclick.net/~a/vPTcLnwvx9f3xcWkvfRTtZLrFMI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vPTcLnwvx9f3xcWkvfRTtZLrFMI/1/da"><img src="http://feedads.g.doubleclick.net/~a/vPTcLnwvx9f3xcWkvfRTtZLrFMI/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/CHkDYD0DYaU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/authentification-autorisation-zend-amf/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/authentification-autorisation-zend-amf/</feedburner:origLink></item>
		<item>
		<title>Mise en production de Zend Framework sur un serveur mutualisé</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/gczjxtUs6mM/</link>
		<comments>http://www.armetiz.info/mise-production-zend-framework-serveur-mutualise/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 08:06:56 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Zend]]></category>
		<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Conseils]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[Mutualisé]]></category>
		<category><![CDATA[Production]]></category>
		<category><![CDATA[RewriteRule]]></category>
		<category><![CDATA[Serveur]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1724</guid>
		<description><![CDATA[Lorsque l&#8217;on dispose d&#8217;un serveur dédié, la mise en production d&#8217;une application Zend Framework est assez simple; il suffit de modifier le DocumentRoot du VirtualHost.
Si l&#8217;on dispose d&#8217;un hébergement mutualisé, il faut aussi pouvoir proposer à nos visiteurs un accès au site via www.domain.tld et non pas www.domain.tld/public/
Première solution
La première solution, consiste à déplacer le [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.armetiz.info/wp-content/uploads/2010/06/zend-framework.png"><img src="http://www.armetiz.info/wp-content/uploads/2010/06/zend-framework.png" alt="Zend Framework Logo" title="Zend Framework Logo" width="185" height="187" class="alignright size-full wp-image-1727" /></a>Lorsque l&#8217;on dispose d&#8217;un serveur dédié, la mise en production d&#8217;une application Zend Framework est assez simple; il suffit de modifier le <strong>DocumentRoot</strong> du <strong>VirtualHost</strong>.</p>
<p>Si l&#8217;on dispose d&#8217;un hébergement mutualisé, il faut aussi pouvoir proposer à nos visiteurs un accès au site via <strong>www.domain.tld</strong> et non pas www.domain.tld/public/</p>
<h3>Première solution</h3>
<p>La première solution, consiste à déplacer le fichier /public/index.php à la racine du domaine et de modifier la définition de la constante <strong>APPLICATION_PATH</strong> de ce même fichier.<br />
Le seul soucis de cette solution, c&#8217;est que les appels aux ressources de type <strong>CSS</strong> ou <strong>JS</strong> devront être modifiés pour pointer vers www.domain.tld/public/<br />
Personnellement, je trouve cela complètement nul&#8230;</p>
<h3>Deuxième solution</h3>
<p>La deuxième solution &#8211; bien plus élégante &#8211; passe par l&#8217;ajout d&#8217;un .htaccess à la racine du domaine.</p>

<div class="wp_syntax"><div class="code"><pre class="htaccess" style="font-family:monospace;">RewriteEngine On
# Only apply to URLs on this domain
RewriteCond %{HTTP_HOST} ^(www.)?domain.tld$
&nbsp;
# Only apply to URLs that aren't already under folder.
RewriteCond %{REQUEST_URI} !^/public/
&nbsp;
# Don't apply to URLs that go to existing files or folders.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
&nbsp;
# Rewrite all those to insert /folder.
RewriteRule ^(.*)$ /public/$1
&nbsp;
# Also redirect the root folder.
RewriteCond %{HTTP_HOST} ^(www.)?domain.tld$
RewriteRule ^(/)?$ public/index.php [L]</pre></div></div>

<p>Là, tout est magique et fonctionne sans <strong>aucune autre modification</strong> de l&#8217;application.<br />
Pour protéger l&#8217;accès à vos autres répertoires, et principalement <strong>/application</strong> qui contient surement vos <strong>mots de passe BDD</strong> non chiffrés. Rajouter un fichier .htaccess contenant</p>

<div class="wp_syntax"><div class="code"><pre class="htaccess" style="font-family:monospace;">deny from all</pre></div></div>


<p><a href="http://feedads.g.doubleclick.net/~a/6qoxtaobbOrrVj0wl38s5kAjgTQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/6qoxtaobbOrrVj0wl38s5kAjgTQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6qoxtaobbOrrVj0wl38s5kAjgTQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/6qoxtaobbOrrVj0wl38s5kAjgTQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/gczjxtUs6mM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/mise-production-zend-framework-serveur-mutualise/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/mise-production-zend-framework-serveur-mutualise/</feedburner:origLink></item>
		<item>
		<title>Ordonner les resultats Doctrine avec une table de composition</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/UIr9sMGNEnY/</link>
		<comments>http://www.armetiz.info/ordonner-resultats-doctrine-table-liaison/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 06:00:59 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[DQL]]></category>
		<category><![CDATA[Ordre]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1716</guid>
		<description><![CDATA[
Prenons le schéma ci-dessus.
Au niveau de la définition, nous avons deux entités : Bureau ( rooms ) et Utilisateur ( users ). Ces deux entités sont liées par une relation manyToMany car un utilisateur peut avoir plusieurs bureaux, et un bureau peut avoir plusieurs utilisateurs.
Pour pouvoir intégrer l&#8217;ordonnancement des utilisateurs au sein d&#8217;une pièce, nous [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.armetiz.info/wp-content/uploads/2010/05/composition.png"><img src="http://www.armetiz.info/wp-content/uploads/2010/05/composition.png" alt="" title="composition" width="333" height="69" class="aligncenter size-full wp-image-1717" /></a></p>
<p>Prenons le schéma ci-dessus.<br />
Au niveau de la définition, nous avons deux entités : <strong>Bureau </strong>( rooms ) et <strong>Utilisateur </strong>( users ). Ces deux entités sont liées par une relation <strong>manyToMany </strong>car un utilisateur peut avoir plusieurs bureaux, et un bureau peut avoir plusieurs utilisateurs.<br />
Pour pouvoir intégrer l&#8217;ordonnancement des utilisateurs au sein d&#8217;une pièce, nous avons ajouté le champs &laquo;&nbsp;<strong>index</strong>&nbsp;&raquo; sur la table de liaison.</p>
<p>Grâce à cette définition, nous pouvons avoir les cas suivants :<br />
- Robert est à la place #2 dans le bureau d&#8217;accueil<br />
- Robert est à la place #1 dans le bureau du président<br />
- Annie est à la place #1 dans le bureau du président</p>
<h3>Définition des Domain Model Object</h3>
<p><a href="http://www.armetiz.info/wp-content/uploads/2010/05/doctrine.gif"><img src="http://www.armetiz.info/wp-content/uploads/2010/05/doctrine.gif" alt="doctrine" title="doctrine" width="191" height="53" class="alignright size-full wp-image-1710" /></a><br />
Nous allons maintenant définir les liaisons Doctrine entre ces objets.<br />
Je n&#8217;utiliserai pas la définition YAML.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">abstract <span style="color: #000000; font-weight: bold;">class</span> Model_Base_Room <span style="color: #000000; font-weight: bold;">extends</span> Model_Base
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setTableDefinition<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;">setTableName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'rooms'</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id_room as idRoom'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'4'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'title'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">80</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'80'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span><span style="color: #004000;">setUp</span><span style="color: #009900;">&#40;</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;">hasMany</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Model_User as users'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'refClass'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Model_CompoRoomsUsers'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'local'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_room'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'foreign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_user'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Model_Base_User <span style="color: #000000; font-weight: bold;">extends</span> Model_Base
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setTableDefinition<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;">setTableName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'users'</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id_user as idUser'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'4'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'firstname'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">80</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'80'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span><span style="color: #004000;">setUp</span><span style="color: #009900;">&#40;</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;">hasMany</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Model_Room as rooms'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'refClass'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Model_CompoRoomsUsers'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'local'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_user'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'foreign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_room'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Model_Base_CompoRoomsUsers <span style="color: #000000; font-weight: bold;">extends</span> Model_Base
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setTableDefinition<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;">setTableName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'compo_rooms_users'</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id_room as idRoom'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'4'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id_user as idUser'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'4'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</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;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'fixed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'unsigned'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'4'</span><span style="color: #339933;">,</span>
             <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<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;">hasOne</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Model_User as user'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'local'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_user'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'foreign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_user'</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;">hasOne</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Model_Room as room'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
             <span style="color: #0000ff;">'local'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_room'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'foreign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'id_room'</span><span style="color: #009900;">&#41;</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></div></div>

<h3>Ordonner avec DQL</h3>
<p>Après cette longue définition, nous pouvons passer au code DQL qui permettra d&#8217;ordonner les résultats en fonction de l&#8217;index de notre table de liaison.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span>	<span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room.*, users.*&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Model_Room room&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #339933;">-&gt;</span><span style="color: #004000;">leftJoin</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room.users users&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #339933;">-&gt;</span><span style="color: #004000;">orderBy</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room.id_room, users.Model_CompoRoomsUsers.index ASC&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Prenez note du fait que nous trions dans un premier temps par identifiant de bureau et ensuite par index. Si nous n&#8217;utilisions qu&#8217;un tri par index, l&#8217;ordre des bureaux serai incohérent.</p>
<h3>Pour aller plus loin</h3>
<p>Nous avons décrit le fonctionnement pour ordonner des résultats à partir d&#8217;une table de liaison.<br />
Mais vous pouvez aussi utiliser cette méthode pour conditionner le résultat.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/X248qSbPV7pvtMsJyiGOImav4CY/0/da"><img src="http://feedads.g.doubleclick.net/~a/X248qSbPV7pvtMsJyiGOImav4CY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/X248qSbPV7pvtMsJyiGOImav4CY/1/da"><img src="http://feedads.g.doubleclick.net/~a/X248qSbPV7pvtMsJyiGOImav4CY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/UIr9sMGNEnY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/ordonner-resultats-doctrine-table-liaison/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/ordonner-resultats-doctrine-table-liaison/</feedburner:origLink></item>
		<item>
		<title>Transfer Object Assembler avec Doctrine 1</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/sNjrkdkBbto/</link>
		<comments>http://www.armetiz.info/transfer-object-assembler-avec-doctrine-1/#comments</comments>
		<pubDate>Mon, 31 May 2010 10:06:12 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[AMF]]></category>
		<category><![CDATA[DBAL]]></category>
		<category><![CDATA[DTO]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Konbini]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Pattern]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1693</guid>
		<description><![CDATA[Le pattern Transfert Object TO, Data Transfert Object DTO, ou encore Value Object VO permet d&#8217;échanger des données entre deux applications.
Wikipédia : Son but est de simplifier les transferts de données entre les sous-systèmes d&#8217;une application logiciel. Les objets de transfert de données sont souvent utilisés en conjonction des objets d&#8217;accès aux données.
Qui dit Transfert [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.armetiz.info/wp-content/uploads/2010/05/doctrine.gif"><img src="http://www.armetiz.info/wp-content/uploads/2010/05/doctrine.gif" alt="doctrine" title="doctrine" width="191" height="53" class="alignright size-full wp-image-1710" /></a>Le <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html">pattern Transfert Object</a> <strong>TO</strong>, <strong>Data Transfert Object DTO</strong>, ou encore <strong>Value Object VO</strong> permet d&#8217;échanger des données entre deux applications.</p>
<p>Wikipédia : <em>Son but est de simplifier les transferts de données entre les sous-systèmes d&#8217;une application logiciel. Les objets de transfert de données sont souvent utilisés en conjonction des objets d&#8217;accès aux données.</em></p>
<p>Qui dit <strong>Transfert Object</strong>, veux aussi dire <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObjectAssembler.html">Transfert Object Assembler</a>. </p>
<h3>Conversion d&#8217;object</h3>
<p>Le pattern <strong>Transfert Object Assembler</strong> permet de passer d&#8217;un DTO à un Objet d&#8217;accès au données, et inversement.<br />
C&#8217;est le moyen le plus simple pour travailler avec le pattern Data Transert Object et un <strong>ORM</strong>.</p>
<h3>Domain Object Model -> Data Transfert Object</h3>
<p>Avec l&#8217;<a href="http://www.doctrine-project.org/">ORM Doctrine</a>, le transfert d&#8217;un &laquo;&nbsp;<strong>Domain Object Model DOM</strong>&nbsp;&raquo; ou ici <strong>Doctrine_Record</strong> vers un <strong>DTO</strong> est très simple.<br />
Il suffit de réaliser un parser qui analyse l&#8217;objet issu de Doctrine, et qui remplit les données du DTO.</p>
<h3>Data Transfert Object -> Domain Object Model</h3>
<p>Convertir un DTO vers un DOM peut s&#8217;avère plus complexe.<br />
En effet, Doctrine utilise des collections d&#8217;objet qui lui sont propres, mais a aussi besoin de connaitre les clés primaires et leurs contenus pour pouvoir créer un objet. Car un objet issu de Doctrine_Record n&#8217;a pas les même propriétés quand il est existant en base de donnée, ou qu&#8217;il est en phase d&#8217;être sauvegardé.</p>
<h3>Implémentation de Transfer Object Assembler</h3>
<p>Une implémentation du pattern <strong>Transfert Object Assembler</strong> vient de voir le jour après moult et moult péripéties.</p>
<p>Cette implémentation permet donc le transférer de DTOs à partir de DOMs et inversement.<br />
Associer au pattern Service Layer, cela peut s&#8217;avérer être très pratique.</p>
<p>Voici un exemple simple d&#8217;utilisation :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$oProgram</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ProgramDTO <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oProgram</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Dorothe&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$oVideoDTO</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> VideoDTO <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oVideoDTO</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">idVideo</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">30</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oVideoDTO</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">program</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oProgram</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$oAssembler</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$new</span> Assembler <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oVideo</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oAssembler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createDomainObject</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$oVideoDTO</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$oVideo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nous avons ici créé une nouvelle entrée dans la table programs, et réalisé une liaison entre ce nouvel objet et la vidéo existante d&#8217;identifiant 30.<br />
Le tout one-shot !</p>
<p>L&#8217;intérêt de cette implémentation, c&#8217;est d&#8217;être fonctionnel avec :</p>
<ul>
<li>Les objets persistant</li>
<li>Les objets non-persistant</li>
<li>Les compositions d&#8217;objets sur N niveau</li>
</ul>
<h3>Utilisation avec le pattern Service Layer</h3>
<p>Nous allons voir l&#8217;exemple le plus simple, soit l&#8217;implémentation des méthodes CRUD pour un objet générique.<br />
L&#8217;utilisation du nommage des classes provient de l&#8217;utilisation de Zend Framework.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> create <span style="color: #009900;">&#40;</span>Model_DTO_Video <span style="color: #000088;">$poVideoDTO</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$oModelVideo</span>		<span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oAssembler</span>		<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Model_Utils_Assembler <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span>		<span style="color: #339933;">=</span> <span style="color: #000088;">$oAssembler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createDomainObject</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">idShow</span>	<span style="color: #339933;">=</span> <span style="color: #000088;">$oModelVideo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">idShow</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> read <span style="color: #009900;">&#40;</span>Model_DTO_Video <span style="color: #000088;">$poVideoDTO</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$query</span>	<span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;video.*&quot;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Model_Video video&quot;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;video.id_show = ?&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$piIdVideo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span>	<span style="color: #339933;">=</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchOne</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oAssembler</span>	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Model_Utils_Assembler <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$oAssembler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createTransfertObject</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$oModelVideo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> update <span style="color: #009900;">&#40;</span>Model_DTO_Video <span style="color: #000088;">$poVideoDTO</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$oModelVideo</span>	<span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oAssembler</span>	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Model_Utils_Assembler <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span>	<span style="color: #339933;">=</span> <span style="color: #000088;">$oAssembler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createDomainObject</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @param Model_DTO_Video
 * @return Model_DTO_Video
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete <span style="color: #009900;">&#40;</span>Model_DTO_Video <span style="color: #000088;">$poVideoDTO</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$oModelVideo</span>	<span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oAssembler</span>	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Model_Utils_Assembler <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span>	<span style="color: #339933;">=</span> <span style="color: #000088;">$oAssembler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createDomainObject</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$oModelVideo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$poVideoDTO</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Téléchargement</h3>
<p>Contenu de l&#8217;archive :</p>
<ul>
<li>Implémentation du pattern Transfer Object Assembler</li>
<li>Interface du pattern Transfer Object Assembler</li>
<li>Classe de définition d&#8217;un DTO</li>
</ul>
<p>Pour faire fonctionner l&#8217;assembler. Vous devez définir une classe qui hérite de Assembler, et ainsi surchargez la propriété $_relationships avec vos liaisons entre DTO et DOM.</p>
<p><strong>Dernière mise à jour : 22 Juillet 2010</strong><br />
<a href='http://www.armetiz.info/wp-content/uploads/2010/05/Transfert_Object_Assembler_Doctrine_1.1.zip'>Transfert_Object_Assembler_Doctrine_1.1.zip</a> &#8211; 3 Ko.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/tN51sHLNafjIoey0JYCVBodtu38/0/da"><img src="http://feedads.g.doubleclick.net/~a/tN51sHLNafjIoey0JYCVBodtu38/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/tN51sHLNafjIoey0JYCVBodtu38/1/da"><img src="http://feedads.g.doubleclick.net/~a/tN51sHLNafjIoey0JYCVBodtu38/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/sNjrkdkBbto" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/transfer-object-assembler-avec-doctrine-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/transfer-object-assembler-avec-doctrine-1/</feedburner:origLink></item>
		<item>
		<title>Google I/O : Vidéo, Android et Adobe</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/AZ20e3I9nKg/</link>
		<comments>http://www.armetiz.info/google-io-video-android-adobe/#comments</comments>
		<pubDate>Fri, 21 May 2010 08:42:25 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Beta]]></category>
		<category><![CDATA[Conférence]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1695</guid>
		<description><![CDATA[Pour ceux qui ne suivent pas l&#8217;actualité, Google tient en ce moment des conférences appelées Google Input/Ouput.
Format vidéo Internet
Pour le premier jour de conférence, nous avons eu droit &#8211; entre autre &#8211; à l&#8217;annonce du format vidéo WebM qui &#8211; normalement &#8211; devrai devenir le standard vidéo libre du net.
La raison de ce nouveau format, [...]]]></description>
			<content:encoded><![CDATA[<p>Pour ceux qui ne suivent pas l&#8217;actualité, Google tient en ce moment des conférences appelées <a href="http://code.google.com/intl/fr/events/io/2010/">Google Input/Ouput</a>.</p>
<h3>Format vidéo Internet</h3>
<p>Pour le premier jour de conférence, nous avons eu droit &#8211; entre autre &#8211; à l&#8217;annonce du format vidéo <a href="http://www.webmproject.org/">WebM</a> qui &#8211; normalement &#8211; devrai devenir le standard vidéo libre du net.<br />
La raison de ce nouveau format, c&#8217;est que l&#8217;utilisation du H.264 est soumise à une licence payante. A cause de cela Firefox ne pouvait pas lire les vidéos H.264&#8230;<br />
<a href="http://www.armetiz.info/wp-content/uploads/2010/05/froyo.png"><img src="http://www.armetiz.info/wp-content/uploads/2010/05/froyo.png" alt="" title="froyo" width="200" height="168" class="alignright size-full wp-image-1696" /></a></p>
<h3>Android 2.2</h3>
<p>Autre nouveauté, concernant <strong>Android</strong>.<br />
Nous avons eu la confirmation de la nouvelle version Android 2.2 nommé Froyo, qui apporte son lot d&#8217;amélioration :
<ul>
<li>Support complet de <strong>Flash Player 10.1</strong> et <strong>Adobe AIR 2.5</strong></li>
<li>2 à 5 fois plus rapide que les anciennes version grâce à un nouveau compilateur <strong>Dalvik JIT</strong></li>
<li>Navigation internet 2 à 3 fois plus rapide grâce à un nouveau moteur Javascript</li>
<li>Installation des applications sur la carte SD possible en natif</li>
<li>Mise à jour automatique des applications installées à partir du Market</li>
</ul>
<p>Pour ceux qui développent pour Android, la <a href="http://developer.android.com/sdk/android-2.2.html">version 2.2 du SDK</a> est disponible.</p>
<h3>Google TV</h3>
<p>Pour le coups, je ne vais pas m&#8217;étendre dessus, je préfère rediriger vers de l&#8217;information bien plus précise.<br />
Vous pouvez donc aller faire un tour sur le 20minutes : <a href="http://www.20minutes.fr/article/405920/High-Tech-Laborieusement-presente-Google-TV-va-t-il-revolutionner-la-tele.php">HIGH-TECH &#8211; Via Android et un processeur Intel, Google veut marier la télé et le Web. Tout le Web&#8230;</a></p>
<h3>Adobe</h3>
<p>A cette occasion, Adobe en a profité pour ouvrir l&#8217;accès à la Bêta du <a href="http://labs.adobe.com/technologies/flashplayer10/">Player Flash 10.1 pour Android</a> et à la prerelease de <a href="http://blogs.adobe.com/air/2010/05/air_android_prerelease.html">Adobe AIR pour Android</a>.</p>
<p>Alors que Adobe AIR peut s&#8217;installer sur Android 2.1, <strong>FP 10.1 doit être installé sur Android 2.2</strong>.<br />
C&#8217;est dommage car très &#8211; très &#8211; peu de gens disposent de la nouvelle version Android Froyo, mais cela annonce aussi que Google ne devrai pas tarder à mettre à jour les terminaux <img src='http://www.armetiz.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><object width="400" height="240"><param name="movie" value="http://www.youtube.com/v/yAZYSVr2Bhc&#038;hl=fr_FR&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/yAZYSVr2Bhc&#038;hl=fr_FR&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="240"></embed></object></p>

<p><a href="http://feedads.g.doubleclick.net/~a/7moMPrmg4-U3Jnfb_sNnywtdTw8/0/da"><img src="http://feedads.g.doubleclick.net/~a/7moMPrmg4-U3Jnfb_sNnywtdTw8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7moMPrmg4-U3Jnfb_sNnywtdTw8/1/da"><img src="http://feedads.g.doubleclick.net/~a/7moMPrmg4-U3Jnfb_sNnywtdTw8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/AZ20e3I9nKg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/google-io-video-android-adobe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/google-io-video-android-adobe/</feedburner:origLink></item>
		<item>
		<title>Statistique Windows Serveur / Workstation</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/tzG-wVnLD4E/</link>
		<comments>http://www.armetiz.info/statistique-windows-serveur/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 08:52:35 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Commande]]></category>
		<category><![CDATA[Core Edition]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Statistique]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1690</guid>
		<description><![CDATA[Il existe un outil de statistique/évènement graphique intégré à Windows 2008 Serveur.
Ici, nous allons voir un outil en ligne de commande qui restitue peu d&#8217;informations, mais qui peu être utilisé rapidement et sur les versions Windows Server Core Edition.
Il s&#8217;agit de net statistics server.
Voici la sortie de cette commande.
Statistiques depuis 27/04/2010 20:20:14
Sessions acceptées
Déconnexions automatiques
Déconnexions sur [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe un outil de statistique/évènement graphique intégré à Windows 2008 Serveur.</p>
<p>Ici, nous allons voir un outil en ligne de commande qui restitue peu d&#8217;informations, mais qui peu être utilisé rapidement et sur les versions <strong>Windows Server Core Edition</strong>.</p>
<p>Il s&#8217;agit de <strong>net statistics server</strong>.<br />
Voici la sortie de cette commande.</p>
<blockquote><p>Statistiques depuis 27/04/2010 20:20:14</p>
<p>Sessions acceptées<br />
Déconnexions automatiques<br />
Déconnexions sur erreur</p>
<p>Kilo-octets envoyés<br />
Kilo-octets reçus</p>
<p>Temps de réponse moyen (ms)</p>
<p>Erreurs système<br />
Violations d&#8217;autorisation<br />
Violations de mot de passe</p>
<p>Fichiers utilisés<br />
Périphériques comm. utilisés<br />
Travaux d&#8217;impression mis en file d&#8217;attente</p>
<p>Saturation des zones tampon
</p></blockquote>
<p>Cette commande existe aussi pour les stations de travail : <strong>net statistics workstation</strong>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/jaC6FQQxza6pB_MRXYhV4qcl0ms/0/da"><img src="http://feedads.g.doubleclick.net/~a/jaC6FQQxza6pB_MRXYhV4qcl0ms/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/jaC6FQQxza6pB_MRXYhV4qcl0ms/1/da"><img src="http://feedads.g.doubleclick.net/~a/jaC6FQQxza6pB_MRXYhV4qcl0ms/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/tzG-wVnLD4E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/statistique-windows-serveur/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/statistique-windows-serveur/</feedburner:origLink></item>
		<item>
		<title>Enregistrer les sources Flash au format XML</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/Tz_lDb2gMkg/</link>
		<comments>http://www.armetiz.info/enregistrer-sources-flash-format-xml/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 08:25:51 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Elearning]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Amélioration]]></category>
		<category><![CDATA[CS5]]></category>
		<category><![CDATA[Production]]></category>
		<category><![CDATA[Tache]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1671</guid>
		<description><![CDATA[Adobe Creative Suite 5 va sortir dans les prochains jours, et hormis l&#8217;iPhone packager qui semblait être le cheval de bataille cette année, les autres améliorations sont passées un peu à la trappe.
Sur Adobe Labs ont peut trouver les nouveautés de Flash CS5, et sur le nouveau blog de mediabox la traduction Française.
Personnellement, je remarque [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.armetiz.info/wp-content/uploads/2009/12/adobe-lq.png"><img src="http://www.armetiz.info/wp-content/uploads/2009/12/adobe-lq.png" alt="" title="Adobe" width="43" height="72" class="alignleft size-full wp-image-1665" /></a><strong>Adobe Creative Suite 5</strong> va sortir dans les prochains jours, et hormis <strong>l&#8217;iPhone packager</strong> qui semblait être le cheval de bataille cette année, les autres améliorations sont passées un peu à la trappe.</p>
<p>Sur <a href="http://labs.adobe.com/technologies/flashcs5/">Adobe Labs</a> ont peut trouver les nouveautés de Flash CS5, et sur le nouveau <a href="http://blog.mediabox.fr/flash-pro-cs5-les-nouveautes">blog de mediabox</a> la traduction Française.</p>
<p>Personnellement, je remarque un point très intéressant : <strong>XML based FLA files</strong>, où encore <strong>Fichiers FLA basés sur le XML</strong>.<br />
Qu&#8217;est-ce que cela signifie ? Mediabox le définit comme tel :</p>
<blockquote><p>En enregistrant votre document .fla, vous constaterez dans votre boite de dialogue <strong>la possibilité d’enregistrer</strong> votre travail sous un <strong>format non compressé .xfl</strong>. Vous aurez alors la <strong>création d’un dossier</strong> reprenant la structure de votre document et de votre librairie. Il sera alors facile à des personnes tiers non familières de Flash, de pouvoir modifier le contenu de la librairie, en changeant les textes, les images etc. Le tout sans avoir besoin de ré-ouvrir votre document dans Flash et de chercher où est le contenu à modifier.</p></blockquote>
<p>Dans tout les cas, cela signifie que nous pourrons accéder à la structure de nos animations sans passer obligatoirement par les <strong>fichiers FLA</strong>, qui sont des fichiers au <strong>format binaire non ouvert</strong>.<br />
Mais aussi et surtout, nous pourrons indirectement <strong>automatiser certaines tâches</strong> !</p>
<p>Je prends l&#8217;exemple d&#8217;un <a href="http://www.projet-elearning.com/">projet eLearning</a> où le nombre de FLA dépasse la centaine. Sur chacun de ces FLA il y a des <strong>éléments redondants</strong>.<br />
Après avoir livré la version de recette au client, celui-ci nous dit qu&#8217;il n&#8217;aime pas la tête du personnage Dupon.<br />
Ce personnage est sur 80% des animations réalisées. </p>
<p>Actuellement, plusieurs solutions s&#8217;offre à vous. Vous avez utilisé une <strong>librairie partagée</strong>, il va falloir ré-ouvrir tout les FLA, faire la mise à jour des symboles et re-compiler chaque FLA.<br />
Si vous n&#8217;avez pas de librairie partagée, il faudra remplacer à la main le symbole du personnage dans chaque FLA et lancer la compilation sur chacun.</p>
<p>Avec Adobe Flash CS5, il sera possible d&#8217;automatiser la modification d&#8217;un élément sur l&#8217;ensemble des sources. Celle-ci pouvant être enregistrée au format XML, un simple <strong>script PHP</strong> fera l&#8217;affaire.<br />
Il est déjà possible d&#8217;<strong>automatiser la compilation de FLA</strong>, <a href="http://www.gskinner.com/blog/archives/2004/08/jsfl_fla_batch.html">gSkinner</a> et <a href="http://www.mikechambers.com/blog/2003/11/01/flashcommand-flash-2004-command-line-compiler/">Mike Chambers</a> l&#8217;ont fait. </p>
<p><a href="http://www.armetiz.info/wp-content/uploads/2009/11/adobe_air.jpg"><img src="http://www.armetiz.info/wp-content/uploads/2009/11/adobe_air.jpg" alt="" title="Adobe AIR" width="150" height="150" class="alignright size-full wp-image-1425" /></a>Je n&#8217;ai pas pu tester cette nouvelle version de Flash.<br />
Il faut donc prendre cela au conditionnel, car il n&#8217;est pas dit que Adobe ai pensé à réaliser un compilateur de fichier SWF à partir de source XML.</p>
<p>Mais si tout cela s&#8217;avère être exact, il n&#8217;est pas impossible de voir apparaître des applications Adobe AIR permettant de modifier des éléments au sein d&#8217;un groupe de fichier source XML.</p>
<p>Edit : Valerio Virgillito <strong>Ingénieur chez Adobe</strong> a publié un article concernant le format XFL de Flash CS5 : <a href="http://blog.mencio.com/?p=28">XFL and Live Editing</a>.<br />
On peut y apprendre des informations intéressantes. Comme le fait que le fichier FLA ne sera plus un fichier binaire fermé, mais un <strong>package de fichier compressé XML</strong>; à la sauce des fichiers Docx surement.<br />
Mais aussi que les modifications des fichiers composants l&#8217;animation seront automatiquement pris en compte par Flash CS5. Je vous conseils de regarder la <strong>vidéo</strong> de son article pour une meilleur visibilité.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Ju_LI5KvQ95GmM4GxP07iBKWHaM/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ju_LI5KvQ95GmM4GxP07iBKWHaM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ju_LI5KvQ95GmM4GxP07iBKWHaM/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ju_LI5KvQ95GmM4GxP07iBKWHaM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/Tz_lDb2gMkg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/enregistrer-sources-flash-format-xml/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/enregistrer-sources-flash-format-xml/</feedburner:origLink></item>
		<item>
		<title>Recherche développeur d’application Flash / iPhone</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/M5oKx3Ql69c/</link>
		<comments>http://www.armetiz.info/recherche-developpeur-flash-iphone/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 17:50:46 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[Konbini]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Emplois]]></category>
		<category><![CDATA[Entreprise]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1649</guid>
		<description><![CDATA[Nous recherchons un stagiaire ou un contrat d&#8217;apprentissage pour nous assister sur le développement des applications frontend.
Voici le speach :
Konbini recherche un(e) stagiaire développeur d&#8217;applications.
Créée en 2008 par Lucie Beudet et David Creuzot, entrepreneurs chevronnés du Web, la chaîne vidéo konbini.com produit et diffuse en exclusivité des programmes de divertissement originaux.

Proposition
1 contrat en tant que [...]]]></description>
			<content:encoded><![CDATA[<p>Nous recherchons un <strong>stagiaire</strong> ou un <strong>contrat d&#8217;apprentissage</strong> pour nous assister sur le développement des <strong>applications frontend</strong>.<br />
Voici le speach :</p>
<blockquote><p><em>Konbini recherche un(e) stagiaire développeur d&#8217;applications.<br />
Créée en 2008 par Lucie Beudet et David Creuzot, entrepreneurs chevronnés du Web, la chaîne vidéo <a href="http://www.konbini.com">konbini.com</a> produit et diffuse en exclusivité des programmes de divertissement originaux.<br />
<a href="http://www.konbini.com"><img src="http://www.armetiz.info/wp-content/uploads/2010/03/konbini_logo.jpg" alt="konbini logo" title="konbini logo" width="120" height="120" class="size-full wp-image-1650 alignright" /></a><br />
<strong>Proposition</strong><br />
1 contrat en tant que développeur d&#8217;application / architecte logiciel dans le secteur Internet / video streaming.<br />
lieu de travail : Paris (France : Ile de France)<br />
durée du stage : 6 mois ou plus<br />
début du stage : au plus tôt<br />
rémunération : selon convention</p>
<p><strong>Votre mission</strong><br />
Vous serez chargé(e) du développement d&#8217;applications pour iPhone / iPad ainsi que de la réalisation de RIA et RDA en ActionScript3 / Flex.</p>
<p>Idéalement en formation bac+4/5 vous connaissez ActionScript 3, Cocoa / CocoaTouch, JAVA/J2EE, PHP5, MySQL, JavaScript Ajax et vous êtes à l&#8217;aise avec les formats vidéo pour internet et la notion de streaming.<br />
Une connaissance de l&#8217;interface de Flash ainsi que des notion élémentaires de design d&#8217;interface seront un plus.</p>
<p>Les qualités recherchées sont la rigueur, l&#8217;autonomie et l&#8217;esprit d&#8217;équipe.</em></p></blockquote>
<p>N&#8217;hésiter pas à nous contacter : <strong>thomas.tourlourat [at] konbini [dot] com</strong> ou <strong>thomas [at] tourlourat [dot] com</strong></p>

<p><a href="http://feedads.g.doubleclick.net/~a/TOJSY3DnywIlWY5bcmID9nIqQJA/0/da"><img src="http://feedads.g.doubleclick.net/~a/TOJSY3DnywIlWY5bcmID9nIqQJA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TOJSY3DnywIlWY5bcmID9nIqQJA/1/da"><img src="http://feedads.g.doubleclick.net/~a/TOJSY3DnywIlWY5bcmID9nIqQJA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/M5oKx3Ql69c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/recherche-developpeur-flash-iphone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/recherche-developpeur-flash-iphone/</feedburner:origLink></item>
		<item>
		<title>iFrame hauteur et largeur à 100%</title>
		<link>http://feedproxy.google.com/~r/armetiz/~3/bcwYZVxcaq8/</link>
		<comments>http://www.armetiz.info/iframe-hauteur-largeur-100/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 12:55:11 +0000</pubDate>
		<dc:creator>Thomas Tourlourat</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[CV]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[iFrame]]></category>
		<category><![CDATA[Ingénieur Informatique]]></category>
		<category><![CDATA[PDF]]></category>

		<guid isPermaLink="false">http://www.armetiz.info/?p=1642</guid>
		<description><![CDATA[Toujours has been, la balise iframe peut se révéler pratique dans certains cas.
L&#8217;exemple d&#8217;utilisation qui me vient à l&#8217;esprit, c&#8217;est l&#8217;affichage d&#8217;un fichier PDF.
Personnellement, cela me sert pour afficher mon CV sur thomas.tourlourat.com
Pour que le PDF utilise toute la zone du navigateur, il faut utiliser la petite astuce CSS suivante :

&#60;style type=&#34;text/css&#34;&#62;
html,body
&#123;
    [...]]]></description>
			<content:encoded><![CDATA[<p>Toujours has been, la balise iframe peut se révéler pratique dans certains cas.<br />
L&#8217;exemple d&#8217;utilisation qui me vient à l&#8217;esprit, c&#8217;est l&#8217;affichage d&#8217;un fichier PDF.</p>
<p>Personnellement, cela me sert pour afficher mon CV sur <a href="http://thomas.tourlourat.com/" title="CV Ingenieur Informatique Lyon">thomas.tourlourat.com</a></p>
<p>Pour que le PDF utilise toute la zone du navigateur, il faut utiliser la petite astuce CSS suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;style type<span style="color: #00AA00;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #00AA00;">&gt;</span>
html<span style="color: #00AA00;">,</span>body
<span style="color: #00AA00;">&#123;</span>
    	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;"><span style="color: #cc66cc;">100</span>%</span><span style="color: #00AA00;">;</span>
   	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;"><span style="color: #cc66cc;">100</span>%</span><span style="color: #00AA00;">;</span>
    	<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
    	<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&lt;/style<span style="color: #00AA00;">&gt;</span></pre></div></div>

<p>Afficher ensuite votre iFrame</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;iframe 
    	src=&quot;http://tourlourat.com/documents/cv_tourlourat_thomas.pdf&quot; 
    	id=&quot;cv&quot;
    	width=&quot;100%&quot;
    	height=&quot;100%&quot;
    	scrolling=&quot;auto&quot;
    	frameborder=&quot;0&quot; &gt;
&lt;/iframe&gt;</pre></div></div>


<p><a href="http://feedads.g.doubleclick.net/~a/8Fuftseg6alXcCp9oqpS5pkrp4I/0/da"><img src="http://feedads.g.doubleclick.net/~a/8Fuftseg6alXcCp9oqpS5pkrp4I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8Fuftseg6alXcCp9oqpS5pkrp4I/1/da"><img src="http://feedads.g.doubleclick.net/~a/8Fuftseg6alXcCp9oqpS5pkrp4I/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/armetiz/~4/bcwYZVxcaq8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.armetiz.info/iframe-hauteur-largeur-100/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.armetiz.info/iframe-hauteur-largeur-100/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 3.145 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-09-09 15:32:27 --><!-- Compression = gzip -->
