Вы находитесь на странице: 1из 48

 5/2009

 10/2010
Table des matières

www.phpsolmag.org 
11/2010

Le périodique phpsolutions est publié par


Table des matières
Software Press Sp. z o.o. SK
Bokserska 1, 02-682 Varsovie, Pologne
Tél. 0975180358, Fax. +48 22 244 24 59

VARIA
www.phpsolmag.org

Président de Software Press Sp. z o.o. SK : 6 Actualités


Paweł Marciniak Actualités du monde du développement.
Christophe Villeneuve
Directrice de la publication :
Ewa Łozowicka
46 Interview de Félix Chassagne
Dépôt légal :
Interview de Félix Chassagne, responsable de
à parution l’hébergement eziHost.
ISSN : 1731-4593

Rédacteur en chef :
Łukasz Bartoszewicz
OUTILS
8 Accéder aux API GOOGLE en PHP
Isabelle Lupi
Couverture : Pour les besoins de son application web (site, blog, por-
Sławomir Sobczyk
tail…), il est parfois nécessaire d’accéder aux ressour-
DTP : ces stockées sur un service Google tel que YouTube,
Sławomir Sobczyk Studio2W@gmail.com
Picassa, Blogger, Documents, … Pour répondre à ce
Composition : besoin, Google offre un certain nombre d’API afin d’ex-
Sławomir Sobczyk ploiter ses services et d’intégrer les résultats à d’autres
applications. Vous verrez quels sont les services Goo-
Correction : gle qui sont accessibles par les API en PHP.
Valérie Viel, Thierry Borel, Barbara Bourdelles

PROJETS
Bêta-testeurs :
Brice Favre, Valérie Viel, Cyril David,
Christophe Milhau, Alain Ribault, Stéphane Guedon,
Eric Boulet, Mickael Puyfages, Christian Hernoux, 12 Développer un centre d’appel avec
Isabelle Lupi, Antoine Beluze, Timotée Neullas,
Yann Faure, Adrien Mogenet, Jean-François Montgaillard,
Asterisk et vtigerCRM
Turmeau Nicolas, Jonathan Marois, Wilfried Ceron, Randriamifidy Bezama Marolahy
Wajih Letaief, François Van de Weerdt, Eric Vincent, Dans ce premier article de notre série, nous allons
Franck Michaël Assi, Francis Hulin-Hubard,
Nicolas Dumas, David Michaud. parler principalement d’Asterisk. Asterisk est un PBX
(Private Branch eXchange ou autocommutateur télé-
Les personnes intéressées par la coopération phonique Privé) Open Source destiné aux entrepri-
sont priées de nous contacter : ses et vtigerCRM est l’un des meilleurs CRM (Custo-
editor@phpsolmag.org
mer Relationship Management ou Gestion de relation
client), en Open Source. Ils sont utilisés par de nom-
Publicité :
publicite@software.com.pl breux projets Open Source pour les centres d’appel
comme ELASTIX.
Pour créer les diagrammes on a utilisé le programme

DOSSIER
17 Web sur iPhone
Jean Tatareau
AVERTISSEMENT Dans cet article, nous verrons pourquoi
Les techniques présentées dans les articles
ne peuvent être utilisées qu’au sein des réseaux et comment aborder le développement
internes. La rédaction du magazine n’est pas sur smartphone et en particulier sur iPhone.
responsable de l’utilisation incorrecte des techniques
présentées. L’utilisation des techniques présentées peut Nous évoquerons les contraintes et les oppor-
provoquer la perte des données ! tunités qu’offre ce développement spécifique.

 11/2010
Table des matières

24 La sécurité des smartphones


Tony Fachaux
POUR LES DÉBUTANTS
Les smartphones sont aujourd’hui en train d’envahir la 40 SQL : langage de manipulation
planète. En effet, depuis l’arrivée de smartphones très des données
évolués tels que l’iPhone d’Apple ou encore le Black- Cilia Mauro, Magali Contensin
berry de RIM, de plus en plus de monde en est équipé. Les bases de données sont très utilisées dans les
applications Web. La création, l’interrogation et la

PRATIQUE
manipulation des données de la base sont réalisées
en SQL. Dans cette série d’articles vous apprendrez
26 Internationaliser une application CakePHP le langage SQL ainsi que les bases nécessaires pour
Pierre Martin communiquer avec une base de données à partir
L’internationalisation d’une application ou d’un site web d’un script PHP.
consiste à fournir un contenu dans différentes langues
en permettant à l’utilisateur de changer de langue sim-
plement, mais aussi d’améliorer son référencement lo-
cal afin de toucher plus de visiteurs. Cela implique bien
souvent une gestion différente des données dynamiques
en base de données, ainsi que l’externationalisation des
chaînes de caractère contenues dans l’application.

FICHE TECHNIQUE
34 Introduction à l’industrialisation de PHP
William Durand
PHP est un langage de programmation largement ré-
pandu, probablement le plus utilisé en programmation
web. Ce que bon nombre de développeurs PHP ne
savent pas, c’est qu’il dispose d’une pano-
plie d’outils permettant une utilisa-
tion confortable de celui-ci en
situation professionnelle.
Cet article présente un
cycle incrémental
d’industrialisa-
tion possible.
Actualités

[PHP-DEV] PHP 5.4 alpha


La prochaine version de PHP 5.4 en
L’AFUP propulse le Forum PHP
version alpha est en cours de libéra-
tion. Elle va apporter un certain nom- au sommet
bre de correctifs et de nettoyages du L’année 2010 est l’année de tous les records pour le Forum PHP 2010. Tout
code. En plus, de nombreuses amélio- d’abord, l’évènement fut marqué par les 15 ans du langage PHP et les 10
rations et de nouvelles fonctionnalités ans de l’association. Ensuite avec la venue de plus de 500 visiteurs par jour
seront incluses comme l’amélioration
de performance, la gestion de la mé- (soit 35 % en plus qu’en 2009).
moire avec APC, l’ajout d’annotation Pour l’édition de cette année, les organisateurs ont proposé un programme
(Un nouveau mécanisme horizontal très varié avec plus de 40 conférences, permettant de couvrir un maximum
pour réutiliser du code).
de sujets et de parler aussi des briques logicielles comme :
http://www.php.net
• Les frameworks (Zend, Symfony, CakePHP).
Zend Framework 1.11 • Les CMS (Drupal, Magix CMS).
La nouvelle version du framework 1.11
vient de sortir. Elle apporte plusieurs
• Le E-commerce (Prestashop, Magento).
nouveautés importantes comme le • Les bases de données (MariaDB, No-SQL).
soutien pour les téléphones mobiles • ERP/CRM (Dolibarr...).
et SimpleCloud API. Bien sur cette • Les Performances.
version est maintenant compatible
avec Doko, simpleDB, eBay et avec • Etc.
MariaDB.
http://www.zend.com/fr/company/ En plus de ces thèmes traités, de nombreuses sociétés ont apporté leurs
news/press/la-nouvelle-version-du- retours d'expériences et de témoignages dans différentes conférences, tels
zend-framework-fournit-la-portabilit-
dans-le-cloud-et-le-d-veloppement-d- que Canal Plus, Orange.
applications-mobiles Ensuite, les projets Open Source PHP étaient aussi de la fête pour la
deuxième année consécutive, permettant ainsi de présenter en détails
CMS Award 2010
La remise des prix aux CMS Awards leurs avancements dans la demi-journée qui leur était consacrée.
Open Source a récompensé Word- Par ailleurs, des personnalités de la scène PHP ont effectué le déplacement
press, suivi de Drupal et Joomla dans comme Rasmus Lerdof, Zeev Suraski, Derick Rethans, Ilia Alshanetsky....
la catégorie des plus populaires. Les
autres catégories ont récompensées Mais aussi les personnalités de SkySQL/MariaDB : Rasmus Johansson de
pour le CMS Open Source :’CMS Made’, Monty Program et Kaj Arnö de SkySQL Ab.
le CMS prometteur : ‘Pimcore’, Open Bien entendu, la mascotte de l'éléPHPant PHP était aussi présente avec
Source E-commerce : ‘Prestashop’ une version gonflable, complétant ainsi les versions peluches.
http://www.packtpub.com/open-sour-
ce-awards-home. Enfin, l'AFUP donne rendez-vous à l'année prochaine pour la prochaine
édition.
Crowdin http://www.afup.org/forumphp
Crowdin est une application gratuite,
réalisée en PHP qui va vous aider dans
la réalisation de vos sites web interna-
tionauxs. Cet API vous permet de tra-
duire plus facilement le contenu d’une
OpenTok
OpenTok est un projet open source qui va vous permettre de communiquer
page internet que vous souhaitez pro-
poser aux internautes en multi-langue. avec d’autres personnes à travers votre site web par le système vidéo.
Différents protocoles sont disponibles Cette application se présente so-
(jSON, XML). us la forme d’une librairie javascript
http://www.crowdin.net/
et peut s’utiliser avec différents lan-
PHP excel extension 0.9 gages : PHP, Java, Ruby, Python par
PHP Excel est une librairie en PHP per- l’intermédiaire d’une interface REST.
mettant de générer des fichiers Excel.
Elle est très légère et très rapide. Cel- Pour utiliser cette librairie, il est nécessaire d’obtenir une clef gratuite (dispo-
le-ci est compatible à partir de Office nible sur le site officiel). Ensuite vous pourrez paramétrer et configurer su-
2003 et plus et fonctionne sur tous les ivant vos envies l’affichage. Du coté du serveur la bibliothèque OpenTok
systèmes d’exploitations. fournit une application avec une interface HTTP pour que les développeurs
https://github.com/iliaal/php_excel/
puissent utiliser le système de conversation vidéo.
PHPcollab 2.5 Par ailleurs, le site propose des tutoriaux pour vous faciliter l’utilisation de
PHPcollab est une application PHP sa librairie.
et  est un outil de gestion de site web.
Il gère un ensemble d’outils nécessai- http://www.tokbox.com/
res pour amener à bien votre projet
comme la gestion des tâches, de ti- Rédaction des actualités :
ckets, de composants, de fichiers...
http://www.php-collab.com
Christophe Villeneuve

 11/2010
<<TOP>>

<<SHORT_NEWS>>
<<BODY>>
KERNEL

GNU/Linux Magazine N°132


7

www.phpsolmag.org 
Outils

Accéder
aux API GOOGLE en PHP
Pour les besoins de son application web (site, blog, portail…),
il est parfois nécessaire d’accéder aux ressources stockées
sur un service Google tel que Youtube, Picassa, Blogger,
Documents, … Pour répondre à ce besoin, Google offre
un certain nombre d’API afin d’exploiter ses services
et d’intégrer les résultats à d’autres applications.

Cet article explique : Ce qu’il faut savoir :


• Quels sont les services Google qui sont accessibles par les API • Le langage PHP.
en PHP supportant le protocole de données Google Data Pro- • Savoir utiliser Zend Framework.
tocol, et quelle est leur logique commune de programmation.

