<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.thebuble.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Bubble Sweat Bubble - développement</title>
  <link>http://blog.thebuble.org/</link>
  <description>Les périgrinations d'un mec normal dans un monde qui ne l'est franchement pas</description>
  <language>fr</language>
  <pubDate>Thu, 21 Aug 2008 09:46:10 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Dissimuler les liens mailto des pages html</title>
    <link>http://blog.thebuble.org/post/2007/11/11/Dissimuler-les-liens-mailto-des-pages-html</link>
    <guid isPermaLink="false">urn:md5:dafc0f8fd3a78fd450487786ed270bc8</guid>
    <pubDate>Sun, 11 Nov 2007 20:54:00 +0100</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>email</category>    
    <description>    Vu sur &lt;a href=&quot;http://www.alistapart.com/comments/gracefulemailobfuscation/&quot;&gt;http://www.alistapart.com/comments/gracefulemailobfuscation/&lt;/a&gt; :
&lt;br /&gt;&lt;br /&gt;Une technique intéressante pour supprimer les liens mailto sur une page html et donc empêcher la détection des adresses emails par les robots des spameurs....
La technique n'est toute fois pas parfaite (elle ne permet pas de gérer le caractère '+' des adresses emails) mais l'idée est là...</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2007/11/11/Dissimuler-les-liens-mailto-des-pages-html#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2007/11/11/Dissimuler-les-liens-mailto-des-pages-html#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/14</wfw:commentRss>
      </item>
    
  <item>
    <title>Classe php5 pour l'API Fotolia utilisant le Zend Framework</title>
    <link>http://blog.thebuble.org/post/2007/11/09/Classe-php5-pour-lAPI-Fotolia-utilisant-le-Zend-Framework</link>
    <guid isPermaLink="false">urn:md5:7ecc4f3b5c331077c4881273533926cf</guid>
    <pubDate>Fri, 09 Nov 2007 04:50:00 +0100</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>fotolia</category><category>php</category><category>xml-rpc</category><category>zend framework</category>    
    <description>&lt;p&gt;Dans la lignée de mon post précédent, voici le code d'une classe implémentant de façon simple l'API XML-RPC de &lt;a href=&quot;http://www.fotolia.com/&quot;&gt;Fotolia&lt;/a&gt; avec le &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;Je précise à tout hasard que ce code est livré tel quel et que
