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
StoneldCore-Techs
Inworldde Gestion de Contenu Web, de Gestion Documentaire,
systemes
Stoneld 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éciques ; 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