our les besoins de son application web (site,

P
Protocol se trouve à l’url http://code.google.com/intl/fr/
blog, portail…), il est parfois nécessaire d’ac- apis/gdata/docs/directory.html). En voici quelques uns.
céder aux ressources stockées sur un service
Google tel que Youtube, Picassa, Blogger. Documents, Google Blogger
… Pour répondre à ce besoin, Google offre un certain Google Blogger (http://www.blogger.com) est une pla-
nombre d’APIs afin d’exploiter ses services et d’intégrer teforme complète de publication de blogs. L’API Blog-
les résultats à d’autres applications. ger Data (http://code.blogger.com) permet d’interroger,
Certaines de ces APIs s’appuient sur le protocole de de visualiser et mettre à jour le contenu du blog via une
données Google Data Protocol (http://code.google.com/ application cliente autre.
intl/fr/apis/gdata). Celui-ci est largement inspiré de l’ar-
chitecture REST, conçue pour manipuler les données Youtube
sur internet. Il supporte actuellement AtomPub et JSON Accessible à l’adresse http://youtube.com, Youtube est
pour représenter et véhiculer les informations. Comme une plateforme de partage de vidéos et offre en outre
tout protocole de données, Google Data Protocol s’in- toute une panoplie de fonctionnalités pour commen-
terface avec divers langages du Web, tels que Java, ter et annoter les vidéos. L’API YouTube Data (http://
.NET, Perl, Python ou PHP. C’est à travers ce dernier code.google.com/intl/fr/apis/youtube) permet de créer,
langage que nous allons découvrir quelques fonction-
nalités.

Présentation des Services et API


Il est nécessaire tout d’abord, de s’inscrire sur le service
souhaité avec son adresse e-mail. Sachant par ailleurs
que l’adresse email est le point d’entrée incontournable
pour piloter et gérer les services Google, il est important
de bien utiliser son ou ses adresses emails pour regrou-
per ou dissocier les services. En effet, il sera difficile
ultérieurement de migrer ou de fusionner les services
avec des adresses emails différentes.
La liste complète des services Google qu’il est pos-
sible de piloter en PHP avec le protocole Google Data Figure 1. Portail du l’api Blogger Data

 11/2010
API GOOGLE

modifier, visualiser et gérer les vidéos via sa propre


application.

Picasa
Picasa (http://picasaweb.google.com) est une platefor-
me de partage d’albums d’images et de photos. L’API
Picasa Web Albums Data (http://code.google.com/intl/
fr/apis/picasaweb) autorise la gestion des albums, des
images et des photos.

Google Books Search


Google Books (http:// books.google.com) permet de re-
chercher spécifiquement dans le contenu des livres mis à
disposition. La recherche s’effectue sur tout le contenu de
l’ouvrage lorsqu’il s’agit d’un livre dans le domaine public,
Figure 2. Portail du l’api YouTube Data
mis à disposition gratuitement ou dans le cadre d’une li- Figure 2. Portail du l’api YouTube Data
cence créative common... Pour les ouvrages commercia-
lisés, le contenu partiel ou choisi en partenariat avec l’édi-
teur sera accessible. Google Books autorise également la
création et le partage de bibliothèques de documents, ainsi
que de rechercher la disponibilité d’un ouvrage à un endroit
localisé (bibliothèque physique ou librairie par exemple).
Toutes ces actions sont réalisables à partir d’une ap-
plication avec l’API Google Books Search (http://code.
google.com/intl/fr/apis/books/).

Google Calendar
Google Calendar (http://www.google.com/calendar)
permet de mettre en ligne et de partager son agenda,
où un agenda événementiel. L’API Calendar Data API
(http://code.google.com/intl/fr/apis/calendar) autorise
toute la gestion et la visualisation de votre agenda dans
Figure 3. Portail du l’api Picassa Web Album Data
votre application. Figure 3. Portail du l’api Picassa Web Album Data

Google Documents
Google Documents (http://docs.
google.com) autorise la mise en li-
gne et le partage de documents. Il
est possible de partager ces docu-
ments avec tout le monde ou de
spécifier les emails autorisés. Il
est également possible d’autoriser
spécifiquement et individuellement
soit la visualisation, soit la modifi-
cation du document. Par ailleurs,
les documents peuvent être parta-
gés soit avec leur format natif, soit
en tant que pièce attachée.
L’API Google Documents List
(http://code.google.com/intl/fr/
apis/documents) s’interface avec
ce service et permet de créer,
partager, uploader et modifier les
documents. Lorsqu’il s’agit plus
spécifiquement de feuilles de
Figure 4. Portail du l’api Google Book Search
calcul, l’API Google Spreadsheets Figure 4. Portail du l’api Google Book Search

www.phpsolmag.org 
Outils

Installer la librairie
Pré-requis indispensable et commun à toutes les apis, il
faut télécharger la librairie à l’adresse http://framework.
zend.com/download/gdata. Dans le code PHP, il faudra
donc mettre dans l’entête pour charger la librairie :

require _ once 'Zend/Loader.php';

Puis, il faut choisir et charger les classes nécessaires


au déroulement de son application. Ainsi, pour tous les
services, il faut charger :

Zend _ Loader::loadClass('Zend _ Gdata');


Zend _ Loader::loadClass('Zend _ Gdata _ Query');
Zend _ Loader::loadClass('Zend _ Gdata _ ClientLogin');

Figure 5. Portail du l’api Google Calendar


Figure 5. Portail du l’api Google Calendar Si le service nécessite une authentification supplémen-
taire, il faut charger la classe Zend_Gdata_AuthSub par
Listing 1. la même commande :
$titre = 'titre de mon billet' ;
$contenu = 'contenu de mon billet' ; Zend _ Loader::loadClass('Zend _ Gdata _ AuthSub') ;
$url = 'http://www.blogger.com/feeds/' . $blogID . '/
posts/default';
Et pour chaque service particulier, il faut charger la clas-
$mon-billet = $mon-blog->newEntry(); se spécifique. Ainsi, par exemple, pour le service Pi-
$mon-billet->title = $mon-blog->newTitle($titre);
$mon-billet->content = $mon-blog- casa, il faut charger la classe Zend_Gdata_Photos par
>newContent($contenu); l’intermédiaire de :
$mon-billet->content->setType('text');
$mon-billet-dans-blog = $mon-blog->insertEntry($mon-
billet, $url); Zend _ Loader::loadClass('Zend _ Gdata _ Photos');
Et pour Picasa, ce sera de la manière suivante :
S’authentifier
$titre = ' titre du nouvel album' ;
$contenu = ' description du nouvel album' ; Il faut utiliser le compte google utilisé pour créer et gérer
$google-client = new Zend _ Gdata _ Photos($client,
le service souhaité. Ainsi, par exemple, pour le service
"Google-DevelopersGuide-1.0"); GoogleBlogger, le code sera le suivant :
$album = new Zend _ Gdata _ Photos _ AlbumEntry();
$album->setTitle($google-client->newTitle($titre));
$album->setSummary($google-client- $nom = 'nom-compte-google@fournisseur.com';
>newSummary($contenu));
$pwd = 'mot-de-passe';
$nouvel-album = $ google-client->insertAlbumEntry($
album); $service = 'blogger';

$client = Zend _ Gdata _ ClientLogin::getHttpClient($nom,


(http://code.google.com/intl/fr/apis/spreadsheets) peut $pwd, $service, null,
être très intéressante. Zend _ Gdata _ ClientLogin::DEFAULT _ SOURCE,
null, null,
Principe de fonctionnement général Zend _ Gdata _ ClientLogin::CLIENTLOGIN _ URI,
Comme nous l’avons vu ci-dessus, les services offrent 'GOOGLE');
tous des fonctionnalités, d’authentification, de création $mon-blog = new Zend _ Gdata($client);
de recherche et de visualisation. Ces fonctionnalités
sont spécifiques ensuite à un contenu mais ont le mê- Création de contenu
me schéma de fonctionnement. Il est donc logique que Le formatage des informations dépend du service vi-
les apis qui s’appuient sur ce protocole Google Dat sé. Ainsi, par exemple, pour le service GoogleBlog-
Protocol s’interfacent naturellement avec la même li- ger, le code pour intégrer un billet est présenté dans
brairie. le Listing 1.
En PHP, ce socle commun est proposé par Google
par l’intermédiaire de l’environnement Zend Framework. Interrogation
Cet environnement fournira, après installation, les fonc- Pour interroger le service, la classe Zend_Gdata_Query
tions transversales d’authentification, de création, de peut être utilisée simplement ou prendre les paramè-
recherche et de visualisation. tres particuliers de ce service. Ainsi, par exemple, pour

10 11/2010
API GOOGLE

Figure
Figure 6. Portail
6. Portail des Documents
des api Google api Google Documents

récupérer l’ensemble des billets de son compte sur Conclusion


Google Blogger, la requête aura la forme suivante : Les services Google sont complètement pilotables
à l’aide des APIs, quel que soit le langage utilisé. En
$quest=new Zend _ Gdata _ Query('http://www.blogger.com/ outre, si l’API n’existe pas dans le langage souhaité,
feeds/default/blogs'); il est toujours possible de la développer et de la pro-
$resultats = $gdClient->getFeed($quest); poser ensuite à Google. C’est un concept assez inté-
ressant dans la mesure où il permet de s’affranchir des
Pour Picassa, ce sera : contraintes de programmation multiple et de tout piloter
à partir d’un seul langage.
$quest = $google-client->newAlbumQuery();
$quest->setUser("default");
$quest->setAlbumName("album à rechercher");
$resultats = $ google-client->getAlbumFeed($quest);

Affichage de résultats
Les résultats de même nature peuvent ainsi être af-
fichés au sein d’un même type de boucle. Ainsi, par
exemple, pour les deux services interrogés ci-dessus,
la boucle d’affichage sera la suivante : Isabelle Lupi
Spécialisée dans les domaines de la gestion documentaire, du tra-
foreach($resultats->entries as $document) { itement du langage naturel et du référencement. Travaille depuis
print $document->title . "\n"; 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 11
Projets

Développer
un centre d’appel avec Asterisk
et vtigerCRM
Asterisk est un PBX (Private Branch eXchange
ou autocommutateur téléphonique Privé) open source destiné
aux entreprises et vtigerCRM est l’un des meilleurs CRM
(Customer Relationship Management ou Gestion de relation
client), en Open Source. Ils sont utilisés par de nombreux projets
Open Source pour les centres d’appel comme ELASTIX.

Cet article explique : Ce qu’il faut savoir :


• Le fonctionnement du système de téléphonie Asterisk. • Vous devez connaître les bases du langage PHP,
• Le fonctionnement du CRM vtigerCRM. l'extension socket de PHP, l'extension CURL de PHP, du
• Comment installer et configurer Asterisk. bash, des notions sur les protocoles SIP, UDP, TCP et les
• Comment créer un dialplan Asterisk. entrées sorties standard de LINUX.
• Comment interfacer Asterisk avec le langage PHP.

D
ans ce premier article de notre série, nous al- occasionnels et la conversion entre les formats, codecs
lons parler principalement d’Asterisk. En pre- et protocoles.
mier lieu, Asterisk est un système de téléphonie Les canaux traitent toutes les entrées/sortie pour
pour les entreprises. C’est un logiciel libre permettant voix,vidéo, texte. Chaque canal représente une tech-
la mise en place d’un autocommutateur logiciel. Créé nologie ou un protocole spécifique c’est à dire SIP, IAX
à l’origine par Mark Spencer de Digium et qui suppor- ou autre protocole, chacun de ces protocoles se trou-
te plusieurs plateformes (Linux, Windows, BSD, …). ve dans son propre module chan_sip.so, chan_iax.so
Asterisk supporte la majorité des protocoles (SIP, etc,
IAX, H.323, SCCOP,...) et supporte aussi la majorité Le module Fonctions et Application sert l’exécution
des codecs audio et vidéo (G711, G723, G726, Speek, d’unités fonctionnelles dans le système par exemple
GSM,etc …). Avec Asterisk on peut faire plusieurs types les VoiceMail, Lecture des fichier enregistrés ou la
d’applications.
Au cours de cette article, nous verrons :

• comment identifier les composants majeurs et la


structure d'Asterisk,
• comment reconnaître l’utilisateur principal et les in-
terfaces de programmation d’Asterisk,
• comment installer Asterisk sous Linux et compren-
dre la méthode de configuration d'Asterisk.

Le core représente le cœur d’Asterisk. Il traite plutôt


les fonctionnalités principales : le Modules dynamique
de chargement, la lecture du système de configura-
tion, l’exécution des applications, les traitements des
requêtes du dialplan (ou Plan de numérotation, c’est la
fonction attribuant une direction à un appel en fonction
de paramètres liés à la communication et son environ-
nement : numéro composé etc,) , la création de canaux Figure 1. Image liste fichier configuration

12 11/2010
Asterisk

www.phpsolmag.org 13
Projets

chambre de conférence. Il télécharge de manière dy-


Listing 1. Installation des dépendances
namique par le core lors d’un appel dans le plan de nu-
mérotation. Mémorisé dans des modules à chargement apt-get -y install libglib-dev
apt-get -y install openssl
dynamique (app_voicemail.so, app_meetme.so), de apt-get -y install libncurses5
multiples applications peuvent être utilisées durant le apt-get -y install libncurses5-dev
apt-get -y install gcc
parcours d’un appel. Les applications sont synchro- apt-get -y install g++
nisées. Toutes les applications disposent d’une ligne apt-get -y install ntpdate
apt-get -y install libapache2-mod-php5
de commande. On peut utiliser des variables et lire des apt-get -y install mysql-server-5.0
variables. apt-get -y install mysql-client
apt-get -y install libmysqlclient15-dev
Les ressources sont similaires aux applications apt-get -y install zlib1g-dev
mais sont chargées par le core de manière statique. Il apt-get -y install mpg123
apt-get -y install automake
offre une fonctionnalité commune utilisée par de mul- aptitude -y install libssl-dev libnewt-dev
tiples applications comme la musique d’attente, les aptitude -y install libcurl3-dev
aptitude -y install libvorbis-dev
enregistrements d’appel, le parcage d’appel et inter- aptitude -y install libspeex-dev
ception d’appel ainsi que le rechargement de la con- aptitude -y install libiksemel-dev
aptitude -y install flex
figuration. aptitude -y install xsltproc
Les AGI (Asterisk Gateway Interface) constituent

aptitude -y install pciutils bc
apt-get -y install bison
une application de programmation de l’interface. Ce- apt-get -y install libssl-dev
la permet aux applications d’Asterisk d’être écrites en

apt-get -y install libreadline4-dev
apt-get -y install libeditline-dev
n’importe quel langage qui supporte les entrées et sor- apt-get -y install libedit-dev
ties standards. Il agit plutôt au niveau du contrôle du

apt-get -y install make
apt-get -y install subversion
plan de numérotation d’Asterisk. Il permet à Asterisk apt-get -y install libtool
d’être lié aux applications externes (base de données,

apt-get -y install libsmpeg-dev
apt-get -y install libnewt-dev
annuaire, web service). Il peut être écrit dans divers lan- apt-get -y install libavcodec-dev
gages comme le PHP, Perl, Python, Bash, JAVA.

apt-get -y install apt-file
aptitude -y install libtiff-dev libtiff-tools
Les différents composant d’Asterisk sont : gs autoconf automake
make uninstall
./configure --prefix=/usr
1. libpri – Interfaces PRI ISDN T1/E1/J1. make
2. dadhi – cartes analogique et digitale.
make install
ldconfig -v
3. asterisk – code source d'Asterisk. aptitude -y install libmysqlclient15-dev
libcurl3-dev
4. addons – plusieurs modules d'extension.
Listing 2. Commande pour installation d’Asterisk
Télécharger la dernière version des codes source Aste- cd directory
risk à partir du site http://www.asterisk.org/downloads. ./configure (pas demandé pour libpri)
Ces fichier sont au format compressé tar.gz make menuselect
make
Vous aurez besoin des packages suivants : make install

Listing 3. Configuration SIP


Asterisk 1.6.2,
Add-Ons 1.6.2.2, [1002]
type = friend ; nom du compte
DAHDI Complete, host = dynamic ;le téléphone devra s’enregistrer
LibPRI 1.4.11.4, context = users ; il va utiliser la contexte user
secret = 1001 ; mot de passe du compte
LibSS7 1.0.2.
Listing 4. Configuration d’extension
Après téléchargement du fichier, il faut d’abord installer exten => 6001, 1 DIAL(SIP/ pangoline|30)
les dépendances (voir Listing 1). On va installer Aste-
risk après l’installation des dépendances. Pour installer
Asterisk, il faut le compiler dans l’ordre suivant : libpri, Maintenant vous avez les répertoires suivants :
dahdi, asterisk, asterisk-addons (spécialement le sup-
port mysql d’asterisk). Tous les 4 (en général) suivent le • /usr/sbin/asterisk,
même format (voir Listing 2). • /etc/asterisk/ : Contient les fichiers de configuration
Aller au répertoire Asterisk. Taper ./configure pour d’Asterisk,
vérifier que votre système dispose des librairies requi- • /usr/lib/asterisk/modules/ : Contient les modules
ses. Entrer make menuselect pour choisir quels modu- chargeables pour les applications, codecs, formats
les compiler. Taper make pour compiler Asterisk. Ta- et canaux,
per make install pour installer Asterisk et les modules • /var/lib/asterisk/ : Les registres Asterisk sous forme
à compiler. d’une base de données Berkeley,

14 11/2010
Asterisk

asterisk.conf
Listing 5. Configuration suite
asterisk.conf est le fichier de configuration meta ou
[general]
format=wav49|gsm|wav
master. Il indique à Asterisk où chercher (ou com-
serveremail=asterisk ment créer) d’autres structures et fichiers de con-
attach=yes
skipms=3000 figuration. Asterisk trouve généralement asterisk.
maxsilence=10 conf dans /etc/asterisk sauf si vous lui donnez une
silencethreshold=128
maxlogins=3 indication contraire quand vous démarrez asterisk
language=fr (l’option -C).
emaildateformat=%A, %d %B %Y a %H:%M:%S
emailsubject=[ASTERISK] Nouveau message dans la boite Ce fichier a rarement besoin d’être édité. /etc/aste-
${VM _ MAILBOX} risk/asterisk.conf
emailbody=Bonjour ${VM _ NAME},\n\n\tLe numéro ${VM _
CALLERID} a tenté de vous joindre sans succčs le
${VM _ DATE}.\nCette personne vous a laissé un message de $$
pagerfromstring=[PBX Asterisk]
sip.conf
pagersubject=Nouveau message vocal Contient les informations de configuration pour le canal
pagerbody=Nouveau message de ${VM _ DUR} secondes
dans la boîte ${VM _ MAILBOX} laissé le ${VM _ DATE} SIP d’Asterisk dans la section [general]. Il contient aussi
par ${VM _ CALLERID}. la configuration des téléphones SIP associés. Contient
 [default]
1001 => 1002,Poste 210, marolahy@gmail.com la configuration pour tout fournisseur de service SIP.

/etc/asterisk/sip.conf

Nous allons créer un compte SIP pour notre téléphone


d’exemple. Ouvrons ce fichier avec un éditeur de texte
vi /etc/asterisk/sip.conf.

[1002] : est le nom du compte quand vous configu-


rez votre téléphone ; vous entrez le « user name »
type = friend : est le type de compte qui peut à la
fois émettre et recevoir des appels.
host = dynamique : ceci indique à Asterisk que votre
téléphone est sur un IP dynamique et s’enregistrera
quand il démarrera pour que Asterisk sache où on
• /var/spool/asterisk/ : Les informations d’appel test, peut le trouver.
les messages vocaux et les enregistrements d’appel, context = users : quand le téléphone émet des ap-
• /var/log/asterisk : Journaux, pels, commencer à chercher les numéros appelés
• /var/log/asterisk/cdr-csv/ : Journal d’appel au format csv. dans ce contexte dans extension.conf.
Secret = 1001 : c’est le mot de passe que le
Aller maintenant dans le répertoire asterisk-addons. téléphone utilise quand il se connecte au système
Taper ./configure pour vérifier votre système pour les ou émet un appel.
librairies requises. Taper make menuselect pour choi-
sir quels sont les modules à compiler. Taper make pour C’est une configuration très basique. Les configurations
compiler les modules additionnels. Taper make install dans un système en production sont beaucoup plus
pour installer les modules asterisk addons. complexes.
Après l’installation, on démarre Asterisk grâce à la
commande /etc/init.d/asterisk start. Et on vérifie que extensions.conf
tout soit fonctionnel grâce à la commande asterisk -r Contient la configuration du plan de numérotation. In-
et ainsi que help dans le console asterisk. dique à Asterisk comment traiter les appels (à la fois en-
trants et sortants) et fournit les clés pour sécuriser votre
Fichier de configuration système Asterisk contre les abus, arnaques et toll fraud
Asterisk est configuré par de nombreux fichiers tex- (il fournit un système de sécurité contre toutes sortes de
tes. Il sont mémorisés, par défaut dans /etc/asterisk. fraudes, les fraudes à la tarifications ). Il ressemble plus
Ils sont tous nommés xxxxx.conf. Ce sont des fichiers à un langage de script qu’à un fichier de configuration
textes ASCII et peuvent être édités par n’importe quel standard.
éditeur de texte standard. Les fichiers de configuration
d’exemple sont installés grâce à l’exécution de make /etc/asterisk/extension.conf.
sample lors de l’installation. Il y a de nombreux fichiers
de configuration. Vous trouverez les originaux dans : Commençons par ouvrir extension.conf avec un éditeur
/usr/src/asterisk-1.6.X/config. (voir Listing 4).

www.phpsolmag.org 15
Projets

exten dit au parseur d’Asterisk que c’est une exten- Configurer un Soft-Phone
sion. J’utilise Pagoline, mais il existe d’autres logiciels. Dans le
menu “Accounts”, vous indiquez les champs suivants :
=> : Manière dont Asterisk identifie un objet.
• User : 1002.
6001 : Nombre d’extension (numéro à composer), • Password : 1001  (mot de passe md5).
1 : La priorité (le numéro de séquence pour cette • Serveur : l’IP ou le domaine de votre serveur.
extension), Dial(SIP/pangoline|30 : Ceci demande
à Asterisk d’essayer de faire sonner le matériel SIP Dans le prochain tutoriel, nous allons installer, configu-
appelé pangoline pendant 30 secondes. rer VtigerCRM et nous allons faire une petite communi-
cation entre les deux systèmes. Dans le prochain tuto-
Créer une boite vocale riel nous allons installer le CRM vtiger-CRM et le faire
La boïte vocale sous Asterisk est configurable depuis le interagir avec Asterisk. Nous verrons ensuite comment
fichier /etc/asterisk/voicemail.xml. Le bloc général per- créer un nouveau composant pour ce CRM et enfin
met d’établir comme son nom l’indique les paramètres créer un script PHP pour Asterisk.
généraux. L’attribut attach permet d’attacher un fichier
son au mail envoyé lors de la réception d’un nouve-
au message vocal. maxlogins raccroche lorsqu’un uti- Randriamifidy Bezama Marolahy
lisateur se trompe trois fois de mot de passe. Le reste L’auteur travaille en tant que consultant ntic ( Nouvelles Techno-
semble logique. La ligne importante est celle du bloc logies de l’Information et de la Communication) au sein de Team-
default : Well Système une SSII spécialisée dans le développement web
et d’applications sur la ToIP (Téléphonie over Internet Protocol). Il
• 1001 : identifiant de la boite vocale. réalise plusieurs applications web et d’applications internet riche.
• Poste 210 : un nom plus propre. Passionné de nouvelles technologies, il cherche toujours à amélio-
rer ses compétences en tant que développeur et administrateur
marolahy@gmail.com : adresse où envoyer la notifica- système.
tion d’un appel. Pour le contacter veuillez envoyer un mail à marolahy@gmail.com.

16 11/2010
Dossier

Web
sur iPhone
‘J’ai toujours rêvé d’un ordinateur qui soit aussi facile à utiliser
qu’un téléphone. Mon rêve s’est réalisé : je ne sais plus comment
utiliser mon téléphone.’ Bjarne Stroustrup (auteur du C++).
Nous verrons pourquoi et comment développer sur smartphone
(iPhone). Nous évoquerons les contraintes et les opportunités
qu’offre ce développement spécifique.

Cet article explique : Ce qu'il faut savoir :


• Pourquoi développer pour les smartphones. • Bonne notion CSS et HTML.
• Les spécificités et contraintes. • Bonne connaissance JavaScript et jQuery.
• Un environnement de développement. • Notion de SQL.
• Les styles de base à adopter. • Connaître PHP 5.2.
• La librairie jQTouch.
• Utilisation avancée de Safari.

De la nécessité de développer Il est souhaitable qu’il propose des fonctionnalités


pour les smartphones inexistantes au site lourd ainsi qu’une approche pragma-
Tout autour de nous, nous voyons ces petits rectangles de tique de ses fonctionnalités. Les plus du site smart peu-
plastique et des index agiles glisser sur leurs surfaces lis- vent être la géolocalisation, une zone de contact twitter
ses et brillantes. Les smartphones sont là. Parions qu’avant ou sms, des visuels en relation avec le lieu de la mobi-
cinq ans, ils seront le moyen d’accès privilégié à Internet. lité. L’approche pragmatique peut être des textes plus
Pour un coût équivalent au téléphone mobile, le courts, des visuels légers, des formulaires simplifiés.
smartphone est un véritable micro-ordinateur portable
avec navigation internet, téléchargements, wi-fi, e-mail,
travail sur document tableur ou texte, etc.
Par exemple, les Qrcode (voir Figure 1), FlashCode,
GS1, DataMatrix qui fleurissent autour de nous, démon-
trent cette nécessité d’une connexion au Web mobile.
Il y a quelques années, les entreprises se posaient
la question s’il fallait avoir un site Web, une adresse
e-mail. Aujourd’hui, la question faut-il un site optimisé
pour smartphone attend la même réponse : oui.

Web sur smartphone, pour quel emploi?


Avec environ sept millions de smartphones en France (5e
rang en Europe), le développement Web pour ces der-
niers ne peut plus être considéré comme anecdotique.
Dans cet esprit, il n’est pas question de recréer
à l’identique un site Web conçu pour un micro-ordinateur
à un smartphone. Le site smart (entendre pour smartpho-
ne) ne sera pas non plus un sous-ensemble, ou une ver-
sion dégradée du site lourd. Le site smart doit proposer
un contenu qui fait sens avec l’utilisation du smartphone. Figure 1. Exemple de QRcode

www.phpsolmag.org 17
iPhone

En ce sens, le site smart est un complément au site


Listing 1. Intégration du CSS iPhone
lourd en plus de faciliter l’accès mobile à un site Web.
<link rel="stylesheet" type="text/css"
Les iPhone représentent environ deux millions d’ap- href="iphone.css" media="only screen and (max-device-
pareils en France. L’iPhone est emblématique d’un sys- width: 480px)" />
<link rel="stylesheet" type="text/css"
tème fermé mais sans doute efficace. Le but de cet ar- href="desktop.css" media="screen and (min-device-width:
ticle n’est pas de jeter l’opprobre sur une marque ou tel 481px)" />
<!--[if IE]>
système d’exploitation. <link rel="stylesheet" type="text/css" href="explorer.
On constate que développer pour iPhone nécessite css" media="all" />
<![endif]-->
la maîtrise d’objective-C, de soumettre son application
au service sévère de Apple Store, d’être en contradiction Listing 2. Typage de la balise body
avec la GNU GPL (section 6 de la GPLv2) et Java est <style type='text/css'>
body.portrait p {  
indésirable.    backgroundcolor: white;  
L’alternative est de développer pour le Web. La dy- }  

namique est créée par un ensemble de technologies body.paysage p {  


   backgroundcolor: gray;  
telles que Javascript et ses frameworks (JQtouch pour }
jQuery, iUI) dédiés au web smart, le HTML 5 ainsi que </style>

CSS 3. Ces technologies peuvent se regrouper sous le Listing 3. Orientation de l’iPhone


concept WebSmart. Nous verrons les techniques pour window.addEventListener('load', setOrientation, false);  
faire une interface de l’application Apple Store like. window.addEventListener('orientationchange',
setOrientation, false);

function setOrientation() {  
Les particularités de l’iPhone  var orientation = Math.abs(window.orientation) === 90 ?
Ce qui n’est pas : 'paysage' : 'portrait';  
 var classOrient = document.body.className;  
 classOrient = classOrient.replace(/portrait|paysage/,
• le Flash et Java sont proscrits, orientation);  
 document.body.className = classOrient;  
• nombre de pages ouvertes simultanément limité à huit, }
• poids de la page Web d'un maximum de dix Mo, Listing 4. Liste HTML à styler avec CSS
• pas de format GIF animé,
<html>
• Javascript limité à cinq secondes et à dix Mo d'allo- <head>
cation, <link rel="stylesheet" href="screen.css" type="text/css" />
<title>Php sol mag</title>
• copier, couper, coller disparaît, </head>
<body>
• pas de drag and drop, <div id="container">
• pas de clique droit, <div id="header">
<h1><a href="./">PHP Solution</a></h1>
• pas de survol (hover), <div id="utility">
• pas de sélection possible en général. <ul>
<li><a href="about.html">A propos</a></li>
<li><a href="auteur.html">Auteurs</a></li>
Particularités pour les événements :
</ul>
</div>
<div id="nav">
<ul>
• Mouseover et Mousemove ne sont pas pris en compte, <li><a href="vieux _ magazines.html">Anciens
• Keypress, Keyup et Keydown dans un textarea uni- magazines</a></li>
<li><a href="Abonnement.html">Abonnement</a></li>
quement, <li><a href="contact.html">Contact</a></li>
• Click, Mousedown et Mouseup ont un comporte- </ul>
</div>
ment étrange (à éviter), </div>
<div id="content">
• Doubleclick n'est pas pris en compte. <h2>A propos</h2>
<p> PHP solutions magazine est un journal consacré à...
</p>
Il faut comprendre que la souris a été chassée par une </div>
interaction plus charnelle (les doigts), et c'est peut-être <div id="sidebar">
<img alt="Dernier numero"
pourquoi le rapport des utilisateurs avec leur interface src="images/dernierNumero.png"
<p>Le dernier numéro est paru...</p>
est plus affectif. </div>
La géométrie : <div id="footer">
<ul>
<li><a href="contact.html">Contact</a></li>
<li><a href="about.html">A propos</a></li>
• en mode portrait, <li><a href="auteur.html">Auteurs</a></li>
surface affichable 320 X 480 pixels soit 320 X </ul>
<p class="subtle">PHP solution magazine copyright</p>
416 sans la barre d'URL </div>
• en mode paysage. </div>
</body>
surface affichable 480 X 268 pixels soit 480 X </html>
208 sans la barre d'URL

18 11/2010
Dossier

Constituer un environnement de développement


Listing 3B. CSS style iPhone
Nous allons constituer un environnement spécifique
body { de développement d’application iPhone Web sous
background-color: #ddd; /* couleur de fond :gris
pale! les digits sont doublés*/ Windows XP, a fortiori sans le SDK de Apple, ni de
color: #222; /* couleur du texte noir bleuté*/ iPhone.
font-family: Helvetica; /*font par défaut Apple iPhone
*/ En plus de l’environnement classique de dévelop-
font-size: 14px; pement :
margin: 0;
padding: 0;
} • navigateur Safari version 5.0.2,
#header h1 {
margin: 0; • activer le menu développement (édition préférences
padding: 0; – avancées – cocher, afficher le menu de dévelop-
}
#header h1 a { pement),
background-color: #ccc; • dans la barre d'adresse taper javascript:window.
border-bottom: 1px solid #666;
color: #222; scrollTo(0,0);resizeTo(320,480);
display: block;
font-size: 20px;
• pour paramétrer entre autres choses l'userAgent,
font-weight: bold; on peut utiliser le plugin TcpCatcher. Le java est né-
padding: 10px 0;
text-align: center;
cessaire : http://www.tcpcatcher.org/index.php. Il
text-decoration: none; existe de même un plugin de switcher userAgent
}
#header ul {
pour Firefox très performant,
list-style: none; • émulateur iPhone : http://www.emulateurmobi-
margin: 10px;
padding: 0;
le.com/ et http://app.protofluid.com/, et l’excellent
} http://www.opera.com/developer/tools/ pour Opera
#header ul li a {
background-color: #FFFFFF; mobile,
border: 1px solid #999999; • il existe une extension pour la complétion HTML 5
et CSS 3 pour Dreamweaver,
color: #222222;
display: block;
font-size: 17px; • une feuille imprimée avec les dimensions de l'iPho-
font-weight: bold;
margin-bottom: -1px; ne, que l'on trouve à http://www.imagescreations.fr/
padding: 12px 10px; telecharger-iphone-mockup.html.
text-decoration: none;
}
#header ul.hide { Cela ne constitue pas un environnement professionnel,
display: none;
} mais permet de faire les premiers tests tout en étant
/* bouton de menu dans la barre supérieure */ vigilant sur les rendus. Par exemple, le flash peut fonc-
#header div.leftButton {
position: absolute; tionner en émulation!
top: 7px; L’idéal est d’avoir un iPhone et le SDK Apple moyen-
left: 6px;
height: 30px; nant 99$ et un Mac OX Snow Leopard.
font-weight: bold; Note : l’émulateur peut permettre avec le client qui
text-align: center;
color: white; ne possède pas encore d’iPhone, de valider des points
text-shadow: rgba(0,0,0,0.6) 0px -1px 0px; du projet, voire commencer à former les futurs utilisa-
line-height: 28px;
border-width: 0 8px 0 8px; teurs et d’avoir ainsi les premiers retours. Ceci est très
-webkit-border-image: url(images/button.png) 0 8 0 8; utile dans le cas de développement avec les méthodes
}
#header div.pressed { agiles.
-webkit-border-image: url(images/button _ clicked.png)
0 8 0 8;
} Premiers pas dans le code
#content, #sidebar {
padding: 10px;
La détection du modèle du mobile se fait grâce à la lec-
} ture de l’UserAgent renvoyé par ce dernier.
L’userAgent renvoyé par iPhone est de type :
Listing 5. Manipulation du bouton menu
if (window.innerWidth && window.innerWidth <= 480) { Mozilla/5.0 (iPhone; U; CPU like Mac OS X;
$(document).ready(function(){
$('#header ul').addClass('hide'); en)
$('#header').append('<div class="leftButton" onclick="t AppleWebKit/420+ (KHTML, like Gecko)
oggleMenu()">Menu</div>');
}); Version/3.0 Mobile/1A543a Safari/419.3

function toggleMenu() {
$('#header ul').toggleClass('hide'); On peut soit le détecter en JavaScript ou en PHP.
$('#header .leftButton').toggleClass('pressed'); Si le mobile est identifié comme iPhone, on fait
}
} une redirection sur un répertoire spécifique à ce
mobile.

www.phpsolmag.org 19
iPhone

Détection en JavaScript : Tableau 1. Caractéristiques pour une liste de blocs contiguës

Item Valeur
if( navigator.userAgent.match(/iPhone/i)
Hauteur cadre (ligne du bas incluse) 44px
){document.location= "/dirPourIphone/";}
Largeur cadre 320px (portrait),480px
(paysage)
Détection en PHP :
Police Helvetica, 20pt bold
On utilise la variable globale $_SERVER[‘HTTP_ Couleur police Black
USER_AGENT] Ligne horizontale (entre les cellules) #d9d9d9 (RGB=217,
217, 217)
if (stristr($_SERVER['HTTP_USER_AGENT],"iPhone") Padding gauche 10px
header("location:/dirPourIphone/"); Padding bas 14px
Hauteur controle 29px
Sélection de la feuille de style CSS Control alignement droit 10px
La séparation des feuilles de style se conforme au prin-
Control rectangle arrondi 7 degrés
cipe DRY (Don’t Repeat Yourself) ainsi qu’à une logi-
que économique singularisée par la bande passante, Control texte Helvetica, 12pt
en évitant de surcharger avec des instructions inutiles Couleur de fond White
ou inadaptées. Il est possible que lors des émulations
Tableau 2. Zones de texte à bords arrondis
sur un navigateur, celui-ci tienne compte de la largeur
réelle de l’écran, dans ce cas, il faut remplacer le para- Item Valeur
mètre du média max-device-width par max-width. Cell height 44px
Maintenant, si on utilise Safari sous IPhone, ce der- Rectangle coin arrondi avec angle 10px × 10px angle (-we-
nier considère la page en 980 pixels et affiche une pa- bkit-border-radius:10px)
ge miniaturisée. C’est pourquoi il faut préciser au navi- Rectangle arrondi marge gauche 10px
gateur Safari mobile le paramètre user-scalable=no et droite
dans la head de la page : Rectangle arrondi marge haut et bas 17px
Horizontal lines (entre les cellules) #d9d9d9 (RGB=217, 217,
<meta name"viewport" content="user-scalable=no, 217)
width=device-width" />
Police étiquette Helvetica 17pt, bold
Couleur de la police étiquette #4c566c (RGB=76, 86,
Ce tag meta est uniquement reconnu par Safari mobile. 108)
Police de la cellule Helvetica 17pt, bold
Détection de l’orientation
L’iPhone peut se manipuler horizontalement (mode Couleur de la police de la cellule Black
paysage) et verticalement (mode portrait). Une maniè- Position du texte dans la cellule 10px du côté gauche,
re de faire si l’on désire affiner une feuille de script en 14px à partir du bas
fonction de l’orientation de la page, est d’indiquer à la Couleur du fond #c5ccd3 (RGB= 197,
balise body une classe d’orientation telle que <body 204, 211)
class="portrait"> (voir Listing 2)
Tableau 3. Zones de saisies
En JavaScript, on ajoute les écouteurs d’événement
sur les évènements onload et onorientationchange Dimension de l’élément visé par Taille recommandée
(voir Listing 3). Le code JavaScript affecte la classe de un doigt
la balise body. Hauteur de l’élément 40px (min. 29px)
Largeur de l’élément Min. 30px
Style de base iPhone
Sélection, entrée hauteur 30px
Le style de base à adopter pour faire une application
Hauteur d’une cellule de liste sélec- 44px
Web conforme en termes de visualisation et d’ergono-
tionnable
mie est décrit dans la feuille CSS du Listing 3. Les don-
Espace entre les éléments 20px
nées sont le résultat de l’observation des applications
Apple sous iPhone. Il est nécessaire dans un premier
temps, pour des raisons d’ergonomie, de ne pas déso- avec une liste dont les éléments sont sélectionnables.
rienter l’utilisateur avec des nouveaux codes visuels de Le bouton de menu est piloté par du JavaScript (voir
façon à rendre son expérience agréable. Listing 5).
Le style, le look and feel, iPhone peut être celui-ci La littérature donne d’autres indications techniques du
du Listing 4 pour un fichier html présentant un menu design iPhone. Voir les Tableau 1, Tableau 2 et Tableau 3.

20 11/2010
Dossier

Il faut initialiser jQTouch avec les paramètres


touchSector et slideSelector. Le traitement de l’évé-
nement se fait simplement avec les méthodes swipe ou
tap. (voir Listing 6).
Le changement d’orientation du smartphone est dé-
tecté de façon plus concise que le code précédemment
montré à ce propos grâce à l’événement implémenté
JQTouch turn (voir Listing 7).

iPhone et AJAX
L’avantage de AJAX dans une application dédiée au
smartphone prend tout son sens. Le code n’est pas dif-
férent d’une requête classique AJAX, mais permet d’ap-
peler uniquement la réponse du serveur nécessaire, ce
Figure 2. Géométrie iPhone qui économise la bande passante en terme de volume
et de vitesse. En effet, une application web sur smart-
Présentation de jQTouch phone est à rapprocher des contraintes imposées par le
JQTouch est une librairie JavaScript qui propo- logiciel embarqué.
se tous les éléments nécessaires au développe-
ment d’applications mobiles. D’autres librairies iPhone et les bases de données
existent et sont très plébiscitées dans la littérature Les navigateurs sur les mobiles, en particulier Safari,
comme iUI ou WebApp.Net, mais il semble qu’elles autorisent la permanence des données. Quid novi? Il
comportent des bugs importants, peut-être vaut-il existe depuis longtemps les cookies et les variables
mieux attendre les versions suivantes. Ô tempora, de sessions. Il peut être nécessaire de passer la limite
Ô mores! des cookies en raison de leurs tailles et de leurs ac-
JQTouch s’appuie sur le moteur de rendu WebKit qui cessibilités trop faciles, et les sessions ne sont là que
est utilisé par les navigateurs Safari, Google et Chrome le temps de la session web. Pour palier à cela, il exis-
et qui provient des librairies KJS et KHTML du projet te d’une part deux objets JavaScript localStorage
KDE. jQTouch est un plugin de jQuery, cela signifie qu’il et sessionsStorage et d’autre part la base de don-
faudra charger jQuery. La version Beta 2 du 25 octobre nées SQL locale (SQLite) propre au navigateur, ac-
2010 s’appuie sur jQuery 1.4.2. Ce plugin est souple cessible par JavaScript. L’intérêt premier est d’avoir
pour accepter la modification de ses thèmes et suppor- une base de données avancée de type SGBD em-
te d’autres plates-formes que iPhone comme Android, barquée, ce qui évitera la sollicitation excessive de
ce qui est un gage d’efficience. la bande passante ainsi que des temps de réponse
La bibliothèque jQTouch doit être appelée après longs rédhibitoires. La base de données permet le
jQuery. Le thème CSS jqtouch.min.css avant les CSS questionnement SQL, les transactions, les rollbacks
spécifiques à la page pour profiter du cascading. en cas d’échecs, etc.
JQTouch simplifie la détection d’événements spé- Il est à remarquer que pour les puristes, que l’implé-
cifiques comme les glissées (swipe) et les frappes au mentation de la base de données repose sur SQLite ce
doigt sur l’écran (tap). Ces événements sont intercep- qui n’est pas acceptable pour une normalisation et en
tés par une méthode callback. ce moment le W3C est dans une impasse.

Figure 3. Inspecteur Web dans Safari

www.phpsolmag.org 21
iPhone

se fait à droite par la console SQL, la complétion SQL


Listing 6. Glisser et taper avec jQTouch
existe. Ce sont des outils de développement utiles pour
$.jQTouch({ la base de données et l’exécution de script SQL. (Voir
la Figure 3). Il existe d’autres outils comme le profilage,

touchSelector: 'a, .touchable',
slideSelector: 'a.slide' l’exécution de script, l’inspection d’éléments. Les utili-
...
}); sateurs de Firebug ne seront pas perdus.
$(function(){
$('#glissezmoi').swipe( function(event, info){ Conclusion
// info.direction donne des précisions sur Un des premiers risque lorsqu’on développe pour un
le glissé: left ou right
// info.deltaX et info.deltaY informent sur smartphone, c’est le faire pour une plate-forme parti-
le métrique du déplacement culière, développer uniquement pour l’ iPhone serait
});
}); une erreur. En ce sens, il faut se méfier des librairies
$(function(){ trop spécifiques. Plus que jamais, les phases de tests
$('#tapezmoi').tap( function(e){
// traiter l'équivalent du click au doigt doivent être prolongées pour vérifier la conformité du
}); site sur les principaux ténors du marché, comme les
});
smartphones sous Android, Windows Phone 7 ou RIM.
Listing 7. Détection de l’orientation avec jQTouch L’utilisation de simulateur ou émulateur ont leurs limites
... et l’on doit tester sur le matériel cible.
$(function(){ Les problèmes de sécurité des données ainsi que
leurs confidentialités doivent être abordés sérieuse-
$('body').bind('turn', function(event, info){
// info.orientation renverra le type
d'orientation: portrait ou landscape (paysage) ment. La possibilité de stocker des données en locale
var msg = 'Vous orienter votre smartphone en
mode ' + info.orientation; ne doit pas se faire au détriment de la confidentialité.
alert(msg) ; Il est dû au développeur de savoir si les données ain-
});
}); si stockées sont réellement nécessaires, car un vol de
smartphone est sans doute plus facile qu’une machine
Listing 8. Création d’une base locale avec table et requęte SQL de bureau.
//signature de openDatabase Les applications que l’on peut télécharger peuvent
/*
HYPERLINK „http://dev.w3.org/html5/webdatabase/" \
être source de fuite d’information comme l’ont montré
l „dom-opendatabase"openDatabase (in DOMString name, les récents événements sous smartphones Android
in DOMString version, in DOMString displayName,
in unsigned long estimatedSize, in optional
avec l’application Wall paper. C’est un spyware qui ré-
DatabaseCallback creationCallback); coltait les IMEI (identifiant unique téléphone) et numéro
};
*/ de carte SIM.
//ouverture d'une base avec creation d'une table Le développement pour les smartphones permet de
var db = openDatabase(" nomBase ", " 1.0 ",
" NomAffichable", 65535 ,function (db) { se plonger dans les nouvelles possibilités offertes par
db.changeVersion('', '1.0', function (t) { HTML 5 et CSS 3 qui sont d’un poids léger et d’une
réactivité instantanée nécessaire à la bonne expérience
t.executeSql('CREATE TABLE maTable (id, nom,
prenom)');
} ) utilisateur.
});
//parametrage de requête De même, une réflexion poussée sur l’ergonomie,
db.readTransaction(function (t) { avec des pages plus simples et des accès directs à l’es-
t.executeSql('SELECT nom, prenom FROM maTable WHERE
id=?', [id], function (t, data) { sentiel de l’information, apportera un plus qualitatif.
report(data.rows[0].nom, data.rows[0].prenom); Le retour d’investissement dans ce domaine sera
});
}); bénéfique pour les développeurs qui pourront ainsi en
faire profiter les sites plus traditionnels.

Il est nécessaire que le navigateur s’appuie sur le


Webkit ainsi que HTML 5. Le langage SQL associé est
celui de Sqlite 3.6.19. En général, la limite pour le vo-
lume du stockage de données est de 5 Mo.
L’ouverture d’une base de données se fait simple- Jean Tatareau
ment avec l’instruction JavaScript openDatabase(). Diplômé en ingénierie et qualité du logiciel au CNAM de Bordeaux,
Les requêtes peuvent être paramétrées pour parer l’auteur s’ intéresse à la programmation et à la réalisation logiciel-
les injections SQL. Voir le Listing 8. le depuis de nombreuses années. Depuis plus de deux ans, il a créé
Dans Safari, le menu développement offre l’affichage et dirige la société Kiwi Engineering. Les domaines de prédilection
de l’inspecteur Web pour agir sur la base de données. sont le travail à façon d’applicatifs pour le professionnel ou le par-
Celui-ci possède une ligne de commande JavaScript en ticulier au travers d’interfaces Web. Contact http://www.kiwi-engi-
bas qui permet la complétion. Le traitement de la base neering.net.

22 11/2010
iPhone

www.phpsolmag.org 23
Dossier

La sécurité
des smartphones
Cet article présente d’une manière générale la sécurité
des smartphones dans un contexte professionnel.
Pour ce faire, nous verrons d’abord qu’il existe plusieurs
systèmes d’exploitation. Nous nous intéresserons ensuite
à leurs faiblesses et à la façon de palier ces faiblesses.

Cet article explique : Ce qu'il faut savoir :


• La sécurité des smartphones. • Quelques notions sur les smartphones.

es smartphones connaissent un boom plané- Nous allons nous pencher sur la sécurité de ces systè-

L taire sans précédent. Que ce soit en Europe, en


Amérique du Nord, ou dans certains pays d’Asie
du Sud-Est comme l’Inde, de plus en plus d’utilisateurs
mes dans un contexte professionnel. Nous nous consa-
crerons à l’étude de la sécurité d’un OS spécifique dans
un prochain article.
s’arrachent ces nouveaux téléphones. Les plus évolués
d’entre eux tels que l’iphone d’Apple, ou le Blackberry de Les faiblesses des smartphones
RIM font fureur. Le consommateur lambda est séduit par Les faiblesses des smartphones se situent à la fois
la variété des fonctions de cette petite machine : consul- sur les plans technique et fonctionnel. Tout d’abord, il
ter ses mails, son compte bancaire, téléphoner, envoyer n’y a aucune notion de privilège au niveau des systè-
un SMS, poster un comment sur Facebook, twitter le der- mes des smartphones. Chaque utilisateur de smart-
nier film qu’on a vu, tout est permis avec le smartphone. phone est totalement libre de faire ce qu’il veut sur
Il me manque une application ? Je peux la télécharger son système. Cela implique donc que dès que nous
illico grâce à une plateforme comme l’AppStore d’Apple avons accès au système nous sommes capables d’y
ou Android Market de Google. Les smartphones sont tel- installer et de récupérer n’importe quel type d’infor-
lement pratiques, et rapides d’utilisation, que certaines mations.
personnes ne se connectent même plus à leur ordina- De plus, aucun outil système n’existe sur les smart-
teur. Ce succès ne pouvait pas laisser les entreprises phones, contrairement aux systèmes d’exploitation
indifférentes. Mais une interrogation subsiste : Dans un classiques.
environnement où la sécurité des données est primordia- Les smartphones peuvent également échanger des
le, dans quelle mesure les smartphones garantissent-ils informations via de multiples canaux : le bluetooth, la
la sécurité du système d’information des entreprises ? SD card, les ports USB ou encore le WiFi. Autant dire
que le risque de transmission de virus est élevé.
Présentation des smartphones Autre problème : les smartphones sont utilisés à des
Les systèmes les plus répandus de smartphones sont fins personnelles, mais aussi professionnelles, ce qui
les suivants : implique des synchronisations d’informations entre
l’ordinateur de bureau et l’ordinateur personnel. Par
• L’iPhone OS, conséquent, la propagation de virus et de malware de-
• Le Blackberry OS, vient relativement aisée. En effet, les smartphones ne
• Windows Mobile, disposent pas des mêmes protections que l’ordinateur
• Symbian OS. professionnel.

24 11/2010
Smartphones

Autre problème majeur : les utilisateurs sont très  Avertir tout de suite le service informatique de
peu sensibilisés aux bonnes pratiques d’utilisation des l’entreprise.
smartphones. Peu d’entre eux pensent à activer un co-  Couper l’accès VPN à l’entreprise pour l’utilisa-
de de protection pour restreindre l’accès à leur télépho- teur ayant perdu son smartphone.
ne. Un élément parmi tant d’autres qui rend les don-  Modifier les mots de passe d’accès au système
nées du smartphone très facilement accessibles. d’information.
Un simple câble USB peut également suffire à dé-
rober les données d’un smartphone. En réalité, aucune Ce ne sont évidemment que des exemples, bien d’autres
session d’utilisateur, ni aucun mot de passe n’empê- actions doivent être entreprises dans un tel cas.
chent l’intrusion au sein du système. Prenons l’exem-
ple d’un iPhone : seul un mot de passe de quatre chif- – Utiliser des antivirus pour smartphones. Des édi-
fres permet le vérouillage, et donc le dévérouillage de teurs tels que Norton ou encore Kaspersky déve-
l’écran. Dans ces conditions, déjouer la sécurité d’un loppent des antivirus pour smartphone.
iphone s’avère relativement facile. – Appliquer des solutions de chiffrement pour mobile.
– Utiliser un firewall pour mobile. On peut ici citer Mo-
Les risques bile Firewall pour Windows Mobile ou encore Fi-
La compromission d’un smartphone peut être dange- rewall IP pour l’iPhone.
reuse. En effet, prenons l’exemple d’un salarié d’une – Mettre à jour les logiciels et systèmes afin de palier
entreprise X qui synchronise son smartphone sur un uti- les éventuelles failles.
lisateur personnel infecté. Le smartphone professionnel
se trouve alors infecté. Il suffit ensuite que ce salarié Néanmoins, les solutions de sécurité pour smartphones
synchronise son smartphone sur son ordinateur profes- présentent encore de nombreuses faiblesses. En effet,
sionnel pour que ce dernier soit infecté. Cela pourrait certains ne sont pas capables de reconnaître certains
alors donner accès au réseau de l’entreprise à un at- virus/spyware très répandus sur la toile.
taquant.
Conclusion
Comment sécuriser les smartphones Les smartphones se répandent de plus en plus, dans
Après avoir étudié les faiblesses des smartphones, il les sphères aussi bien professionnelles que privées.
convient de passer en revue les différents moyens de Mais ils présentent de nombreuses faiblesses. De nom-
les sécuriser. Tout d’abord, nous tenons à préciser que breux moyens, techniques et fonctionnels existent pour
le but premier des smartphones est une utilisation per- améliorer leur sécurisation. Ils représentent une base
sonnelle. En ce sens, l’aspect sécurité n’a donc pas été intéressante, mais pas encore suffisante pour affirmer
privilégié par les développeurs bien que les nouvelles que les smartphones disposent du  niveau de sécuri-
versions d’OS l’améliorent grandement. En effet, de té requis pour être intégrés à l’environnement critique
plus en plus de sociétés s’interrogent et réalisent des d’une entreprise.
analyses de risques car l’utilisation des smartphones en D’abord développés pour le consommateur lamb-
entreprise est en passe de devenir incontournable. da, les smartphones n’ont pas été prévus pour un
Afin de sécuriser au mieux les smartphones, voici usage professionnel. Si vous l’utilisez dans un contex-
quelques bonnes pratiques à suivre : te professionnel, prenez garde à optimiser la sécuri-
sation de vos données afin d’éviter toute fuite d’infor-
– Utiliser une bonne politique de mot de passe. mations.
Concrètement une bonne politique de mot de pas-
se respecte les règles suivantes :
 Les mots de passe doivent disposer d’au moins
huit caractères en combinant lettres (a-z), chif-
fres (0-9) et caractères spéciaux ($, #, @, etc.).
 Les mots de passe triviaux tels que les dates de
naissances, prénoms, noms communs et mots-
clés en relation avec l’application (IPM, douane,
etc.) sont proscrits.
– Protéger l’accès à l’entreprise via un tunnel VPN.
– Établir des procédures fonctionnelles en cas de Tony Fachaux
perte ou de vol d’informations afin d’éviter de gra- L’auteur travaille en tant que consultant sécurité pour la société LE-
ves conséquences pour l’entreprise. Cela peut être XSI (Laboratoire d’EXpertise en Sécurité Informatique). Il se passion-
une série d’actions à effectuer auprès du service in- ne pour toutes les problématiques liées à la sécurité dans un conte-
formatique de la société telles que : xte professionnel.

www.phpsolmag.org 25
Fiche technique

Introduction
à l’industrialisation de PHP
PHP est un langage de programmation largement répandu,
probablement le plus utilisé en programmation web. Ce que
bon nombre de développeurs PHP ne savent pas, c’est qu’il
dispose d’une panoplie d’outils permettant une utilisation
confortable de celui-ci en situation professionnelle. Cet article
présente un cycle incrémental d’industrialisation possible.

Cet article explique : Ce qu’il faut savoir :


• Le terme industrialisation et ses enjeux. • Des connaissances en matière de bonnes pratiques PHP (tests
• Une forme d’industrialisation possible. notamment).

’industrialisation de PHP c’est le processus de fa- dification dans votre schema.yml (le schéma qui repré-

L brication d’une application web en utilisant des


outils et techniques qui favorisent la productivité
et facilitent l’exécution de certaines tâches critiques. Je
sente la base de données). Cependant, ces classes
Model constituent le métier de votre application. Mê-
me rigoureux, vous ne pourrez pas toujours répercu-
m’attarderai sur la phase de développement et précisé- ter l’ensemble des changements amenés par une mo-
ment sur les tests, une partie très importante et souvent dification dans le schéma. L’écriture de tests unitaires
la première à outiller lorsque l’on souhaite industrialiser permet de surveiller vos classes Model, c’est-à-dire le
ses développements. Une première partie sera consa- fonctionnement interne de votre application : les acces-
crée aux différentes manières de tester une application seurs (getters/setters), les méthodes de calcul et tou-
web en rappelant brièvement pourquoi il est important tes autres méthodes publiques de vos objets. Le débat
d’écrire des tests. Suite à cela, quelques outils à connaî- intéressant est le suivant : doit-on tester les méthodes
tre (et à mettre en place !) seront présentés. Pour termi- privées ou protégées ? Oui mais attention, il ne s’agit
ner, j’évoquerai d’autres outils présents en amont et en pas de casser la visibilité de nos méthodes. Une mé-
aval de la phase de développement. thode privée ou protégée sera utilisée dans au moins
une méthode publique, c’est celle-ci que nous devrons
Vous avez dit tests ? tester en faisant en sorte de tester les appels de mé-
En effet. Tester son application est de loin la meilleure thodes privées ou protégées dont elle se sert. Je viens
chose à faire. C’est ce qui fera gagner le plus de temps de vous présenter les tests unitaires, des tests simples
et beaucoup de développeurs croient (encore) le contraire. garant d’un code solide, voyons maintenant d’autres
Le calcul est simple : le temps passé à écrire quelques tests types de tests.
sera bien moindre face au temps passé en débogage. Les tests fonctionnels suivent généralement les
L’exemple le plus marquant est peut-être celui de la tests unitaires. Généralement, on en distingue deux
régression de code. PHP excelle en la matière : un pe- types :
tit point-virgule oublié, une portion de code mort, une
méthode qui n’est plus appelée, … Ces erreurs sont • Les tests fonctionnels du client qui va voir comment
fréquentes et quelques tests unitaires permettront de le système réagit ;
surveiller votre code qui deviendra robuste. • Les tests fonctionnels appliqués au code (les for-
Avec le framework Symfony, vous générez vos mulaires par exemple) que l’on confond parfois
classes Model à chaque fois que vous faites une mo- avec les tests d’intégration.

26 11/2010
Industrialisation de PHP

Figure 1. Exemple de tests unitaires avec Lime (Extrait de Jobeet – www.symfony-project.org).

Figure 2. Exemple de tests fonctionnels avec Symfony (Extrait de Jobeet – www.symfony-project.org).

Les tests d’intégration forment une troisième famille de Attention, la rédaction des tests unitaires ne sera pas
tests. Ils visent à tester la cohésion de l’application lors- traitée dans cet article. Passons donc aux tests fonc-
qu’on y ajoute de nouvelles fonctionnalités, modules, tionnels.
etc. Symfony embarque un mini framework de tests fonc-
tionnels. Celui-ci permet de faire des tests qualifiés de
Des outils pour les tests ! techniques. En d’autres termes, nous allons tester des for-
Pour tester une application, il faut avoir les outils qui mulaires, des navigations de pages et autres mais sans
vont bien et en PHP, il y en a rassurez-vous. Voici pour autant profiter d’un vrai rendu et de toutes les interac-
deux librairies incontournables pour nos tests uni- tions possibles avec un vrai navigateur. En effet, la clas-
taires : se sfBrowser de Symfony ne fait que des requêtes HTTP
sans possibilité de tester les requêtes AJAX par exemple.
• Lime : framework de tests embarqué dans le fra- Pour cela, il existe un outil très pratique nommé :
mework Symfony 1.x ; Selenium. C’est une application disposant de plusieurs
• PHPUnit : semblable à JUnit en Java, il tend à de- éléments dont un plugin pour Firefox permettant d’enre-
venir le framework principal de tests pour PHP. Je gistrer un scénario de tests et de le rejouer par la suite.
ne peux que vous le recommander. Ce dernier vous C’est puissant puisque, une fois enregistré, nous pou-
permettra de profiter de sur-couches issues du vons tester à peu près tout ce que l’on souhaite et le re-
monde Java pour vos développements PHP com- jouer sur plusieurs navigateurs sans souci. Vous voyez
me nous allons le voir par la suite. aisément l’intérêt ?

www.phpsolmag.org 27
Fiche technique

Figure 3. Exemple de couverture de code avec Lime (www.symfony-project.org).

Figure 4. Exemple de graphiques dans phpUnderControl.

En complément, nous avons le test de couverture de de prise en main notamment par le biais d’un paquet
code. Ce test quantifie le code testé avec les tests uni- officiel Debian.
taires, autrement dit l’efficacité de ces tests. Cette cou- Hudson (Figure 5) quant à lui est très simple, doté
verture se mesure avec Xdebug couplé à l’un des deux d’énormément de plugins et, bien qu’outil Java, très uti-
frameworks de tests énoncés ci-avant. lisé dans le monde PHP professionnel.
Il nous est possible de faire des tests unitaires Un serveur CI se connecte à un gestionnaire de ver-
et fonctionnels mais leurs exécutions restent manuel- sions et possède la capacité d’effectuer une série de tâ-
les. Il serait bon d’affranchir nos développeurs du fait de ches périodiquement. On pourra, par exemple, choisir
lancer nos tests. Il existe des outils pour cela, regrou- de lancer nos tests après chaque commit ou à interval-
pés autour du terme intégration continue. le de temps spécifié. Nous reviendrons sur les gestion-
naires de versions dans la dernière partie de cet article.
L’intégration continue Brancher nos tests unitaires et fonctionnels est très
Continuous Integration (CI) est l’action d’automatiser simple puisque Lime et surtout PHPUnit reprennent le
les tests et de les lancer périodiquement. Le logiciel format de sortie de JUnit, une référence en matière de
employé est appelé serveur d’intégration continue, en tests unitaires Java.
voici deux : Cependant, le vocabulaire est peu commun, il fau-
dra d’abord se familiariser avec le terme build qui signi-
• phpUnderControl : qui utilise en sous-couche fie étape de création. Autrement dit pour une application
CruiseControl, le serveur CI Java ; PHP, la récupération des sources depuis un gestionnai-
• Hudson : directement emprunté à Java. re de versions, l’exécution des tests, des analyses sur
le code, la remontée d’indicateurs ou métriques et l’in-
phpUnderControl (Figure 4) est très sexy mais com- tégration avec d’autres outils extérieurs que je présen-
pliqué à installer. Un projet vise à le rendre plus simple terai plus loin.

28 11/2010
Industrialisation de PHP

www.phpsolmag.org 29
Fiche technique

Figure 5. Visualisation des résultats dans Hudson (Capture provenant de www.martinaspeli.net).

Mais que sont ces analyses sur le code ? C’est l’ob- complexité cyclomatique, le nombre de classes héritées
jet de ma prochaine partie. et bien d’autres. Notez que PHP_Depend est l’équiva-
lent PHP de JDepend en Java.
Analyser pour mieux régner On dispose également de PHP Mess Detector qui
Lorsque notre serveur CI est fonctionnel, il est intéres- est proche de PHP_Depend et qui lui va détecter les
sant de lui ajouter des fonctionnalités qui seront lan- portions de code mort ou encore le nombre excessif de
cées après l’exécution de nos tests et la réussite de paramètres pour une méthode. On utilisera le plugin
ceux-ci. Analyser le code source est une bonne idée. Il DRY d’Hudson pour visualiser les résultats.
existe trois niveaux d’analyse : Troisième et dernier outil, PHP Copy/Past Detector
qui va détecter la duplication de code. Un must have
• L’analyse lexicale : pour le code redondant, les er- lorsque l’on suit la logique Don’t Repeat Yourself !
reurs dans le suivi du guide de style ; Analyser notre code au niveau byte code est plus
• L’analyse syntaxique : pour les erreurs de paramè- compliqué, les outils sont moins connus et je ne m’y at-
tres, code mort, non respect de règles Objet ; tarderai pas. Pour les intéressés, voyez Vulcan Logic
• L’analyse du bytecode PHP (opcode). Disassembler, Bytekit et Bytekit-cli.
L’ensemble des outils présentés dans cette partie
Au niveau lexical, on dispose de PHP_CodeSniffer qui ne nous servent à rien si l’on ne peut pas exploiter les
va vérifier le respect de règles prédéfinies. L’utilisation indicateurs retournés. Pour visualiser les informations,
courante est d’écrire une série de règles définissant son on peut utiliser directement Hudson ou phpUnderCon-
guide de style et de valider notre code source. Si une trol mais il existe également Sonar pour PHP (Figure
portion de code ne respecte pas notre guide, PHP_Co- 6). Sonar est l’arme ultime en Java pour l’analyse de
deSniffer l’indiquera dans son rapport. Couplé à Hud- code et il est porté pour PHP, foncez ! Certaines métri-
son et à son plugin Checkstyle, nous aurons directe- ques (celles de PHP_Depend par exemple) ne seront
ment l’information. C’est très pratique lorsque plusieurs pas très explicites dans Hudson, il sera préférable de
développeurs travaillent sur un même projet et dispo- connecter PHP_Depend à Sonar et Sonar à Hudson.
sent du guide de style de l’entreprise. Dernier outil de cette partie : phpDocumentor qui
Au niveau syntaxique, PHP_Depend va nous four- va générer une documentation complète de l’applica-
nir des informations sur le niveau d’abstraction de no- tion en se basant sur les commentaires dans les sour-
tre code, le nombre moyen de méthodes par classe, la ces. Bien évidemment, si des erreurs sont présentes

30 11/2010
Industrialisation de PHP

Figure 6. Dashboard de Sonar PHP (Capture provenant de www.industrialisation-php.com).

Sur Internet
• http://symfony-project.org/ : Site officiel du framework Symfony,
• http://www.phpunit.de/ : Site du projet PHPUnit,
• http://seleniumhq.org/ : Site officiel de Selenium,
• http://www.xdebug.org/ : Site officiel de Xdebug,
• http://phpundercontrol.org/ : Site du projet phpUnderControl,
• http://hudson-ci.org/ : Site officiel du serveur d’intégration continue,
• http://pear.php.net/package/PHP_CodeSniffer : Page du projet PHP_CodeSniffer,
• http://pdepend.org/ : Site officiel de PHP_Depend,
• http://phpmd.org/ : Site officiel de PHP Mess Detector,
• https://github.com/sebastianbergmann/phpcpd : Github du projet PHP Copy/Past Detector,
• http://derickrethans.nl/projects.html : Documentation de Vulcan Disassembler Logic,
• http://www.bytekit.org/ : Site officiel de Bytekit,
• https://github.com/sebastianbergmann/bytekit-cli : Github du projet Bytekit-cli,
• http://sonar-php.sqli.com/ : Démo de Sonar pour PHP,
• http://www.phpdoc.org/ : Site officiel de phpDocumentor,
• http://git-scm.com/ : Site officiel de l’excellent gestionnaire de versions,
• https://github.com/capistrano/capistrano : Github du projet Capistrano,
• http://symfony-project.org/ : Site officiel de l’ORM PHP Doctrine,
• http://www.mantisbt.org/ : Site officiel du bug-tracker MantisBT,
• http://www.bugzilla.org/ : Site officiel du Bugzilla,
• http://www.industrialisation-php.com/ : Blog sur l’industrialisation PHP.

dans les commentaires (exemple : s’il n’y en a pas …), build.xml contenant une série d’actions possibles pou-
l’outil fera remonter l’information. vant être dépendantes les unes des autres.
La plupart de ces outils seront mis en place via Nous avons à présent totalement défini les outils
Phing, un automatiseur de tâches open source comme supplémentaires attachés à notre build. Elle est com-
peut l’être Ant en Java. On utilise un fichier XML nommé plètement configurée, les résultats des analyses sont

www.phpsolmag.org 31
Fiche technique

visibles. Nous pouvons désormais travailler en amont


et en aval de celle-ci. C’est ce qui suit.

Préparons et automatisons
Nous sommes dans une dynamique d’industrialisation,
c’est-à-dire simplifier et automatiser les processus histo-
riquement lourds et difficiles à gérer. Dans le cadre d’une
application web, fiabiliser notre code est très important
mais ne va pas directement impacter notre processus
de conception. La fiabilisation agira plutôt sur les délais
de développement et réduira les phases de débogage.
En amont de cette fiabilisation du code, nous pou-
vons mettre en place un outil très simple, très connu
mais pas toujours utilisé : le gestionnaire de versions,
permettant de conserver l’historique intégral des modi-
fications apportées à notre code. Les gestionnaires de
versions à la mode tels Git ont la notion de branches
permettant d’explorer des pistes sans pour autant per-
turber l’ensemble majeur des sources de l’application.
Tout projet devrait être versionné…
Ensuite, nous pouvons définir des environnements
de développement :

• Développement : utilisé par les développeurs avec


un maximum d’informations, de remontées d’er-
reurs, etc ;
• Test : utilisé par les outils de test et d’analyse. Cet
environnement peut voir sa configuration varier
pour améliorer le processus de tests : utiliser un
moteur de base de données différent de celui en
production pour tester la fiabilité des requêtes SQL
ou de l’ORM ;
• Pré-production : c’est l’environnement de produc-
tion répliqué à J –1, il peut être utile pour tester le
déploiement ;
• Production : c’est l’environnement client, là où nous
n’avons plus vraiment le droit à l’erreur.

Après une build réussie, nous obtenons une application


fonctionnelle. On peut alors se poser la question du pas-
sage en production : ce que l’on appelle déploiement. Figure 7. Arborescence créée par Capistrano sur chaque serveur
Des outils existent pour faciliter cette phase critique. web distant.
Capistrano est le premier. C’est un outil écrit en Ru-
by et initialement fait pour déployer des applications Ru- déployées du projet, le dossier shared contient les élé-
by On Rails. Le fonctionnement est simple : on initialise ments partagés entre toutes les releases et un lien sym-
une configuration pour un projet donné, on configure bolique current pointe sur la dernière version déployée de
nos accès serveurs, gestionnaire de versions, base de l’application. Ce système de releases permet de faire un
données, … Éventuellement, nous pouvons surcharger roll back si un problème survient lors du déploiement.
certains comportements. Capistrano sait gérer autant Enfin, Capistrano pourrait gérer les migrations des
de serveurs qu’on le souhaite, il va exécuter une suc- bases de données mais il faut faire attention.
cession de commandes sur chaque serveur : récupéra- Une migration de base de données est très criti-
tion des sources, liaison à la base de données, efface- que car elle a un impact directement sur l’intégrité des
ment des caches, rotation des logs, etc. données : une requête plante et toute la base peut être
Capistrano met en place une arborescence de fi- cassée. Pour éviter cela, on peut soit faire les migra-
chiers qui lui est propre sur chaque serveur web (Figure tions à la main, soit faire confiance à certaines appli-
7). Le dossier releases contient l’ensemble des versions cations PHP. Doctrine sait gérer les migrations et le

32 11/2010
Industrialisation de PHP

Figure 8. Schéma global de l’architecture en place (Crédit : Jean-Luc Nta)

fait plutôt bien, moyennant la relecture des scripts de matiser puis mettre en place des outils d’analyse et les
migration générés. Là encore, il faut soit être de nature automatiser. Après cela, on va pouvoir changer d’autres
confiant, soit passer les migrations à la main. phases : un gestionnaire de version pour centraliser les
Notre application est maintenant déployée, accessi- sources, différents environnements de développement,
ble aux utilisateurs finaux. Pourtant, des problèmes sur- une automatisation du processus de déploiement et une
viennent et les utilisateurs nous submergent de mails. gestion des retours clients.
Un type d’application est dédié à cette récolte de retours S’industrialiser est un fait, de nombreuses entrepri-
utilisateurs (feedbacks) : les bug-trackers ou encore ses s’y attèlent. De plus, les frameworks actuels facili-
rapporteurs d’erreurs. Les utilisateurs saisissent directe- tent les choses, les concepts agiles sont bien en phase
ment leurs mésaventures via une interface web et sont avec l’industrialisation et PHP est clairement profes-
tenus au courant par mail des avancées : demande de sionnel.
précisions, résolution, rejet, prise en compte, ... L’unique problème reste la gestion du changement,
MantisBT est une solution répandue, qui peut se qui n’est ni lié à PHP, ni lié au monde informatique mais
connecter à un serveur Hudson et recevoir des infor- intimement mêlé au genre humain. Il faudra alors prépa-
mations lorsque les erreurs sont corrigées dans une rer l’équipe aux changements, montrer l’efficacité et la
build. Il existe également Bugzilla utilisé par Mozilla, nécessité de s’industrialiser. Une industrialisation réussie
plus complet et donc moins simple à prendre en main. est une industrialisation convaincante et performante.

Conclusion
Après cette introduction qui présente de nombreux William DURAND
outils, que pouvons-nous en retenir ? Premièrement L’auteur est élève ingénieur et développeur web indépendant spéc-
que nous disposons de beaucoup d’outils et qu’il ne ialisé dans le développement PHP avec le framework Symfony et Ja-
reste qu’à s’en servir. Il existe un bon nombre d’articles va depuis près de deux ans. Il est également fondateur de Bazinga,
techniques sur le sujet. une agence spécialisée en développement web et rythmée par les
La progression décrite ici est une logique d’indus- pratiques agiles.
trialisation : commencer par écrire des tests, les auto- Contact direct : http://www.willdurand.fr

www.phpsolmag.org 33
Pratique

Internationaliser
une application CakePHP
L’internationalisation d’une application ou d’un site web
consiste à fournir un contenu dans différentes langues
en permettant à l’utilisateur de changer de langue simplement,
mais aussi d’améliorer son référencement local afin de toucher
plus de visiteurs. Cela implique bien souvent une gestion
différente des données dynamiques en base de données...

Cet article explique : Ce qu'il faut savoir :


• La gestion de la traduction des chaînes statiques. • Être à l'aise avec le fonctionnement de CakePHP : routes, clas-
• Une stratégie de gestion des urls facilitant la détection auto- se Configure, modèles, plugins.
matique de la langue et permettant de proposer des urls spéc- • Utiliser le shell cake en ligne de commande.
ifiques à chaque langue.
• Les bases de la création de modèles contenant des informa-
tions multilingues.

n framework permet de simplifier considérable- par exemple un fichier de langue par plugin) ou de dé-

U ment le processus d’internationalisation, mais


chacun a ses spécificités. Internationaliser une
application existante peut s’avérer complexe et laborieu-
finir la Catégorie des données affichées (similaires aux
valeurs PHP LC_ALL, LC_NUMERIC, LC_TYPE...). Le Lis-
ting 1 donne quelques exemples de fonctions gettext.
se si l’implémentation initiale ne suit pas certains princi- Remarque : si aucune correspondance n’est trou-
pes … il vaut donc mieux en tenir compte dès le départ ! vée, le texte passé en paramètre est affiché / retourné.
Cet article vous présentera les principales étapes Si votre site n’est pas multilingue, il est tout de même re-
d’internationalisation d’une application utilisant le fra- commandé (et peu contraignant) d’utiliser les fonctions
mework CakePHP. gettext pour vos chaînes. En effet, cela vous fera ga-
gner un temps très important le jour où vous voudrez
Internationaliser les chaînes statiques. réutiliser du code dans une application internationalisée
Les fonctions gettext
Les fonctions gettext de CakePHP sont des fonctions
accessibles depuis n’importe quelle classe et fichier
de votre application : Modèles, Contrôleurs, Vues, Hel-
pers... Elles vous permettent d’afficher une chaîne de
caractère statique en fonction de la langue courante.
CakePHP va charger le fichier de traduction (voir ci-
dessous la gestion des fichiers *.po) correspondant à la
langue courante de votre application et retourner la tra-
duction de la chaîne s’il la trouve dans le fichier.
Par exemple, le code __(‘Hello world’); affiche-
ra Hello world si la langue actuelle est l’Anglais, mais
affichera Bonjour monde si c’est le Français et que vous
avez créé la traduction correspondante.
Il y a de nombreuses variantes de cette fonction,
vous permettant notamment de gérer le singulier / plu- Figure 1. Arborescence des fichiers de langue d’une application
riel, de grouper des chaînes par domaine (pour avoir CakePHP

34 11/2010
CakePHP

ou tout simplement internationaliser votre application


Listing 1. Exemples d'appels aux fonction gettext et résultats
existante !
en langue française

Gestion des fichiers de traduction _ _ ('Hello world'); // Affichera "Bonjour monde"


_ _ ('Hello world', true); // Retournera "Bonjour
Organisation des fichiers monde"
Comme vous avez pu le comprendre, l’intérêt de l’utilisa- _ _ n('Hello world', 'Hello worlds', $count); //
"Bonjour monde" ou "Bonjour mondes" suivant la valeur
tion des fonctions gettext est qu’il vous permettra de gé- de $count
_ _ d('mon-plugin', 'Hello world'); // Afficherait
rer les traductions de vos chaînes dans des fichiers ex- "Bonjour monde du plugin" (fichier "mon-plugin.po")
ternes. CakePHP se base sur l’utilisation de fichiers *.pot _ _ c('January', 5); // Afficherait "Janvier" (fichier
(catalogue) et *.po (traductions) qui sont des formats de "LC _ TIME/default.po")
// Il existe différentes combinaisons possibles. Par
fichiers très répandus pour la gestion de traductions. exemple :
La Figure 1 illustre l’arborescence des fichiers de lan- _ _ dcn('mon-plugin', 'Monday', 'Mondays', $count, 5,
true); // Retournerait "Lundi" si $count = 1 (fichier
gues tels qu’ils sont organisés dans une application Ca- "LC _ TIME/mon-plugin.po");
kePHP. Tous les fichiers sont regroupés dans le dossier
/locale de l’application. Les fichiers *.pot sont à la ra- Listing 2. Trace d'exécution d'un shell cake i18n extract
cine du dossier et contiennent le catalogue des chaînes mac-mini:phpsol pierremartin$ cake i18n extract
de caractères existantes. Les catalogues ne contiennent Welcome to CakePHP v1.3.6 Console
------------------------------------------------------
pas de traduction, mais sont utilisés comme point de ré- ---------
férence pour la génération des fichiers *.po. App : phpsol
Path: /Users/pierremartin/www/phpsol
Ces derniers contiennent une correspondance en- ------------------------------------------------------
tre la chaîne originale (décrite dans le catalogue) et sa ---------
What is the full path you would like to extract?
traduction dans une langue donnée. Ils sont organisés Example: /Users/pierremartin/www/myapp
dans des sous-dossiers ayant le code de la langue de [Q]uit [D]one
[/Users/pierremartin/www/phpsol] >
traduction (par exemple «fre» pour la langue Françai-
se), et ensuite par catégorie de chaîne (LC_MESSAGES What is the full path you would like to extract?
Example: /Users/pierremartin/www/myapp
par défaut) [Q]uit [D]one
[D] >
Remarque : il existe plusieurs outils permettant l’édi-
tion des fichiers de traduction. Bien qu’un simple éditeur What is the full path you would like to output?
de texte suffise, nous vous recommandons l’utilisation Example: /Users/pierremartin/www/phpsol/locale
[Q]uit
du logiciel Open Source PoEdit (http://poedit.net). [/Users/pierremartin/www/phpsol/locale] >
Génération des fichiers *.pot Would you like to merge all domains strings into the
L’extraction des chaînes de votre application est l’éta- default.pot file? (y/n)
pe consistant à générer un ou plusieurs fichiers *.pot
[n] >

contenant les chaînes statiques utilisées dans votre ap- Extracting...

plication. Cette opération est très laborieuse à faire ma-


------------------------------------------------------
---------
nuellement, en revanche CakePHP fournit une applica- Paths:
/Users/pierremartin/www/phpsol
tion en mode console (un shell) vous permettant de le Output Directory: /Users/pierremartin/www/phpsol/
faire très facilement. locale/
------------------------------------------------------
Pour l’utiliser, il vous suffit d’exécuter la commande ---------
cake i18n extract et de vous laisser guider par les Processing /Users/pierremartin/www/phpsol/app _
controller.php...
questions qui vous seront posées. Le Listing 2 contient [...]
une trace d’exécution du shell d’extraction des chaînes
Error: default.pot already exists in this location.
de caractère d’une application phpsol. Overwrite? [Y]es, [N]o, [A]ll (y/n/a)
[y] >

Détection et choix de la langue


Done.

Principes de base Listing 3. Configuration de la langue courante avec détection


Configuration de la langue courante de la langue de l'utilisateur
La configuration de la langue actuelle que doit utiliser if (!class _ exists('L10n') {
CakePHP se fait par le biais de la clé Config.lang App::import('Lib', 'L10n');
de la classe Configure. Le framework n’implémente
}

pas de stratégie par défaut pour le choix de la langue, $L10n = new L10n();

et c’est au développeur de mettre en place la solution $currLang = $L10n->get(); // Configurera


adaptée à ses besoins. automatiquement "Config.lang"

Il est recommandé de déterminer la langue actuelle debug($currLang); // Au besoin vous pouvez utiliser
grâce à l’url, soit par l’utilisation de sous-domaine soit cette valeur pour votre propre logique

par un paramètre de l’url. Le code ci-après présente

www.phpsolmag.org 35
Pratique

plication. Elle permet notamment de définir la langue pré-


Listing 4. Implémentation de base d'une route permettant
férée de l’utilisateur comme langue courante. Le Listing 3
la gestion des urls internationalisées
montre comment déterminer la langue de l’utilisateur.
App::import('Core', 'Router'); Remarque : dans le cas où la langue de l’utilisa-
class I18nRoute extends CakeRoute {
teur ne peut pas être déterminée, c’est la valeur de la
public function _ _ construct($template, $defaults = constante DEFAULT_LANGUAGE qui sera utilisée. Il est
array(), $options = array()) {
// Ajoute une contrainte sur les codes de langue donc conseillé de la définir dans le fichier /config/
corrects pour le préfixe bootstrap.php.
$options = array _ merge((array)$options, array(
'lang' => implode('|', Configure::read('Config.
languages')),
));
Utilisation des routes pour un peu de magie...
parent:: _ _ construct($template, $defaults, Limites des implémentations les plus utilisées
$options);
}
Il y a différentes approches existantes pour déterminer
et configurer la langue actuelle dans une application.
public function match($url) {
// Ajoute la langue courante en tant que
Ce problème se résout facilement si le site utilise des
paramètre pour l'url générée sous-domaines ou des domaines différents pour cha-
if (empty($url['lang'])) {
$url['lang'] = Configure::read('Config.language');
que langue (dans ce cas il suffit de définir la langue
} courante en fonction de l’url de base). En revanche cela
}
return parent::match($url);
s’avère plus complexe dans cas où le paramètre est
propagé dans l’url : http://exemple.com/ (version anglai-
public function parse($url) {
$params = parent::parse($url); se du site), http://exemple.com/fre (version française du
// Configure la langue courante en fonction du site) …
Il existe différentes implémentations pour cette si-
paramètre de l'url
if ($params !== false && array _ key _
exists('lang', $params)) { tuation, les principales étant :
Configure::write('Config.language',
$params['lang']);
} • la détection de la langue courante dans
return $params;
} AppController::beforeFilter() et la surcharge
} de AppHelper::url() pour ajouter automatiquement
Listing 5. Configuration des langues de l'application dans le code de langue à chaque lien généré dans la vue,
le bootstrap • l'extension du Router de CakePHP afin de traiter
cette problématique à la racine.
define('DEFAULT _ LANGUAGE', 'fre');
Configure::write('Config.languages', array('eng', 'spa');
La première solution est la plus répandue, mais po-
Listing 6. Modification / Configuration des routes dans config/
se des problèmes pour propager le code de la lan-
routes.php
gue notamment lors de l’utilisation de Controller::
App::import('Lib', 'I18n.I18nRoute'); redirect(). De plus la configuration de la langue est
Router::connect(
'/', effectuée assez tard dans le processus de dispatch de
array('controller' => 'pages', 'action' => 'display',
'home'),
l’url, ce qui peut notamment poser des problèmes pour
array('routeClass' => 'I18nRoute')); les chaînes de caractères déclarées dans les modèles
// Cette route contiendra le code de langue en milieu
(messages de validation par exemple).
d'url (/pages/eng/* au lieu de /eng/pages/* par défaut) La seconde est celle qui est implémentée dans le
Router::connect(
'/pages/:lang/*',
CMS Croogo (http://croogo.org). Elle est assez effica-
array('controller' => 'pages', 'action' => 'display'), ce, mais la quantité de code à maintenir est assez im-
array('routeClass' => 'I18nRoute'));
portante et l’implémentation dépend fortement du cœur
// Appels permettant une configuration complète des routes du framework (ce qui peut poser des problèmes en cas
de mises à jour par exemple).
I18nRoute::connectDefaultRoutes();
I18nRoute::promoteLangRoutes();
L’implémentation que nous détaillerons par la suite
se base sur une nouvelle fonctionnalité apportée par la
une manière simple pour définir la langue courante en version 1.3 du framework : les routes personnalisées.
fonction des paramètres de la requête :
Routes personnalisées
Configure::write(‘Config.lang’, $this->params Les routes sont utilisées dans CakePHP pour faire un
[‘named’][‘lang’]); mapping entre l’url courante et le trio contrôleur / action /
paramètres qui seront exécutés. A l’inverse, elles sont aus-
Détection automatique de la langue de l’utilisateur si utilisées pour convertir un tableau représentant ce trio
CakePHP fournit une classe L10n contenant diverses en une url correcte. Elles permettent ainsi de centraliser
méthodes utiles dès que l’on souhaite localiser son ap- la gestion des urls (dans le fichier /config/routes.php)

36 11/2010
CakePHP

et de modifier très simplement le schéma d’urls utilisé


Listing 7. Utilisation des callbacks des Modèles pour manipuler
par votre application.
des contenus spécifiques à une langue
CakePHP depuis sa version 1.3 donne la possibilité
au développeur d’étendre la classe de route par défaut public function beforeFind($query) {
if (empty($query['conditions'][$this->alias.
du framework pour ajouter de la logique personnalisée. '.lang')) {
$language = Configure::read('Config.language');
Cette classe étant assez bas niveau dans l’architecture $query['conditions'][$this->alias . '.lang'] =
du framework, elle est appelée très tôt dans le proces- $language;
sus de dispatch … ce qui en fait un très bon endroit }
return $query;
pour la gestion du changement des langues. }
Les deux principales méthodes que doit implémenter public function beforeSave() {
une route sont : match() pour générer une url à partir d’un if (empty($this->data[$this->alias][$this-
tableau (trio contrôleur / action / paramètres), et parse() >primaryKey]) && empty($this->data[$this-
>alias]['lang'])) {
pour parser une url et générer le trio correspondant. Le $this->data[$this->alias]['lang'] = Configure::
Listing 4 présente une implémentation simple de ce prin-
read('Config.language');
}
cipe. Heureusement pour nous, il existe une version tes- return true;
tée et améliorée de cette route … en Open Source ! La
}

partie suivante explique comment l’utiliser. Listing 8. Configuration d'un Modèle Article pour utiliser le
TranslateBehavior
Utilisation du plugin i18n de CakeDC class Article extends AppModel {
Le plugin i18n proposé par CakeDC est un plugin Open public $actsAs = array(
Source (licence MIT) contenant notamment une route
'Translate' => array('titre', 'contenu')
);
permettant de gérer la langue actuelle par l’url grâce }

à une route personnalisée, comme présenté dans la


section précédente.
Voici comment l’utiliser étape par étape, c’est assez
simple : Le plugin i18n
Nous avons illustré l’utilisation de la route personnalisée
1. Téléchargez le plugin (https://github.com/cake- fournie par le plugin i18n de CakeDC, mais sachez que ce
dc/i18n) et ajoutez les fichiers dans le dossier / plugin contient d’autres classes utiles pour la création de si-
plugins/i18n de votre application. tes multilingues. Nous vous invitons à regarder ce que pro-
2. Configurez les langues de votre application dans pose le plugin (Google Translate, I18nableBehavior...).
le fichier /config/bootstrap.php – il est conseillé
de définir une langue par défaut séparément des
autres langues disponibles (voir Listing 5). Internationalisation des contenus
3. Modifiez vos routes existantes dans le fichier / dynamiques
config/routes.php pour utiliser la route personna- L’internationalisation d’une application ne se limite pas
lisée I18nRoute fournie par le plugin. Par défaut le à la traduction de chaînes statiques dans la langue de
code de la langue sera ajouté en début d’url (exem- l’utilisateur. Il faut le plus souvent également gérer les
ple: http://exemple.com/spa/articles/view/4) mais contenus dynamiques ou publiés par les utilisateurs soit
vous pouvez choisir vous même son emplacement gérés par les administrateurs.
avec le paramètre nommé :lang (voir le Listing 6). Cette section propose des solutions à ces problé-
4. Appelez la méthode I18nRoute::promoteLangRoutes() matiques.
en fin de fichier. Ceci est nécessaire pour rétablir l’or-
dre correct des routes déclarées (il serait assez long Contenus spécifiques à une langue
et peu utile d’expliquer la raison exacte dans cet ar- Prenons le cas d’une base de données partagée entre
ticle car cela touche au fonctionnement interne du les différentes langues du site, mais dont les contenus
framework). Il est également nécessaire d’appeler la postés par les utilisateurs ne doivent être affichés que
méthode I18nRoute::connectDefaultRoutes(); si sur l’interface correspondant à une seule des langues.
vous souhaitez configurer les routes par défaut du fra- Par exemple, un commentaire posté par un utilisateur
mework pour utiliser ce schéma d’url (voir le Listing 6). sur la version Française du site sera visible uniquement
sur la version Française.
C’est tout ce qu’il faut pour mettre en place très simple- La solution la plus simple est d’ajouter un champ
ment la gestion de différentes langues sur votre site ! lang dans la table commentaires afin de stocker la lan-
Pour rediriger l’utilisateur vers une page dans une langue gue dans laquelle est le contenu.
différente (par exemple en anglais), il suffira d’ajouter le Les callbacks du modèle peuvent être utilisés pour
paramètre ‘lang’ => ‘eng’ au tableau décrivant l’url. remplir automatiquement le champ avec la langue

www.phpsolmag.org 37
Pratique

1. Créez la table i18n : il suffit simplement de lancer


Sur Internet la commande cake i18n initdb dans un shell de-
puis la racine de votre application.
• https://github.com/cakedc/i18n – Le plugin i18n de Ca-
keDC (licence MIT), 2. Supprimez les champs superflus de votre schéma
• http://book.cakephp.org/fr/view/1328/Translate – Docu- actuel. Vous n’aurez plus besoin d’avoir les champs
mentation du TranslateBehavior, multilingues dans la table utilisée par le Modèle.
• http://www.poedit.net/ – Site web du logiciel POEdit po- Dans notre exemple nous supprimerons les champs
ur l’édition de fichiers de traduction, articles.titre et articles.contenu de notre ba-
• http://www.cakephp-fr.org – Site de la communauté fran-
se de données.
cophone de CakePHP (forums …),
• contact@pierre-martin.fr – Adresse de l’auteur de l’article 3. Ajoutez le comportement Translate dans votre Mo-
pour toutes questions ou remarques. dèle, en le configurant avec la liste des champs
multilingues. Le Listing 8 illustre cette configuration
dans le cas de notre exemple.
courante lors d’une sauvegarde, et ajouter une condi-
tion avant chaque recherche. Le Listing 7 illustre cette Dorénavant le titre et le contenu des Articles seront sau-
implémentation. vegardés dans la table i18n, avec des informations sur
Remarque : Cette implémentation peut bien sûr être la langue utilisée. CakePHP fera ensuite les jointures
améliorée et rendue générique. Le plugin i18n mention- nécessaires pour retourner les traductions correctes en
né précédemment propose par exemple le comporte- fonction de la langue configurée dans l’application.
ment I18nableBehavior qui répond à cette probléma- Remarque : l’utilisation d’une seule table d’interna-
tique. tionalisation peut poser des problèmes de performance
lorsque la quantité de données stockées augmente. Heu-
Contenus multilingues reusement il est possible de définir des tables différentes
Abordons enfin le cas de contenus dynamiques devant pour stocker les traductions de chaque modèle dans des
être disponibles dans plusieurs langues. Par exemple tables séparées grâce aux attributs $translateModel
un CMS proposant à l’administrateur d’administrer les et $translateTable du Modèle multilingue.
pages pour chacune des langues du site. Attention : il existe une limite connue de cette im-
Il y a en général plusieurs implémentations possi- plémentation, due au fonctionnement interne de Cake-
bles pour ce type de problématique : PHP. Les callbacks des comportements ne sont pas
appelés pour les modèles associés durant la récupéra-
• la création de plusieurs champs en base de don- tion de données. Il faudra donc implémenter leur appel
née pour chaque langue (exemple : titre _ fr, de manière manuelle … nous n’entrons volontairement
titre _ en), pas dans les détails, mais sachez que c’est possible !
• la duplication des entrées, avec un code de langue
différent pour chacune (voir la section précédente Conclusion
sur la gestion des contenus spécifiques à une lan- Nous avons donc vu quelles étaient les principales éta-
gue), pes et techniques pour internationaliser une application
• l'externalisation des champs multilingues dans une CakePHP. Le framework propose des outils permettant
table différente. de faciliter la tâche du développeur, et la communauté
propose également des ressources dans ce sens.
C'est cette dernière implémentation qui est supportée Que vos besoins soient simples (traduction de l’in-
de base par CakePHP grâce au TranslateBehavior. terface d’un site) ou plus complexes (détection automa-
En effet, ce comportement permet de sauvegarder tique de la langue, contenus multilingues) il suffira en
et de retrouver les informations de chaque contenu de règle générale de quelques lignes de code pour attein-
manière transparente … celles-ci étant stockées dans dre votre but, dans le cas où votre application respecte
une table séparée. les quelques principes de bases présentés ici.
Note : Par souci de concision, nous ne détaillerons
pas les différentes options disponibles et invitons le lec-
teur à se rendre sur la documentation du framework pour Pierre Martin
aller plus loin (http://book.cakephp.org/fr/view/1328/ Pierre Martin est développeur web, expert CakePHP au sein de
Translate). la société CakeDC. Passionné de programmation, il s’est spécia-
Voici les principales étapes pour l’utilisation du lisé dans le développement web en parallèle de ses études avec
TranslateBehavior et rendre multilingue un modè- une activité de développeur web indépendant durant deux années,
le existant. Nous utiliserons l’exemple d’un modèle avant d’intégrer CakeDC. Il travaille désormais à plein temps autour
Article dont nous voulons rendre les champs titre du framework pour des clients internationaux, et est un membre
et contenu multilingues. actif de la communauté francophone de CakePHP.

38 11/2010
CakePHP

www.phpsolmag.org 39
Pour les débutants

SQL :
langage de manipulation des données
Les bases de données sont très utilisées dans les applications
Web. La création, l’interrogation et la manipulation
des données de la base sont réalisées en SQL. Dans cette série
d’articles vous apprendrez le langage SQL ainsi que les bases
nécessaires pour communiquer avec une base de données
à partir d’un script PHP.

Cet article explique : Ce qu’il faut savoir :


• Comment insérer des données. • Aucun prérequis.
• Comment les mettre à jour ou les supprimer.
• Comment les afficher.

D
ans l’article précédent, sur le langage de défi- Insérer une ligne de données
nition des données, vous avez appris à créer La commande SQL INSERT permet d’insérer des don-
une base et des tables. Vous allez maintenant nées dans une table. Il faut préciser le nom de la table
apprendre à insérer des données dans cette base, à les et éventuellement la liste des colonnes dans lesquelles
modifier ou à les supprimer tout en tenant compte des les données vont être insérées. La première valeur in-
contraintes établies. diquée sera liée au nom de la première colonne listée,
Pour appliquer les notions présentées, vous devez uti- la seconde valeur à la seconde colonne, etc... La com-
liser un serveur de base de données MySQL, de préféren- mande suit la syntaxe :
ce la version 5, un serveur web avec PHP version 5 et le
client graphique phpMyAdmin. Les distributions XAMPP INSERT INTO nom _ table (col1, col2, ...)
(Windows, Linux, Mac OS), WAMP (Windows), EasyPHP VALUES (val1, val2, ...);
(Windows) ou MAMP (Mac OS) vous fourniront l’environ-
nement de travail nécessaire. Type de données
Dans cet article, nous allons utiliser l’exemple d’une Lorsque la valeur insérée est de type chaîne de carac-
bibliothèque privée dont le schéma est représenté par tères, il faut indiquer la valeur entre quotes. Par exem-
la Figure 1. Le Listing 1 donne les instructions SQL de ple, pour insérer un nom dans la colonne nom de la table
création de tables. auteur, la valeur 'Tolkien' est utilisée. Les nombres

Figure 1. Schéma de la base de données biblio

40 11/2010
SQL

sont entrés tels quels. Par exemple, la colonne clé pri- Listing 1. Création tables
maire id_auteur prend la valeur 7. Les dates doivent
-- selectionner la base de travail
suivre un format prédéfini (YYYY-MM-DD) et être écrites USE biblio;
entre quotes. Tolkien est né un 03 janvier 1892 ce qui
-- creer les tables
se traduit en MySQL par : '1892-01-03'. Pour signaler CREATE TABLE zone (
l’absence d’information, il suffit d’utiliser la valeur NULL, code _ zone CHAR(10) NOT NULL,
piece VARCHAR(20),
sans quotes afin qu’elle ne soit pas considérée comme meuble VARCHAR(20),
une chaîne de caractères, comme dans l’exemple sui- CONSTRAINT pk _ zone PRIMARY KEY (code _ zone)
)ENGINE = InnoDB;
vant :
CREATE TABLE livre (
isbn CHAR(20) NOT NULL,
INSERT INTO auteur (id _ auteur, nom, titre VARCHAR(30) NOT NULL,
prenom, date _ naissance) VALUES genre ENUM('roman','policier','theatre','historique',
'fantastique'),
(7,'Tolkien',NULL,'1892-01-03'); date _ parution INTEGER,
langue ENUM('francais','anglais','allemand','espagnol',
'chinois') DEFAULT 'francais',
La valeur NULL ne doit pas être confondue avec la chaî- nb _ pages INTEGER UNSIGNED,
ne vide ou le chiffre 0. Elle est utilisée pour symboliser preface ENUM('oui','non'),
code _ zone CHAR(10),
l’absence d’information. CONSTRAINT pk _ livre PRIMARY KEY (isbn),
CONSTRAINT fk _ zone FOREIGN KEY (code _ zone)
REFERENCES zone(code _ zone) ON DELETE SET NULL ON
Ordre d’insertion UPDATE CASCADE
Si toutes les colonnes sont renseignées, il n’est pas né- )ENGINE = InnoDB;

cessaire de les lister dans la commande. Dans ce cas, CREATE TABLE auteur (
il faut donner les valeurs dans l’ordre de déclaration des id _ auteur INTEGER NOT NULL AUTO _ INCREMENT,
nom VARCHAR(45) NOT NULL,
colonnes. Par exemple, dans la table auteur, l’instruc- prenom VARCHAR(45),
tion suivante est équivalente à celle proposée ci-des-
date _ naissance DATE,
CONSTRAINT pk _ auteur PRIMARY KEY (id _ auteur)
sus : )ENGINE = InnoDB;

CREATE TABLE ecrit (


INSERT INTO auteur VALUES isbn CHAR(20) NOT NULL ,
id _ auteur INTEGER NOT NULL ,
(7,'Tolkien',NULL,'1892-01-03'); CONSTRAINT pk _ ecrit PRIMARY KEY (isbn, id _ auteur) ,
CONSTRAINT fk _ livre FOREIGN KEY (isbn) REFERENCES
livre (isbn) ON DELETE CASCADE ON UPDATE CASCADE,
Lister le nom des colonnes permet d’insérer des valeurs CONSTRAINT fk _ auteur FOREIGN KEY (id _ auteur )
dans un ordre différent de celui de la déclaration dans REFERENCES auteur (id _ auteur) ON UPDATE CASCADE
)ENGINE = InnoDB;
la table. L’exemple suivant est équivalent aux deux re-
quêtes précédentes :
Tableau 1. Contenu de la table ZONE
INSERT INTO auteur (nom, prenom, id _
auteur, date _ naissance) VALUES code_zone piece meuble
('Tolkien',NULL,7,'1892-01-03'); c10 chambre armoire en pin
c20 chambre armoire en pin
Clés primaires et uniques
s8 salon bibliotheque noire
La déclaration d’une colonne comme clé primaire ou uni-
c5 chambre bibliotheque grise
que implique qu’elle ne peut pas contenir deux valeurs
identiques. Toute requête dans ce sens sera rejetée. L’ins-
truction suivante cherche à entrer un autre auteur ayant 7 ne la plus proche d’un champ numérique, ou tronque
comme clé primaire ce qui provoquera une erreur : les chaînes de caractères. Pour éviter cela, il faut indi-
quer que le mode du SGBD doit être strict (sql_mode
INSERT INTO auteur VALUES = strict_all_tables). Par exemple, l’insertion d’un
(7,'Hugo','Victor','1802-02-26'); nombre de pages négatif dans la table livre enregis-
#1062 - Duplicate entry '7' for key 'PRIMARY' trera la valeur 0 par défaut ou refusera l’insertion en
mode strict :
Limite de champs
Lors de l’insertion d’une valeur qui sort des limites auto- INSERT INTO livre (isbn, titre, gen-
risées par le domaine du champ et ses contraintes, le re, date_parution, langue, nb_pa-
SGBD doit refuser l’opération. Le comportement de ges) VALUES ('102-2-35419-5','Les four-
MySQL dépend du mode défini dans le fichier de confi- mis','roman',1991,'francais',-300);
guration (my.ini ou my.cnf selon le système d’exploita- #1264 - Out of range value for column 'nb_pa-
tion). Par défaut, MySQL attribue la valeur de la bor- ges' at row 1

www.phpsolmag.org 41
Pour les débutants

Tableau 2. Contenu de la table LIVRE

isbn titre genre date_parution langue nb_pages preface code_zone


128-5-56985-5 Fall of giants historique 2010 anglais 255 oui c20
598-5-55596-2 Notre Dame de Paris roman 1831 francais 123 non s8
102-2-35419-5 Les fourmis roman 1991 francais 300 NULL c10
523-5-65472-9 David Copperfield roman 1850 anglais 458 oui s8
320-2-02365-5 Le bourgeois gentilhomme theatre 1670 francais 152 NULL NULL
152-5-55695-2 Le seigneur des anneaux fantastique 1954 francais NULL NULL NULL

Tableau 3. Contenu de la table ZONE après mise à jour


l'insertion enregistrera une chaîne vide. Par exem-
code_zone piece meuble ple, dans la table livre, c'est le cas de la colonne
c20 chambre armoire en pin titre . Nous travaillons ici en mode strict. L'instruc-
s11 salon bibliotheque noire tion suivante va donc générer une erreur :
c5 chambre bibliotheque grise
INSERT INTO livre (isbn, genre, date _
parution, nb _ pages, code _ zone) VALUES
Insérer un sous-ensemble de données ('598-5-55596-2','roman',1831,123,NULL);
Pour ne renseigner qu’un sous-ensemble de colonnes, #1364 - Field 'titre' doesn't have a default
il suffit de les lister dans la commande INSERT. Les va- value
leurs non renseignées seront gérées automatiquement
par le SGBD : un nouveau numéro en cas d'auto incré- Auto incrément
mentation, NULL, une valeur prédéfinie par défaut lors Lorsqu’une colonne numérique a un auto incrément, elle
de la création de la table... n’a pas à être renseignée. L’insertion d’une nouvelle ligne
provoque l’ajout automatique d’une valeur dans la colon-
Valeur par défaut ne. Celle-ci est égale à l’entier immédiatement supérieur
Si une valeur par défaut a été attribuée à une colonne à la valeur maximale de la colonne. Dans la table auteur,
lors de la création de la table, cette valeur sera utilisée si la colonne id_auteur est auto incrémentée. L’instruction
la colonne n’est pas renseignée. Dans la table livre, la suivante génère donc un identifiant automatiquement :
colonne langue prend la valeur 'francais' par défaut.
Aussi, si aucune langue n’est définie dans l’instruction, INSERT INTO auteur (nom, prenom, date _
la valeur prise par le champ langue sera le français : naissance) VALUES ('Hugo','Victor','1802-02-26');

INSERT INTO livre (isbn, titre, genre, Clé primaire


date_parution, nb_pages, code_zone) Une colonne référencée comme clé primaire doit obli-
VALUES ('320-2-02365-5','Le bourgeois gatoirement être renseignée (sauf si elle est auto incré-
gentilhomme','theatre',1670,152,NULL); mentée). Une instruction qui omet d’entrer une clé pri-
maire provoque une erreur. Si le numéro ISBN d’un livre
Null / Not null n’est pas indiqué, l’insertion est refusée :
Les colonnes non renseignées prendront automatique-
ment la valeur NULL sauf si une autre valeur par défaut INSERT INTO livre (titre, genre, date_parution,
a été définie. Par exemple, pour insérer un livre dont langue, nb_pages, code_zone) VALUES ('David
le nombre de pages, la présence de préface et le code Copperfield','roman',1850,'anglais',458,NULL);
zone sont inconnus, la requête suivante mettra auto- #1364 - Field 'isbn' doesn't have a default va-
matiquement la valeur NULL dans le champ nb_pages, lue
preface et code_zone de la table livre :
Insérer avec phpMyAdmin
INSERT INTO livre (isbn, titre, L’interface web phpMyAdmin permet d’insérer des don-
genre, date _ parution, langue) VALUES nées dans la base sans avoir de connaissances SQL.
('152-5-55695-2','Le seigneur des Elle présente l’avantage d’afficher la requête d’insertion
anneaux','fantastique',1954,'francais'); après exécution de cette dernière. Ceci permet de for-
muler des requêtes qui pourront être adaptées et utili-
Attention, si la colonne concernée a été déclarée sées dans un script PHP.
comme NOT NULL, l'insertion sera rejetée si le SG- Pour insérer des données dans une table, il faut
BD a bien été placé en mode strict. Le cas échéant, sélectionner la table en cliquant sur son nom dans le

42 11/2010
SQL

Tableau 4. Contenu de la table LIVRE après mise à jour

isbn titre genre date_parution langue nb_pages preface code_zone


128-5-56985-5 Fall of giants historique 2010 anglais 255 oui c20
598-5-55596-2 Notre Dame de Paris roman 1831 francais 123 non s11
102-2-35419-5 Les fourmis roman 1991 francais 300 NULL s11
523-5-65472-9 David Copperfield roman 1850 anglais 458 oui s11
320-2-02365-5 Le bourgeois gentilhomme theatre 1670 francais 152 NULL NULL
152-5-55695-2 Le seigneur des anneaux fantastique 1954 francais NULL NULL NULL

cadre de gauche de l’interface. Le formulaire d’insertion est sous-ensemble de lignes, il faut utiliser la clause WHERE
disponible à partir de l’onglet Insérer dans le cadre droit (Fi- suivie d’une condition. Seules les lignes qui satisfont
gure 2). Une fois le formulaire soumis, la requête est géné- la condition sont modifiées. Par exemple, pour mettre
rée automatiquement, affichée et envoyée à MySQL. à jour seulement les livres en français :

Extraire des données UPDATE livre SET date _ parution = date _


La commande SELECT extrait des données de la base. parution + 1 WHERE langue = 'francais';
Dans cet article, vous allez apprendre à afficher toutes
les données d’une table. Dans les prochains numéros, Pour changer le genre du livre Les fourmis, il est pos-
vous verrez comment restreindre l’affichage des don- sible d’utiliser la commande suivante :
nées et comment réaliser des jointures entre plusieurs
tables. Pour afficher toutes les données d’une table, la UPDATE livre SET genre = 'fantastique' WHERE
commande suit la syntaxe suivante : titre = 'Les fourmis';

SELECT * FROM nom _ table; Si plusieurs livres portaient ce nom dans la base, le gen-
re aurait été modifié pour chacun. Pour éviter cette si-
Pour afficher la liste des auteurs enregistrés dans la base, tuation, il vaut mieux utiliser la clé primaire de l’ouvrage
il suffit de taper la commande suivante dans la console : car elle identifie une seule et unique ligne de la table :

SELECT * FROM auteur; UPDATE livre SET genre = 'fantastique' WHERE


isbn ='102-2-35419-5';
Si vous utilisez phpMyAdmin, il faut cliquer sur le nom
de la table dans le cadre de gauche (Figure 3). Lors de mises à jour, MySQL indique le nombre de li-
Cette opération permet de vérifier que les insertions gnes qui satisfont la condition (Rows matched) et le
se sont bien déroulées. nombre de modifications effectuées (Changed). La mi-
se à jour peut échouer dans plusieurs cas : la valeur
Mettre à jour des données ne correspond pas au type de données attendu, la va-
Une fois les données insérées dans les tables, elles leur viole une contrainte (clé primaire, clé unique, clé
peuvent être modifiées grâce à la commande UPDATE. étrangère), … Attention, si vous n’êtes pas en mode
Celle-ci permet la modification d’une ou plusieurs lignes strict, l’attribution de valeurs hors des bornes autori-
d’une table. Il est possible d’indiquer les nouvelles va- sées peut entraîner l’enregistrement de fausses don-
leurs pour plusieurs colonnes en les séparant par des nées (cf Insérer une ligne de données >>> Limite de
virgules : champs).
Dans phpMyAdmin, lorsque vous avez affiché la lis-
UPDATE nom_table SET col1 = val1 [, col2 = te des données de la table, vous pouvez en modifier
val2, ...]; le contenu en cliquant sur l’icône en forme de crayon
(Figure 3). Un formulaire identique à celui de l’insertion
Pour ajouter un an aux dates de parution des livres, il est affiché pré rempli avec les valeurs de la ligne sé-
faut utiliser la commande : lectionnée. L’envoi du formulaire génère et affiche une
requête UPDATE.
UPDATE livre SET date_parution =
date_parution + 1; Supprimer des données
La commande SQL DELETE permet de supprimer des
Toutes les lignes de la table livre seront concernées lignes dans une table. Pour restreindre la suppression,
par la mise à jour. Pour restreindre la modification à un il faut indiquer une condition.

www.phpsolmag.org 43
Pour les débutants

Figure 2. PhpMyAdmin : formulaire d’insertion et de modification

Figure 3. PhpMyAdmin : liste des données de la table zone

DELETE FROM nom _ table [WHERE condition]; et livre comporteront les valeurs définies dans les
tableaux 1 et 2.
Pour effacer le livre Notre Dame de Paris, il faut utili- Ainsi, l’attribution de la zone s10 au livre Les four-
ser la commande : mis est refusée car le code_zone n’existe pas dans la
table zone :
DELETE FROM livre WHERE isbn = '598-5-55596-2';
UPDATE livre SET code_zone = 's10' WHERE isbn
Attention, si vous n’indiquez aucune condition, toutes = '102-2-35419-5';
les lignes de votre table seront supprimées. #1452 - Cannot add or update a child
Dans phpMyAdmin, l’icône en forme de croix à côté row: a foreign key constraint fails
du crayon permet de supprimer la ligne (Figure 3). ('biblio'.'livre', CONSTRAINT 'fk_zone'
FOREIGN KEY ('code_zone') REFERENCES 'zone'
Manipuler des clés étrangères ('code_zone') ON DELETE SET NULL ON UPDATE
Une clé étrangère peut prendre la valeur NULL ou CASCADE)
une valeur issue de la clé primaire de la table qu’elle
référence. Cette restriction entraîne parfois des dif- L’attribution de la zone s8 qui existe ne pose pas de
ficultés lors des insertions, des mises à jour ou des problème, ici pour le livre Les fourmis :
suppressions. Lors des insertions dans la base bi-
blio, aucune valeur n’a été attribuée aux clés étran- UPDATE livre SET code _ zone = 's8' WHERE isbn
gères. Pour les exemples suivants, les tables zone = '102-2-35419-5';

44 11/2010
Rejoignez le Club .PRO
Sur Internet
• http://www.mysql.fr – MySQL,
Rejoignez le Club .PRO
Pour plus de renseignement : editor@phpsolmag.org

Stonfield
Pour Inworld : editor@phpsolmag.org
plus de renseignement
• http://www.phpmyadmin.net – phpMyAdmin. Stonfield Inworld propose aux entreprises des solutions globale
d'intègration d'Internet et des Univers Virtuels dans leur stratégie
Stonfield
de développement.Inworld
Au-delà de ses services, la société consacre 30%
de ses ressources
Stonfield à des travaux
Inworld propose de R&D des
aux entreprises sur le e-Commerce
solutions globale
et le e-Learning dans les Mondes Virtuels
Les propriétés indiquées lors de la création de la ta- 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%
ble (cf Article SQL : langage de définition des données) de ses ressources à des travaux de R&D sur le e-Commerce
influent sur le comportement lors de mises à jour ou et le e-Learning dans les Mondes Virtuels
COGNIX Systems
de suppressions de valeurs référencées (clauses ON Conseil, conception et développement d'applications évoluées pour
UPDATE ou ON DELETE). Par exemple, la modification les systèmes d'informations Internet/intranet/extranet. Alliant les
ou la suppression du code_zone dans la table zone en- COGNIX
compétences Systems
d'une SSII et d'une Web Agency, Cognix Systems
conçoit des
Conseil, applicatifs
conception et detéveloppement
portails web àd'applications
l'ergonomie travaillée
évoluées pour
traînera une mise à jour automatique de la table livre et des
les sites Internet
systèmes à forte valeur
d'informations ajoutée.
Internet/intranet/extranet. Alliant les
grâce aux clauses ON UPDATE CASCADE et ON DELETE 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
SET NULL.
et des sites Internet à forte valeur ajoutée.
WEB82
http://www.cognix-systems.com
UPDATE zone SET code _ zone = 's11' WHERE é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
code _ zone = 's8'; WEB82
W3C (www.w3.org) de sites web de qualité, au graphisme soigné soigné
DELETE FROM zone WHERE code _ zone = 'c10'; etéemployant
Cr les dernieresde
hébergements
ation et hébergements
Création detechnologies
sites web
sites du web
web pour
pour (PHP5, associations,
particuliers,
particuliers, MySQL5,
associations,
Ajax, XHTML,
entreprises, CSS2). Développement entierement aux normes
e-commerce.
SELECT * FROM livre; http://www.web82.net

Rejoignez le Club .PRO


W3C (www.w3.org) de sites web de qualité, au graphisme soigné soigné
et employant les dernieres technologies du web (PHP5, MySQL5,
La commande SELECT affiche la table livre avec les Ajax, XHTML, CSS2).
Core-Techs
http://www.web82.net
valeurs s8 remplacées par s11 et la valeur c10 rempla- Expert desPour plus de
solutions degestion
renseignement : editor@phpsolmag.org
et de communication d'entreprise
cée par NULL (tableaux 3 et 4). 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
Si le comportement en cas de mise à jour ou de sup- 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
Expert
Virtuels dans leur desdesolutions de gestion
développement. Au-delà deses
de communication
services, d'entreprise
la société 30% de
pression de la valeur d'une colonne référencée n’a pas 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. de core-techs. fr
été défini lors de la création de la table, aucune de ces systemes Gestion de Contenu Web, de Gestion Documentaire,
de Gestion de la Relation Client (CRM), d'ecommerce et de travail
opérations ne sera acceptée. Par exemple, sans clau- COGNIX Systems
ollaboratif.
se ON DELETE SET NULL dans la table livre, la sup- POP FACTORY
Conseil, conception et développement d’applications évoluées pour les systèmes d’informations Internet/
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
pression du code_zone c10 aurait été refusée car uti- http://www.cognix-systems.com
applicatives spécifi ques ; offre de solutions packagées : catalogue
lisé dans la table livre. Par contre, la suppression de 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,
c5 aurait été autorisée car le code n’est pas référencé PoP Factory,SSII
Anaska est le spécialiste spsur
des formations écialis ée Web. DOpenSource.
les technologies éveloppement de solutions
En partenariat avec MySQL
conseil,
AB, Mandriva, Zend développement,
et d'autres
applicatives ques ; suivi
offre et
acteurs de la communauté,
spécifi degestion.
Anaska vous propose un catalogue de plus
solutions packagées : catalogue
ailleurs. de 50 formations dédiés aux technologies du Libre.
http://www.popfactory.com
numérique,
http://www.anaska.com
/ info@popfactory.fr
e-commerce, livre/magazine numérique, envoi SMS.
Dans phpMyAdmin, le formulaire d’insertion ou de Nous accompagnons nos clients tout au long de leur projet : audit,
mise à jour d’une table qui en référence une autre pro- conseil, développement, suivi et gestion.
WEB82 Blue Note Systems
http://www.popfactory.com / info@popfactory.fr
Création et hébergements de sites web pour particuliers, associations, entreprises, e-commerce.
pose seulement les clés possibles pour les colonnes Développement Sp écialistes
entierement auxen CRMW3C
normes Open Source, de
(www.w3.org) nous
sitesproposons uneauoffre
web de qualité, graphisme
soigné et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2).
clés étrangères. complète de prestations sur la solution SugarCRM. Notre valeur
Blue
ajoutée Note
http://www.web82.net
réside dans Systems
une expertise réactive et une expérience des
Spécialistes en CRMlaOpen
problématiques de GRC.Source,
Nous vousnousaidons à tirer une
proposons le meilleur
offre
Conclusion Core-Techs parti de votre
complète
Expert des solutions de gestion
solution CRM.
de prestations sur la solution
et de communication SugarCRM.
d’entreprise en Open Notre
Source,valeur
Core-Techs
http://www.bluenote-systems. com
Vous avez appris dans cet article les bases du langa- ajoutée
conçoit, integre, déploieréside dans des
et maintient unesystemes
expertisederéactive
Gestion etde une expérience
Contenu Web, de des
Documentaire, de Gestion de la Relation Client (CRM), d’ecommerce et de travail ollaboratif.
Gestion
problématiques de la GRC. Nous vous aidons à tirer le meilleur
ge de manipulation de données : insertion, mise à jour, http://www.core-techs.fr
parti de votre solution CRM.
suppression et extraction globale d’information. Dans le
Intelligence Power
http://www.bluenote-systems. com
POP FACTORY Conseil, Expertises, Formations et Projets E-business centrés au tour
prochain numéro, vous apprendrez à affiner les extrac- PoP Factory,SSII spécialisée Web. Développement de solutions applicatives spéciques ; offre de
du cœur
solutions packagées de métier
: catalogue : la Business
numérique, e-commerce,Intelligence.
livre/magazineIntelligence Power
numérique, envoi SMS. vous
Nous
tions de données. accompagnonsIntelligence
propose
nos clients tout long dePower
desausolutions leurinnovant.es pour aligner
projet : audit, conseil, la technologie
développement, sur
suivi et gestion.
http://www.popfactory.com / info@popfactory.fr
la stratégie
Conseil, de votreFormations
Expertises, entreprise. et Projets E-business centrés au tour
http://www.
du cœur de métierintelligencepower.
: 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
Cilia Mauro, Magali Contensin la stratégie
solution SugarCRM. de votre
Notre valeur ajoutéeentreprise.
réside dans une expertise réactive et une expérience des
problématiqueshttp://www. intelligencepower.
de la GRC. Nous vous aidons à tirer lecom
meilleur parti de votre solution CRM.
Cilia Mauro est gestionnaire de bases de données et développeur Web Alliance
http://www.bluenote-systems.com

d’applications web au CNRS. Elle enseigne les bases de données Vous souhaitez être en première page des moteurs de recherche ?
Intelligence Rejoignez-nous,
Power 100% des clients Web Alliance sont en 1ère page
et PHP à l’université.
Web
de Alliance
Conseil, Expertises, Formations et Projets E-business centrés au tour du cĞur de métier : la Business
Google. Web Alliance, société de conseil spécialisée dans le
Intelligence. Intelligence Power vous propose des solutions innovantes pour aligner la technologie sur
Contact : cilia.mro@gmail.com référencement
la stratégie de votre
Vous entreprise. internet,
souhaitez être vous propose
en première son moteurs
page des expertisede(référencement,
recherche ?
Magali Contensin est chef de projet en développement d’applica- liens sponsorisés,
http://www.intelligencepower.com
Rejoignez-nous, web-marketing).
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
tions au CNRS. Elle enseigne depuis plus de dix ans le développe-
référencement internet, vous propose son expertise (référencement,
Web Alliance
ment d’applications web à l’université et est l’auteur de nombreux Vous souhaitez être en première page des moteurs de recherche ? Rejoignez-nous, 100% des clients
liensensponsorisés,
Web Alliance sont web-marketing).
1ère page de Google. Web Alliance, société de conseil spécialisée dans le
articles sur le développement web en PHP. www. web-alliance.
référencement internet, vous propose sonfrexpertise (référencement, liens sponsorisés, web-marketing).
www.web-alliance.fr
Contact : http://magali.contensin.online.fr

www.phpsolmag.org
Club .PRO 45
Interview

Interview
de Félix Chassagne,
responsable de l’hébergement eziHost

PHP Solutions : Bonjour, tout d’abord nous vous re- PS : Pouvez-vous nous présenter les avantages de
mercions de nous accorder du temps pour cette in- vos solutions d’hébergement ?
terview. Pourriez-vous vous présenter aux lecteurs FC : Pour garantir la sécurité des données nous utilisons
de PHP Solutions ? la technologie RAID au niveau des disques durs asso-
Félix Chassagne : eziHost est un service d’héberge- ciée à un système de sauvegarde externe. Nous ne sur-
ment sur Internet (depuis 2001) spécialisé dans l’héber- chargeons pas les machines, en limitant le nombre de
gement de sites Web en PHP/MySQL. Nous proposons, sites à 45 par serveurs et en séparant les services Web
en outre, des noms de domaines (bureau d’enregistre- et mail.
ment Network Solutions depuis 2002 et AFNIC depuis
2008) et des mails à nos clients ainsi que des services PS : Quels sont les outils que vous utilisez pour as-
complémentaires, dont : surer à vos clients la qualité du service ?
− installation de systèmes de gestion de contenu FC : Nous sommes présent si un client nous contac-
(blog, wiki, forum…), te par mail ou par téléphone, mais nous essayons de
− suivi statistique de l'activité du site, tableau des logs trouver des solutions en amont. En ce sens, au niveau
et bande passante… des outils, nous avons mis en place un système de
− audits de performance simplifiés semestriels avec gestion des tickets nous permettant d’être plus réactif
l'option Full Services. et efficace dans la résolution des problèmes de nos
clients. Nous diffusons en complément une lettre d’in-
PS : Quels sont les projets à venir d’eziHost ? formation afin de les tenir informés de l’actualité d’ezi-
FC : Nos clients peuvent gérer leur compte grâce à une Host (évolution des services, mise à jour système, pro-
interface Web. Cette interface est donc au cœur de no- motions…).
tre prestation. Ainsi, nous prévoyons de poursuivre les
améliorations de ce panel de gestion, et de pousser une Pouvez-vous nous donner quelques exemples d’en-
automatisation plus complète de notre architecture de treprises qui ont fait appel à vos services ?
serveurs. FC : Internet touche toutes les branches, nos clients sont
donc représentatifs de ce phénomène. En voici quelques
PS : Comment vous voyez le Web de demain ? exemples : Airria, AST Groupe, Crédit Agricole, Externat
FC : «Comme au supermarché», des solutions clé en Notre Dame, IMGR, Innovia, Le Périscope, Nouveau mon-
main, prêtes à l’emploi, mais personnalisables. Nous de DDB, Sanisère, Somudimec, Tenerrdis, Vercors Tra-
nous efforçons donc de proposer des offres simples versées, Vi TECHNOLOGY, Volubill, Ydesign, Zamst...
mais souples pour répondre au mieux aux attentes de
chacun de nos clients. Quelques informations clés sur eziHost ?

PS : Quels sont les types d’entreprises qui se tour- − Adresse : www.ezihost.fr


nent vers vos solutions ? − Ancienneté : 9 ans
FC : Nous avons essentiellement des petites et moyen- − Nombre de serveurs : 13
nes entreprises, la plupart implantées aux alentours de − Nombre de clients : plus de 150
Grenoble. Nous savons aussi répondre à des deman-
des plus importantes qui justifient l’utilisation de ser-
veurs dédiés ou de solutions techniques avancées (an- Merci beaucoup pour le temps que avez bien voulu
nuaires LDAP, certificats SSL, Web-services…). nous accorder.

46 11/2010
SQL

www.phpsolmag.org 47
SQL

48 11/2010

Вам также может понравиться