je ne suis pas responsable de tout problème pouvant survenir de son
utilisation.
&lt;br /&gt;La licence du code est la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Licence_BSD&quot;&gt;licence BSD&lt;/a&gt;.
&lt;br /&gt;Pour ceux que ça intéresse, cette classe fait l'objet d'une proposition pour intégrer le framework. &lt;br /&gt;Vous pouvez suivre son évolution ici : &lt;a href=&quot;http://framework.zend.com/wiki/display/ZFPROP/Zend_Service_Fotolia&quot;&gt;http://framework.zend.com/wiki/display/ZFPROP/Zend_Service_Fotolia&lt;/a&gt;
&lt;/p&gt;    &lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;require_once 'Zend/Service/Exception.php';&lt;br /&gt;require_once 'Zend/Http/Client.php';&lt;br /&gt;require_once 'Zend/XmlRpc/Client.php';&lt;br /&gt;&lt;br /&gt;class Zend_Service_Fotolia_Exception extends Zend_Service_Exception&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Zend_Service_Fotolia&lt;br /&gt;{&lt;br /&gt;    /**&lt;br /&gt;     * Fotolia xml-rpc uri&lt;br /&gt;     */&lt;br /&gt;    const FOTOLIA_URI = 'http://www.fotolia.com/Xmlrpc/rpc';&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * API key&lt;br /&gt;     *&lt;br /&gt;     * @var $_key string&lt;br /&gt;     */&lt;br /&gt;    private $_key;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * XML-RPC client&lt;br /&gt;     *&lt;br /&gt;     * @var $_client Zend_XmlRpc_Client&lt;br /&gt;     */&lt;br /&gt;    private $_client;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Proxy instances array&lt;br /&gt;     *&lt;br /&gt;     * @var $_proxies array&lt;br /&gt;     */&lt;br /&gt;    private $_proxies;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Current session id&lt;br /&gt;     *&lt;br /&gt;     * @var $_session_id string&lt;br /&gt;     */&lt;br /&gt;    private $_session_id;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Constructor&lt;br /&gt;     *&lt;br /&gt;     * @param  string $apiKey&lt;br /&gt;     */&lt;br /&gt;    public function __construct($apiKey)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;_key = $apiKey;&lt;br /&gt;        $this-&amp;gt;_session_id = NULL;&lt;br /&gt;        $http = new Zend_Http_Client();&lt;br /&gt;        $http-&amp;gt;setCookieJar();&lt;br /&gt;        $this-&amp;gt;_client = new Zend_XmlRpc_Client(self::FOTOLIA_URI, $http);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns current api key&lt;br /&gt;     *&lt;br /&gt;     * return string&lt;br /&gt;     */&lt;br /&gt;    public function getApiKey()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;_key;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method makes possible to search media in fotolia image bank.&lt;br /&gt;     * Full search capabilities are available through the API&lt;br /&gt;     *&lt;br /&gt;     * @param  array  $searchParams&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getSearchResults($searchParams)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getSearchResults',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $searchParams));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns childs of a parent category in fotolia representative category system.&lt;br /&gt;     * This method could be used to display a part of the category system or the all tree.&lt;br /&gt;     * Fotolia categories system counts three levels.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @param  int    $category_type_id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getCategories1($language_id = 2, $id = 0, $category_type_id = 1)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getCategories1',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $language_id,&lt;br /&gt;                                   $id,&lt;br /&gt;                                   $category_type_id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns childs of a parent category in fotolia conceptual category system.&lt;br /&gt;     * This method could be used to display a part of the category system or the all tree.&lt;br /&gt;     * Fotolia categories system counts three levels.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getCategories2($language_id = 2, $id = 0)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getCategories2',&lt;br /&gt;                             array($this-&amp;gt;_key, $language_id, $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns most searched tag and most used tag on fotolia website.&lt;br /&gt;     * This method may help you to create a tags cloud.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @param  string $type&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getTags($language_id = 2, $type = 'Used')&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;_call('getTags',&lt;br /&gt;                            array($this-&amp;gt;_key, $language_id, $type));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns public galleries for a defined language&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getGalleries($language_id = 2)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getGalleries',&lt;br /&gt;                             array($this-&amp;gt;_key, $language_id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns childs of a parent colors in the Fotolia color scheme.&lt;br /&gt;     * If no parent is provided first level colors are returned.&lt;br /&gt;     * This method can be used to display color and subcolors for color search queries.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getColors($id = 0)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getColors', array($this-&amp;gt;_key, $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns Fotolia list of countries.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getCountries($language_id = 2)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getCountries',&lt;br /&gt;                             array($this-&amp;gt;_key, $language_id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns fotolia data&lt;br /&gt;     *&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getData()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getData', array($this-&amp;gt;_key));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method is a test method which returns success if connexion is valid&lt;br /&gt;     *&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function test()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('test', array($this-&amp;gt;_key));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method return all information about a media&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @param  int    $thumbnail_size&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getMediaData($id, $thumbnail_size = 110, $language_id = 2)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getMediaData',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $id,&lt;br /&gt;                                   $thumbnail_size,&lt;br /&gt;                                   $language_id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method return private galleries for logged user&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @param  int    $language_id&lt;br /&gt;     * @param  int    $thumbnail_size&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getMediaGalleries($id, $language_id = 2, $thumbnail_size = 110)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getMediaData',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $id,&lt;br /&gt;                                   $language_id,&lt;br /&gt;                                   $thumbnail_size));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method allows to purchase a media and returns url to the purchased file&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @param  string $license_name&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getMedia($id, $license_name)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getMedia',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId(),&lt;br /&gt;                                   $id,&lt;br /&gt;                                   $license_name));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns comp images. Comp images can ONLY be used to evaluate the image&lt;br /&gt;     * as to suitability for a project, obtain client or internal company approvals,&lt;br /&gt;     * or experiment with layout alternatives.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getMediaComp($id)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getMediaComp',&lt;br /&gt;                             array($this-&amp;gt;_key, $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Authenticate an user&lt;br /&gt;     *&lt;br /&gt;     * @param  string $login User login&lt;br /&gt;     * @param  string $pass User password&lt;br /&gt;     */&lt;br /&gt;    public function loginUser($login, $pass)&lt;br /&gt;    {&lt;br /&gt;        $res = $this-&amp;gt;__call('loginUser',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $login,&lt;br /&gt;                                   $pass));&lt;br /&gt;        $this-&amp;gt;_session_id = $res['session_id'];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Log out an user&lt;br /&gt;     */&lt;br /&gt;    public function logoutUser()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;__call('logoutUser',&lt;br /&gt;                      array($this-&amp;gt;key,&lt;br /&gt;                            $this-&amp;gt;_getSessionId()));&lt;br /&gt;        $this-&amp;gt;_session_id = NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns data for logged user.&lt;br /&gt;     *&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getUserData()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getUserData',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId()));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method allows you to get sales/views/income statistics from your account.&lt;br /&gt;     *&lt;br /&gt;     * @param  string $type&lt;br /&gt;     * @param  string $time_range&lt;br /&gt;     * @param  string $easy_date_period&lt;br /&gt;     * @param  string $start_date&lt;br /&gt;     * @param  string $end_date&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getUserAdvancedStats($type,&lt;br /&gt;                                         $time_range,&lt;br /&gt;                                         $easy_date_period=NULL,&lt;br /&gt;                                         $start_date=NULL,&lt;br /&gt;                                         $end_date=NULL)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getUserAdvancedStats',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId(),&lt;br /&gt;                                   $type,&lt;br /&gt;                                   $time_range,&lt;br /&gt;                                   $easy_date_period,&lt;br /&gt;                                   $start_date,&lt;br /&gt;                                   $end_date));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This methods returns statistics for logged user&lt;br /&gt;     *&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getUserStats()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getUserStats',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId()));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Delete a user's gallery&lt;br /&gt;     *&lt;br /&gt;     * @param  string $id&lt;br /&gt;     */&lt;br /&gt;    public function deleteUserGallery($id)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;__call('deleteUserGallery',&lt;br /&gt;                      array($this-&amp;gt;_key,&lt;br /&gt;                            $this-&amp;gt;_getSessionId(),&lt;br /&gt;                            $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method allows you to create a new gallery in your account.&lt;br /&gt;     *&lt;br /&gt;     * @param  string $name&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function createUserGallery($name)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('createUserGallery',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId(),&lt;br /&gt;                                   $name));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method allows you to add a content to your default lightbox or any of your existing galleries&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $content_id&lt;br /&gt;     * @param  string $id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function addToUserGallery($content_id, $id = '')&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('addToUserGallery',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId(),&lt;br /&gt;                                   $content_id,&lt;br /&gt;                                   $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method allows you to remove a content from your default lightbox or any of your existing galleries&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $content_id&lt;br /&gt;     * @param  string $id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function removeFromUserGallery($content_id, $id = '')&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('removeFromUserGallery',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId(),&lt;br /&gt;                                   $content_id,&lt;br /&gt;                                   $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method allows to search media in logged user galleries or lightbox.&lt;br /&gt;     *&lt;br /&gt;     * @param  int    $page&lt;br /&gt;     * @param  int    $per_page&lt;br /&gt;     * @param  int    $thumbnail_size&lt;br /&gt;     * @param  string $id&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getUserGalleryMedias($page = 0,&lt;br /&gt;                                         $per_page = 32,&lt;br /&gt;                                         $thumbnail_size = 110,&lt;br /&gt;                                         $id = '')&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getUserGalleryMedias',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId(),&lt;br /&gt;                                   $page,&lt;br /&gt;                                   $per_page,&lt;br /&gt;                                   $thumbnail_size,&lt;br /&gt;                                   $id));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * This method returns private galleries for logged user.&lt;br /&gt;     *&lt;br /&gt;     * @return array&lt;br /&gt;     */&lt;br /&gt;    public function getUserGalleries()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__call('getUserGalleries',&lt;br /&gt;                             array($this-&amp;gt;_key,&lt;br /&gt;                                   $this-&amp;gt;_getSessionId()));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Magic method used to call fotolia xml-rpc functions&lt;br /&gt;     *&lt;br /&gt;     * @param  string $method&lt;br /&gt;     * @param  array  $args&lt;br /&gt;     * @return array&lt;br /&gt;     * @throws Zend_Service_Fotolia_Exception&lt;br /&gt;     */&lt;br /&gt;    public function __call($method, $args)&lt;br /&gt;    {&lt;br /&gt;        $obj = $this-&amp;gt;_getProxy($this-&amp;gt;_getNamespace($method));&lt;br /&gt;        try {&lt;br /&gt;            return $obj-&amp;gt;__call($method, $args);&lt;br /&gt;        } catch (Zend_XmlRpc_Client_Exception $e) {&lt;br /&gt;            throw new Zend_Service_Fotolia_Exception($e-&amp;gt;getMessage(),&lt;br /&gt;                                                     $e-&amp;gt;getCode());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns xml-rpc client&lt;br /&gt;     *&lt;br /&gt;     * @return Zend_XmlRpc_Client&lt;br /&gt;     */&lt;br /&gt;    public function getClient()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;_client;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns namespace associated to given method name&lt;br /&gt;     *&lt;br /&gt;     * @param  string $method&lt;br /&gt;     * @return string&lt;br /&gt;     */&lt;br /&gt;    protected function _getNamespace($method)&lt;br /&gt;    {&lt;br /&gt;        switch ($method) {&lt;br /&gt;        case 'getSearchResults':&lt;br /&gt;        case 'getCategories1':&lt;br /&gt;        case 'getCategories2':&lt;br /&gt;        case 'getTags':&lt;br /&gt;        case 'getGalleries':&lt;br /&gt;        case 'getColors':&lt;br /&gt;        case 'getCountries':&lt;br /&gt;            return 'search';&lt;br /&gt;        case 'getMediaData':&lt;br /&gt;        case 'getMediaGalleries':&lt;br /&gt;        case 'getMedia':&lt;br /&gt;        case 'getMediaComp':&lt;br /&gt;            return 'media';&lt;br /&gt;        case 'loginUSer':&lt;br /&gt;        case 'logoutUser':&lt;br /&gt;        case 'getUserData':&lt;br /&gt;        case 'getUserGalleries':&lt;br /&gt;        case 'getUserGalleryMedias':&lt;br /&gt;        case 'deleteUserGallery':&lt;br /&gt;        case 'createUserGallery':&lt;br /&gt;        case 'addToUserGallery':&lt;br /&gt;        case 'removeFromUserGallery':&lt;br /&gt;        case 'getUSerAdvancedStats':&lt;br /&gt;            return 'user';&lt;br /&gt;        case 'getData':&lt;br /&gt;        case 'test':&lt;br /&gt;            return 'main';&lt;br /&gt;        default:&lt;br /&gt;            return 'xmlrpc';&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns a xml-rpc proxy instance from a namespace&lt;br /&gt;     *&lt;br /&gt;     * @param  string $namespace&lt;br /&gt;     * @return Zend_xmlRpc_Client_ServerProxy&lt;br /&gt;     * @throws Zend_Service_Fotolia_Exception&lt;br /&gt;     */&lt;br /&gt;    protected function _getProxy($namespace)&lt;br /&gt;    {&lt;br /&gt;        if (!isset($this-&amp;gt;_proxies[$namespace])) {&lt;br /&gt;            $valid = array('xmlrpc', 'search', 'media', 'user', 'main');&lt;br /&gt;            if (!in_array($namespace, $valid)) {&lt;br /&gt;                throw new Zend_Service_Fotolia_Exception('invalid namespace');&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            $this-&amp;gt;_proxies[$namespace] = $this-&amp;gt;_client-&amp;gt;getProxy($namespace);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return $this-&amp;gt;_proxies[$namespace];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns current session id&lt;br /&gt;     *&lt;br /&gt;     * @return string&lt;br /&gt;     * @throws Zend_Service_Fotolia_Exception&lt;br /&gt;     */&lt;br /&gt;    protected function _getSessionId()&lt;br /&gt;    {&lt;br /&gt;        if ($this-&amp;gt;_session_id === NULL) {&lt;br /&gt;            throw new Zend_Service_Fotolia_Exception('session id not set, please use loginUser method before');&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return $this-&amp;gt;_session_id;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2007/11/09/Classe-php5-pour-lAPI-Fotolia-utilisant-le-Zend-Framework#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2007/11/09/Classe-php5-pour-lAPI-Fotolia-utilisant-le-Zend-Framework#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/13</wfw:commentRss>
      </item>
    
  <item>
    <title>Utiliser l'API XML-RPC Fotolia en php5</title>
    <link>http://blog.thebuble.org/post/2007/11/08/Utiliser-lAPI-XML-RPC-Fotolia-en-php5</link>
    <guid isPermaLink="false">urn:md5:5c4fbb0fd39c607fd702e703974a0705</guid>
    <pubDate>Thu, 08 Nov 2007 11:17:00 +0100</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>fotolia</category><category>xml-rpc</category><category>zend framework</category>    
    <description>&lt;p&gt;Afin d'utiliser l'api de &lt;a href=&quot;http://fr.fotolia.com/&quot;&gt;Fotolia&lt;/a&gt; il est nécessaire d'obtenir une clé API.
&lt;br /&gt;Si vous n'en avez pas déjà une, il suffit d'aller dans votre compte, section &quot;outils&quot; puis de cliquer sur l'onglet &quot;api&quot;.
&lt;br /&gt;Une fois que votre clé API aura été validée par l'équipe Fotolia vous pourrez commencer à utiliser leur service xml-rpc. &lt;br /&gt;Lire &lt;a href=&quot;http://fr.fotolia.com/Services/API/Documentation&quot;&gt;la documentation&lt;/a&gt; sera bien sûr bienvenue !
&lt;/p&gt;    Voici un exemple de recherche sur Fotolia via le composant &lt;a href=&quot;http://framework.zend.com/manual/fr/zend.xmlrpc.client.html&quot;&gt;Zend_XmlRpc_Client&lt;/a&gt; du &lt;a href=&quot;http://framework.zend.com&quot;&gt;Zend Framework&lt;/a&gt;.
&lt;pre&gt;require_once 'Zend/Loader.php';&lt;br /&gt;&lt;br /&gt;Zend_Loader::registerAutoload();&lt;br /&gt;$client = new Zend_XmlRpc_Client('http://www.fotolia.com/Xmlrpc/rpc');&lt;br /&gt;&lt;br /&gt;// on récupère l'objet correspondant à l'espace de noms 'system'&lt;br /&gt;$system = $client-&amp;gt;getProxy('system');&lt;br /&gt;&lt;br /&gt;// on affiche la liste des méthodes supportées par le serveur&lt;br /&gt;echo &quot;Méthodes disponibles :\n&quot;;&lt;br /&gt;print_r($system-&amp;gt;listMethods());&lt;br /&gt;&lt;br /&gt;// on affiche l'aide xml-rpc de la méthode search.getSearchResults&lt;br /&gt;echo &quot;Aide du serveur :\n&quot;;&lt;br /&gt;echo $system-&amp;gt;methodHelp('search.getSearchResults');&lt;br /&gt;&lt;br /&gt;// clé API fotolia&lt;br /&gt;$api_key = 'ma clé api fotolia';&lt;br /&gt;&lt;br /&gt;// on récupère l'objet correspondant à l'espace de noms 'search'&lt;br /&gt;$search = $client-&amp;gt;getProxy('search');&lt;br /&gt;&lt;br /&gt;// on recherche toutes les photos de bulldog anglais sur le site US&lt;br /&gt;$results = $search-&amp;gt;getSearchResults($api_key,&lt;br /&gt;                                     array('words' =&amp;gt; 'bulldog anglais'));&lt;br /&gt;&lt;br /&gt;// on recherche toutes les photos de bulldog anglais sur le site français&lt;br /&gt;$results = $search-&amp;gt;getSearchResults($api_key,&lt;br /&gt;                                     array('words' =&amp;gt; 'bulldog anglais',&lt;br /&gt;                                           'language_id' =&amp;gt; 1));&lt;br /&gt;&lt;br /&gt;// on recherche les 10 première photos de bulldog anglais sur le site français&lt;br /&gt;$results = $search-&amp;gt;getSearchResults($api_key,&lt;br /&gt;                                     array('words' =&amp;gt; 'bulldog anglais',&lt;br /&gt;                                           'language_id' =&amp;gt; 1,&lt;br /&gt;                                           'limit' =&amp;gt; 10));&lt;br /&gt;&lt;br /&gt;// on affiche les résultats de la recherche&lt;br /&gt;foreach ($results as $result) {&lt;br /&gt;    echo 'Photo #' . $result['id'] . &quot;\\n&quot;;&lt;br /&gt;    echo 'Titre : ' . $result['title'] . &quot;\\n&quot;;&lt;br /&gt;    echo 'Auteur : ' . $result['creator_name'] . &quot;\\n&quot;;&lt;br /&gt;    echo 'Miniature de la photo : ' . $result['thumbnail_url'] . &quot;\\n&quot;;&lt;br /&gt;    echo 'Tag html à utiliser : ' . $result['thumbnail_html_tag'] . &quot;\\n&quot;;&lt;br /&gt;    echo &quot;\\n&quot;;&lt;br /&gt;}&lt;/pre&gt;
Exemple de requête nécessitant une identification préalable :
&lt;pre&gt;require_once 'Zend/Loader.php';&lt;br /&gt;&lt;br /&gt;Zend_Loader::registerAutoload();&lt;br /&gt;&lt;br /&gt;// on utilise un client http avec le support des cookies activé&lt;br /&gt;$http_client = new Zend_Http_Client();&lt;br /&gt;$http_client-&amp;gt;setCookieJar();&lt;br /&gt;$client = new Zend_XmlRpc_Client('http://www.fotolia.com/Xmlrpc/rpc',&lt;br /&gt;                                 $http_client);&lt;br /&gt;&lt;br /&gt;// clé API fotolia&lt;br /&gt;$api_key = 'ma clé api fotolia';&lt;br /&gt;&lt;br /&gt;// on récupère l'objet correspondant à l'espace de noms 'user'&lt;br /&gt;$user = $client-&amp;gt;getProxy('user');&lt;br /&gt;&lt;br /&gt;// on s'identifie&lt;br /&gt;$res = $user-&amp;gt;loginUser($api_key, 'identifiant', 'mot de passe');&lt;br /&gt;$sess_id = $res['session_id'];&lt;br /&gt;&lt;br /&gt;// on récupère les statistiques du compte&lt;br /&gt;$stats = $user-&amp;gt;getUserStats($api_key, $sess_id);&lt;br /&gt;&lt;br /&gt;echo 'Nombre de médias envoyés : ' . $stats['nb_media_uploaded'] . &quot;\\n&quot;;&lt;br /&gt;echo 'Nombre de médias validés : ' . $stats['nb_media_accepted'] . &quot;\\n&quot;;&lt;br /&gt;echo 'Nombre de médias achetés : ' . $stats['nb_media_purchased'] . &quot;\\n&quot;;&lt;br /&gt;echo 'Nombre de médias vendus : ' . $stats['nb_media_sold'] . &quot;\\n&quot;;&lt;br /&gt;echo 'Classement du compte : ' . $stats['ranking_absolute'] . &quot;\\n&quot;;&lt;br /&gt;echo 'Classement du compte sur les 7 derniers jours : ' . $stats['ranking_relative'] . &quot;\\n&quot;;&lt;/pre&gt;
Comme vous le voyez, il est très simple d'accéder à toute la puissance de Fotolia grâce au Zend Framework !</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2007/11/08/Utiliser-lAPI-XML-RPC-Fotolia-en-php5#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2007/11/08/Utiliser-lAPI-XML-RPC-Fotolia-en-php5#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/12</wfw:commentRss>
      </item>
    
  <item>
    <title>sprintf en Javascript</title>
    <link>http://blog.thebuble.org/post/2007/06/07/sprintf-en-Javascript</link>
    <guid isPermaLink="false">urn:md5:cea23956d96e85b8a0f97d943085e8a4</guid>
    <pubDate>Thu, 07 Jun 2007 10:54:00 +0200</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>javascript</category>    
    <description>    Javascript ne propose pas en standard de fonction sprintf pourtant si pratique....
Voilà le code de cette fonction trouvée sur &lt;a href=&quot;http://jan.moesen.nu/&quot;&gt;http://jan.moesen.nu/&lt;/a&gt; :
&lt;pre style=&quot;overflow: auto;&quot;&gt;// This code is in the public domain. Feel free to link back to http://jan.moesen.nu/&lt;br /&gt;function sprintf() {&lt;br /&gt;    if (!arguments || arguments.length &amp;lt; 1 || !RegExp) {&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var str = arguments[0];&lt;br /&gt;    var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;&lt;br /&gt;    var a = b = [], numSubstitutions = 0, numMatches = 0;&lt;br /&gt;    while (a = re.exec(str)) {&lt;br /&gt;        var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];&lt;br /&gt;        var pPrecision = a[5], pType = a[6], rightPart = a[7];&lt;br /&gt;&lt;br /&gt;        numMatches++;&lt;br /&gt;&lt;br /&gt;        if (pType == '%') {&lt;br /&gt;            subst = '%';&lt;br /&gt;        } else {&lt;br /&gt;            numSubstitutions++;&lt;br /&gt;            if (numSubstitutions &amp;gt;= arguments.length) {&lt;br /&gt;                alert('Error! Not enough function arguments (' + (arguments.length - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).');&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            var param = arguments[numSubstitutions];&lt;br /&gt;            var pad = '';&lt;br /&gt;            if (pPad &amp;amp;&amp;amp; pPad.substr(0,1) == &quot;'&quot;) {&lt;br /&gt;                pad = leftpart.substr(1,1);&lt;br /&gt;            } else if (pPad) {&lt;br /&gt;                pad = pPad;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            var justifyRight = true;&lt;br /&gt;            if (pJustify &amp;amp;&amp;amp; pJustify === &quot;-&quot;) {&lt;br /&gt;                justifyRight = false;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            var minLength = -1;&lt;br /&gt;            if (pMinLength) {&lt;br /&gt;                minLength = parseInt(pMinLength);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            var precision = -1;&lt;br /&gt;            if (pPrecision &amp;amp;&amp;amp; pType == 'f') {&lt;br /&gt;                precision = parseInt(pPrecision.substring(1));&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            var subst = param;&lt;br /&gt;            if (pType == 'b') {&lt;br /&gt;                subst = parseInt(param).toString(2);&lt;br /&gt;            } else if (pType == 'c') {&lt;br /&gt;                subst = String.fromCharCode(parseInt(param));&lt;br /&gt;            } else if (pType == 'd') {&lt;br /&gt;                subst = parseInt(param) ? parseInt(param) : 0;&lt;br /&gt;            } else if (pType == 'u') {&lt;br /&gt;                subst = Math.abs(param);&lt;br /&gt;            } else if (pType == 'f') {&lt;br /&gt;                subst = (precision &amp;gt; -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);&lt;br /&gt;            } else if (pType == 'o') {&lt;br /&gt;                subst = parseInt(param).toString(8);&lt;br /&gt;            } else if (pType == 's') {&lt;br /&gt;                subst = param;&lt;br /&gt;            } else if (pType == 'x') {&lt;br /&gt;                subst = ('' + parseInt(param).toString(16)).toLowerCase();&lt;br /&gt;            } else if (pType == 'X') {&lt;br /&gt;                subst = ('' + parseInt(param).toString(16)).toUpperCase();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        str = leftpart + subst + rightPart;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return str;&lt;br /&gt;}&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2007/06/07/sprintf-en-Javascript#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2007/06/07/sprintf-en-Javascript#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/11</wfw:commentRss>
      </item>
    
  <item>
    <title>Lightbox ou comment attirer l'attention</title>
    <link>http://blog.thebuble.org/post/2006/08/16/Lightbox-ou-comment-attirer-lattention</link>
    <guid isPermaLink="false">urn:md5:8d19bb9274041e03f62633bca9fb98e0</guid>
    <pubDate>Wed, 16 Aug 2006 20:23:00 +0200</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>javascript</category>    
    <description>    Pour ceux qui se demande comment réaliser un effet de boîte de dialogue rendant inaccessible ce qui est derrière lui, autrement dit un comportement basique de n'importe quel système de fenêtres, une solution en javascript se nomme &lt;a href=&quot;http://www.gregphoto.net/index.php/2006/02/26/multifaceted-lightbox/&quot;&gt;Lightbox&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;Il s'agit d'une bibliothèque javascript qui permet d'afficher une boîte de dialogue de façon élégante et rapide de façon très simple.
On peut l'utiliser en lui donnant une url ou charger ses données ou alors les lui donner directement. &lt;br /&gt;Pour ceux qui ont déjà fait de jolis formulaires on peut aussi très facilement les relier au système lightbox.
&lt;br /&gt;Seul bémol en ce qui me concerne : le code n'est pas écrit en objet.</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2006/08/16/Lightbox-ou-comment-attirer-lattention#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2006/08/16/Lightbox-ou-comment-attirer-lattention#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/6</wfw:commentRss>
      </item>
    
  <item>
    <title>Zend Framework</title>
    <link>http://blog.thebuble.org/post/2006/08/15/Zend-Framework</link>
    <guid isPermaLink="false">urn:md5:08cde61ad90443f27b57664d7cc06ad6</guid>
    <pubDate>Tue, 15 Aug 2006 16:03:00 +0200</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>php</category><category>zend framework</category>    
    <description>    J'ai longtemps cherché un framework intéressant à utiliser en php.
&lt;br /&gt;&lt;br /&gt;Tous les framework que j'avais pu trouvé ne me plaisaient pas : ils étaient ou trop lourd ou trop simple et dans les deux cas compliqués à mettre en oeuvre dans un projet industriel.
&lt;br /&gt;&lt;br /&gt;Mais voilà que Zend a répondu à mon &lt;a href=&quot;http://framework.zend.com&quot;&gt;besoin&lt;/a&gt; !&lt;br /&gt;Ce framework est conçu sur le modèle &lt;a href=&quot;http://en.wikipedia.org/wiki/Model-view-controller&quot;&gt;MVC&lt;/a&gt; et est très modulaire.&lt;br /&gt;Le fait qu'il soit supporté par Zend lui donne un côté pérenne qui n'est pas fait pour me déplaire !</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2006/08/15/Zend-Framework#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2006/08/15/Zend-Framework#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/5</wfw:commentRss>
      </item>
    
  <item>
    <title>Travailler avec des fichiers .po</title>
    <link>http://blog.thebuble.org/post/2008/03/20/Travailler-avec-des-fichiers-po</link>
    <guid isPermaLink="false">urn:md5:b1936f84a89f7c0dec0fb5a96c7e48be</guid>
    <pubDate>Thu, 26 Jan 2006 23:47:00 +0100</pubDate>
    <dc:creator>Olivier</dc:creator>
        <category>développement</category>
        <category>gettext</category><category>localisation</category>    
    <description>    Les fichiers &lt;em&gt;.po&lt;/em&gt; sont les fichiers utilisés par les systèmes de traduction utilisant gettext. Un exemple de fichier &lt;em&gt;.po&lt;/em&gt; pourrait être :
&lt;code&gt;&lt;br /&gt;# message à traduire&lt;br /&gt;msgid &quot;Hello world!&quot;&lt;br /&gt;# message traduit&lt;br /&gt;msgstr &quot;Bonjour monde !&quot;
&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;Ce n'est pas les fichiers &lt;em&gt;.po&lt;/em&gt; qui sont utilisés à proprement parler par gettext mais une version binaire du fichier en extension &lt;em&gt;.mo&lt;/em&gt;.
&lt;br /&gt;&lt;br /&gt;Un tel fichier est généré par une commande du type :
&lt;code&gt;msgfmt -o mon_fichier.mo mon_fichier.po&lt;/code&gt;
&lt;br /&gt;&lt;br /&gt;Comme d'habitude, se réferer à la page de manuel de la commande &lt;em&gt;msgfmt&lt;/em&gt;  pour de plus amples informations sur ses possibilités.</description>
    
    
    
          <comments>http://blog.thebuble.org/post/2008/03/20/Travailler-avec-des-fichiers-po#comment-form</comments>
      <wfw:comment>http://blog.thebuble.org/post/2008/03/20/Travailler-avec-des-fichiers-po#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.thebuble.org/feed/rss2/comments/4</wfw:commentRss>
      </item>
    
</channel>
</rss>