table des matières
Transcription
table des matières
1 5/2009 NewsletTux 2 www.phpsolmag.org 7/2010 8 Table des matières www.phpsolmag.org 3 9/2010 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682 Varsovie, Pologne Tél. 0975180358, Fax. +48 22 244 24 59 www.phpsolmag.org Président de Software Press Sp. z o.o. SK : Paweł Marciniak Directrice de la publication : Ewa Łozowicka Dépôt légal : à parution ISSN : 1731-4593 Rédacteur en chef : Łukasz Bartoszewicz Couverture : Sławomir Sobczyk DTP : Sławomir Sobczyk [email protected] Composition : Sławomir Sobczyk Correction : Valérie Viel, Thierry Borel, Barbara Bourdelles Bêta-testeurs : Fabrice Gyre, Brice Favre, Valérie Viel, Cyril David, Christophe Milhau, Alain Ribault, Stéphane Guedon, Eric Boulet, Mickael Puyfages, Christian Hernoux, Isabelle Lupi, Antoine Beluze, Timotée Neullas, Yann Faure, Adrien Mogenet, Jean-François Montgaillard, Turmeau Nicolas, Jonathan Marois, Wilfried Ceron, Wajih Letaief, François Van de Weerdt, Eric Vincent, Franck Michaël Assi, Francis Hulin-Hubard, Nicolas Dumas, David Michaud. Les personnes intéressées par la coopération sont priées de nous contacter : [email protected] Publicité : [email protected] Pour créer les diagrammes on a utilisé le programme AVERTISSEMENT Les techniques présentées dans les articles ne peuvent être utilisées qu’au sein des réseaux internes. La rédaction du magazine n’est pas responsable de l’utilisation incorrecte des techniques présentées. L’utilisation des techniques présentées peut provoquer la perte des données ! 4 TABLE DES MATIÈRES VARIA 6 Actualités Actualités du monde du développement. Christophe Villeneuve OUTILS 8 NewsletTux, logiciel de gestion de listes de diffusion pour votre site Web Matthieu Lacroix NewsletTux est un logiciel écrit en PHP et MySQL qui permet à vos visiteurs de s’abonner à une liste de diffusion. A vous d’écrire vos lettres d’information grâce à un éditeur de texte avancé, des templates. Découvrez les possibilités de NewsletTux. PROJETS 13 L’approche PHP pour le système d’exploitation Android Julien Del Rio Depuis 2007 et son annonce par Google, un système d’exploitation Open Source pour les terminaux mobiles fait son nid dans le paysage mobile. Il s’appelle Android. Prévu au départ pour du développement en Java, Google propose de plus en plus d’outils pour développer dans d’autres langages. Voyons les possibilités pour PHP. 17 ExtJs, Json et PHP Maodo Diop L’objet de cet article est de voir la coopération entre ExtJs récemment connu sous Sencha et PHP. La communication des données se fera au travers du JSON. ExtJs permettra uniquement d’afficher un rendu graphique à travers les données issues de PHP. Il ne s’agit donc pas d’une application purement Javascript mais un rendu d’ExtJs. DOSSIER 20 PHP5 contre Java : le champ des possibles William Durand Le langage PHP a été créé en 1994 par Rasmus Lerdorf. Le langage Java quant à lui est basé sur un projet de Sun Microsystems datant des années 1990, mais dès 1994, la plate-forme Java se concentre sur le web. Ces deux langages ont été introduits sensiblement au 9/2010 Table des matières même moment pourtant ceux-ci s’opposent rapidement. A l’heure actuelle, qu’est-ce qui fera qu’une entreprise choisisse l’une de ces deux technologies plutôt que l’autre ? PRATIQUE 25 Génération de PDF en PHP via la classe FPDF Jonathan Danse L’automatisation des tâches et la génération de documents en ligne devient monnaie courante. Dès lors, il est important d’avoir à disposition des outils adéquats permettant de réaliser des documents automatiquement et ce en conservant leur aspect graphique. Nous allons aborder la génération de document PDF via PHP. E-COMMERCE 30 E-commerce international Gauthier Bouly, Mickael Ruau Quels sont les problèmes liés à l’internationalisation de l’e-commerce ? Quelles solutions pour palier à ces difficultés ? Cet article vous apporte les principaux éléments de réflexion, en abordant le e-commerce sous l’angle du B to C (business to consumer). FICHE TECHNIQUE 38 Comparatif des fonctionnalités de référencement naturel entre Joomla 1.5 et 1.6 Isabelle Lupi Les règles du référencement naturel s’affinent au fil des mois et les moteurs accordent de plus en plus d’attention à la qualité de la présentation ainsi que du contenu. L’auteur de cet article analyse et compare les fonctionnalités de Joomla 1.5 et de Joomla 1.6 autour de quelques points importants en termes de référencement naturel, tels que des noms de pages significatifs, des urls bien constituées ou la gestion des méta-tags (ou métadonnées). POUR LES DÉBUTANTS 46 Manipuler une archive ZIP avec PHP Cilia Mauro, Magali Contensin Le format de fichier ZIP est un format d’archivage et de compression supporté par tous les systèmes d’exploitation. La spécification du format et son extension sont du domaine public. Savoir manipuler une archive ZIP est utile lorsqu’un grand nombre de données doit être envoyé à un script PHP, ou que le script génère plusieurs fichiers en sortie. Actualités Viewer pour PHP C’est une application qui est une alternative aux AMP (Apache – MySQL – PHP) déjà existant. Ce projet a pour but d’afficher vos PHP sans avoir besoin d’installer autre chose. Il se sert de son propre environnement et d’un navigateur pour traiter et afficher les pages PHP, comme il le ferait dans un navigateur normal. http://viewerforphp.sourceforge.net/ PostgreSQL 9.0 La nouvelle version de PostgreSQL vient de sortir. Elle apporte de nombreuses évolutions dont la plus importante concerne la réplication intégrée, c’est-à-dire que vous pouvez avoir un seul maître et plusieurs esclaves, ce qui n’était pas possible auparavant en natif. http://www.postgresql.org/ Importateur projet 4.1 Il s’agit d’une application en PHP, permettant d’importer certains types de fichiers comme actuellement les formats WBS Gantt Chart Pro et Microsoft Project. Comme ceci, vous allez pouvoir utiliser ces documents dans vos différents projets. https://sourceforge.net/projects/web2project-mod/files/Project-Importer/ MariaDB 5.1.50 La base de données MariaDB est maintenant compatible avec de nouvelles applications PHP comme le CMS Drupal et prochainement Zend Framework. http://askmonty.org/blog/mariadb-51-50-released/ MonoQL MonoQL permet de gérer les bases de données MySQL. Cet outil agile a été réalisé en PHP / Ajax, sous licence Open Source et se compose d’une interface fluide et intuitive sous la forme d’un environnement Desktop. Vous retrouverez l’ensemble des fonctionnalités standards pour gérer une base de données : Création, manipulations, éditions, import et export. http://sourceforge.net/projects/monoql/ Roundcube 0.4 La nouvelle version du Webmail Roundcube vient de sortir en PHP, sous licence GPL. Cette application vous permet d’utiliser un environnement de messagerie en IMAP, tout en utilisant les dernières versions de jQuery et TinyMCE. Vous trouverez au niveau des évolutions l’ajout de la signature, l’amélioration du carnet de contacts, l’accélération de l’application au niveau des performances d’affichages, l’évolution de l’interface générale et des dossiers, une prise en charge de la connexion TLS. http://roundcube.net/ 6 ORM Designer Ce projet a été lancé suite à un constat que les développeurs qui utilisent les frameworks PHP, réalisent leurs projets avec l’aide de différents ORM (Doctrine, Propel, etc...). Par ailleurs, certains développeurs ne peuvent plus s’en passer, même sur des projets classiques car cela donne plus de liberté aux développeurs ou développeuses pour optimiser le nouveau projet web. Le but de ORM Designer, c’est de vous permettre de maintenir vos projets car il s’agit d’un double outils : • Un outil de modélisation (ERD). • Un outil de Désigner ORM. ORM Designer vous permet de concevoir des modèles d’application de manière confortable et exporte le modèle dans le format natof ORM choisi. Par ailleurs, il reconnaît de nombreux formats vous permettant d’importer et d’exporter les principaux ORM, MySQL Workbench ou fabForce DBDesigner. http://www.orm-designer.com/ IPFaces IPFaces est un Framework pour téléphones mobiles (iPhone, iPod touch, BlackBerry et les téléphones équipés de Java ME). Le principe est simple : il s’agit simplement d’une application client/serveur. D’un coté vous développez une application JEE et de l’autre la possibilité de développer des applications riches. La prise en main de ce framework est facile puisque vous pourrez vous connecter avec un serveur d’applications et par conséquent vous pouvez utiliser différents langages de développement comme PHP. Les avantages d’utiliser ce type de Framework, concerne le rendu graphique natif à l’iPhone, une utilisation simplifié au maximum. Cependant, vous devez posséder une application cliente générique ce qui limite plusieurs développements en simultanés et obligeant la reconfiguration à chaque fois. Au niveau de la façon de développer, voici un petit exemple qui affiche un texte Hello World : <?php require «path/to/ipfaces/library/ipfaces-php-lib-1.1.php»; $ipf_form = new IPFForm(); $ipf_screen = $ipf_form->addScreen(«screen», «Hello World Application»); $ipf_screen->addLabel(«label», «Hello World!»); $ipf_form->render(); ?> http://www.ipfaces.org/ Rédaction des actualités : Christophe Villeneuve 9/2010 <<TOP>> PHP5 et Java <<SHORT_NEWS>> <<BODY>> www.phpsolmag.org 710 Outils NewsletTux, logiciel de gestion de listes de diffusion pour votre site Web NewsletTux est un logiciel écrit en PHP et MySQL qui permet à vos visiteurs de s’abonner à une liste de diffusion, et à vous d’écrire vos lettres d’information grâce à un éditeur de texte avancé, des templates… Cet article explique : Ce qu’il faut savoir : • Ce qu’est NewsletTux, ses pré-requis, son installation. • Comment fonctionne une liste de diffusion. • Savoir activer PHP5 sur son hébergement, créer une base de données MySQL, installer un logiciel sur son site (FTP, chemins relatifs). V ous êtes sans doute déjà abonné à des listes de diffusion, lorsqu’un site d’entreprise vous envoie un email contenant ses dernières nouveautés. Vous recevez cet email sur votre ordinateur à l’aide de votre client messagerie, ou sur votre téléphone / smartphone / iPhone … Et vous êtes ainsi tenu au courant des dernières publications. Ou bien, vous êtes membre d’une association qui diffuse par ce biais ses prochains événements, ainsi que la vie de l’association… Plus exactement, c’est votre adresse email qui est inscrite à une liste de diffusion, une liste contenant une centaine, voire des milliers d’adresses à qui un email unique sera envoyé. Tour d’horizon de quelques logiciels existants Il existe plusieurs solutions permettant d’atteindre cet objectif, certaines sont gratuites, d’autres payantes, certaines utilisent un simple site Web, d’autres un logiciel avec un client lourd (i.e. installé sur votre ordinateur). Dans les solutions gratuites, il y a PHPList, NewsletTux, phpMyNewsletter, sur la plate-forme Apache/PHP, ainsi que d’autres systèmes, tournant sur des platesformes Microsoft type IIS/ASP. Ces solutions nécessitent un serveur Web pour fonctionner et se contrôlent par une interface type administration de site web, via un navigateur (qui peut être Firefox, Internet Explorer… ou votre iPhone !). Dans les solutions payantes, certains professionnels proposent un service en ligne (campagne d’e-mailing 8 pour un budget, une quantité max d’emails, un temps d’envoi, etc.) ou des solutions logicielles existent, comme Sarbacane ou Augure qui s’installent sur un serveur d’entreprise et utilisent l’outil de messagerie de l’entreprise ou du fournisseur d’accès à Internet. Présentation de NewsletTux Parmi ces solutions (la liste pourrait être très longue, vous avez ici les principaux logiciels représentés sur Internet), nous avons choisi de présenter NewsletTux, un logiciel permettant d’appliquer le principe de l’e-mailing sur votre site Web à l’aide d’un panel d’options et de fonctionnalités pour rédiger vos emails simplement et les envoyer en quelques clics… Figure 1. Accueil NewsletTux.fr 9/2010 NewsletTux Chaque visiteur peut à tout moment s’inscrire à votre liste et se retirer (désabonner), vous déchargeant de la tâche de le faire manuellement à chaque retour de mail ! En matière de données personnelles, la loi française impose que le site offre un moyen d’accès, rectification et suppression des données, ce que NewsletTux prend en charge. Mais peut-être que votre site présente plusieurs rubriques, vous désirez ainsi proposer à vos visiteurs une inscription à plusieurs listes de diffusion… NewsletTux permet aussi de gérer plusieurs listes indépendantes ! La Figure 1 présente la page d’accueil du site de NewsletTux. NewsletTux est ainsi livré avec : • Un fichier d’aide à l’installation détaillant pas à pas les différentes étapes.Un blog (http://www.newslettux.fr/blog/) détaillant par des articles des grosses manipulations.Une Foire Aux Questions (http:// www.newslettux.fr/faq.php) permettant de répondre à des questions ponctuelles.Un annuaire pour y référencer votre site.Un forum de support (http://www. newslettux.fr/forum/). Figure 2. Mon Compte sur NewsletTux.fr > Ajouter mon site Installer NewsletTux L’installation du logiciel demande quelques pré-requis : • • Un serveur Web exécutant Apache 2 et PHP5 avec 2 Mo d’espace disque.Un serveur de bases de données exécutant MySQL 4 (minimum) avec une base de données. Un compte MySQL qui permet les opérations classiques + suppression des tables sur une base. Figure 3. Première installation NewsletTux Lorsque les pré-requis sont remplis, vous devez vous rendre sur http://www.newslettux.fr/ afin de créer un compte et y associer votre site (cf. Figure 2) pour pouvoir récupérer le logiciel ainsi qu’une clé d’installation. La version Standard du logiciel est entièrement gratuite pour un usage non commercial. Installation des fichiers et du logiciel Dézippez l’archive récupérée depuis NewsletTux.fr sur votre bureau et téléchargez le tout sur votre serveur Web dans un sous-dossier que vous appellerez, par exemple, newslettux/ (chmod 777). Rendez-vous ensuite sur http://www.votresite.ext/ newslettux/_admin/install.php pour réaliser l’installation de la base de données (cf. Figure 3). Le logiciel est livré avec une documentation (install-francais.txt) qui explique toutes les étapes à suivre pour l’installer. L’installation vous demande successivement : a) La langue. b) L’acceptation de la licence du logiciel. www.phpsolmag.org Figure 4. Mise en place de NewsletTux sur votre Site Web 9 Outils Listing 1. Code à insérer dans la page inscription_newsletter. php pour déclarer les valeurs <?php require _ once('newslettux3/newslettux3cli _ form _ subscribe.php'); ?> Listing 2. Code à insérer dans la page inscription_newsletter. php pour faire apparaître le formulaire <?php echo $newslettux3->RegForm(); ?> Listing 3. Code à insérer dans la page inscription_newsletter. php pour faire apparaître le formulaire en espagnol <?php $newslettux3->SetLang('es'); echo $newslettux3->RegForm(); ?> Figure 5. Assistant installation sur site Figure 6. Installation sur le site effectuée ! 10 c) Les paramètres techniques (connexion MySQL, jeu de caractères). d) Vos données sur votre site (nom du site, URL, adresse email générique). Et le script d’installation automatisée se charge de mettre à jour la configuration en base de données pour vous, ainsi que créer le fichier de connexion MySQL. Par souci de sécurité, ce script se désactive une fois l’installation finie. Vous remarquerez que chaque module de fonctionnalité de NewsletTux est pourvu d’un ou plusieurs assistants qui aident l’utilisateur à configurer simplement son exemplaire du logiciel. Configuration finale Une fois l’installation terminée, nous allons passer à la mise en place sur le site. Pour installer le formulaire d’inscription sur votre site, il faut créer une page (ou en prendre une que vous avez déjà prévue pour cela). Nous l’appellerons inscription_newsletter. php dans cet exemple et cette page se situe arbitrairement à l’adresse http://www.votresite.ext/inscription_newsletter.php. ATTENTION : il faut que la page qui accueille le formulaire d’inscription NewsletTux porte l’extension .php ! Dans cette page, il faut mettre au tout début le code (cf. Listing 1). Maintenant, toujours dans cette même page, là où nous souhaitons voir le formulaire apparaître, il suffit de mettre le code (cf. Listing 2). NewsletTux propose aussi de forcer quelques variables, par exemple si vous avez une version espagnole de votre site, sans réinstaller un autre NewsletTux sur le même site, vous pouvez forcer la langue (cf. Listing 3). Ces réglages et bien d’autres sont documentés dans le fichier install-francais.txt livré avec le logiciel, vous pouvez ainsi par exemple changer la redirection finale une fois l’inscription terminée, le temps de redirection, une inscription pré-établie sur certaines listes de façon à ce que l’utilisateur ne saisisse que son adresse email… Mais ces réglages annexes sont facultatifs. En outre, NewsletTux propose deux types d’affichage du formulaire d’inscription : a) L’affichage normal, où le visiteur saisit son adresse email puis coche les listes de diffusion auxquelles il vaut s’abonner (avec choix du format Texte ou HTML si nécessaire) b) L’affichage mini où une pré-sélection de listes avec format est cochée, de manière invisible pour l’utilisateur final, qui n’a plus qu’à rentrer son adresse email. Ceci permet d’afficher un formulaire bien plus restreint, utile pour le caser dans un coin de page par exemple. 9/2010 NewsletTux Si nous affichons la page inscription_newsletter.php, nous allons voir une erreur, car l’installation n’est pas tout à fait finie. Une fois que vous avez terminé la page inscription_ newsletter.php, rendez-vous dans l’administration de NewsletTux, menu Général > Assistant installation sur site (Assurez-vous au préalable que le fichier newslettux3cli_form_subscribe.php soit accessible en écriture). La Figure 5 illustre cet écran. Cet assistant vous demande d’entrer quatre variables : 1. Le dossier où est installé NewsletTux (par défaut, vous ne devriez pas avoir à le modifier) ; 2. L’adresse complète de la page d’inscription (vous devez renseigner http://www.votresite.ext/inscription_newsletter.php ; 3. L’adresse complète de la page de désinscription (dans cet article, nous ne la modifions pas mais de la même façon vous pouvez la personnaliser) ; 4. Et pour finir, le Doctype de votre site, afin que l’affichage de NewsletTux dans inscription_newsletter.php respecte votre choix entre HTML ou XHTML. Affichez maintenant la page http://www.votresite.ext/ inscription_newsletter.php : vous devez voir un message indiquant que le webmaster n’a pas créé de liste de diffusion… (cf. Figure 6). A ce niveau, NewsletTux est correctement installé sur votre site, il ne manque plus que son remplissage ! Vous pouvez le configurer de manière un peu plus poussée en vous rendant dans Général > Configuration. Depuis l’accueil de l’administration (voir Figure 7), vous avez un lien pour créer une nouvelle liste de diffusion… Figure 7. Accueil administration NewsletTux Figure 8. Assistant composition de lettre d’information Première campagne d’e-mailing avec NewsletTux Vous avez installé NewsletTux sur votre site, vous avez créé une (ou plusieurs) listes de diffusion, il est temps de préparer une première campagne d’e-mailing ! Pour ce faire, rendez-vous dans Lettres d’information > Composer (Figure 8). Vous arrivez alors sur la page de création de lettre d’information (newsletter). Cette page vous permet de renseigner : • • • • • La liste (ou les listes) de diffusion à qui la lettre doit être envoyée. L’objet du mail qui sera envoyé. Le corps du mail, au format HTML. Les éventuelles pièces jointes. Le template (cf. §Personnalisation). Enfin, vous devez choisir l’étape suivante : conserver en brouillon, ou préparer l’envoi. www.phpsolmag.org Figure 9. Envoi de la lettre d’information L’envoi de la lettre d’information se fait en 3 temps : 1) Vous ouvrez l’assistant de composition d’une lettre et remplissez les principaux champs (sujet, destinataires, corps, pièces jointes, template). 2) Suite à la rédaction, le test unitaire est un email envoyé sur votre adresse qui vous montre l’aperçu de 11 Outils b) De ne pas avoir un serveur qui envoie continuellement une quantité potentiellement très importante d’emails en un temps assez restreint. Sur Internet • • • • http://www.newslettux.fr/ – Site de NewsletTux : informations, téléchargement… http://www.newslettux.fr/blog/ – Blog NewsletTux.fr, articles détaillés sur les possibilités du logiciel, http://www.newslettux.fr/faq.php – Foire Aux Questions : première aide rapide et ponctuelle, http://www.newslettux.fr/directory.php – Annuaire référençant les sites utilisant NewsletTux. ce que les abonnés verront. Une fois celui-ci envoyé, votre lettre d’information est en attente d’envoi. 3) La validation du test unitaire (dans la page d’attente) qui débouche sur la préparation de la lettre et l’envoi proprement dit (Figure 9). L’envoi est paginé afin de ne pas faire passer le serveur pour spammeur. Techniquement, l’envoi est fait par groupes d’emails avec une recharge de page, permettant : a) De ne pas surcharger le serveur (puisque le temps maximal d’exécution d’un script PHP est défini). Personnalisation de la campagne de mailing Par défaut, le mail est une page HTML vide. NewsletTux prend en charge des templates, c’est-à-dire des pages HTML contenant textes, décors/images avec un marqueur qui pointera l’endroit où sera inséré le corps du mail que vous composez. Ceci vous permet d’envoyer une lettre d’information aux couleurs de votre site ! Attention cependant au fait que : • • • Informations générales sur NewsletTux Pour donner quelques informations complémentaires sur NewsletTux, les emails sont envoyés dès que le test unitaire est validé. Ce processus assure que l’email envoyé à tous les abonnés aura pu être vu sur un ou plusieurs clients messagerie (la destination du test unitaire pouvant être une liste de plusieurs adresses par exemple les principaux webmails Gmail, Yahoo, Hotmail, ainsi que quelques adresses sur des logiciels de messagerie spécifiques comme Outlook, Thunderbird, …) et être relu. Tant que le test unitaire n’a pas été validé, la lettre d’information n’est pas expédiée. Par souci de compatibilité avec les hébergeurs mutualisés, la version Standard de NewsletTux ne propose pas d’envois planifiés (a contrario de la version supérieure, optimisée pour des serveurs professionnels). Les listes de diffusion ne sont ni limitées en nombre, ni en quantité d’abonnés, ni en nombre d’envois. L’administrateur de NewsletTux peut donner la permission d’écriture à un ou plusieurs abonnés qui deviennent alors écrivains (ou administrateurs s’ils sont bien promus !), un peu comme des modérateurs sur un forum, ces écrivains peuvent gérer une liste de diffusion. Un site Web doté de NewsletTux peut alors proposer plusieurs listes de diffusion, chacune rédigée par un reporter différent ! NewsletTux propose, en outre, les fonctionnalités classiques d’un système de gestion de lettre d’information : abonnement et désabonnement automatisés, validation des emails, pièces jointes dans les lettres d’information, flux RSS (RSS 2.0 ou ATOM 1.0), module d’import en masse d’abonnés ou export d’emails. La configuration du logiciel est chargée en base de données, les fichiers ne servant que pour les templates et leurs images (par souci de compatibilité technique avec la plupart des hébergeurs Web, celles-ci ne sont pas stockées en base de données). 12 • Le Javascript n’est pas supporté par les clients de messagerie. Les styles CSS sont plus ou moins bien pris en charge. Certains clients de messagerie les interprètent partiellement (c’est le cas de Mozilla Thunderbird par exemple), d’autres les désactivent complètement (comme Google Mail ou Microsoft Outlook) – plus d’information disponible sur l’article http:// www.email-standards.org/. Les templates ne sont disponibles que pour les abonnés ayant choisi le format HTML. Les abonnés ayant choisi le format texte auront alors une version textuelle (dégradée) de la lettre d’information. La compatibilité avec les clients messagerie sans HTML est alors assurée. Utilisez des tableaux pour la mise en page de vos templates ainsi que des liens absolus pour vos images, en doctype HTML (les clients messagerie interprètent mal le CSS et l’XHTML). MATTHIEU LACROIX L’auteur est ingénieur systèmes et réseaux dans une PME parisienne, en charge d’un parc de cent cinquante machines sous Windows (XP, 7), Linux (Red Hat, Debian) ainsi que des serveurs Windows 2008, HyperV, SAN. Il développe également des solutions back-office/intranet en tant qu’entrepreneur depuis quatre ans. 9/2010 Projets L’approche PHP pour le système d’exploitation Android Depuis 2007 et son annonce par Google, un système d’exploitation Open Source pour les terminaux mobiles fait son nid dans le paysage mobile. Il s’appelle Android. Prévu au départ pour du développement en Java, Google propose de plus en plus d’outils pour développer dans d’autres langages. Voyons les possibilités pour PHP. Cet article explique : Ce qu’il faut savoir : • Présentation du système d’exploitation pour mobiles Android. • Comment utiliser PHP pour Android. • Connaissances générales de l’univers mobile : smartphones, netbooks, Internet Mobile… N ous sommes en novembre 2007, Google, géant de l’Internet, annonce au grand jour un projet issu du rachat d’une société. Ce projet est appelé Android, notez l’absence de tréma. C’est un système d’exploitation Open Source optimisé pour les terminaux mobiles. Autour du système, on retrouve un consortium d’acteurs industriels de la mobilité guidés par Google, c’est l’Open Handset Alliance. Android se décompose en couches. Au plus bas, on retrouve un noyau Linux. Basique, il fournit tous les composants nécessaires à la construction d’un système d’exploitation standard, excepté l’implémentation des couches graphiques (vous ne retrouverez pas, par exemple, X11). On retrouve dans cette couche basse par exemple des drivers développés en C. Au dessus, on trouve une couche qui propose d’un coté des librairies de fonctionnalités spécifiques ou non au monde mobile, développées en C/C++. En parallèle, on trouve la machine virtuelle Dalvik. C’est elle qui apporte la particularité d’Android, car les couches au dessus sont prévues pour être développées en Java. Au dessus, on trouve en avant-dernière couche le framework applicatif. C’est cette couche qui fournit la plus grande partie des fonctionnalités aux applications, telles que le gestionnaire de fenêtres ou de la téléphonie. Au dessus encore se trouve la couche purement applicative destinée aux utilisateurs et dans laquelle se situeront les applications développées. L’intérêt de cette dernière couche est que toutes les applications sont à un niveau égal. Cela se traduit par la possibilité de remplacer www.phpsolmag.org n’importe quelle application de base par une version tierce. Que ce soient des gestionnaires d’appels ou de contacts par exemple. On retrouve sur le web et l’Android Market des dizaines d’applications pour remplacer celles par défaut. En août 2010 est sortie la dernière version estampillée 2.2 répondant au nom de FroYo. Elle n’est malheureusement pas disponible sur tous les terminaux. On parle déjà de grosses modifications pour une version nommée Gingerbread qui pourrait être la version 3.0 prévue pour la fin 2010. Android est fourni sous licence Apache version 2. Tout le monde peut donc récupérer le code source sur un dépôt GIT à l’adresse : http://source.android. com/. Par contre, Google maintient plusieurs applications dont la plus-value n’est plus à discuter, dans un format propriétaire. On trouve en particulier l’Android Market, le client natif de Google Maps et le client natif de GMail lié par défaut avec l’adresse e-mail du compte. L’accès à Android pour les constructeurs est disponible de deux façons. La moins utilisée est celle ne requérant pas l’activation d’un compte Google, comme celle-ci disponible sur l’Archos 5 IT, ou tout autre appareil ne correspondant aux pré-requis imposés par Google. C’est ce format que le marché chinois utilise dans une version renommée : Open Mobile System. L’autre possibilité, utilisée dans la plupart des cas comme pour le Google Nexus One, est de distribuer les terminaux avec une licence des applications Google. 13 Android Figure 1. Fonctionnement en couche d’Android Vous êtes maintenant au courant des tenants et aboutissants d’Android… en tout cas de loin. Voyons maintenant à quoi cela peut servir pour les développeurs. Les possibilités de développement pour Android Avant d’attaquer sur les possibilités de développement normales, il faut préciser quelques points sur les terminaux cibles. Vous devez vous demander sur quelle plateforme matérielle vous êtes susceptible de retrouver Android. Au départ, seuls les smartphones étaient visés. Ce sont ces téléphones ultra complets qui en plus de leur écran tactile embarquent une connexion des plus complètes, pleins de capteurs et des possibilités d’usages mobiles très intéressants, comme le concurrent leader : l’iPhone. Mais dans les prévisions stratégiques, ce n’est pas la seule cible. Très bientôt, de nombreuses tablettes Internet Android vont débarquer. On trouve aussi des prototypes de netbooks, jusque là rien d’original. Mais des constructeurs de voitures, d’électroménager, de télévision, etc. ont annoncé des appareils de leur cœur de métier dopés à l’interface tactile grâce à Android. On pourra donc prévoir des usages réellement révolutionnaires et convergents dans les années à venir, les développements tiers devront donc être à la hauteur ! 14 Au niveau du développement proprement dit, dans sa grande majorité, Android est prévu pour un développement en Java. Des APIs du SDK Java sont disponibles dans le SDK Android. De plus, depuis quelques temps, Google a mis à disposition un NDK pour Native Development Kit. Il permet de développer des outils, des bibliothèques et des applications en C/C++ avec lesquels vous pouvez interfacer vos applications développées elles en Java. Figure 2. Logo de PHP For Android 9/2010 Projets Figure 3. Impressions écran Dans l’objectif d’ouverture aux développeurs du NDK, Google a mis à disposition l’outil SL4A pour Scripting Layer for Android. C’est une application à installer sur le terminal qui sera utilisée pour exécuter du code script. Par défaut les langages Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl, et Shell sont supportés, mais pas PHP. Voyons maintenant comment utiliser PHP. Développer en PHP pour Android Basé sur le projet SL4A, c’est maintenant que PHP for Android fait son entrée, on va l’appeler PHP4A entre nous. Ce projet, développé par Irontec, offre un interpréteur PHP à Android, mais pas que. Fonctionnalité logique, PHP4A est un serveur PHP interne au terminal. Vous pourrez donc afficher des pages web dans le navigateur interne. Mais le gros intérêt vient d’une API pour créer des interfaces standards pour Android depuis une librairie PHP. Le projet en est à son début mais il n’est pas à douter que le potentiel est bien réel. www.phpsolmag.org Pour finir sur la présentation du projet, l’équipe fait la promotion d’un autre projet afin de déployer les applications en PHP dans un format apk, standard aux applications Android. Vous retrouverez ce projet à cette adresse : http://code.google.com/p/android-scripting/ wiki/SharingScripts. Elles pourront dont être normalement diffusées. Voici un premier pas basé sur le Getting Started officiel : http://www.phpforandroid.net/#getting_started. 1. Installer SL4A, anciennement ACE. 2. Pour cela, rendez-vous à l’adresse http://androidscripting.googlecode.com/files/sl4a_r0.apk. Si ce lien n’est plus valide, allez sur l’accueil du site pour le trouver. 3. Installez l’outil comme n’importe quelle application. Si vous y accédez par le navigateur web du terminal ou de l’émulateur, ouvrir le fichier l’installera. 4. Par défaut, c’est un interpréteur Shell qui est fourni. Il faut donc installer l’interpréteur Shell. 15 Android Sur Internet • • • • • http://www.android.com – Site officiel d’Android. Vous y trouverez toutes les informations de présentation de la plateforme et tout le nécessaire au développement avec les SDK et le NDK. En anglais, http://www.phpforandroid.net/ – Site officiel du projet PHP for Android. Toutes les informations pour faire du développement PHP pour Android, http://www.frandroid.com – 1er site francophone dédié à la plateforme. Vous trouverez toutes les news relatives à Android, mais aussi un forum complet et convivial, un wiki qui ne demande qu’à grossir, un outil de recrutement, un comparateur de terminaux, etc. Tout ce qu’il faut pour maîtriser la plateforme, http://code.google.com/p/android-scripting/ – Site officiel du projet Android scripting, http://code.google.com/p/android-scripting/wiki/SharingScripts – Site du projet pour la publication des applications en script. 5. Installer PHP for Android. De la même façon que pour le projet SL4A, accédez à l’apk de ce projet à l’adresse : http://phpforandroid.net/files/PhpForAndroid_r1.apk. L’installation est comme au point 1. Lancez l’application que vous venez d’installer. Deux boutons vous font face, cliquez sur Install. C’est bon, PHP for Android est prêt à fonctionner. Vous n’avez plus besoin de lancer PHP for Android, à partir de là tout passe par SL4A. 6. Développez votre script. Là, le terminal n’est plus nécessaire. Même si PHP for Android permet de modifier directement le fichier, ce n’est bien entendu pas la méthode que nous conseillons. 7. Déposez le fichier PHP sur votre mobile. Pour cela, la méthode diffère d’une utilisation sur un terminal ou sur l’émulateur. Normalement assez intuitive, si cette démarche vous paraît compliquée, vous trouverez des explications sur Internet. 8. Dans SL4A lancez votre fichier PHP. Voilà, le script s’exécute. Vous avez développé pour Android. A vous de naviguer dans la documentation du projet pour appréhender toutes les fonctionnalités. Si vous avez l’âme participative, le projet est Open Source et l’équipe attend des contributions. est Hi !, et le texte du message What is your name ?. L’exécution de la boîte de dialogue affecte le texte saisi par l’utilisateur à la variable name. Il ne reste plus qu’à l’afficher avec un message surgissant (la méthode makeToast reprend la méthode Toast.makeText disponible dans l’API Android standard). Dans la Figure 3, vous voyez la boîte de dialogue à gauche et le résultat de la saisie à droite. Conclusion Au final, nous avons là un projet à ses tout débuts. L’équipe est ambitieuse et la roadmap est à la hauteur de cette ambition. Si vous voulez développer pour Android, PHP for Android peut vous permettre actuellement de réaliser des sites hors ligne. A terme, l’objectif est d’accéder à un confort du niveau des applications venues du SDK. Si le projet n’est pas encore assez mature pour réaliser de vrais produits, si cet article a touché votre curiosité, il est clair que suivre l’avancée de l’équipe pourra être intéressant dans un futur proche. Exemple de code Afin d’avoir un aperçu concret, voici un extrait de code proposé par l’équipe. Lisons-le ensemble, et voyons son résultat. C’est un simple Hello World amélioré. En première ligne, on voit l’intégration de l’API qui permet d’accéder aux fonctions Android. C’est elle qui donne le comportement natif à votre application. En deuxième ligne on déclare l’objet Android, pour, en troisième ligne, initier une boîte de saisie dont le titre Listing 1. Fragment plus long du code en PHP <?php require _ once("Android.php"); $droid = new Android(); $name = $droid->getInput("Hi!", "What is your name?"); $droid->makeToast('Hello, ' . $name['result']); ?> 16 JULIEN DEL RIO FrAndroid.com a été créé en novembre 2007 par trois membres cofondateurs, aujourd’hui nous sommes quatre dans l’équipe principale. Ulrich Rozier, Pierre-Olivier Dybman et Baptiste Michaud sont les membres co-fondateurs de FrAndroid. Puis, Arnaud de la société eXpertiseAndroid, après avoir géré pendant un an le blog du PAF (phoneandroid.fr), rejoint l’équipe en avril 2009. Depuis l’été 2009, une équipe de rédacteurs survoltés est venue prêter main forte dont Julien Del Rio, auteur de l’article. 9/2010 Projets ExtJs, Json et PHP L’usage des frameworks pour la gestion des interfaces graphiques riches dans le développement web ne cesse d’augmenter; certains à la fois Open Source et commercial tels ExtJs et d’autres dans le monde purement Open Source tels jquery, mootools etc. Cet article explique : Ce qu’il faut savoir : • Ce qu'est ExtJs dans son usage simpliste. • Comment utiliser JSON pour la communication des données. • Vous devez connaître les bases du langage PHP, un peu de ExtJs, MySQL, et de JSON. L développements industriels. Nous n’allons pas faire sa publicité ni son étude exhaustive. Son site regorge de maintes informations pour débuter. ’objet de cet article est de voir la coopération entre extjs récemment connu sous sencha et php ; la communication des données se fera au travers du JSON. Extjs permettra uniquement d’afficher un rendu graphique à travers les données issues de PHP. Il ne s’agit donc pas d’une application purement Javascript mais un rendu d’ExtJs. Imaginons que nous ayons une application de backoffice utilisant purement du (x)html et un front-end faisant office d’une interface graphique plus évoluée en termes d’utilisation des frameworks du monde. Le choix de cette facon de faire est que le front-office est utilisé pour les tâches de configuration, d’administration alors que le back-office sert uniquement aux requêtes. Ces dernières pouvant être multi-critères et complexes, le format de données qui a priori devrait être du xml se verrait changer pour un format moins encombrant et plus facilement manipulable. Et ce format n’est rien d’autre que JSON . Pour rappel, le choix du framework javascript sera ExtJs. Car la plupart des options les plus récurrentes en développement (pagination, fenêtr, panneau graphique etc.) sont facilement utilisables. Dans cet article, nous parlerons de la communication entre ExtJs et Php à travers le format d’échanges json pris directement de la base de données. Extjs Extjs, framework javascript développé par la société américaine Sequoia Capital, de version Open Source et commerciale est devenu trés utilisé dans de nombreux www.phpsolmag.org Installation,Configuration Pour l’installation de ce framework, rien de plus de simple que de télécharger la dernière version par votre navigateur ou par un utilitaire tel wget et le dezipper. La version de cet article est la 3.1.1. Une fois dezippé, nous avons l’arborescence suivante : ext-3.1.1 --------------------------------------------------------- adapter pkgs ressource src welcome ext-all-debug.js ext-all.js ext.jsb2 Vous remarquerez que le fichier ext.jsb2 est au format JSON ! Pour les commodités de convention de développement, il suffit de le mettre dans le répertoire de votre projet js ou script ou quelque chose de ce genre. Et le tour est joué. Il faudra renseigner la librairie et la feuille de style au sein de la page correspondant à l’invocation de ce framework. 17 ExtJs, Json ExtJs, Json Figure 1. Notre application PHP, ExtJs, CSS, MySQL Ajouter ces quelques lignes : <link rel=»stylesheet» type=»text/css» href=»ext-3.1.1/resources/css/ext-all.css»> <script type=»text/javascript» src=»ext-3.1.1/ adapter/ext/ext-base.js»></script> <script type=»text/javascript» src=»ext-3.1.1/ ext-all.js»></script> Json Le format de données de communication recommandé entre le server-side et le client-side est sans nul doute le format JSON car par défaut Extjs l’utilise. Le contenu JSON de nos données prises au niveau de la base de données (voir Listing 2) renverra les mêmes données que le Listing 3. Vous verrez que le contenu JSON à travers le Listing 3 est autre que le contenu que nous avions l’habitude de voir mais ce qui est intéressant dans tout cela est le contenu généré. PHP apporte une facilité au développeur pour la génération de contenu JSON de ses données. Il suffit simplement de renseigner la donnée à la fonction json_ encode pour l’encodage et son pendant par un json_ decode. Le Listing 4 renvoie toutes les informations des utilisateurs sous le format JSON comme on peut le voir sur le Listing 3. JSON+ ExtJs + CSS = HTML évolué Il s’est avéré que l’équation JSON + ExtJs + Css donne un rendu graphique très évolué. Vous avez compris dans les lignes précédentes que Extjs utilise par défaut JSON à travers son gestionnaire de stockage de données (store). Pour ce faire, il suffit de créer une variable de type Ext. data.JsonStore prenant pour paramètres un contenu JSON et les différents champs du contenu. Une fois cette étape faite, il suffit de charger les valeurs récupérées par la variable de stockage. Le Listing 5 fait référence à la variable de stockage store et les valeurs et leur type de données. Il nous reste l’étape de rendu des valeurs de nos données à travers un panelgrid. Il suffit d’instancier une variable de type Ext.grid.GridPanel qui prend en paramètre notre éternel contenu JSON chargé à travers la variable store. Pour afficher les colonnes, le framework nous offre certaines options à définir à savoir l’en-tête(header), les dimensions (height,width), la donnée indexée(dataIndex) renvoyée par le contenu JSON, l’option de tri (sortable), le titre (title). 18 Listing 1. users.sql # Base de données CREATE DATABASE IF NOT EXISTS 'db _ users' USE 'db _ users'; # Table user CREATE TABLE IF NOT EXISTS 'user' ( 'matricule' int(11) NOT NULL AUTO _ INCREMENT, 'nom' varchar(25) NOT NULL, 'prenom' varchar(25) NOT NULL, 'email' varchar(25) NOT NULL, 'password' varchar(25) NOT NULL, PRIMARY KEY ('matricule') ) ENGINE=MyISAM AUTO _ INCREMENT=4 DEFAULT CHARSET=latin1; Listing 2. dump_data.sql # Ajout des données dans la table user INSERT INTO 'user' ('matricule', 'nom', 'prenom', 'email', 'password') VALUES (1, 'maodo', 'diop', '[email protected]', 'pi'), (2, 'saer', 'diokhe', '[email protected]', 'senegal'), (3, 'etienne', 'de longeaux', 'pi _ [email protected]', 'coincoin'); Listing 3. json_data.jbs [ {"matricule":"1","nom":"maodo","prenom":"diop","em ail":"[email protected]","password":"pi"}, {"matricule":"2","nom":"saer","prenom":"diokhe","e mail":"[email protected]","password":"senegal"}, {"matricule":"3","nom":"etienne","prenom":"de longeaux","email":"pi _ [email protected]","password":"coin coin"} ] Listing 4. data.php <?php $conn = mysql _ connect("localhost", "root", "") or die (mysql _ error ()); $db = mysql _ select _ db ("db _ users") or die (mysql _ error ()); $result=mysql _ query ("SELECT * FROM user") or die (mysql _ error ()); $data = array(); while ($row=mysql _ fetch _ object($result)) { $data [] = $row; } echo json _ encode($data); ?> Listing 5 . db_grid..js // Creation des données de stockage var store = new Ext.data.JsonStore( { url : 'data.php', fields : [ { name : 'matricule', type : 'int' }, 'nom', 'prenom', 'email', 'password' ] }); // Charger les données store.load(); 9/2010 Projets Listing 6. db_grid..js (suite) // Creation du Pannel var grid = new Ext.grid.GridPanel( { store : store, columns : [ { id : 'id', header : 'Matricule', width : 100, sortable : true, dataIndex : 'matricule' }, { header : 'Nom', width : 100, dataIndex : 'nom' }, { header : 'Prenom', width : 100, dataIndex : 'prenom' }, { header : 'Email', width : 175, dataIndex : 'email' }, { header : 'Password', width : 250, dataIndex : 'password' } ], stripeRows : true, height : 250, width : 750, title : 'Diopisto Family Co' }); // Rendu du Pannel grid.render("db-grid"); Listing 7. db_grid..html (complet) Ext.onReady(function() { // Creation des données de stockage var store = new Ext.data.JsonStore( { url : 'data.php', fields : [ { name : 'matricule', type : 'int' }, 'nom', 'prenom', 'email', 'password' ] }); // Charger les données store.load(); Le Listing 6 renvoie un rendu purement extensible et jsonisable en définissant un div db-grid par grid.render(«db-grid»). Le code complet est le Listing 7 coiffé d’un Ext. onReady(function() { }. Notre page de présentation visible dans le Listing 8 utilisera tout simplement notre variable db-grid. Celle-ci, définie dans le Listing 6 par grid.render(«db-grid»), permet d’ afficher le rendu ci-dessous une fois que l’utilisateur pointe le curseur dessus. Et voilà le rendu de notre petite application avec ExtJs, PHP, MySQL et CSS. // Creation du Pannel var grid = new Ext.grid.GridPanel( { store : store, columns : [ { id : 'id', header : 'Matricule', width : 100, sortable : true, dataIndex : 'matricule' }, { header : 'Nom', width : 100, dataIndex : 'nom' }, { header : 'Prenom', width : 100, dataIndex : 'prenom' }, { header : 'Email', width : 175, dataIndex : 'email' }, { header : 'Password', width : 250, dataIndex : 'password' } ], stripeRows : true, height : 250, width : 750, title : 'Diopisto Family Co' }); // Rendu du Pannel grid.render("db-grid"); }); Listing 8. db_grid..html <html> <head> <title>Diopisto Family Co</title> <link rel="stylesheet" type="text/css" href="ext-3.1.1/ resources/css/ext-all.css"> <script type="text/javascript" src="ext-3.1.1/adapter/ext/ ext-base.js"></script> <script type="text/javascript" src="ext-3.1.1/ext-all.js"></ script> <script type="text/javascript" src="db-grid.js"></script> </head> <body> <div id="db-grid"></div> </body> </html> Conclusion Grâce à ses gestionnaires de stockage (XML, JSON,etc.), le framework ExtJs utilisé avec PHP par exemple renvoie des rendus graphiques très évolués. Il faudra avoir une connaissance sur le type de données à faire communiquer de la part du développeur. Une approche très designer sera un plus. Nous avons vu à travers cet article le dixième du centième de l’iceberg du framework Extjs. Sur Internet • • • • • http://us3.php.net/manual/en/ref.json.php – Référence de JSON, http://us3.php.net/manual/en/function.json-encode.php – Référence de JSON_ENCODE, http://www.json.org/ – Philosophie de JSON, http://extjs.com/learn/Tutorials – Tutoriel de Extjs http://www.extjs.com/ – Référence principale de Extjs. www.phpsolmag.org MAODO DIOP Maodo DIOP, Consultant en Développement Logiciel (PHP, J2EE) a un background de maintenance logicielle et sur l’audit des systèmes Linux compromis. Il s’intéresse aux SVA et à l’infographie. Pour le contacter : dmaodo@{gmail,yahoo}.com Contact : dmaodo@{gmail,yahoo}.com 19 Dossier PHP5 contre Java : le champ des possibles Le langage PHP a été créé en 1994 par Rasmus Lerdorf. Le langage Java quant à lui est basé sur un projet de Sun Microsystems datant des années 1990, mais dès 1994, la plate-forme Java se concentre sur le web. Ces deux langages ont été introduits sensiblement au même moment pourtant ceux-ci s’opposent rapidement. Cet article explique : Ce qu’il faut savoir : • Une approche du choix à faire entre PHP5 et Java en fonction du projet à réaliser. • Savoir ce que sont les langages PHP et Java. L e langage Java évolue vite et devient un langage particulièrement robuste, fiable et éprouvé. Le langage PHP n’a pas évolué ainsi, il est resté très longtemps vu comme un langage uniquement utilisé pour sa facilité d’accès et non pour autre chose. Avec l’arrivée de la cinquième version du langage PHP, ce dernier prend une revanche et devient à son tour un langage reconnu par les entreprises. PHP5 formalise ce qui n’était qu’un langage de script en ajoutant notamment une vraie conception objet. Soutenu par des frameworks très performants, PHP ne cesse de se professionnaliser. A l’heure actuelle, qu’est-ce qui fera qu’une entreprise choisisse l’une de ces deux technologies plutôt que l’autre ? Java : pour faire du web Java est un langage orienté objet nativement, stable et très apprécié par les entreprises. Historiquement, c’est le langage phare pour du développement web fiable au sein de grandes entreprises. C’est un langage qualifié de professionnel. Pour réaliser une application web en Java, il est très souvent nécessaire d’utiliser des sur-couches qui rendent l’application lourde. Cependant le langage Java dispose d’une panoplie de frameworks et de librairies permettant de l’utiliser sur tous les domaines possibles. Le framework multi-couches par excellence est Spring, un framework très modulaire dont chacune de ses parties peut être utilisée seule. D’autres frameworks 20 sont très prisés comme Hibernate, ORM par référence, faisant le lien entre base de données relationnelle et monde objet, ou encore Struts, un autre framework pour développer des applications web. Aujourd’hui la nouvelle tendance vient de JSF, un framework d’un nouveau genre puisqu’il incorpore la notion de composants (comme Swing). Par exemple, la librairie JSF PrimeFaces implémente la plupart des fonctionnalités de YahooUI (API JavaScript). La manipulation d’AJAX devient très simple puisque les composants masquent ce comportement au travers d’attributs. Il devient ainsi plus aisé de réaliser des applications web. Pourtant, Java est complexe. Son approche suivie de sa maîtrise demandent un certain temps d’apprentissage. Un collaborateur Java qui n’a jamais fait de web peut parfois se retrouver déstabilisé face aux nombreuses possibilités qu’offre ce langage. Java pour le web est particulier avec de nombreuses fonctionnalités basées sur des outils externes. Ces derniers sont bien documentés. On ne peut pas parler de documentation sans évoquer la communauté du monde Java : grande et talentueuse, celle-ci peut s’avérer parfois abrupte. C’est pour cela que ce langage est souvent vu comme élitiste. Travailler avec des technologies issues du langage Java demande un personnel bien formé, généralement plus cher sur le marché du travail qu’un développeur web classique (au sens non Java). Cela engendre une utilisation de Java pour des projets de 9/2010 PHP5 et Java tailles assez conséquentes et donc de durées importantes. Les coûts sont statistiquement plus élevés : il faut prendre en compte toutes les spécificités liées au langage. Après les développeurs, il faut prévoir l’architecture qui va accueillir l’application Java. L’architecture pour une application web Java est bien différente des cas classiques où un simple serveur web suffirait. Au contraire, il est nécessaire de disposer d’un serveur d’applications type Jboss ou Glassfish. Ces serveurs sont moins courants que ceux du type Apache2 et demandent plus de ressources notamment en mémoire vive. D’ailleurs, il y a très peu d’offres d’hébergement pour des applications Java : ces applications sont moins répandues bien sûr mais demandent des compétences non standards en administration serveur. Ajoutons à cela le déploiement d’une application Java qui ne se résume pas à un simple transfert des fichiers sources vers le serveur cible. Il faut prendre en compte le chargement et le lancement de plusieurs paramètres, comme la configuration placée en mémoire ou encore d’autres paramètres liés à l’application. Cette dernière est stockée en mémoire, nécessitant un redémarrage du serveur afin de bien recharger la nouvelle version de l’application lors des mises à jour. Java bénéficie de nombreuses ressources pour industrialiser les développements. Parmi ces ressources : Maven, un logiciel de gestion et d’automatisation de projets Java largement répandu et utilisé. Il se couple à l’ensemble des environnements et outils Java, ce qui en fait un outil redoutable. L’outil d’automatisation Ant qui permet de créer des tâches de déploiement très complètes (compilation, archivage, exécution de tests, vérification du style, ...) est également incontournable. On couple souvent ces outils à des serveurs d’intégration continue comme Hudson ou CruiseControl permettant d’automatiser les processus de tests et de déploiement des projets. Après avoir présenté le langage Java, introduisons le langage PHP. PHP5 : fait pour le web PHP5 est le langage d’excellence pour écrire des applications ou de simples pages web. Cette spécialisation en fait sa force. Anciennement dénigré, PHP5 s’invite depuis quelques années dans des projets importants. Plusieurs raisons en sont à l’origine. Premièrement, PHP5 est complètement différent de ces versions antérieures de par sa nouvelle implémentation du concept objet et des formalismes reconnus. Grâce à cela, des frameworks sont nés tels Symfony ou Zend amenant une nouvelle dimension à PHP : des projets entièrement en objet, souples, flexibles et maintenables. C’est ce qui manquait à ce langage : www.phpsolmag.org la formalisation de tous les concepts objets couplée à la simplicité de celui-ci. Il existe aujourd’hui bon nombre de frameworks et de librairies permettant de répondre à toutes les attentes d’une application web. Pourtant, PHP n’est pas nativement un langage objet et reste avant tout un langage procédural. C’est certainement ce qui lui fait le plus de tort. Les frameworks jouent alors un rôle de couche d’abstraction en vue d’estomper ce côté procédural. On notera également l’absence de gestion d’interfaces riches ou une grande difficulté à créer des applications bureautiques due principalement à une méconnaissance de l’extension PHP-GTK2 et de ce fait à la non-démocratisation de celle-ci. L’avantage majeur de PHP5 est sa simplicité au premier abord. Il est très rapide à prendre en main et ne demande pas de formation spécifique. Sa documentation est bien faite, abondante et les articles ne manquent pas. PHP5 dispose certainement de la plus grande communauté dans le monde. La majorité des travailleurs du web connaissent ce langage tout simplement parce qu’ils ont débuté avec. Les développeurs PHP sont nombreux et s’adaptent relativement bien à son évolution. Par ailleurs, PHP ne demande pas de moyens particuliers. Une application PHP s’exécute sur un serveur web comme Apache2. Sa popularité permet d’accéder aux ressources nécessaires facilement. Son déploiement est simple et n’impose pas de conditions particulières. PHP s’exécute à chaque fois qu’on le sollicite. Ce qui le rend moins gourmand mais le limite : à chaque exécution, un nouveau contexte est recréé. Il n’y a pas de mémoire, pas de traces après l’exécution du script. Ceci est problématique quand on sait ce que permet le contexte d’une application Java : l’instanciation d’objets au niveau application par exemple, utile pour garder une connexion ouverte à la base de données, les sessions, des paramètres de configuration de l’application, … PHP est de manière générale rapide. Les performances se sont très nettement améliorées de PHP4 à PHP5 et accrues avec PHP 5.3. Les problèmes liés à sa nature (langage de script) sont résorbés avec des opcodes (APC, e-accelerator, …) qui stockent une version intermédiaire entre script et exécutable d’une application PHP. PHP 5.3 amène également de nouvelles notions très proches de Java : le système d’annotations et les espaces de nom. Peu à peu, PHP emprunte des fonctionnalités intéressantes au monde Java. C’est ce que nous allons voir dans la prochaine partie de cet article. Java/PHP5 : le coude à coude par l’exemple Java est trop rigide dans sa structure tandis que PHP est trop souple. Cette souplesse lui permet d’être facilement et rapidement accessible face à un Java 21 Dossier Figure 1. Architecture du framework Spring (http://doc.javanb.com) Figure 2. Architecture du framework Symfony (http://www.Symfony-project.org/) initialement très technique. Sa vision purement objet en fait par ailleurs un langage très apprécié des développeurs. La conception objet de PHP5 est très inspirée de Java et si l’on prend deux frameworks tels que Spring 22 pour Java (Figure 1) et Symfony pour PHP5 (Figure 2), les ressemblances sont très prononcées. Symfony dispose d’une interaction forte avec les deux ORM PHP du moment : Doctrine et Propel. De son côté, Spring supporte Hibernate et possède sa propre couche DAO 9/2010 PHP5 et Java (accès aux données via des objets) là où Symfony fait confiance à Doctrine ou Propel. Spring dispose d’un contexte d’application et Symfony d’une classe sfContext qui gère la quasi totalité de l’application, liée à une classe de configuration sfConfiguration. Tous les modules de Spring sont basés sur un spring core que l’on peut facilement associer à la brique plateform du schéma présentant Symfony. On note aussi le composant Spring Web MVC qui gère notamment la partie vue de l’application. Dans Symfony, on dispose de la classe sfView. Les helpers Symfony pourraient être vus comme des tags en Java. Des morceaux de codes permettant de factoriser le code des vues. Comme on a pu le voir, Spring et Symfony sont très similaires d’un point de vue structurel. De plus, Spring est connu pour deux raisons : l’injection de dépendances et sa couche d’abstraction. Symfony dispose justement d’un composant d’injection de dépendances et sera la base de la version 2 du framework PHP. D’autre part, Symfony est très découplé et chacun de ses composants peut être utilisé séparément. Ce fut notamment le cas lorsque Dailymotion, célèbre site de partage de vidéos, est passé à Symfony : ils ont migré composant par composant. Que nous montre cette analyse ? Qu’il existe des réponses PHP5 à Java principalement. Aujourd’hui, PHP5 est industrialisable et industrialisé. Cet aspect, longuement réservé à Java, permet de professionnaliser un langage trop longtemps sous-estimé. Exemple : on peut aujourd’hui effectuer des tests unitaires ou fonctionnels en PHP5. Beaucoup d’outils Java sont déclinés pour PHP5 : couverture et analyse de code, intégration continue… PHP5 est clairement devenu professionnel et n’a plus à rougir face à un Java très outillé. Cependant, l’industrialisation des projets en PHP5 est encore une activité marginale dans le monde PHP et gagne à être généralisée dans l’ensemble des projets en PHP5. Dans une optique agile, PHP5 devient un atout grâce à sa rapidité de mise en œuvre. L’approche RAD pour Rapid Application Development prend tout son sens avec PHP5. L’utilisation de Java devient facultative. Il m’est déjà arrivé de voir des entreprises choisir PHP5 comme ébauche d’application. Comme nous l’avons vu auparavant, les coûts et délais engendrés par ce langage sont plus faibles que Java et permettent ainsi de lancer rapidement une application sur le marché. Grâce aux frameworks et à PHP5, les concepts objets sont aujourd’hui identiques et, de ce fait, les problématiques qui se posent lors de la phase d’analyse aussi. Pour avoir vu ce cas de figure, le passage www.phpsolmag.org d’une application développée avec Symfony à sa version Java est rapide. La plupart des problèmes rencontrés avaient été résolus lors du premier développement. Il n’y avait qu’à transposer le code de PHP5 à Java. Alors comment choisir ? Bien sûr, Java se veut très rassurant pour une entreprise, jouissant d’une réputation exemplaire et s’imposant. Ses coûts sont plus élevés à cause de l’infrastructure entre autres. De ce fait, PHP5 ne peut être plus négligé lorsque le choix des technologies se pose. Plusieurs grandes sociétés utilisent PHP5 participant au développement et à la professionnalisation du langage. Le choix se porte donc plus sur la facilité et la rapidité de mise en œuvre que sur les possibilités. Nous l’avons vu, PHP5 et Java disposent sensiblement des mêmes outils pour réaliser un projet web complet (spécification, développement, tests, passage en production). Il faut donc se poser les bonnes questions : • • • • Quand dois-je débuter la phase de développement ? De quelles ressources ai-je à ma disposition ? Dans combien de temps la livraison doit-elle être effectuée ? Quelle est la durée du projet ? A la suite de quoi, le choix se portera sur l’une ou sur l’autre de ces deux technologies. Mais ce n’est qu’une approche de sélection. Il ne faut pas négliger les communautés des deux langages. Les projets Java sont souvent suivis ou initiés par de grosses institutions comme l’Apache Software Foundation. La communauté de Java est très riche et techniquement excellente grâce à de grandes entreprises comme Google (GWT, Guice) ou Vmware (SpringSource). Les projets aboutissent mais on regrette parfois de ne pas avoir plus de documentation ou d’exemples concrets. C’est pour cela que Java paraît être élitiste. Il faut vraiment cibler ce que l’on souhaite pour devenir performant. Il y a finalement peu de publications sur Java pour le web présentant des exemples d’utilisations ou des morceaux de codes prêts à l’emploi sur Internet. PHP est plus laxiste de ce point de vue là puisque Internet regorge d’exemples et de morceaux de codes répondant à d’innombrables problématiques. Prenons la documentation PHP (http://www.php. net/manual/), qui est très fournie avec des exemples concrets d’utilisation des fonctionnalités et un système de commentaires permettant d’avoir encore plus de choix. Cette ouverture ne se fait pas uniquement ici puisque beaucoup de projets sont accessibles. 23 Dossier Malheureusement l’abondance de documentation oblige un tri préalable pour trouver les informations les plus pertinentes. PHP n’est pas porté par une entreprise comme peut l’être Java avec Oracle qui a racheté Sun en début d’année 2010. PHP est orchestré par un ensemble de développeurs provenant directement de la communauté. Zend Technologies n’est que la façade institutionnelle et participe au développement de PHP au travers du Zend Engine, le moteur de script actuellement utilisé par PHP, et au travers du Zend Framework. Il reste un dernier point à évoquer : la sûreté de l'application réalisée. Premièrement, écrire une application web sécurisée dépend de l'équipe dont on dispose. Des développeurs avec peu d'expérience Java feront forcément des erreurs et ceci affectera la sécurité du projet tandis que des développeurs PHP expérimentés concevront une application réellement fiable. Le fait qu'une application soit sûre ne dépend pas uniquement du langage mais plus de son environnement : serveur, hébergement, respect des bonnes pratiques par les développeurs, utilisation d'API externes, … Un code très fiable ne peut pas, à lui seul, définir une application comme sûre mais il peut y contribuer. Java possède nativement une gestion de la sécurité : code local ou distant, signature du code, objets de gestion des permissions, des règles d'accès, … mais pas de gestion de l'authentification ni de l'identité. PHP ne gère que la sécurité liée aux fichiers, aux bases de données et aux données transmises par les utilisateurs. L'abondance de mauvais scripts PHP a provoqué une mauvaise réputation de la sûreté de ce langage, c'est une conséquence de son succès, induit par sa simplicité d'approche. PHP n'étant pas maintenu par des entreprises, les réactions face aux failles sont plus longues que pour Java. Ce dernier paraît meilleur du fait qu'il soit compilé mais si l'application est mal configurée alors, quel que soit le langage, les problèmes seront identiques : • Conclusion Aujourd’hui, rien ne justifie de mettre de côté PHP5. Java ou PHP5, puisque chacun a son utilité. Mais au niveau d’un projet web, la question du choix est pertinente. PHP5 dispose d’autant d’outils que Java et peut être utilisé dans le milieu professionnel sans aucun souci. La tendance actuelle reste d’utiliser PHP pour des projets web de petites ou moyennes tailles ou ayant des délais relativement courts. Java sera utilisé dans le cadre de projets plus lourds et/ou plus longs. Ce n’est que le reflet de cette tendance. En tout cas, ces deux langages ne sont pas en réelle compétition puisqu’ils ne répondent pas précisément aux mêmes attentes. Il faut voir au-delà d’un choix de technologie et se concentrer sur les besoins tout en prenant en compte les ressources dont nous disposons. Soit l'application servira le code PHP en clair (ceci s'est produit chez Facebook en 2009) ; Soit l'application Java servira le fichier .class et une simple décompilation produira le même effet que cidessus. • Sur Internet • • • 24 N'oublions pas que les cas les plus fréquents d'attaque sur une application web ne dépendent pas du langage : vols de session, attaques cross-site scripting (XSS), injections SQL, … La sécurité n'est donc pas un critère de choix du langage de programmation. http://www.php.net – Site web de PHP, http://www.oracle.com/technetwork/java/index.html – Site web de Java (pour les développeurs), http://www.industrialisation-php.com – Blog sur l’industrialisation de PHP par Damien Seguy et Jean-Marc Fontaine. WILLIAM DURAND Élève ingénieur et développeur web indépendant spécialisé dans le développement PHP avec le framework Symfony et Java depuis près de deux ans. Il est également fondateur de Bazinga, une agence spécialisée en développement web et rythmée par des pratiques agiles. Contact direct : http://www.willdurand.fr 9/2010 Pratique Génération de PDF en PHP via la classe FPDF L'automatisation des tâches et la génération de documents en ligne devient monnaie courante. Dès lors, il est important d'avoir à disposition des outils adéquats permettant de réaliser des documents automatiquement et ce en conservant leur aspect graphique. Nous allons aborder la génération de document PDF via PHP. Cet article explique : Ce qu'il faut savoir : • L'utilisation de la classe FPDF. • Comment générer des documents PDF via PHP. • Le lecteur devra avoir des notions en PHP Objet. A vant même de vouloir et de pouvoir utiliser la librairie FPDF pour PHP, il est nécessaire de savoir ce qu'elle est et ce qu'elle fait. FPDF pour Free PDF (Portable Document Format) est une classe écrite en PHP permettant de générer des documents PDF à partir d'un script PHP. L'avantage et la spécificité du PDF étant de conserver les mises en forme graphique, telles que les polices d'écritures ou les objets graphiques, et de restituer le document de la même façon, peu importe la plate-forme ainsi que l'application utilisée pour afficher ou imprimer le fichier. L'avantage même de FPDF – outre le fait que la librairie soit libre – réside dans sa compatibilité ascendante avec PHP. De fait, les versions allant de la 1.0 à la 1.31 incluse peuvent être utilisées avec un serveur configuré en PHP3. Les autres versions sont compatibles avec PHP4 et PHP5. Notons toutefois que pour utiliser la dernière version, il vous faudra au minimum PHP 4.3.10. Nous pouvons noter aussi que FPDF ne requiert aucune extension particulière. Cependant, il vous faudra activer zlib pour activer la compression ainsi que GD pour le support des images et des graphiques. Les présentations étant faites, installons et configurons FPDF... chargements. Je ne peux que vous conseiller de prendre la dernière version, si votre serveur web supporte le PHP 5. Une fois fait, vous décompressez l'archive obtenue. Celle-ci comprend plusieurs dossiers et fichiers. Ceux qui nous intéressent sont le fichier fpdf.php et le répertoire fonts. Et c'est tout ! Placer ceux-ci dans le répertoire de votre application (en anticipant sur le prochain chapitre, je déposerais ces Installation et configuration L'installation de FPDF est très simple et réside en trois étapes. La première est de se procurer une version de FPDF sur le site officiel de la librairie, rubrique Téléwww.phpsolmag.org Figure 1. Première page du document généré 25 FPDF Figure 2. Deuxième page du document généré derniers dans un répertoire nommé articles placé à la racine du serveur). Avant de continuer, prenons le temps de voir ce qui se trouve dans le dossier font. Nous pouvons y trouver un autre dossier, nommé makefont ; celui-ci est utilisé pour la génération de fichiers de définition de police. En clair, il est utilisé par la librairie et vous ne devez pas y toucher ! Nous trouvons, outre ce dossier, des fichiers d'extensions PHP. Ces derniers portent le nom d'une police utilisable au sein de notre document PDF. Vous pouvez donc tout à fait supprimer les fichiers de polices que vous n'utiliserez pas pour la génération de votre document. Cependant, vu leur poids et par facilité, je vous conseille de garder ces fichiers intacts. La troisième et dernière étape est de référencer l'utilisation de la librairie dans votre application. Pour ce faire, voici le code nécessaire: require_once(‘fpdf. 26 php'); Vous voici fin prêt à commencer la construction même de votre application. Présentation du document à produire Pour le bien de cette introduction à FPDF, nous allons produire un document PDF, cela va de soi, sur plusieurs pages et y regroupant plusieurs éléments. La première page fera office de page de garde, la deuxième page comportera un rapport fictif sur les ventes du premier trimestre de l'année pour une série de produits donnés. Afin de ne pas compliquer inutilement l'application actuellement, nous ne connecterons pas celle-ci à une base de données. Sachez toutefois que c'est tout à fait possible et même vivement conseillé pour d'autres cas. Voici un aperçu du document en images. N'est-ce pas magnifique ? Note : le rendu peut différer au niveau des couleurs. 9/2010 Pratique Listing 1. Création du document $pdf = new FPDF( 'P', 'mm', 'A4' ); // Equivaut à $pdf = new FPDF(); $pdf->SetFont( 'Arial', '', 18); $pdf->AddPage(); Listing 2. Insertion du logo $pdf->Ln(100); $pdf->Image('logo.jpg', null, null, 98); $pdf->Write(15, 'Rapport fictif d\'analyse des ventes'); Listing 3. Insertion du nom de l'auteur $pdf->Ln(); // Nous effectuons le saut de ligne nécessaire du à l'utilisation de Write précédemment $pdf->SetFontSize(12); // Nous modifions la taille de la police $pdf->Cell(0,0,'Jonathan Danse',0,1,'C'); Listing 4. Insertion de la légende du tableau $pdf->AddPage(); // Legende du tableau $pdf->Ln(20); $pdf->SetFont('Times','B',14); $pdf->SetTextColor(255,255,255); $pdf->SetFillColor(59,89,152); $pdf->Cell(0,8,'Tableau des ventes pour le premier trimestre de l\'année 2010',1,1,'L',true); Listing 5. Déclaration et assignations de variables utiles // Déclarations et assignations de variables utiles $columnLabels = array('Janvier','Février','Mars'); $rowLabels = array('Produit 1','Produit 2','Produit 3','Produit 4'); $data = array( array(1540,3698,2510), array(3502,2114,2056), array(350,262,251), array(2700,2400,3000), ); Listing 6. Création de l'en-tête du tableau // Création de l'en-tête du tableau $pdf->Ln(); $pdf->SetFillColor(119,144,191); $pdf->Cell(46,12,'',1,0,'L',true); for ($i=0; $i<count($columnLabels); $i++) { $pdf->Cell(48,12,$columnLabels[$i],1,0,'C',true); } $pdf->Ln(12); Listing 7. Insertion des lignes de données // Insertion des lignes de données $row = 0; $fill=false; foreach ( $data as $dataRow ) { $pdf->SetFont('Arial','B',15); $pdf->SetTextColor(0,0,0); $pdf->SetFillColor(239,239,239); $pdf->Cell(46,12,''.$rowLabels[$row],1,0,'L',$fill); $pdf->SetFont('Arial','',15); for ( $i=0; $i<count($columnLabels); $i++ ) { $pdf->Cell(48,12,(number _ format($dataRow[$i]).'¬ '),1,0,'C',$fill); } $row++; $fill = !$fill; $pdf->Ln(12); } La page de garde Occupons-nous dans un premier temps de réaliser la toute première page, à savoir la page de garde. Sur cette dernière, nous allons inscrire le titre du document et apposer le logo de notre société. www.phpsolmag.org Afin de créer un document PDF, il faut instancier l'objet FPDF et réaliser un traitement basique mais obligatoire comme indiqué dans le Listing 1. Ces trois lignes sont nécessaire. Lors de l'instanciation de l'objet FPDF, vous avez la possibilité de préciser trois paramètres : l'orientation, l'unité de mesure ainsi que le format. L'orientation peut prendre deux valeurs distinctes : P pour Portrait, L pour Landscape (paysage). La valeur par défaut est P. L'unité de mesure peut prendre l'une des quatre valeurs : pt (point), mm (millimètre), cm (centimètre) et in (pouce). La valeur par défaut est mm. Le format peut prendre une valeur parmi : A3, A4, A5, Letter, Legal ou encore un tableau comprenant la largeur et la hauteur (exprimées dans l'unité de mesure choisie). La valeur par défaut est A4. La méthode SetFont permet quant à elle de préciser la police d'écriture utilisée pour le texte contenu dans le document. Si cette étape est omise, le document ne pourra être généré. Nous utiliserons la méthode AddPage afin d'insérer une page au sein du document. Ajoutons maintenant le logo et le titre du document au moyen du code indiqué au Listing 2. Nous commençons par effectuer un saut de ligne de 100mm afin de nous positionner dans le document. Nous aurions pu aussi utiliser la méthode SetY(100) qui positionne le curseur à la valeur donnée par rapport à la position courante sur un modèle abscisse ordonnée. Nous insérons l'image via la méthode Image, en lui précisant comme paramètre le nom de fichier (chemin et extension compris). On précise aussi deux paramètres valant chacun la valeur null, afin d'utiliser les valeurs courantes de l'abscisse et de l'ordonnée. La dernière valeur que l'on indique correspond à la taille de l'image affichée. Nous ajoutons ensuite, au travers de la méthode Write, le texte à l'endroit courant. Le tout sur une hauteur de 15mm. A partir de ce point, nous pouvons ajouter un texte mentionnant l'auteur du rapport. Il nous faut tout d'abord effectuer un saut de ligne grâce à $pdf->Ln(); Nous ne sommes par contre pas obligé d'utiliser la même taille d'écriture. Pour ce faire, nous en modifions la valeur via SetFontSize(). Nous ajoutons ensuite le texte voulu (i.e., votre nom) via une nouvelle méthode : Cell. Cell permet d'ajouter une cellule à notre document. Une cellule peut prendre diverses formes, selon les paramètres donnés. Dans notre cas, nous voulons que la cellule s'étende sur l'ensemble de la page (valeur à 0). Nous n'indiquons pas de hauteur minimale, ce qui n'est pas nécessaire dès que l'on ne veut pas afficher de bordure. Nous passons ensuite la chaine de caractères à écrire. Nous spécifions via la valeur par défaut de 0 que nous ne voulons pas de bordure. Nous aurions pu 27 FPDF indiquer L (gauche) ou T (haut) ou R (droite) ou encore B (bas). En mettant cette valeur à 1, nous indiquons que l'on souhaite un encadré. Concernant l'avant-dernière valeur, nous voulons passer à la ligne suivante après insertion du texte. Nous passons donc la valeur 1. Si nous voulions rester positionné à droite, nous aurions mis la valeur 0. De même, pour se placer sur la ligne suivante mais en-dessous, nous aurions indiqué la valeur 2. Pour finir, le dernier paramètre que nous passons nous permet de centrer le texte dans la cellule. La page d'analyse : le tableau Attaquons-nous maintenant à la page principale du rapport comportant un tableau des ventes et un graphique illustrant ce tableau. Nous n'allons pas illustrer nos données avec une description écrite de celles-ci. Toutefois, prenons le temps d'indiquer la légende de notre tableau. Nous prenons soin d'ajouter une page, à nouveau, afin de commencer la deuxième et dernière page de notre document. Afin de rendre le document aéré et de ne pas accoler notre légende au dessus de la page, on effectue un saut de ligne conséquent mais pas trop grand. Nous voulons écrire notre légende en caractères gras, de taille 14 et en Times. De plus, nous voulons que ce texte soit écrit en blanc sur bleu. C'est au moyen des méthodes SetTextColor() et SetFillColor() que nous allons indiquer les couleurs du texte et du fond, respectivement, avec les valeurs RGB/RVB des couleurs adéquates. L'insertion du texte n'apporte pas de grandes nouveautés par rapport aux précédents, si ce n'est qu'on lui demande un encadrement rempli par la couleur précédemment définie. Nous allons maintenant définir des variables que nous utiliserons pour réaliser le tableau ainsi que le graphique. Commençons par leur déclaration et assignation respective. Nous avons besoin de trois données : le nom des mois, le nom des produits et pour finir un tableau comportant les montants totaux des ventes. Le tableau des données comprend autant de tableaux que de produits (lignes) à insérer. Chacun de ces tableaux comprend autant d'index que de mois (colonnes) à insérer. Insérons la ligne d'en-tête de notre tableau. Celui-ci comportera une cellule vide et autant de cellules que de colonnes voulues (dans notre cas : trois). Pour ce faire, nous utiliserons une boucle. C'est pourquoi nous avons besoin d'avoir une variable ayant le nom des colonnes voulues. Pour ce faire, nous écrivons dans notre script le Listing 6. 28 Listing 8. Modification de l'insertion des lignes de données for ( $i=0; $i<count($columnLabels); $i++ ) { $pdf->Cell((190-46)/count($columnLabels),12,(number _ f ormat($dataRow[$i]).'€'),1,0,'C',$fill); } Listing 9. Variables utilisées dans la création du graphique $chartXPos = 20; $chartYPos = 225; $chartWidth = 160; $chartHeight = 80; Listing 10. Calcul des axes et de la taille d'une barre // Calcul des axes $xScale = count($rowLabels) / ($chartWidth-40); $maxTotal = 0; foreach ($data as $dataRow) { $totalSales = 0; foreach ($dataRow as $dataCell) $totalSales += $dataCell; $maxTotal = ($totalSales > $maxTotal) ? $totalSales : $maxTotal; } $yScale = $maxTotal / $chartHeight; //Calcul de la taille des barres $barWidth = (1 / $xScale) / 1.5; Listing 11. Insertion des axes et de leur titre // Axe X $pdf->Line( $chartXPos + 30, $chartYPos, $chartXPos + $chartWidth, $chartYPos ); for ( $i=0; $i < count( $rowLabels ); $i++ ) { $pdf->SetXY( $chartXPos + 40 + $i / $xScale, $chartYPos ); $pdf->Cell( $barWidth, 10, $rowLabels[$i], 0, 0, 'C' ); } // Axe Y $pdf->Line( $chartXPos + 30, $chartYPos, $chartXPos + 30, $chartYPos - $chartHeight - 8 ); for ( $i=0; $i <= $maxTotal; $i += 1000 ) { $pdf->SetXY( $chartXPos + 7, $chartYPos - 5 - $i / $yScale ); $pdf->Cell( 20, 10,number _ format( $i ).'€', 0, 0, 'R' ); $pdf->Line( $chartXPos + 28, $chartYPos - $i / $yScale, $chartXPos + 30, $chartYPos - $i / $yScale ); } // Ajout des titres des axes $pdf->SetFont( 'Arial', 'B', 12 ); $pdf->SetXY( $chartWidth / 2 + 20, $chartYPos + 8 ); $pdf->Cell( 30, 10, 'Produits', 0, 0, 'C' ); $pdf->SetXY( $chartXPos + 7, $chartYPos - $chartHeight 12 ); $pdf->Cell( 20, 10, '1er trismetre 2010', 0, 0, 'R' ); Listing 12. Création des barres // Creation des barres $xPos = $chartXPos + 40; $pdf->SetFillColor(119,144,191); foreach ( $data as $dataRow ) { $totalSales = 0; foreach ( $dataRow as $dataCell ) $totalSales += $dataCell; $pdf->Rect( $xPos, $chartYPos - ( $totalSales / $yScale ), $barWidth, $totalSales / $yScale, 'DF' ); $xPos += ( 1 / $xScale ); } Listing 13. Définitions des propriétés // Définitions $pdf->SetAuthor('Jonathan Danse'); $pdf->SetCreator('FPDF Class'); $pdf->SetTitle('Génération de PDF en PHP via la classe FPDF'); $pdf->SetSubject('Document généré pour un article de PHP Solutions'); $pdf->SetKeywords('FPDF Generation Document'); 9/2010 Pratique Encore une fois, nous ne faisons rien de plus que de définir une couleur de fond différente et de boucler sur notre tableau de colonnes afin d'obtenir le nombre de colonnes voulues. L'insertion des lignes garde le même principe, comme on peut le remarque au Listing 7. Nous pouvons ajouter une petite remarque concernant l'utilisation de la variable fill qui nous permet de mettre un fond de couleur différent une ligne sur deux. Cette variable prend la valeur false dans un premier temps. A chaque passage dans la boucle, nous lui assignons son contraire. Notre tableau est maintenant terminé. Précisons toutefois que les valeurs de largeur indiquées ne sont pas innocentes : nous disposons de 190 mm, à savoir 19 cm (largeur d'une page A4). Notre première colonne fera 46 mm. Ce qui nous laisse 144 mm disponible. Ayant du coup trois colonnes supplémentaires, nous pouvons fixer la largeur de ces colonnes à 48 mm (144/3). Cependant, il se pourrait que vous ne sachiez pas par avance le nombre de colonnes à afficher. Vous pourriez donc utiliser le même mécanisme qui est utilisé dans les boucles, à savoir utiliser la fonction count() du tableau des cellules. Ainsi, vous obtiendrez un code similaire au Listing 8. La page d'analyse: le graphique Procédons maintenant au graphique. Cette étape n'est pas la plus simple de notre document. Procédons donc par étapes. En premier lieu, nous allons – comme précédemment pour le tableau – créer des variables utiles à la suite. Ainsi, comme visible au Listing 9, nous créons quatre variables que nous utiliserons assez souvent dans la création du graphique. Procédons maintenant au calcul des axes ainsi que de la taille d'une barre du graphique. Ceci se fait grâce au code indiqué au Listing 10. Nous y calculons le maximum des ventes par produits afin de garder le montant total maximum possible, ce qui déterminera la hauteur de l'axe Y maximale. Maintenant que le calcul des axes est réalisé, nous pouvons les générer. Sur l'axe des X, nous indiquons chacun des noms de produits disponibles. Pour ce faire, nous utilisons notre tableau des en-têtes de lignes précédemment créé es. Sur l'axe des Y, nous allons indiquer des paliers. Dans notre exemple, nos paliers vont de 1000 en 1000. Nous utilisons une boucle permettant de générer ces paliers en prenant en compte la valeur maximum en Sur Internet • http://www.fpdf.org/ – Site officiel de FPDF. www.phpsolmag.org hauteur que prendra une barre de notre graphique afin d'obtenir le nombre adéquat de paliers visibles. Nous ajoutons par ailleurs le titre des axes. La dernière étape reste maintenant d'ajouter les barres à notre graphique. Pour ce faire, voyons le Listing 12. Ici, nous indiquons que la première barre se placera à 40mm du point d'origine. Nous indiquons aussi la couleur de fond des barres. Pour chaque donnée, nous calculons le montant total sur le trimestre. Nous traçons la barre au moyen de la méthode Rect(), ce qui a pour effet de créer un rectangle avec fond coloré à l'endroit voulu sur l'axe des X. Après l'insertion d'une barre, nous décalons notre curseur sur l'axe des X afin d'effectuer la même opération que précédemment. L'enregistrement du document Maintenant que notre document est fin prêt, il nous faut le sauver. Mais avant tout, procédons à quelques définitions du document. Ces dernières lignes vous permettent ainsi d'assigner quelques propriétés à votre document. L'enregistrement du document se fait grâce à cette ultime ligne: $pdf->output(‘Rapport.pdf'); Conclusion Nous avons vu comment utiliser PHP pour produire des documents PDF via la classe FPDF. Bien que nous n'ayons pas voulu surcharger cet article avec l'utilisation d'une base de données, vous avez pu remarquer qu'il était tout à fait possible d'automatiser certaines de ses tâches lors, notamment, de l'intégration d'un tableau ou d'un graphique. La classe FPDF étant libre, il vous est tout à fait possible de l'étendre pour y apporter vos propres méthodes et donc accroître les possibilités offertes. Par exemple, vous pourriez ainsi bénéficier de la possibilité d'intégrer une table des matières. JONATHAN DANSE Autodidacte en matière de développement de sites en PHP, l'auteur a toujours poussé plus loin sa curiosité sur le sujet et les outils du web. Sa volonté d'apprendre et d'aller toujours plus loin dans ses réalisations lui a permis de forger un bagage conséquent sur le développement d'applications PHP. Soucieux de réaliser des applications valides (aux normes du W3C), il utilise le CSS et l'(x)HTML avec parcimonie. Dans la même lignée, il s'attaque à l'apprentissage de jQuery et s'en fait un allié dans ses développements. L'auteur est actuellement en train de finir sa licence en informatique de gestion lui permettant d'être polyvalent et de voir d'autres méthodes de développement existantes. L'auteur est actuellement engagé en tant que développeur web pour l'agence Peppermind pour laquelle il réalise des développements sur mesure en externe mais aussi, et surtout, la refonte de la boutique en ligne de la société. 29 E-commerce E-commerce international L'e-commerce est international par essence. Vendre par Internet permet de commercialiser plus facilement ses produits à l’étranger. Mais cela ne va pas sans quelques difficultés spécifiques. Cet article explique : Ce qu’il faut savoir : • Les problèmes liés à l'internationalisation de l'e-commerce. • Une certaine connaissance du web. L ’e-commerce est international par essence. Vendre par Internet permet de commercialiser plus facilement ses produits à l’étranger. Mais cela ne va pas sans quelques difficultés spécifiques. Quelles sont les problèmes liés à l’internationalisation de l’e-commerce ? Quelles solutions pour palier à ces difficultés ? Cet article vous apporte les principaux éléments de réflexion, en abordant le e-commerce sous l’angle du B to C (business to consumer) : le commerce B to B (entre professionnels) est nettement plus complexe et nécessite le recours à des professionnels expérimentés et/ou un accompagnement par un organisme d’aide à l’export. • État des lieux de l’e-commerce international Les frais de port tendent souvent à augmenter le coût final pour le consommateur. Les frais de douanes et les taxes varient d’un pays à l’autre, jouant sur les prix ou provoquant une insécurité juridique pour l’acheteur. En conséquence, il semble normal que les consommateurs se tournent vers des vendeurs locaux ou nationaux pour les achats courants. Ceux qui tirent le mieux leur épingle du jeu à l’international sont souvent les vendeurs spécialisés : sur un marché de niche, proposer un produit rare ou à un prix attractif permet de développer son chiffre d’affaire à l’international. Les communautés d’expatriés sont un premier débouché facile à développer pour les produits régionaux et artisanaux. Ces produits trouvent également L’e-commerce progresse en Europe mais peine lorsqu’il est transfontalier. Selon une étude de la commission européenne, les internautes ont du mal à faire confiance aux sites ecommerce des pays étrangers : http://ec.europa.eu/consumers/strategy/facts_eurobar_en.htm. Entre 2006 et 2008, au sein de l’Union Européenne : • • 30 la proportion de consommateurs qui ont acheté au moins un article par Internet est passée de 50 à 56%, les transactions électroniques transfrontalières n'ont pratiquement pas progressé, passant de 6% à 7% de l'ensemble des achats, • • la confiance des consommateurs envers les vendeurs d'autres pays de l'UE a augmenté de 8% : en 2008, 57% estiment qu’ils sont autant rassurés de faire des achats en ligne auprès de vendeurs d'autres pays de l'UE, qu'auprès de vendeurs nationaux, les vendeurs pratiquent moins le commerce électronique (baisse de 6% de la proportion de vendeurs recourant au commerce électronique), la part des transactions transfontalières dans les transactions en ligne n'a pratiquement pas progressé : 17 % en 2008, 16% en 2006. Obstacles et opportunités pour l’e-commerce dans le monde 9/2010 E-commerce international aisément des débouchés à l’export du fait de leur connexion avec le monde du luxe. Parmi les secteurs ayant pu se développer à l’international grâce au web, on trouve aussi : le luxe, les voyages, l’informatique (essentiellement les logiciels), les livres, la musique. Historiquement, les sociétés ayant le mieux profité de l’ouverture des fontières sont celles qui disposaient déjà d’une filiale à l’étranger (ce qui revient à se positionner comme un vendeur national). Mais les pure-players réussissent aussi très bien, et montrent qu’il n’est pas obligatoire de passer par ces démarches complexes et coûteuses de création de filiales pour s’imposer à l’international. Les Difficultés rencontrées Exporter permet d’accroître sa zone de chalandise mais comporte des risques : Figure 1. Précisez clairement les frais applicables à la commande • La facture commerciale doit répondre à la législation française mais aussi à celle du pays où se situe votre acheteur. Elle doit comporter : • • les frais liés à l'exportation (internationalisation du site, publicité, etc.) peuvent ne pas être couverts par les bénéfices qu'elle génère, pertes de change éventuelles, problèmes de non paiement. Prenez le temps d'évaluer ces risques avant de prendre la décision d’exporter. Certains de ces risques peuvent être en partie couverts par des assurances spécifiques. Exporter est une opération plus ou moins complexe, en fonction du pays de destination. Parfois, le jeu peut ne pas en valoir la chandelle... Difficultés juridiques Pour vendre à l’étranger, vous devez vous soumettre à votre législation nationale, et à la législation du pays vers lequel vous exportez, tant en matière pénale qu’en matière sanitaire, etc. Exemple : vendre et expédier des gaines de cannabis est légal aux Pays Bas, mais strictement prohibé dans la plupart des autres états. Le colis risque d’être saisi par les douanes. Il n’existe pas de droit international civil. En cas de litige avec l’acheteur, sauf clause particulière d’attribution de juridiction ou de traitement des litiges (droit utilisé, arbitrage...) il vous faudra poursuivre votre interlocuteur devant ses propres tribunaux. Le contrat de vente doit donc préciser le tribunal compétent en cas de litige : est-ce la loi française ou la loi du pays du client qui s’appliquera ? Je vous conseille la première option, plus facile à maîtriser... La facture commerciale • • • • • votre nom et votre adresse, le nom et l’adresse de votre client, pour chaque produit : dénomination précise, quantité, prix unitaire HT, prix total HT, le coût du transport que vous avez payé, la mention : exonération de TVA, article 262-ter 1 du Code Général des Impôts, votre numéro individuel de TVA. La facture douanière (facture consulaire) Certains pays vous obligent à remplir une facture douanière (en fait, un ou plusieurs formulaires, à se procurer auprès des services consulaires ou de librairies spécialisées). Figure 2. Ce bouton renvoie sur une autre page du site (voir figure 9) Comment facturer à l’international ? La facturation des exportations se fait hors TVA. Rédigez la facture en deux exemplaires, en français si c’est ausi la langue de votre client, sinon en anglais. www.phpsolmag.org Figure 3. Le choix du pays de destination est proposé dans une barre de boutons 31 E-commerce • port français d’où la marchandise va être acheminée vers l’étranger, douane étrangère : le dédouanement import a lieu à la frontière à l’entrée du pays où se trouve l’acheteur. Il existe plus de 400 formulaires différents pour les douanes, la logistique, les assurances export et les règlements de taxes. En moyenne, pour une transaction, une entreprise doit collecter sept documents et trois signatures. Les douanes proposent le dédouanement en ligne par traitement automatisé avec DELTA (Déclaration Electronique Transmise Automatiquement) : www.douane.gouv.fr/page.asp?id=3332 Delta est un système de communication national entre le déclarant à l’import/export et l’administration. Figure 4. Le choix du pays de destination est proposé dés l’entrée du site Documents complémentaires La douane du pays vers lequel vous exportez demande parfois des documents complémentaires : • • • • • • une décomposition du prix (marchandise, assurance, port), une attestation de sincérité du prix, un certificat d’origine de la marchandise (à se procurer sur le site : www.webcoronline.com ), le visa de la facture par un organisme public (CCI...), un certificat d’inspection (contrôle de la qualité et de la quantité des produits), un certificat de conformité des marchandises aux normes du pays destinataire. Votre transitaire peut établir ces divers documents pour votre compte. (Le terme de transitaire est souvent employé comme terme générique des spécialistes de la logistique). Les formalités douanières Toute exportation entraîne deux séries d’opérations douanières : • douane française : le dédouanement export se fait à la frontière française ou dans le port ou l’aéro- • • • • • DELTA D : Procédures simplifiées de dédouanement à domicile, DELTA C : Procédures de dédouanement en droit commun, DELTA T : Transit Communautaire, DELTA X : Dédouanement du fret express, DELTA P : Prise en charge aéroportuaire des marchandises. Envoi vers un pays de l’Union Européenne Il n’y a plus de droits de douane entre les pays de l’Union. Cependant, il existe une formalité : la Déclaration d’Echange de Biens (DEB). Elle peut être réalisée en téléprocédure via : https://pro.douane.gouv.fr. La TVA est payée dans le pays d’origine de la marchandise (art. 258 A Code Général des impôts), au taux en vigueur dans le pays du vendeur. Exception : si un site de e-commerce étranger vend pour plus de 100 000 € hors taxe à des clients français, la TVA est payable en France (art. 258 B CGI). Cela signifie que si le site de e-commerce vend pour plus de 100 000 € de biens, c’est le taux français de TVA qui s’applique. Les entreprises qui exportent à l’intérieur de l’Union européenne doivent remplir une déclaration d’échanges de biens transmise à la douane chaque mois. Cette formalité s’explique pour des raisons statistiques (établir les statistiques du commerce extérieur de la France) et fiscales (surveiller les flux de marchandises sur le plan fiscal (TVA intercommunautaire). Envoi hors Union Européenne Une déclaration en douane appelée Document Administratif Unique (DAU) est exigée. Le DAU doit être accompagné d’autres documents : Figure 5. Deux autres manières d’envisager l’internationalisation 32 • • la facture commerciale, les titres de transport, 9/2010 E-commerce international • la liste de colisage (nombre de colis et poids de chacun d’entre eux correspondant à la facture). Le DAU, utilisé par les 25 pays membres de l’Union Européenne, permet à la douane de recueillir les informations relatives aux statistiques, aux taxes et aux formalités liées aux paiements. Le DAU comprend 54 cases et fait apparaître trois éléments principaux : Figure 6. Exemple d’internationalisation à améliorer • • • l’espèce tarifaire, c’est-à-dire la nomenclature du produit exporté, la valeur en douane : valeur Hors Taxes des marchandises comprenant les frais de prétransport, c’est à dire avant le transport principal, l’origine du produit exporté (en effet, les droits de douane à l’arrivée dans le pays cible peuvent varier en fonction d’accords préférentiels conclus entre certains Etats). Le régime douanier le plus simple pour les exportations hors de l’Union Européenne est l’exportation en simple sortie. Pour les exportations hors de la Communauté Européenne, conclure un contrat de transport unique permettra de réduire les formalités : • • la compagnie de transport prend en charge l’acheminement des marchandises à destination du pays tiers, la compagnie de transport est partie au contrat et en assume les obligations : elle assume une responsabilité juridique envers la douane en cas d’irrégularité. Pour certaines destinations, la présence d’une déclaration d’origine permet la diminution ou l’exonération du montant des droits de douane dans le pays de destination. L’expéditeur doit prouver pour cela que la marchandise concernée est bien originaire d’un pays de l’Union Européenne. Cette preuve sera fournie par l’exportateur au moment de l’expédition à l’aide d’une déclaration d’origine sur facture (DOF) : pour la majorité des pays, cette déclaration peut, jusqu’à un certain seuil (variable suivant les pays), être établie sur la facture. Modèle de DOF (déclaration d’origine sur facture) : Je soussigné ...(1) déclare que les marchandises dans mon envoi répondent aux conditions fixées pour obtenir le caractère originaire dans les échanges préférentiels avec ...(2) et sont originaires de l’Union Européenne. (3). • • • (1)Nom de la personne effectuant la déclaration, (2)Précisez le pays de destination, (3)La déclaration doit être suivie de la signature. Produits interdits ou réglementés Dans ce cas, le bureau de dédouanement est responsable de l’accomplissement des formalités de sortie : Ce site propose un outil pour vous informer rapidement sur les démarches à l’export (déclarations en douane, objets interdits...) : • https://www.coliposte.net/pro/services/main.jsp?m=30012002 • visa de l’exemplaire n° 3 du DAU, qui est immédiatement restitué à l’exportateur apposition de la mention " EXPORT " en rouge et du cachet du bureau sur les documents de transport (LVI, LTA, connaissement maritime) qui doivent également être présentés au bureau de sortie réel de l’Union européenne. La TVA sera également à payer : le montant de cette TVA sera calculé en fonction de la valeur de la marchandise, plus les frais de transport, plus les assurances et les droits de douane. Les droits et taxes sont à payer directement auprès du transporteur qui s’est chargé de toutes les démarches auprès des services de douanes. Les formalités douanières applicables pour les colis expédiés depuis la France sont expliquées en détail sur le site de l'Administration : http://www.douane.gouv. fr/menu.asp?id=92. www.phpsolmag.org Pour certains types de marchandises (ex : alcool, parfums, végétaux ) vous devez joindre à votre envoi un certificat d’exportation. La réglementation sur ces produits étant en évolution constante, consultez les services des Douanes afin de connaître la réglementation à jour : www.douane. gouv.fr. Les réglementations locales peuvent vous obliger à adapter vos produits ou leur emballage, voire ralentir la livraison. Ainsi, les lois australiennes sur la quarantaine sont appliquées strictement à l’importation sur tous les produits d’origine végétale et animale ainsi que ceux fabriqués à base de terre ou de sable. Les envois ne doivent pas être conditionnés dans des boîtes en bois ni dans des cartons à fruit. 33 E-commerce Attention aussi à ne pas vous laisser pièger par les frais de change et l’évolution du cours des devises : http://www.conex.fr/cm/index/infos_pratiques/Taux_ de_change/0.html Figure 7. Exemple d’internationalisation à améliorer La fiscalité Les taux de TVA varient entre les pays de la zone Euro. Vous les trouverez à cette adresse : http://www.eic.ccip.fr/informations/tva/tva5.htm Le portail du Ministère de l’économie et du commerce extérieur informe sur les conventions fiscales entre les pays. Pour trouver la réglementation des échanges entre un pays et la France, utilisez ce moteur de recherche : http://www.minefe.gouv.fr. Comment préparer son site pour vendre à l’international Oseo propose un guide de l’export plein de conseils judicieux : http://www.oseo.fr/votre_projet/international/guides_ et_conseils Offrir des monnaies multiples Un atout maitre pour le commerce transfrontalier reste une monnaie commune, qui favorise la comparaison des prix et supprime les taux de change. L’Euro joue ce rôle au sein des quinze pays de la zone Euros. L’euro permet déjà de commercer directement avec quinze pays représentant 318 millions d’habitants; accepter les paiements en dollar vous permettra de vendre partout dans le monde. Le client souhaite être facturé dans sa monnaie locale. Cela alourdit le coût de la transaction, mais peut vous permettre de gagner des clients. Cela peut également vous permettre de répercuter directement les taxes dans le prix affiché, le risque étant que certains clients se sentent lésés en constatant les prix affichés pour d’autres devises, pour lesquelles les états taxent moins lourdement les importations... Adapter son site Suivant les moyens de l’entreprise et les profits espérés, on devra choisir entre : • • vendre directement sur son propre site, après l'avoir internationalisé réaliser une version localisée, avec un nom de domaine national (ex : monentreprise.be, monentreprise.ch, monentreprise.lu, etc.), ce qui peut aider au référencement lorsque les .com sont déjà très encombrés dans votre secteur d’activité. L’étude des sites concurrents poura aider à faire son choix entre ces deux options. Réaliser une étude de marché pour chaque marché ciblé L’étude de marché permettra de déterminer s’il faut adapter son offre et comment se conformer aux habitudes de consommation et au contexte culturel. L’étude de marché peut être réalisée par un organisme extérieur spécialisé, par un collaborateur de votre entreprise ou un volontaire international en entreprise (V.I.E.). Adapter sa communication L’objectif doit rester de drainer un trafic qualifié. Un référencement spécifique à la langue, au pays et aux habitudes de recherche s’impose. Les marchés francophones peuvent réserver des surprises, car le vocabulaire varie d’un pays à l’autre (Québec, Suisse, Maghreb, etc.), nécessitant le choix de mots-clés spécifiques pour chaque pays visé. Une campagne de publicité aidera à se faire connaître : sur les moteurs de recherche, des sites ou blogs de référence, etc. Recruter des affiliés est un moyen toujours rentable de développer son chiffre d’affaire, à condition de privilégier la rémunération sur les ventes. Maîtriser la logistique Figure 8. Deux bugs d’internationalisation à éviter 34 Certains marchés complexes nécessitent de recruter un logisticien, qui aura la charge du transport, des formalités douanières et administratives, contrôles sanitaires, etc. Les formalités se sont simplifiées entre pays membres de l’union europénenne. Dans la plupart des cas, il suffira de se documenter auprès des administrations locales et des sites spécialisés dans la logistique comme www.e-logisticien.com. 9/2010 E-commerce international Certaines collectivités, chambres de commerce ou associations d’entrepreneurs proposent de l’information ou de l’aide pour vous guider dans les formalités liées à l’export. http://www.telecom.gouv.fr/fonds_documentaire/captef/2005/gramunt.pdf Choisir une société de transport bien implantée vous simplifiera la tâche : DHL, Fedex, TNT, UPS, etc. Conformez-vous scrupuleusement aux instructions d’emballage de votre transporteur : les clients coûtent cher à acquérir et à conserver, il serait dommage de les perdre parce que vous négligez la qualité de l’emballage ou du calage. Vous trouverez sur ce site quelques ressources intéressantes : http://www.lememo-transport.com/envoi-colis-international.asp. Vous serez peut-être amené à répercuter ces coûts supplémentaires sur le consommateur, ce qui peut nuire à votre compétitivité sur le marché visé. De même, vous devez prévenir l’acheteur lorsqu’il est susceptible de payer des charges, taxes ou frais de douane supplémentaires, ce qui peut nuire à l’attractivité de votre offre. Faites en sorte de faciliter la tâche à vos clients. Maîtriser les risques Le consommateur attend que vous le rassuriez sur la sécurité lors du paiement. Et de votre côté vous souhaitez éviter les impayés, d’autant plus difficiles à gérer lorsque le litige doit être jugé à l’étranger. Lorsque les sommes en jeu sont trop faibles, il vaut souvent mieux se contenter de simples relances et/ou blacklister le fraudeur. Certains pays sont connus pour héberger des trafic de marchandises obtenues par escroquerie : toutes les opportunités d’affaire ne sont pas bonnes à prendre... Pour sécuriser vos clients, outre les méthodes classiques (formulaires sécurisés, connexion sécurisée SSL, certificats de sécurité), vous pouvez faire appel à tiers de confiance ayant une bonne notoriété dans le pays de votre client (Paypal, etc.). Laissez le client choisir le moyen le plus sûr pour lui. Les paiements par carte bancaire sont de loins les plus simples et les plus appréciés par les consommateurs. Ils vous permettent également de bénéficier d’une garantie de paiement. Pour les paiements par virement, ouvrir un compte dans le pays vers lequel vous exportez permet de rassurer le client. Accepter les paiements par chèque vous expose à un fort risque d’impayé et à des commissions bancaires. www.phpsolmag.org Figure 9. Une autre manière d’indiquer clairement la TVA pour justifier les différences de prix Entre commerçants, les différentes formules concernant le transfert de risques et de charge pour les acteurs du commerce international sont codifiées dans les conditions de vente internationales (ou Incoterms) définies par la Chambre de Commerce Internationale : http://www.conex.fr/cm/index/infos_pratiques/Incoterms_2000/0.html. http://www.logistiqueconseil.org/Articles/Transit-douane/Piege-incoterms.htm. Les incoterms précisent les responsabilités respectives, fixent le partage des coûts et la division des risques, mais ne définissent pas le moment où est transférée la propriété. Les risques liés au transport Plusieurs types de risques sont à envisager : • • • Le risque de détérioration de la marchandise (avarie ou casse liées à des chocs lors de la manutention ou à un mauvais emballage), Le risque de non livraison (perte ou vol de la marchandise), Le risque de livraison en retard par rapport au délai prévu. Compte tenu des limites de responsabilité des transporteurs et des faibles indemnités à percevoir en cas de sinistre, il convient de prendre une police d’assurance transport sur les marchandises (perte ou vol) ou les dommages causés à celles-ci (casse, détérioration). 35 E-commerce Figure 10. Proposez des modes de paiement adaptés et précisez les délais de traitement Cas concrets d’internationalisation réussie Nous l’avons vu, vendre à l’international est un vrai challenge. Les difficultés sont nombreuses et parfois difficiles à soupçonner. Je vous présente ci-dessous deux cas concrets d’internationalisation réussie. L’exemple des vendeurs de matériel de musique : www.thomann.de Historiquement, les anglais sont les champions de l’export de musique et de matériel de musique. Les magasins Studiospares et Canford Audio ont rayonné à l’international bien avant l’ouverture des frontières, grâce à une offre de produits difficiles à trouver dans les autres pays (consommables pour studios d’enregistrement, etc.). Mais l’Angleterre s’est récemment fait dépasser par l’Allemagne, Sur le marché des instuments de musique, on a pu observer une concentration de l’offre en Allemagne, avec l’apparition de magasins comme Thomann, contenant une salle de spectacle complète en guise de show room! Les deux ou trois vendeurs ayant pu atteindre cette taille ont développé une politique de prix attractifs 36 en s’appuyant sur les économies d’échelle qu’ils réalisent grâce au volume de leurs ventes, et aux opportunités offertes en se fournissant directement en Chine. Ils proposent des produits d’entrée de gamme sous leur propre marque de distributeur, et réalisent régulièrement des opérations promotionnelles sur des produits prestigieux ou très demandés, qu’ils commandent spécialement en grosse quantités pour faire baisser les prix. Pour faciliter leur pénétration sur le marché européen, ils ont également embauché des personnes parlant couramment anglais, espagnol et français (ces langues sont citées dans l’ordre du nombre de personnes les utilisant dans le monde). Le consommateur dispose d’un service avant et après vente dans sa langue native. Ils ont également fait l’effort de publier un site en version internationalisée et un catalogue papier dans chacune des principales langues. Last but not least, ils reprennnent sans discussion les produits, même si lorsque le retour est motivé par une erreur du consommateur. Car la confiance est la clé de voûte de la VPC. 9/2010 E-commerce international On remarque donc que les éléments clé du succés de ces vendeurs ont été : • • • • • volume de vente important, politique de prix bas, embauche de collaborateurs natifs des pays visés (ou au minimum ayant une bonne pratique des langues), catalogue très étoffé (nombreuses références), politique de retour facilité pour le consommateur : satisfait ou remboursé. Thomann s’est donné les moyens pour conquérir une clientèle internationale et dominer ses compétiteurs. Pour comprendre les raison de son succès, il suffit de comparer son site à celui de son concurrent le plus important : www.musicstore.de L’exemple des vendeurs de médias vierges L’Allemagne et le Luxembourg dominent la vente de médias vierges en Europe : CD-r, DVD-r, etc. Ce marché ne bénéficie pas complètement de l’harmonisation européenne, le montant des taxes pour les droits d’auteurs variant d’un pays à l’autre. Le consommateur est considéré comme l’importateur du produit, et doit s’acquitter de ces taxes directement auprès de Sorecop ou de Copie France. Apparemment, ces sociétés n’ont pas de formulaire de déclaration à destination des particuliers... Les vendeurs s’appuient donc classiquement sur des volumes élevés, des prix bas et un catalogue avec de nombreuses références. Mais ils profitent aussi de facto de la distorsion de concurrence créée par les variations de taxe. Ils affichent ainsi des prix que leurs concurrents des autres pays ne peuvent pas atteindre. • • • tions verticales conformément à la législation européenne dans le domaine de la concurrence (relations entre fournisseurs et distributeurs), examiner en profondeur la légitimité des restrictions géographiques artificielles qui empêchent les consommateurs de franchir les frontières nationales (réglements sanitaires, etc.), éradiquer la nouvelle génération de pratiques commerciales déloyales qui se développent rapidement en ligne (comme l’usage de plus en plus répandu des cases précochées, les alertes aux virus et la confusion entre communications commerciales et non commerciales), veiller à ce que des questions importantes touchant au respect de la vie privée – collecte de données et pratiques de profilage – ne sapent pas la confiance dans l’espace numérique. Conclusion Vendre à l’international peut être simple, à la double condition de : • • vendre au sein de la zone euro ou utiliser les services d'un transporteur qui se charge des formalités douanières, vendre des produits qui ne sont pas soumis à une législation trop contraignante. Mais il y a loin de la coupe aux lèvres, et réussir dans le commerce international demande d'investir des moyens conséquents, sans garantie de succès. La voie la plus sûre reste de suivre la demande, en proposant un site ouvert aux acheteurs étrangers, et en accompagnant l’augmentation des commandes par une localisation progressive de l’offre. Les soutients au développement du ecommerce transfrontalier Le service Sémaphore recense pour vous l’ensemble des dispositifs d’aide et de soutien à l’export pour les entreprises françaises, à tous les niveaux territoriaux : http://semaphore.cci.fr/oseo/?projet=exporter. Meglena Kuneva, la commissaire européenne chargée de la protection des consommateurs préconise cinq mesures que l’Union pourrait prendre pour favoriser la confiance des Européens envers le commerce en ligne : • • un corpus législatif unique et simplifié applicable aux contrats de consommation, revoir les restrictions imposées sur l’Internet dans le cadre de la révision du règlement sur les restric- www.phpsolmag.org GAUTHIER BOULY, MICKAEL RUAU Gauthier Bouly est développeur pour le site http://www.yozik.com/ (service internet d’aide à la vente de produits musicaux). Mickael Ruau est l’initiateur du projet Open Source USEB (format de panier électronique). 37 Fiche technique Comparatif des fonctionnalités de référencement naturel entre Joomla 1.5 et 1.6 Les règles du référencement naturel s’affinent au fil des mois et les moteurs accordent de plus en plus d’attention à la qualité de la présentation ainsi que du contenu. En termes de gestion de contenu, Joomla, dans sa version 1.5, est un des CSM les plus utilisés. Cet article explique : Ce qu’il faut savoir : • Cet article analyse et compare les fonctionnalités de Joomla 1.5 et de Joomla 1.6 autour de quelques points importants en termes de référencement naturel, tels que des noms de pages significatifs, des urls bien constituées ou la gestion des méta-tags (ou métadonnées). • Connaître et utiliser Joomla. A u sein de la nouvelle version de Joomla 1.6, plusieurs fonctionnalités permettant nativement la gestion du référencement naturel ont été améliorées et d’autres rajoutées. Alors que sous Joomla 1.5.20, ces fonctionnalités étant parfois dans leurs premières phases de développement, il était quelquefois nécessaire d’utiliser des extensions, si possible Open Source, pour répondre aux exigences de plus aiguës des moteurs de recherche en matière de référencement naturel. Un soin tout particulier a été apporté à l’intégration de la technique d’url-rewriting. Celle-ci consiste à trans- former les urls illisibles générées par le système en urls plus lisibles par le moteur et par l’internaute. Par exemple, http://www.monsite.fr/index.php?option=com_conte nt&view=article&catid=45&id=55&Itemid=30 sera transformé en http://www.monsite.fr/informations-generales. html. Fonctionnement des moteurs de recherche Les moteurs de recherches parcourent le web à l’aide de petits robots qui indexent (rangent) les sites et les pages qu’ils rencontrent ou qu’on leur indique. Plus Figure 1. Gestion du titre d’article sous Joomla 1.5 Bien évidemment, ce plug-in fonctionne également pour les catégories mais n’est pas rétroactif. 38 9/2010 Le principe de configuration deRéférencement base, mais naturel qui là est nettement enrichi pour ce problème particulier, est le même que sous Joomla 1.5 et est accessible en cliquant sur Site/Global Configuration. Figure 2. Configuration des paramètres globaux de SEO sous Joomla 1.6 l’information est structurée correctement, mieux l’indexation sera effective, et plus le site aura une chance d’être présent dans les moteurs de recherche. Ainsi, à contenu égal, une page qui aura un nom en rapport avec le sujet, des méta-tags soignés et un contenu correctement présenté sera naturellement mieux placée qu’une page avec un nom de page non significatif, sans méta-tags, ainsi qu’avec un contenu mal ou pas présenté. Noms de pages significatives Le moyen le plus simple de transformer des noms de pages illisibles en noms plus compréhensibles est l’urlrewriting en utilisant des règles automatiques. Malheureusement, il se révèle parfois très ardu à mettre en œuvre et il est géré différemment d’un hébergeur à un autre. De plus, le réglage pour une ou plusieurs pages particulières à mettre en avant, peut se réveler plus préjudiciable qu’utile. Une première solution, est le mécanisme des urls explicites. Celui-ci consiste à s’appuyer sur les alias des articles (un article est l’équivalent de la page), des catégories, des sections et des éléments de menu, pour fabriquer des noms de page. Ce champ alias, si on ne le remplit pas soi-même, est généré automatiquement www.phpsolmag.org en fonction des mots du titre, séparés par un tiret. Et ce, lors de la première sauvegarde d’un nouvel article ou d’un nouvel élément. Joomla 1.5 Après avoir vérifié les règles d’activation auprès de son hébergeur, il faut tout d’abord, dans la configuration de l’administration Joomla, activer l’option URL explicite. Ensuite, par exemple, pour le titre ex d’art accentué, l’alias généré automatiquement sera transformé en exdart-qaccentueq. Il est évidemment possible de corriger à la main, mais cela peut se révéler à la longue fastidieux, surtout si les titres des articles sont parlants. Une des solutions est la petite extension Open Source Unicode Slug (http://extensions.joomla.org/extensions/site-management/sef/10275), qui s’installe sous la forme d’un plug-in, et qui décode proprement les titres. Ainsi, le titre ex d’art accentué sera transformé plus élégamment en ex-d-art-accentué. Bien évidemment, ce plug-in fonctionne également pour les catégories mais n’est pas rétroactif. Joomla 1.6 Le principe de configuration de base, mais qui là est nettement enrichi pour ce problème particulier, est le 39 Fiche technique Figure 3. Configuration des paramètres globaux de SEO sous Joomla 1.5 Voici, à titre d’exemple, la bonne configuration pour un fichier .htaccess, pour un Joomla 1.5.20, tournant sur un serveur linux hébergé par 1and1 : AddType x-mapp-php5 .php Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$ [NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php Il faut ensuite ne pas oublier d’enrichir les règles d’url-rewriting en fonction des extensions rajoutées dans le site, par exemple, les extensions de gestion de menus, de documents, de catégories ou de galeries d’images. Chaque extension fournit les lignes à rajouter dans le .htaccess. Il existe quelques extensions spécialisées (dont certaines se sont déjà positionnées sur Joomla 1.6) qui peuvent vous faciliter la vie. Figure 4. Gestion des métas-tags d’un article sous Joomla 1.5 40 Joomla 1.6 9/2010 Référencement naturel Figure 5. Gestion du titre de menu sous Joomla 1.5 Joomla 1.6 même que sous Joomla 1.5 et est accessible en cli- Enfin, l’utilisation des deux premières options permet de créer des noms de pages significatifs. quant sur Site/Global Configuration. rapport à de la version précédente de Joomla, il exi- ont là aussi été enrichies, notamment en LesParoptions gestion des méta-données ste trois nouvelles options qui ont une influence sur le Urls significatives ce qui concerne la gestion du meta-tag titre et la gestion des autres métadonnées. référencement naturel : Le problème évoqué au point précédent, touche mainMais elles ont également été étendues à d’autres éléments tenant l’url dans toutede sa Joomla. constitution, notamment en ce • Unicode Aliasses : cette option offre la possibilité de qui concerne la navigation via les sections, et les catédécoder proprement les alias en choisissant la meilleu- gories, ainsi que les modes d’affichages. re translation de possible. Ainsi, cocher cette option revient Meta-tags l’article à utiliser le plug-in Unicode Slug et fournit le même ré- Joomla 1.5 sultat. Par exemple, le titre ex d’art accentué, sans cet- Avec l’option Search-Engine Friendly activée dans le te option, restera ex-dart-qaccentueq. Mais avec cette panneau d’activation, Joomla 1.5 a encore un peu de Titre option, il sera transformé en ex-d-art-accentué. mal à constituer des urls significatives reflétant la na• Add Suffi xe to url : cette option rajoute .html à la vigation. Sous Joomla 1.5, il n’y a donc pas d’autre soTout d’abord, pour le meta-tag titre (qui apparaît aussi dans l’en-tête du fin des alias. Les urls ne sont donc plus de la forme lution pour avoir des urls harmonieuses que d’activer navigateur), il est possible de ne mais pas http:// utiliserl’url-rewriting le titre deenl’article, mais d’en renseigner http://www.monsite.fr/ex-d-art-accentué configurant correctement son fichier unwww.monsite.fr/ex-d-art-accentué.html. autre en choisissant dans le menu de droite Articles Options puis Alternate .htaccess en fonction de son hébergeur, et enPage acti• Add Ceci Site permet, Name to Page : cette optionde ra-titrer vant le ensuite dans la configuration l’administration Title. si onTitle le souhaite, même contenu avec de deux objectifs joute le nom différents : du site en début de chaque titre de pa- Joomla, l’option utiliser le module Apache mod_rege. Dans la mesure où Google privilégie de plus en write. plus le référencement de chaque page individuelleVoici, à titre d’exemple, la bonne configuration pour -Titre l’article à destination qui.htaccess, parcours Page ment,de cette option simplifi e le rappel du de noml’internaute du site un fichier pourleunsite.-Alternate Joomla 1.5.20, tournant Title à chaque destination des résultats de recherche et de linux l’indexation des moteurs de dans page. sur un serveur hébergé par 1and1 : recherche. www.phpsolmag.org 41 Fiche technique Figure 6. Gestion du titre d’un article sous Joomla 1.6 Gestion des autres métadonnées Concernant le sous-menu metadata options, la description et les mots-clefs se remplissent de la même manière. Les options d’indexation des robots sont désormais accessibles dans une liste, ce qui évite les erreurs de frappe. Le choix de Use Global, par défaut, réutilise les options définies par défaut dans le menu global options. Figure 7. Gestion des métas-tags d’un article sous Joomla 1.6 42 L’option Content Rights décrit les droits des utilisateurs sur le contenu de l’article 9/2010 (Creative Common License par exemple ou pas de droits d’utilisation). Référencement naturel Figure 8. Gestion des métas-tags d’une catégorie sous Joomla 1.6 AddType x-mapp-php5 .php tement la constitution d’urls significatives en se basant Options +FollowSymLinks sur la navigation au sein des catégories. RewriteEngine On Par exemple, l’url affichant les flux rss du composant RewriteBase / News Feeds dans la catégorie extensions du menu utiRewriteCond ^(/component/ lisation Joomlaleur se présente avecacette de la Concernant%{REQUEST_URI} les métadonnées des éléments de de menu, gestion étéoption enrichie option,com) [NC,OR] manière suivante : également et regroupée dans un onglet du menu de droite, l’onglet metadata RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\. options. html|/[^.]*)$ [NC] http://www.monsite.com/index.php/using-joomla/extenRewriteCond %{REQUEST_FILENAME} !-f sions/components/news-feeds-component.html. RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php Les urls sont aussi bien générées qu’avec l’option uti- Meta-tags des éléments de menu Il faut ensuite ne pas oublier d’enrichir les règles d’url-rewriting en fonction des extensions rajoutées dans le site, par exemple, les extensions de gestion de menus, de documents, de catégories ou de galeries d’images. Chaque extension fournit les lignes à rajouter dans le .htaccess. Il existe quelques extensions spécialisées (dont certaines se sont déjà positionnées sur Joomla 1.6) qui peuvent vous faciliter la vie. Joomla 1.6 Avec l’option Search-Engine Friendly activée dans le menu Global Configuration Joomla 1.6 réalise parfaiwww.phpsolmag.org liser le module Apache mod_rewrite. Le fait de ne plus avoir à utiliser explicitement cette option (sauf dans des cas bien particuliers) est plus économique en termes de charge pour le serveur et le chargement des pages. Et quand on sait que Google accorde actuellement du crédit aux pages qui se chargent vite, toute économie est bonne à prendre. Gestion des méta-tags Les méta-tags servent surtout à renseigner les moteurs de recherche. Et ce quel que soit l’élément de Joomla utilisé, c’est-à-dire l’article, la catégorie ou l’élément de menu. 43 Fiche technique Meta-tags de l’article Titre Tout d’abord, pour le metatag titre (qui apparaît aussi dans l’en-tête du navigateur), il est possible de ne pas utiliser le titre de l’article, mais d’en renseigner un autre en choisissant dans le menu de droite Articles Options puis Alternate Page Title. Ceci permet, si on le souhaite, de titrer le même contenu avec deux objectifs différents : • Titre de l’article à destination de l’internaute qui parcours le site.-Alternate Page Title à destination des résultats de recherche et de l’indexation des moteurs de recherche. Figure 9. Gestion des métas-tags des éléments de menu sous Joomla 1.6 Comme pour les catégories, il sera possible de piloter les robots, le meta-tag title et le nom de page via l’option Alternate Page Title, ainsi que de renseigner la Joomla 1.5,laarticles Gestion des autres métadonnées description et les mots-clefs. Mais en plus, il sera possible d’agir sur d’autres Sous Joomla 1.5, à la droite de chaque article existe Concernant le sous-menu metadata options, la deinformations annexes qui ont une grande influence sur le référencement naturel un petit menu metadonnées dans lequel il est possible scription et les mots-clefs se remplissent de la même telles que les options suivantes : de noter optionnellement la description, les mots-clefs, manière. l’instruction d’indexation pour les ainsidescription Les options des robots sont désorma: il ou estnon possible d’y moteurs ajouter une textuelled’indexation pour le Link Title Attribute que l’auteur. Le titre qui apparaîtra dans le navigateur et is accessibles dans une liste, ce qui évite les erreurs lien de l’élément de menu quand la souris survole ce lien. dans les résultats des moteurs de recherche est le titre de frappe. Le choix de Use Global, par défaut, réutiliLink CSS Style : il s’agit du nom de la classe CSS utilisé pour présenter de l’article à gauche. se les options définies par défaut dans le menu global visuellement ce lien. Pour améliorer ce mécanisme, il existe des extenoptions. : on peut ici associer l’url d’une image au lien, en y incorporant les Link Image sions du type Meta Generator L’option Content Rights décrit les droits des utiinformations textuelles nécessaires(http://extensions.jotelles que title ou alt. Show Page Heading : par défaut, le nom de l’élément de menu ne sera affiché de l’article (Creative Comomla.org/extensions/site-management/seo-a-melisateurs sur pas le contenu lorsqu’on cliquequi sur générent lui. Mais ilautomatiquement est possible de choisir l’afficher enpar affectant tadata/11038) une de mon License exemple ou pas de droits d’utilil’option à oui. description et des mots-clefs en s’appuyant sur le con- sation). : Ilenest possible un autre texte pour l’élément de menu. Et Page de Heading tenu l’article, cas de nond’afficher remplissage des métaL’option External Reference est utilisée pour référenil sera entre balises H2 (ce qui lui donne une importance par défaut plus données. Cette extension permet en outre de para- cer une source de données externe. importante quequi duapparaîtra texte). métrer le titre dans le navigateur. Page Class : il s’agit du nom de la classe CSS utilisé pour enrichir visuellement Metas-tags des catégories l’affichage du nom de cet élément de menu. Élément de menu La gestion des méta-données a été étendue aux caDans le menu système, à droite de l’élément de me- tégories et regroupées au sein d’un seul onglet du nu, se trouve le paramétrage système. C’est ici qu’il est menu de droite, l’onglet metadata options. Il sera Conclusion possible de changer le titre de la page qui fait égale- donc possible de piloter les robots, ainsi que le mement office de meta-tag titre. À défaut, ce sera le titre ta-tag title et le nom de la page via l’option AlternaComme nousdeavons pu le voir dans ces différentes fonctionnalités, la gestion de l’élément menu. te Page Title ; et de du renseigner la description et les référencement naturel dans Joomla 1.6 est le prolongemement de la version 1.5. Il mots-clefs. Joomla 1.6 Les options de gestion des méta-données ont là aussi été enrichies, notamment en ce qui concerne la gestion du meta-tag titre et la gestion des autres métadonnées. Mais elles ont également été étendues à d’autres éléments de Joomla. 44 Meta-tags des éléments de menu Concernant les métadonnées des éléments de menu, leur gestion a été enrichie également et regroupée dans un onglet du menu de droite, l’onglet metadata options. 9/2010 Référencement naturel Comme pour les catégories, il sera possible de piloter les robots, le meta-tag title et le nom de la page via l’option Alternate Page Title, ainsi que de renseigner la description et les mots-clefs. Mais en plus, il sera possible d’agir sur d’autres informations annexes qui ont une grande influence sur le référencement naturel telles que les options suivantes : Rejoignez le Club .PRO Rejoignez le Club .PRO Pour plus de renseignement : [email protected] Stonfield Inworld : [email protected] Pour plus de renseignement Stonfield Inworld propose aux entreprises des solutions globale d'intègration d'Internet et des Univers Virtuels dans leur stratégie Stonfield Inworld de développement. Au-delà de ses services, la société consacre 30% de ses ressources à des travaux de R&D des sur le e-Commerce Stonfield Inworld propose aux entreprises solutions globale et le e-Learning dans les Mondes Virtuels d'intègration d'Internet et des Univers Virtuels dans leur stratégie de développement. Au-delà de ses services, la société consacre 30% de ses ressources à des travaux de R&D sur le e-Commerce et le e-Learning dans les Mondes Virtuels Link Title Attribute : il est possible d’y ajouter une description textuelle pour le lien de l’élément de menu quand la souris survole ce lien. Link CSS Style : il s’agit du nom de la classe CSS utilisé pour présenter visuellement ce lien. Link Image : on peut ici associer l’url d’une image au lien, en y incorporant les informations textuelles nécessaires telles que title ou alt. Show Page Heading : par défaut, le nom de l’élément de menu ne sera pas affiché lorsqu’on clique sur lui. Mais il est possible de choisir de l’afficher en affectant l’option à oui. Page Heading : Il est possible d’afficher un autre texte pour l’élément de menu. Et il sera entre balises H2 (ce qui lui donne une importance par défaut plus importante que du texte). Page Class : il s’agit du nom de la classe CSS utilisé pour enrichir visuellement l’affichage du nom de cet élément de menu. Conclusion Comme nous avons pu le voir dans ces différentes fonctionnalités, la gestion du référencement naturel dans Joomla 1.6 est le prolongemement de la version 1.5. Il peut sembler prématuré de démarrer un nouveau projet avec Joomla 1.6 qui est encore en beta-test (release beta-test 7 au 15 août 2010). Mais il est possible, en ce qui concerne le référencement (l’objet de cet article ne traitait pas des nouvelles fonctionnalités de Joomla 1.6 qui sont extrêmement puissantes) de travailler simultanément sous les deux versions, en utilisant les extensions appropriées sous Joomla 1.5, qui sont compatibles avec les nouvelles fonctionnalités de Joomla 1.6 afin que, lorsque la version stable de Joomla 1.6 sortira, être compatible à une totale migration en terme de référencement naturel. COGNIX Systems Conseil, conception et développement d'applications évoluées pour les systèmes d'informations Internet/intranet/extranet. Alliant les COGNIX compétences Systems d'une SSII et d'une Web Agency, Cognix Systems conçoit des applicatifs portails web àd'applications l'ergonomie travaillée évoluées pour Conseil, conception et detéveloppement et des sites Internet à forte valeur ajoutée. les systèmes d'informations Internet/intranet/extranet. Alliant les http://www.cognix-systems.com compétences d'une SSII et d'une Web Agency, Cognix Systems conçoit des applicatifs et portails web à l'ergonomie travaillée et des sites Internet à forte valeur ajoutée. WEB82 http://www.cognix-systems.com éation et hébergements Création Cr hébergements de de sites sites web web pour pour particuliers, particuliers, associations, associations, entreprises, e-commerce. Développement entierement aux normes WEB82 W3C (www.w3.org) de sites web de qualité, au graphisme soigné soigné etéemployant les dernieresde du web (PHP5, associations, MySQL5, Création Cr ation et hébergements hébergements detechnologies sites sites web web pour pour particuliers, particuliers, associations, Ajax, XHTML, CSS2). Développement entierement aux normes entreprises, e-commerce. http://www.web82.net W3C (www.w3.org) de sites web de qualité, au graphisme soigné soigné Rejoignez le Club .PRO et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2). Core-Techs http://www.web82.net plus de degestion renseignement : [email protected] Expert desPour solutions et de communication d'entreprise en Open Source, Core-Techs conçoit, integre, déploie et maintient des StoneldCore-Techs Inworldde Gestion de Contenu Web, de Gestion Documentaire, systemes Stoneld Inworld propose aux entreprises des solutions globale d’intègration d’Internet et des Univers destratégie Gestion de la Relation Clientet(CRM), d'ecommerce etconsacre de travail Virtuels dans leur développement. Au-delà de services, la société 30% de Expert desdesolutions de gestion deses communication d'entreprise ses ressources àollaboratif. des travaux de R&D sur le e-Commerce et le e-Learning dans les Mondes Virtuels. en Open Source, Core-Techs conçoit, integre, déploie et maintient des http://www. fr systemes de core-techs. Gestion de Contenu Web, de Gestion Documentaire, de Gestion de la Relation Client (CRM), d'ecommerce et de travail COGNIX Systems Conseil, conception et développement d’applications évoluées pour les systèmes d’informations Internet/ ollaboratif. intranet/extranet. Alliant les compétences d’une SSII et d’une Web Agency, Cognix Systems conçoit des http://www. core-techs. fr applicatifs et portails web à l’ergonomie travaillée et des sites Internet à forte valeur ajoutée. PoP Factory,SSII spécialisée Web. Développement de solutions http://www.cognix-systems.com POP FACTORY applicatives spécifi ques ; offre de solutions packagées : catalogue POP FACTORY numérique, e-commerce, livre/magazine numérique, envoi SMS. Anaska Formation Nous accompagnons nos clients tout au long de leur projet : audit, Anaska est le spécialiste des formations les technologies En partenariat avec MySQL PoP Factory,SSII spsur de solutions écialis ée Web. DOpenSource. éveloppement AB, Mandriva, Zend et d'autres acteurs de la communauté, Anaska vous propose un catalogue de plus conseil, développement, applicatives spécifi ques ; suivi offre et degestion. solutions packagées : catalogue de 50 formations dédiés aux technologies du Libre. http://www.popfactory.com / [email protected] numérique, e-commerce, livre/magazine numérique, envoi SMS. http://www.anaska.com Nous accompagnons nos clients tout au long de leur projet : audit, conseil, développement, suivi et gestion. Blue Note Systems http://www.popfactory.com / [email protected] Création et hébergements de sites web pour particuliers, associations, entreprises, e-commerce. Développement Sp entierement auxen normes (www.w3.org) sitesproposons web de qualité, graphisme écialistes CRMW3C Open Source, de nous uneauoffre soigné et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2). complète de prestations sur la solution SugarCRM. Notre valeur http://www.web82.net Blue Systems ajoutée Note réside dans une expertise réactive et une expérience des problématiques de GRC.Source, Nous vous aidons à tirer une le meilleur Spécialistes en CRMlaOpen nous proposons offre Core-Techs parti de votre solution CRM. complète de prestations sur la solution SugarCRM. Expert des solutions de gestion et de communication d’entreprise en Open Notre Source,valeur Core-Techs http://www.bluenote-systems. com conçoit, integre, déploieréside et maintient Gestion et de une Contenu Web, de des Gestion ajoutée dans des unesystemes expertisederéactive expérience WEB82 Documentaire, de Gestion de la Relation Client (CRM), d’ecommerce et de travail ollaboratif. problématiques de la GRC. Nous vous aidons à tirer le meilleur http://www.core-techs.fr parti de votre solution CRM. Intelligence Power http://www.bluenote-systems. com POP FACTORY Conseil, Expertises, Formations et Projets E-business centrés au tour PoP Factory,SSII spécialisée Web. Développement de solutions applicatives spéciques ; offre de du cœur de métier : la Business Power solutions packagées : catalogue numérique, e-commerce,Intelligence. livre/magazineIntelligence numérique, envoi SMS. vous Nous accompagnonsIntelligence nos clients tout long dePower leurinnovant.es projet : audit, conseil, développement, suivi et gestion. propose desausolutions pour aligner la technologie sur http://www.popfactory.com / [email protected] la stratégie de votreFormations entreprise. et Projets E-business centrés au tour Conseil, Expertises, http://www. intelligencepower. du cœur de métier : la Business com Intelligence. Intelligence Power vous Blue Notepropose Systems des solutions innovant.es pour aligner la technologie sur Spécialistes en CRM Open Source, nous proposons une offre complète de prestations sur la la stratégie de votre solution SugarCRM. Notre valeur ajoutéeentreprise. réside dans une expertise réactive et une expérience des problématiqueshttp://www. de la GRC. Nous vous aidons à tirer lecom meilleur parti de votre solution CRM. intelligencepower. http://www.bluenote-systems.com Web Alliance ISABELLE LUPI Spécialisée dans les domaines de la gestion documentaire, du traitement du langage naturel et du référencement. Travaille depuis plus de 10 ans dans ce dernier domaine et a créé, début 2007, b-find, sa propre société spécialisée dans le domaine du référencement. www.phpsolmag.org Vous souhaitez être en première page des moteurs de recherche ? Intelligence Power Rejoignez-nous, 100% des clients Web Alliance sont en 1ère page Conseil, Expertises, Formations et Projets E-business centrés au tour du cĞur de métier : la Business de Google. Web Alliance, société de conseil spécialisée dans le Web Alliance Intelligence. Intelligence Power vous propose des solutions innovantes pour aligner la technologie sur référencement internet, vous propose son moteurs expertisede(référencement, la stratégie de votre entreprise. Vous souhaitez être en première page des recherche ? http://www.intelligencepower.com liens sponsorisés, web-marketing). Rejoignez-nous, 100% des clients Web Alliance sont en 1ère page www. web-alliance. fr de Google. Web Alliance, société de conseil spécialisée dans le Web Alliance référencement internet, vous propose son expertise (référencement, Vous souhaitez être en première page des moteurs de recherche ? Rejoignez-nous, 100% des clients liensensponsorisés, web-marketing). Web Alliance sont 1ère page de Google. Web Alliance, société de conseil spécialisée dans le référencement internet, vous propose sonfrexpertise (référencement, liens sponsorisés, web-marketing). www. web-alliance. www.web-alliance.fr Club .PRO 45 Pour les débutants Manipuler une archive ZIP avec PHP L’extension ZIP pour PHP permet de manipuler des archives compressées au format ZIP. Il est possible d’obtenir des informations sur l’archive et son contenu, d’y ajouter ou supprimer des fichiers et répertoires et de créer de nouvelles archives. Cet article explique : Ce qu’il faut savoir : • Comment lire le contenu d'une archive ZIP. • Comment extraire son contenu. • Comment créer une archive ZIP. • Vous devez connaître les bases du langage PHP. L e format de fichier ZIP est un format d’archivage et de compression supporté par tous les systèmes d’exploitation. La spécification du format et son extension sont du domaine public. Une archive ZIP peut contenir un ou plusieurs fichiers. Savoir manipuler une archive ZIP est utile lorsqu’un grand nombre de données doit être envoyé à un script PHP, ou que le script génère plusieurs fichiers en sortie. Par exemple, dans le cas où il faudrait redimensionner un lot de 500 images par l’intermédiaire d’un script PHP, envoyer une archive contenant toutes les images évite d’exécuter 500 fois le script. De même après traitement, il est plus aisé de récupérer une archive comprenant toutes les données résultats que 500 fichiers. L’extension ZIP disponible par défaut depuis la version 5.3 de PHP permet de créer, modifier ou extraire une archive ZIP très facilement. Pour vérifier que votre version de PHP est capable de manipuler des archives ZIP, exécutez la fonction phpinfo(). Vous devez obtenir des tableaux zip et zlib comme dans la figure 1 pour être en mesure d’exécuter les listings de l’article. Pour les versions antérieures, reportez-vous à la partie Installation de la documentation officielle de PHP (http:// www.php.net/manual/en/zip.setup.php). Vous allez voir dans cet article toutes les étapes permettant de manipuler des archives ZIP. Dans un premier temps, vous apprendrez à ouvrir, fermer une archive et gérer les erreurs. Puis vous serez initiés à la récupération d’informations sur l’archive et son contenu. Enfin, 46 vous verrez comment extraire une archive, la modifier ou en créer une nouvelle. Étapes de manipulation Pour manipuler des archives ZIP, il est nécessaire de systématiquement effectuer plusieurs étapes : • • • • créer une instance de la classe ZipArchive, ouvrir ou créer une archive, effectuer les opérations : lecture, écriture, modification, fermer l’archive. Créer un objet ZipArchive PHP propose une classe ZipArchive. La première étape pour manipuler une archive ZIP consiste à créer une instance de cette classe : $archive = new ZipArchive(); Ouvrir une archive La méthode open de la classe ZipArchive permet d’ouvrir une archive ou d’en créer une. En premier argument, elle prend le chemin de l’archive à ouvrir (ou créer). Un second argument, optionnel, définit le mode d’ouverture. Le tableau 1 décrit les différents modes d’ouverture. La méthode open renvoie le booléen true en cas de succès de l’ouverture ou un code d’erreur en cas d’échec. $code = $archive->open($nom_archive, $mode); 9/2010 Extension ZIP pour PHP Figure 1. Information sur l’extension ZIP générée par phpinfo(). Lors de l’ouverture de chaque archive, il faut vérifier que l’opération s’est bien déroulée. Il est donc préférable de créer une fonction afin d’éviter de répéter le test dans chaque script de manipulation de fichiers ZIP. La fonction ouvrirArchive du Listing 1 effectue l’ouverture et gère les erreurs comme expliqué dans la soussection intitulée Gérer les erreurs. Fermer l’archive A la sortie d’un script, l’archive est automatiquement fermée. Cependant, en cas de problème (interdiction d’écriture, …) les opérations effectuées ne seront pas validées et aucun message d’erreur ne permettra de s’en rendre compte. Pour pallier cela, il est nécessaire d’utiliser la méthode close. Elle ne prend aucun paramètre et retourne true en cas de succès ou false en cas d’échec. $archive->close(); Afin de simplifier les listings, une fonction fermerArchive (Listing 1) réalise la fermeture et gère les erreurs éventuelles. Gérer les erreurs Pour chaque méthode utilisée, les erreurs ont été gérées au moyen d’exceptions. Par exemple, dans la fonction ouvrirArchive, s’il y a un problème, le résultat est un code d’erreur et l’exception suivante est lancée : throw new Exception(messageErreur($code)); // (1) La variable $code contient le booléen true en cas de succès ou un code d’erreur en cas d’échec d’ouverture. La classe ZipArchive définit des constantes d’erreur. Par exemple, si le fichier n’est pas une archive au format ZIP, la constante ZIPARCHIVE::ER_NOZIP est rewww.phpsolmag.org tournée et le message correspondant est renvoyé par la fonction messageErreur (Listing 1). Le traitement des erreurs des scripts principaux est géré par des blocs de type try et catch. Si une exception est levée à l’intérieur du bloc try, les instructions suivantes de ce bloc ne sont pas exécutées et PHP interprète le contenu du bloc catch. L’exemple suivant ouvre une archive et affiche le nombre de fichiers qu’elle contient. Si $fic_zip ne contient pas un nom de fichier au format ZIP, une exception est levée dans la fonction ouvrirArchive, l’instruction echo n’est pas exécutée et le message d’erreur est généré par la fonction die dans le catch. Le message fourni en paramètre lors de la levée d’exception (1) est obtenu dans le catch en utilisant la méthode getMessage de la classe Exception. try{ $archive = new ZipArchive(); ouvrirArchive($archive, $fic_zip); echo 'nombre de fichiers : ', $archive->numFiles; fermerArchive($archive); }catch(Exception $e){ die($e->getMessage()); } Informations sur l’archive La classe ZipArchive fournit des propriétés donnant des informations sur l’archive. Par exemple, la propriété filename indique le nom de l’archive et numFiles le nombre de fichiers qu’elle contient. Ces deux propriétés sont utilisées dans la fonction afficherInformations du Listing 1. echo $archive->filename; 47 Pour les débutants Listing 1. fonction_archive.php <?php /** * Retourne le message d'erreur correspondant au code. * @param $err _ code code d'erreur ZIP * @return message d'erreur */ function messageErreur($err _ code){ $message = null; switch ($err _ code){ case ZIPARCHIVE::ER _ EXISTS : $message = 'le fichier existe deja'; break; case ZIPARCHIVE::ER _ INCONS : $message = 'archive ZIP incoherente'; break; case ZIPARCHIVE::ER _ INVAL : $message = 'argument invalide'; break; case ZIPARCHIVE::ER _ MEMORY : $message = 'echec d\'allocation memoire'; break; case ZIPARCHIVE::ER _ OPEN : $message = 'erreur ouverture'; break; case ZIPARCHIVE::ER _ CLOSE : $message = 'erreur fermeture'; break; case ZIPARCHIVE::ER _ NOENT: $message = 'fichier inexistant'; break; case ZIPARCHIVE::ER _ NOZIP: $message = 'ce n\'est pas une archive ZIP'; break; case ZIPARCHIVE::ER _ READ : $message = 'erreur de lecture'; break; case ZIPARCHIVE::ER _ SEEK: $message = 'erreur de pointeur'; break; default: $message = 'autre message'; } return $message; } /** * Ouverture d'une archive ZIP. * @param $archive objet ZIPArchive * @param $nom _ archive chemin de l'archive zip * @param $mode mode d'ouverture de l'archive */ function ouvrirArchive($archive, $nom _ archive, $mode=null){ $code = $archive->open($nom _ archive, $mode); if ($code !== true){ throw new Exception(messageErreur($code)); } } /** * Fermeture d'une archive ZIP. * @param $archive objet ZIPArchive */ function fermerArchive($archive){ if (!$archive->close()){ $message = messageErreur(ZIPARCHIVE::ER _ CLOSE); // ajouter le message de statut $message .= '('. $archive>getStatusString().')'; throw new Exception($message); } } /** * Affiche le nom de l'archive et le nombre de fichiers. * @param $archive objet ZIPArchive */ function afficherInformations($archive){ echo 'L\'archive ', basename($archive->filename), ' contient ', $archive->numFiles, ' fichiers.'; } /** * Affiche la liste des fichiers et repertoires contenus dans l'archive. * @param $archive objet ZIPArchive */ function afficherContenu($archive){ for ($i=0; $i < $archive->numFiles; $i++) { $info = $archive->statIndex($i); if (!is _ array($info)){ throw new Exception('erreur lecture index '.$i); } 48 $info['mtime']); $info['name']; octets)'; } } $date _ entree = date('d/m/Y H:i:s', echo "\n", $date _ entree, ' - ', if ($info['size'] > 0){ echo ' (', $info['size'], ' } /** * Extrait le contenu de l'archive dans le repertoire de destination. * @param $archive objet ZIPArchive * @param $destination chemin oů le contenu de l'archive sera extrait */ function extraireArchive($archive, $destination){ } if (! $archive->extractTo($destination)){ throw new Exception('echec extraction'); } /** * Ajouter un fichier dans l'archive. * @param $archive objet ZIPArchive * @param $chemin _ fichier chemin du fichier a ajouter a l'archive * @param $nom _ local nom du fichier dans l'archive */ function ajouterFichier($archive, $chemin _ fichier, $nom _ local=null){ if (! $archive->addFile($chemin _ fichier, $nom _ local)){ throw new Exception("impossible d'ajouter $chemin _ fichier"); } } /** * Ajouter un repetoire vide dans l'archive. * @param $archive objet ZIPArchive * @param $repertoire nom du repertoire a creer */ function ajouterRepertoire($archive, $nom _ repertoire){ if (! $archive->addEmptyDir($nom _ repertoire)){ throw new Exception('echec ajout du repertoire'); } } /** * Supprimer une entree de l'archive a partir de son indice. * @param $archive objet ZIPArchive * @param $indice numero de l'entree a supprimer */ function supprimerEntree($archive, $indice){ if (! $archive->deleteIndex($indice)){ throw new Exception("suppression de l'entree $indice impossible"); } } ?> Listing 2. lire_archive.php <?php header('Content-type:text/plain'); require 'fonctions _ archive.php'; try{ // ouvrir l'archive $archive = new ZipArchive(); ouvrirArchive($archive, 'Archive.zip'); // afficher les informations afficherInformations($archive); // afficher le contenu de l'archive afficherContenu($archive); // fermer l'archive fermerArchive($archive); }catch (Exception $e){ die("\n\nERREUR : ".$e->getMessage()); } ?> 9/2010 Extension ZIP pour PHP Lister le contenu d’une archive La méthode statIndex donne des informations sur une entrée de l’archive définie par son indice au sein de l’archive. Elle prend en argument cet indice et retourne false en cas d’échec ou un tableau associatif contenant des informations sur l’entrée (par exemple : mtime, name ou size). Les instructions suivantes affichent le tableau pour la première entrée de l’archive et son nom : $info = $archive->statIndex(0); print_r($info); echo 'Nom : ', $info['name']; La fonction afficherContenu (Listing 1) donne un exemple d’utilisation : pour chaque entrée de l’archive, elle affiche sa date de dernière modification, son nom et sa taille (en octets). Extraire une archive La méthode extractTo de la classe ZipArchive extrait le contenu de l’archive ouverte précédemment à l’emplacement passé en argument. L’instruction suivante décompresse l’archive dans le répertoire du script exécuté (le caractère point ‘.’ représente le répertoire courant) : $archive->extractTo('.'); Si le chemin de destination ne bénéficie pas des droits en écriture, la méthode ne pourra pas réaliser l’extraction et retournera false. Le Listing 3 donne un exemple d’extraction. Après avoir instancié l’objet ZipArchive, le fichier ZIP nommé Archive.zip est extrait dans le répertoire courant. Le script utilise les fonctions du Listing 1. La fonction extraireArchive extrait les données et gère les erreurs. Si le répertoire n’est pas accessible en écriture, une exception est levée, sinon l’archive est fermée. Modifier une archive Dans une archive, il est possible d’ajouter un fichier, un répertoire, ou de supprimer des données dès lors que l’archive est accessible en écriture. En cas d’erreur, ces méthodes de modification d’archive retournent false. Ajouter un fichier La méthode addFile de la classe ZipArchive ajoute un fichier à l’archive. Le chemin du fichier est passé en premier argument, le fichier peut être renommé et/ou rangé dans un sous- répertoire par un second argument (optionnel). $archive->addFile($chemin_fichier, $nom_local); Pour ajouter un fichier à une archive, il faut avoir les droits d’écriture au niveau de l’archive et que le fichier existe. En cas d’erreur lors de l’ajout du fichier (droit d’écriture, fichier inexistant), l’exception est levée lors www.phpsolmag.org Listing 3. extraire_archive.php <?php header('Content-type:text/plain'); require 'fonctions _ archive.php'; try{ // ouvrir l'archive $archive = new ZipArchive(); ouvrirArchive($archive, 'Archive.zip'); // extraire l'archive dans le repertoire courant extraireArchive($archive, '.'); // fermer l'archive fermerArchive($archive); // message succes echo 'archive extraite'; }catch (Exception $e){ die("\n\nERREUR : ".$e->getMessage()); } ?> Listing 4. modifier_archive.php <?php header('Content-type:text/plain'); require 'fonctions _ archive.php'; try{ // ouvrir l'archive $archive = new ZipArchive(); ouvrirArchive($archive, 'Archive.zip'); // ajouter un fichier (remplace le fichier s'il existait deja) ajouterFichier($archive, 'info.txt', 'readme. txt'); // ajouter un repertoire et un fichier dans ce repertoire ajouterRepertoire($archive, 'tests'); ajouterFichier($archive, 'tests.txt', 'tests/ tests.txt'); // supprimer la 1ere entree de l'archive supprimerEntree($archive, 0); // fermer l'archive fermerArchive($archive); // message succes echo 'modifications effectuees'; }catch (Exception $e){ die("\n\nERREUR : ".$e->getMessage()); } ?> Listing 5. creer_archive.php <?php header('Content-type:text/plain'); require 'fonctions _ archive.php'; try{ // ouvrir l'archive $archive = new ZipArchive(); // cree ou ecrase l'archive ouvrirArchive($archive, 'new _ archive.zip', ZIPARCHIVE::OVERWRITE); // ajouter des fichiers a l'archive ajouterFichier($archive, 'tests.txt'); ajouterFichier($archive, 'info.txt'); ajouterRepertoire($archive, 'tests'); ajouterFichier($archive, 'tests.txt', 'tests/ tests.txt'); // fermer l'archive fermerArchive($archive); // message succes echo "\nsucces creation"; }catch (Exception $e){ die("\n\nERREUR : ".$e->getMessage()); } ?> de la fermeture de l’archive. La méthode getStatusString utilisée dans la fonction fermerArchive (Listing 1) permet d’afficher un message quant au type d’erreur. 49 Pour les débutants Tableau 1. Différents modes d’ouverture Mode Description ZIPARCHIVE::CREATE Crée l’archive si elle n’existe pas ZIPARCHIVE::OVERWRITE Crée une nouvelle archive, écrase le fichier s’il existe déjà ZIPARCHIVE::EXCL Erreur si l’archive existe déjà ZIPARCHIVE::CHECKCONS Vérifie la cohérence de l’archive (erreur en cas d’échec) Tableau 2. Différentes méthodes utilisées dans les listings Méthode Description addEmptyDir Ajoute un dossier vide dans l’archive Zip addFile Ajoute un fichier à une archive ZIP depuis le chemin fourni close Ferme une archive ouverte ou nouvellement créée et sauvegarde les modifications deleteIndex Efface une entrée de l’archive en utilisant son index deleteName Efface une entrée dans l’archive en utilisant son nom extractTo Extrait l’archive complète ou les fichiers fournis vers un chemin spécifié open Ouvre une nouvelle archive ZIP pour lecture, écriture et modification statIndex Donne des informations sur l’entrée spécifiée en paramètre Ajouter un répertoire La méthode addEmptyDir ajoute un répertoire vide dans l’archive. Elle prend en paramètre un nom de répertoire. $archive->addEmptyDir($nom_repertoire); Il est impossible d’ajouter deux répertoires de même nom. Supprimer un fichier Les méthodes deleteIndex et deleteName suppriment un fichier de l’archive respectivement à partir de son indice ou de son nom. $archive->deleteIndex($indice); Il est nécessaire d’avoir les droits en écriture sur l’archive pour pouvoir supprimer une entrée. Le nom ou l’indice indiqué doivent correspondre à un des fichiers de l’archive. Le Listing 4 donne un exemple de modification. Après avoir instancié la classe ZipArchive et ouvert l’archive, un répertoire y est créé, deux fichiers sont ajoutés dans l’archive dont un dans le nouveau répertoire. Enfin, l’entrée placée en premier est supprimée de l’archive. Créer une archive Pour créer une archive, la méthode open est utilisée pour laquelle on spécifie un mode d’ouverture du ta- Sur Internet • 50 http://fr.php.net/manual/fr/book.zip.php – Description de l’extension ZIP dans le manuel officiel de PHP. bleau 1. Ensuite il faut modifier le contenu de l’archive (ajout de fichiers et/ou de répertoires) et fermer l’archive. Il est nécessaire d’avoir tous les droits en écriture et que les fichiers existent pour que l’archive soit créée. Le Listing 5 donne un exemple d’une création d’archive en mode OVERWRITE où un répertoire est créé et trois fichiers sont ajoutés, dont un dans le nouveau répertoire. Conclusion Vous savez maintenant ouvrir et fermer des archives, gérer des erreurs et afficher des informations sur vos archives et leur contenu. Vous êtes capable d’extraire des archives, de les modifier et d’en créer. Ceci vous permettra de créer des scripts de traitement de grands jeux de données téléchargés à partir d’une archive unique envoyée par le biais d’un formulaire HTML. En sortie, vous pourrez proposer une archive contenant tous les fichiers générés par un de vos scripts. CILIA MAURO MAGALI CONTENSIN Cilia Mauro est gestionnaire de bases de données et développeur d’applications web au CNRS. Elle enseigne les bases de données et PHP à l’Université. Contact : [email protected] Magali Contensin est chef de projet en développement d’applications au CNRS. Elle enseigne depuis plus de dix ans le développement d’applications web à l’Université et est l’auteur de nombreux articles sur le développement web en PHP. Contact : http://magali.contensin.online.fr 9/2010 Extension ZIP pour PHP www.phpsolmag.org 51 Extension ZIP pour PHP 52 9/2010