5/2009ddepoort.free.fr/phpsolution/iphone_et_smartphone_php_11_2010.pdf · 11/2010 / 0 0 le...

48
5/2009

Upload: others

Post on 23-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

5/2009�

Page 2: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

� �0/�0�0

Page 3: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

www.phpsolmag.org �

Table des matières

Page 4: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Table des maTières

11/2010

� ��/�0�0

Le périodique phpsolutions est publié parSoftware Press Sp. z o.o. SK

Bokserska 1, 02-682 Varsovie, PologneTél. 0975180358, Fax. +48 22 244 24 59

www.phpsolmag.org

Président de Software Press Sp. z o.o. SK : Paweł Marciniak

Directrice de la publication : Ewa Łozowicka

Dépôt légal : à parution

ISSN : 1731-4593

Rédacteur en chef : Łukasz Bartoszewicz

Couverture : Sławomir Sobczyk

DTP : Sławomir Sobczyk [email protected]

Composition : Sławomir Sobczyk

Correction : Valérie Viel, Thierry Borel, Barbara Bourdelles

Bêta-testeurs : Brice Favre, Valérie Viel, Cyril David,

Christophe Milhau, Alain Ribault, Stéphane Guedon, Eric Boulet, Mickael Puyfages, Christian Hernoux,

Isabelle Lupi, Antoine Beluze, Timotée Neullas, Yann Faure, Adrien Mogenet, Jean-François Montgaillard,

Turmeau Nicolas, Jonathan Marois, Wilfried Ceron, Wajih Letaief, François Van de Weerdt, Eric Vincent,

Franck Michaël Assi, Francis Hulin-Hubard, Nicolas Dumas, David Michaud.

Les personnes intéressées par la coopération sont priées de nous contacter :

[email protected]

Publicité : [email protected]

Pour créer les diagrammes on a utilisé le programme

AVERTISSEMENTLes techniques présentées dans les articles

ne peuvent être utilisées qu’au sein des réseaux internes. La rédaction du magazine n’est pas

responsable de l’utilisation incorrecte des techniques présentées. L’utilisation des techniques présentées peut

provoquer la perte des données !

VARIA6 ActualitésActualités du monde du développement.Christophe Villeneuve

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

OUTILS8 Accéder aux API GOOGLE en PHPIsabelle LupiPour les besoins de son application web (site, blog, por-tail…), il est parfois nécessaire d’accéder aux ressour-ces 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’ex-ploiter ses services et d’intégrer les résultats à d’autres applications. Vous verrez quels sont les services Goo-gle qui sont accessibles par les API en PHP.

PROJETS12 Développer un centre d’appel avec Asterisk et vtigerCRMRandriamifidy Bezama MarolahyDans ce premier article de notre série, nous allons parler principalement d’Asterisk. Asterisk est un PBX (Private Branch eXchange ou autocommutateur télé-phonique Privé) Open Source destiné aux entrepri-ses et vtigerCRM est l’un des meilleurs CRM (Custo-mer Relationship Management ou Gestion de relation client), en Open Source. Ils sont utilisés par de nom-breux projets Open Source pour les centres d’appel comme ELASTIX.

DOSSIER17 Web sur iPhoneJean TatareauDans cet article, nous verrons pourquoi et comment aborder le développement sur smartphone et en particulier sur iPhone. Nous évoquerons les contraintes et les oppor-tunités qu’offre ce développement spécifique.

Page 5: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Table des matièresTable des matières

POUR LES DÉBUTANTS40 SQL : langage de manipulation des donnéesCilia Mauro, Magali ContensinLes 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.

24 La sécurité des smartphonesTony FachauxLes smartphones sont aujourd’hui en train d’envahir la planète. En effet, depuis l’arrivée de smartphones très évolués tels que l’iPhone d’Apple ou encore le Black-berry de RIM, de plus en plus de monde en est équipé.

PRATIQUE26 Internationaliser une application CakePHPPierre MartinL’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 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 TECHNIQUE34 Introduction à l’industrialisation de PHPWilliam DurandPHP 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.

Page 6: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Actualités

��/�0�0

[PHP-DEV] PHP 5.4 alphaLa prochaine version de PHP 5.� en version alpha est en cours de libéra-tion. Elle va apporter un certain nom-bre de correctifs et de nettoyages du code. En plus, de nombreuses amélio-rations et de nouvelles fonctionnalités seront incluses comme l’amélioration de performance, la gestion de la mé-moire avec APC, l’ajout d’annotation (Un nouveau mécanisme horizontal pour réutiliser du code).http://www.php.net

Zend Framework 1.11La nouvelle version du framework �.�� vient de sortir. Elle apporte plusieurs nouveautés importantes comme le soutien pour les téléphones mobiles et SimpleCloud API. Bien sur cette version est maintenant compatible avec Doko, simpleDB, eBay et avec MariaDB.http://www.zend.com/fr/company/news/press/la-nouvelle-version-du-zend-framework-fournit-la-portabilit-dans-le-cloud-et-le-d-veloppement-d-applications-mobiles

CMS Award 2010La remise des prix aux CMS Awards Open Source a récompensé Word-press, suivi de Drupal et Joomla dans la catégorie des plus populaires. Les autres catégories ont récompensées pour le CMS Open Source :’CMS Made’, le CMS prometteur : ‘Pimcore’, Open Source E-commerce : ‘Prestashop’http://www.packtpub.com/open-sour-ce-awards-home.

CrowdinCrowdin 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 page internet que vous souhaitez pro-poser aux internautes en multi-langue. Différents protocoles sont disponibles (jSON, XML).http://www.crowdin.net/

PHP excel extension 0.9PHP Excel est une librairie en PHP per-mettant de générer des fichiers Excel. Elle est très légère et très rapide. Cel-le-ci est compatible à partir de Office �00� et plus et fonctionne sur tous les systèmes d’exploitations.https://github.com/iliaal/php_excel/

PHPcollab 2.5PHPcollab est une application PHP et est un outil de gestion de site web. Il gère un ensemble d’outils nécessai-res pour amener à bien votre projet comme la gestion des tâches, de ti-ckets, de composants, de fichiers...http://www.php-collab.com

L’AFUP propulse le Forum PHP au sommetL’année 2010 est l’année de tous les records pour le Forum PHP 2010. Tout d’abord, l’évènement fut marqué par les 15 ans du langage PHP et les 10 ans de l’association. Ensuite avec la venue de plus de 500 visiteurs par jour (soit 35 % en plus qu’en 2009).Pour l’édition de cette année, les organisateurs ont proposé un programme très varié avec plus de 40 conférences, permettant de couvrir un maximum de sujets et de parler aussi des briques logicielles comme : • Les frameworks (Zend, Symfony, CakePHP).• Les CMS (Drupal, Magix CMS).• Le E-commerce (Prestashop, Magento).• Les bases de données (MariaDB, No-SQL).• ERP/CRM (Dolibarr...).• Les Performances.• Etc.

En plus de ces thèmes traités, de nombreuses sociétés ont apporté leurs retours d'expériences et de témoignages dans différentes conférences, tels que Canal Plus, Orange.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 leurs avancements dans la demi-journée qui leur était consacrée.Par ailleurs, des personnalités de la scène PHP ont effectué le déplacement comme Rasmus Lerdof, Zeev Suraski, Derick Rethans, Ilia Alshanetsky.... Mais aussi les personnalités de SkySQL/MariaDB : Rasmus Johansson de Monty Program et Kaj Arnö de SkySQL Ab.Bien entendu, la mascotte de l'éléPHPant PHP était aussi présente avec une version gonflable, complétant ainsi les versions peluches.Enfin, l'AFUP donne rendez-vous à l'année prochaine pour la prochaine édition.http://www.afup.org/forumphp

OpenTokOpenTok est un projet open source qui va vous permettre de communiquer avec d’autres personnes à travers votre site web par le système vidéo. Cette application se présente so-us la forme d’une librairie javascript et peut s’utiliser avec différents lan-gages : PHP, Java, Ruby, Python par l’intermédiaire d’une interface REST.Pour utiliser cette librairie, il est nécessaire d’obtenir une clef gratuite (dispo-nible sur le site officiel). Ensuite vous pourrez paramétrer et configurer su-ivant vos envies l’affichage. Du coté du serveur la bibliothèque OpenTok fournit une application avec une interface HTTP pour que les développeurs puissent utiliser le système de conversation vidéo.Par ailleurs, le site propose des tutoriaux pour vous faciliter l’utilisation de sa librairie. http://www.tokbox.com/

Rédaction des actualités : Christophe Villeneuve

Page 7: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

<<TOP>>

www.phpsolmag.org

<<BODY>>

<<SHORT_NEWS>>

7GNU/Linux Magazine N°132

KERNEL

Page 8: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0�

Outils

P our les besoins de son application web (site, blog, portail…), il est parfois nécessaire d’ac-cé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’APIs afin d’exploiter ses services et d’intégrer les résultats à d’autres applications.

Certaines de ces APIs s’appuient sur le protocole de données Google Data Protocol (http://code.google.com/intl/fr/apis/gdata). Celui-ci est largement inspiré de l’ar-chitecture REST, conçue pour manipuler les données sur internet. Il supporte actuellement AtomPub et JSON pour représenter et véhiculer les informations. Comme tout protocole de données, Google Data Protocol s’in-terface avec divers langages du Web, tels que Java, .NET, Perl, Python ou PHP. C’est à travers ce dernier langage que nous allons découvrir quelques fonction-nalités.

Présentation des Services et APIIl 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

Protocol se trouve à l’url http://code.google.com/intl/fr/apis/gdata/docs/directory.html). En voici quelques uns.

Google BloggerGoogle Blogger (http://www.blogger.com) est une pla-teforme complète de publication de blogs. L’API Blog-ger Data (http://code.blogger.com) permet d’interroger, de visualiser et mettre à jour le contenu du blog via une application cliente autre.

YoutubeAccessible à l’adresse http://youtube.com, Youtube est une plateforme de partage de vidéos et offre en outre toute une panoplie de fonctionnalités pour commen-ter et annoter les vidéos. L’API YouTube Data (http://code.google.com/intl/fr/apis/youtube) permet de créer,

Accéder aux API GOOGLE en PHPPour 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 :• Quels sont les services Google qui sont accessibles par les API

en PHP supportant le protocole de données Google Data Pro-tocol, et quelle est leur logique commune de programmation.

Ce qu’il faut savoir :• Le langage PHP.• Savoir utiliser Zend Framework.

Figure 1. Portail du l’api Blogger Data

Page 9: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

API GOOGLE

www.phpsolmag.org �

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

PicasaPicasa (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 SearchGoogle 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, mis à disposition gratuitement ou dans le cadre d’une li-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 votre application.

Google DocumentsGoogle 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 calcul, l’API Google Spreadsheets Figure 4. Portail du l’api Google Book Search Figure 4. Portail du l’api Google Book Search

Figure 2. Portail du l’api YouTube Data

Figure 3. Portail du l’api Picassa Web Album Data

Figure 2. Portail du l’api YouTube Data

Figure 3. Portail du l’api Picassa Web Album Data

Page 10: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0�0

Outils

(http://code.google.com/intl/fr/apis/spreadsheets) peut être très intéressante.

Principe de fonctionnement généralComme nous l’avons vu ci-dessus, les services offrent tous des fonctionnalités, d’authentification, de création de recherche et de visualisation. Ces fonctionnalités sont spécifiques ensuite à un contenu mais ont le mê-me schéma de fonctionnement. Il est donc logique que les apis qui s’appuient sur ce protocole Google Dat Protocol s’interfacent naturellement avec la même li-brairie.

En PHP, ce socle commun est proposé par Google par l’intermédiaire de l’environnement Zend Framework. Cet environnement fournira, après installation, les fonc-tions transversales d’authentification, de création, de recherche et de visualisation.

Installer la librairiePré-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');

Si le service nécessite une authentification supplémen-taire, il faut charger la classe Zend_Gdata_AuthSub par la même commande :

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

Et pour chaque service particulier, il faut charger la clas-se spécifique. Ainsi, par exemple, pour le service Pi-casa, il faut charger la classe Zend_Gdata_Photos par l’intermédiaire de :

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

S’authentifierIl faut utiliser le compte google utilisé pour créer et gérer le service souhaité. Ainsi, par exemple, pour le service GoogleBlogger, le code sera le suivant :

$nom = '[email protected]';

$pwd = 'mot-de-passe';

$service = 'blogger';

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

$pwd, $service, null,

Zend _ Gdata _ ClientLogin::DEFAULT _ SOURCE,

null, null,

Zend _ Gdata _ ClientLogin::CLIENTLOGIN _ URI,

'GOOGLE');

$mon-blog = new Zend _ Gdata($client);

Création de contenuLe formatage des informations dépend du service vi-sé. Ainsi, par exemple, pour le service GoogleBlog-ger, le code pour intégrer un billet est présenté dans le Listing 1.

Interrogation Pour interroger le service, la classe Zend_Gdata_Query peut être utilisée simplement ou prendre les paramè-tres particuliers de ce service. Ainsi, par exemple, pour

Figure 5. Portail du l’api Google Calendar Figure 5. Portail du l’api Google Calendar

Listing 1.

$titre = 'titre de mon billet' ;$contenu = 'contenu de mon billet' ;$url = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default';

$mon-billet = $mon-blog->newEntry();$mon-billet->title = $mon-blog->newTitle($titre);$mon-billet->content = $mon-blog->newContent($contenu);$mon-billet->content->setType('text');$mon-billet-dans-blog = $mon-blog->insertEntry($mon-billet, $url);

Et pour Picasa, ce sera de la manière suivante :

$titre = ' titre du nouvel album' ;$contenu = ' description du nouvel album' ;

$google-client = new Zend _ Gdata _ Photos($client, "Google-DevelopersGuide-1.0");$album = new Zend _ Gdata _ Photos _ AlbumEntry();$album->setTitle($google-client->newTitle($titre));$album->setSummary($google-client->newSummary($contenu));$nouvel-album = $ google-client->insertAlbumEntry($album);

Page 11: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

API GOOGLE

www.phpsolmag.org ��

récupérer l’ensemble des billets de son compte sur Google Blogger, la requête aura la forme suivante :

$quest=new Zend _ Gdata _ Query('http://www.blogger.com/

feeds/default/blogs');

$resultats = $gdClient->getFeed($quest);

Pour Picassa, ce sera :

$quest = $google-client->newAlbumQuery();

$quest->setUser("default");

$quest->setAlbumName("album à rechercher");

$resultats = $ google-client->getAlbumFeed($quest);

Affichage de résultatsLes 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 :

foreach($resultats->entries as $document) {

print $document->title . "\n";

}

Conclusion Les services Google sont complètement pilotables à l’aide des APIs, quel que soit le langage utilisé. En outre, si l’API n’existe pas dans le langage souhaité, il est toujours possible de la développer et de la pro-poser ensuite à Google. C’est un concept assez inté-ressant dans la mesure où il permet de s’affranchir des contraintes de programmation multiple et de tout piloter à partir d’un seul langage.

ISABELLE LUPISpécialisée dans les domaines de la gestion documentaire, du tra-itement du langage naturel et du référencement. Travaille depuis plus de 10 ans dans ce dernier domaine et a créé, début 2007, b-find, sa propre société spécialisée dans le domaine du référencement.

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

Page 12: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Projets

Dans ce premier article de notre série, nous al-lons parler principalement d’Asterisk. En pre-mier lieu, Asterisk est un système de téléphonie

pour les entreprises. C’est un logiciel libre permettant la mise en place d’un autocommutateur logiciel. Créé à l’origine par Mark Spencer de Digium et qui suppor-te plusieurs plateformes (Linux, Windows, BSD, …). Asterisk supporte la majorité des protocoles (SIP, IAX, H.323, SCCOP,...) et supporte aussi la majorité des codecs audio et vidéo (G711, G723, G726, Speek, GSM,etc …). Avec Asterisk on peut faire plusieurs types 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

occasionnels et la conversion entre les formats, codecs et protocoles.

Les canaux traitent toutes les entrées/sortie pour voix,vidéo, texte. Chaque canal représente une tech-nologie ou un protocole spécifique c’est à dire SIP, IAX ou autre protocole, chacun de ces protocoles se trou-ve dans son propre module chan_sip.so, chan_iax.so etc,

Le module Fonctions et Application sert l’exécution d’unités fonctionnelles dans le système par exemple les VoiceMail, Lecture des fichier enregistrés ou la

Développer un centre d’appel avec Asterisk et vtigerCRMAsterisk 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 :• Le fonctionnement du système de téléphonie Asterisk. • Le fonctionnement du CRM vtigerCRM.• Comment installer et configurer Asterisk.• Comment créer un dialplan Asterisk.• Comment interfacer Asterisk avec le langage PHP.

Ce qu’il faut savoir :• Vous devez connaître les bases du langage PHP,

l'extension socket de PHP, l'extension CURL de PHP, du bash, des notions sur les protocoles SIP, UDP, TCP et les entrées sorties standard de LINUX.

Figure 1. Image liste fichier configuration

Page 13: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Asterisk

www.phpsolmag.org ��

Page 14: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Projets

Maintenant vous avez les répertoires suivants :

• /usr/sbin/asterisk,• /etc/asterisk/ : Contient les fichiers de configuration

d’Asterisk,• /usr/lib/asterisk/modules/ : Contient les modules

chargeables pour les applications, codecs, formats et canaux,

• /var/lib/asterisk/ : Les registres Asterisk sous forme d’une base de données Berkeley,

chambre de conférence. Il télécharge de manière dy-namique par le core lors d’un appel dans le plan de nu-mérotation. Mémorisé dans des modules à chargement dynamique (app_voicemail.so, app_meetme.so), de multiples applications peuvent être utilisées durant le parcours d’un appel. Les applications sont synchro-nisées. Toutes les applications disposent d’une ligne de commande. On peut utiliser des variables et lire des variables.

Les ressources sont similaires aux applications mais sont chargées par le core de manière statique. Il offre une fonctionnalité commune utilisée par de mul-tiples applications comme la musique d’attente, les enregistrements d’appel, le parcage d’appel et inter-ception d’appel ainsi que le rechargement de la con-figuration.

Les AGI (Asterisk Gateway Interface) constituent une application de programmation de l’interface. Ce-la permet aux applications d’Asterisk d’être écrites en n’importe quel langage qui supporte les entrées et sor-ties standards. Il agit plutôt au niveau du contrôle du plan de numérotation d’Asterisk. Il permet à Asterisk d’être lié aux applications externes (base de données, annuaire, web service). Il peut être écrit dans divers lan-gages comme le PHP, Perl, Python, Bash, JAVA.

Les différents composant d’Asterisk sont :

1. libpri – Interfaces PRI ISDN T1/E1/J1.2. dadhi – cartes analogique et digitale.3. asterisk – code source d'Asterisk.4. addons – plusieurs modules d'extension.

Télécharger la dernière version des codes source Aste-risk à partir du site http://www.asterisk.org/downloads. Ces fichier sont au format compressé tar.gz

Vous aurez besoin des packages suivants :

Asterisk 1.6.2, Add-Ons 1.6.2.2, DAHDI Complete, LibPRI 1.4.11.4, LibSS7 1.0.2.

Après téléchargement du fichier, il faut d’abord installer 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, dahdi, asterisk, asterisk-addons (spécialement le sup-port mysql d’asterisk). Tous les 4 (en général) suivent le même format (voir Listing 2).

Aller au répertoire Asterisk. Taper ./configure pour vérifier que votre système dispose des librairies requi-ses. Entrer make menuselect pour choisir quels modu-les compiler. Taper make pour compiler Asterisk. Ta-per make install pour installer Asterisk et les modules à compiler.

Listing 1. Installation des dépendances

apt-get -y install libglib-dev apt-get -y install openssl apt-get -y install libncurses5 apt-get -y install libncurses5-dev apt-get -y install gcc apt-get -y install g++ apt-get -y install ntpdate apt-get -y install libapache2-mod-php5 apt-get -y install mysql-server-5.0 apt-get -y install mysql-client apt-get -y install libmysqlclient15-dev apt-get -y install zlib1g-dev apt-get -y install mpg123 apt-get -y install automake aptitude -y install libssl-dev libnewt-dev aptitude -y install libcurl3-dev aptitude -y install libvorbis-dev aptitude -y install libspeex-dev aptitude -y install libiksemel-dev aptitude -y install flex aptitude -y install xsltproc aptitude -y install pciutils bc apt-get -y install bison apt-get -y install libssl-dev apt-get -y install libreadline4-dev apt-get -y install libeditline-dev apt-get -y install libedit-dev apt-get -y install make apt-get -y install subversion apt-get -y install libtool apt-get -y install libsmpeg-dev apt-get -y install libnewt-dev apt-get -y install libavcodec-dev apt-get -y install apt-file aptitude -y install libtiff-dev libtiff-tools gs autoconf automake make uninstall ./configure --prefix=/usr make make install ldconfig -v aptitude -y install libmysqlclient15-dev libcurl3-dev

Listing 2. Commande pour installation d’Asterisk

cd directory./configure (pas demandé pour libpri)make menuselectmakemake install

Listing 3. Configuration SIP

[1002]type = friend ; nom du comptehost = dynamic ;le téléphone devra s’enregistrercontext = users ; il va utiliser la contexte usersecret = 1001 ; mot de passe du compte

Listing 4. Configuration d’extension

exten => 6001, 1 DIAL(SIP/ pangoline|30)

Page 15: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Asterisk

www.phpsolmag.org �5

asterisk.confasterisk.conf est le fichier de configuration meta ou master. Il indique à Asterisk où chercher (ou com-ment créer) d’autres structures et fichiers de con-figuration. Asterisk trouve généralement asterisk.conf dans /etc/asterisk sauf si vous lui donnez une indication contraire quand vous démarrez asterisk (l’option -C).

Ce fichier a rarement besoin d’être édité. /etc/aste-risk/asterisk.conf

sip.confContient les informations de configuration pour le canal SIP d’Asterisk dans la section [general]. Il contient aussi la configuration des téléphones SIP associés. Contient 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 peut le trouver.

context = users : quand le téléphone émet des ap-pels, commencer à chercher les numéros appelés dans ce contexte dans extension.conf.

Secret = 1001 : c’est le mot de passe que le téléphone utilise quand il se connecte au système ou émet un appel.

C’est une configuration très basique. Les configurations dans un système en production sont beaucoup plus complexes.

extensions.confContient la configuration du plan de numérotation. In-dique à Asterisk comment traiter les appels (à la fois en-trants et sortants) et fournit les clés pour sécuriser votre système Asterisk contre les abus, arnaques et toll fraud (il fournit un système de sécurité contre toutes sortes de fraudes, les fraudes à la tarifications ). Il ressemble plus à un langage de script qu’à un fichier de configuration standard.

/etc/asterisk/extension.conf.

Commençons par ouvrir extension.conf avec un éditeur (voir Listing 4).

• /var/spool/asterisk/ : Les informations d’appel test, les messages vocaux et les enregistrements d’appel,

• /var/log/asterisk : Journaux,• /var/log/asterisk/cdr-csv/ : Journal d’appel au format csv.

Aller maintenant dans le répertoire asterisk-addons. Taper ./configure pour vérifier votre système pour les librairies requises. Taper make menuselect pour choi-sir quels sont les modules à compiler. Taper make pour compiler les modules additionnels. Taper make install pour installer les modules asterisk addons.

Après l’installation, on démarre Asterisk grâce à la commande /etc/init.d/asterisk start. Et on vérifie que tout soit fonctionnel grâce à la commande asterisk -r et ainsi que help dans le console asterisk.

Fichier de configurationAsterisk est configuré par de nombreux fichiers tex-tes. Il sont mémorisés, par défaut dans /etc/asterisk. Ils sont tous nommés xxxxx.conf. Ce sont des fichiers textes ASCII et peuvent être édités par n’importe quel éditeur de texte standard. Les fichiers de configuration d’exemple sont installés grâce à l’exécution de make sample lors de l’installation. Il y a de nombreux fichiers de configuration. Vous trouverez les originaux dans : /usr/src/asterisk-1.6.X/config.

Listing 5. Configuration suite

[general]format=wav49|gsm|wavserveremail=asteriskattach=yesskipms=3000maxsilence=10silencethreshold=128maxlogins=3language=fremaildateformat=%A, %d %B %Y a %H:%M:%Semailsubject=[ASTERISK] Nouveau message dans la boite ${VM _ MAILBOX}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]pagersubject=Nouveau message vocalpagerbody=Nouveau message de ${VM _ DUR} secondes dans la boîte ${VM _ MAILBOX} laissé le ${VM _ DATE} par ${VM _ CALLERID}. [default]1001 => 1002,Poste 210, [email protected]

Page 16: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Projets

exten dit au parseur d’Asterisk que c’est une exten-sion.

=> : Manière dont Asterisk identifie un objet.

6001 : Nombre d’extension (numéro à composer), 1 : La priorité (le numéro de séquence pour cette extension), Dial(SIP/pangoline|30 : Ceci demande à Asterisk d’essayer de faire sonner le matériel SIP appelé pangoline pendant 30 secondes.

Créer une boite vocaleLa boïte vocale sous Asterisk est configurable depuis le fichier /etc/asterisk/voicemail.xml. Le bloc général per-met d’établir comme son nom l’indique les paramètres 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-lisateur se trompe trois fois de mot de passe. Le reste semble logique. La ligne importante est celle du bloc default :

• 1001 : identifiant de la boite vocale. • Poste 210 : un nom plus propre.

[email protected] : adresse où envoyer la notifica-tion d’un appel.

Configurer un Soft-PhoneJ’utilise Pagoline, mais il existe d’autres logiciels. Dans le menu “Accounts”, vous indiquez les champs suivants :

• User : 1002.• Password : 1001 (mot de passe md5). • Serveur : l’IP ou le domaine de votre serveur.

Dans le prochain tutoriel, nous allons installer, configu-rer VtigerCRM et nous allons faire une petite communi-cation entre les deux systèmes. Dans le prochain tuto-riel nous allons installer le CRM vtiger-CRM et le faire interagir avec Asterisk. Nous verrons ensuite comment créer un nouveau composant pour ce CRM et enfin créer un script PHP pour Asterisk.

RAnDRIAMIFIDY BEZAMA MAROLAHYL’auteur travaille en tant que consultant ntic ( Nouvelles Techno-logies de l’Information et de la Communication) au sein de Team-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 réalise plusieurs applications web et d’applications internet riche. Passionné de nouvelles technologies, il cherche toujours à amélio-rer ses compétences en tant que développeur et administrateur système.Pour le contacter veuillez envoyer un mail à [email protected].

Page 17: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

www.phpsolmag.org ��

Dossier

De la nécessité de développer pour les smartphonesTout autour de nous, nous voyons ces petits rectangles de plastique et des index agiles glisser sur leurs surfaces lis-ses et brillantes. Les smartphones sont là. Parions qu’avant cinq ans, ils seront le moyen d’accès privilégié à Internet.

Pour un coût équivalent au téléphone mobile, le 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.

Il est souhaitable qu’il propose des fonctionnalités inexistantes au site lourd ainsi qu’une approche pragma-tique de ses fonctionnalités. Les plus du site smart peu-vent être la géolocalisation, une zone de contact twitter ou sms, des visuels en relation avec le lieu de la mobi-lité. L’approche pragmatique peut être des textes plus courts, des visuels légers, des formulaires simplifiés.

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 :• Pourquoi développer pour les smartphones.• Les spécificités et contraintes.• Un environnement de développement.• Les styles de base à adopter.• La librairie jQTouch.• Utilisation avancée de Safari.

Ce qu'il faut savoir :• Bonne notion CSS et HTML.• Bonne connaissance JavaScript et jQuery.• Notion de SQL.• Connaître PHP 5.�.

Figure 1. Exemple de QRcode

Page 18: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

iPhone

En ce sens, le site smart est un complément au site lourd en plus de faciliter l’accès mobile à un site Web.

Les iPhone représentent environ deux millions d’ap-pareils en France. L’iPhone est emblématique d’un sys-tème fermé mais sans doute efficace. Le but de cet ar-ticle n’est pas de jeter l’opprobre sur une marque ou tel système d’exploitation.

On constate que développer pour iPhone nécessite la maîtrise d’objective-C, de soumettre son application au service sévère de Apple Store, d’être en contradiction avec la GNU GPL (section 6 de la GPLv2) et Java est indésirable.

L’alternative est de développer pour le Web. La dy-namique est créée par un ensemble de technologies telles que Javascript et ses frameworks (JQtouch pour jQuery, iUI) dédiés au web smart, le HTML 5 ainsi que CSS 3. Ces technologies peuvent se regrouper sous le concept WebSmart. Nous verrons les techniques pour faire une interface de l’application Apple Store like.

Les particularités de l’iPhoneCe qui n’est pas :

• le Flash et Java sont proscrits,• nombre de pages ouvertes simultanément limité à huit,• poids de la page Web d'un maximum de dix Mo,• pas de format GIF animé,• Javascript limité à cinq secondes et à dix Mo d'allo-

cation,• copier, couper, coller disparaît,• pas de drag and drop,• pas de clique droit,• pas de survol (hover),• pas de sélection possible en général.

Particularités pour les événements :

• Mouseover et Mousemove ne sont pas pris en compte,• Keypress, Keyup et Keydown dans un textarea uni-

quement,• Click, Mousedown et Mouseup ont un comporte-

ment étrange (à éviter),• Doubleclick n'est pas pris en compte.

Il faut comprendre que la souris a été chassée par une interaction plus charnelle (les doigts), et c'est peut-être pourquoi le rapport des utilisateurs avec leur interface est plus affectif.

La géométrie :

• en mode portrait, surface affichable 320 X 480 pixels soit 320 X

416 sans la barre d'URL• en mode paysage.

surface affichable 480 X 268 pixels soit 480 X 208 sans la barre d'URL

Listing 1. Intégration du CSS iPhone

<link rel="stylesheet" type="text/css"href="iphone.css" media="only screen and (max-device-width: 480px)" /><link rel="stylesheet" type="text/css"href="desktop.css" media="screen and (min-device-width: 481px)" /><!--[if IE]><link rel="stylesheet" type="text/css" href="explorer.css" media="all" /><![endif]-->

Listing 2. Typage de la balise body

<style type='text/css'>body.portrait p { backgroundcolor: white; } body.paysage p { backgroundcolor: gray; }</style>

Listing 3. Orientation de l’iPhone

window.addEventListener('load', setOrientation, false); window.addEventListener('orientationchange', setOrientation, false);

function setOrientation() { var orientation = Math.abs(window.orientation) === 90 ? 'paysage' : 'portrait'; var classOrient = document.body.className; classOrient = classOrient.replace(/portrait|paysage/, orientation); document.body.className = classOrient; }

Listing 4. Liste HTML à styler avec CSS

<html><head><link rel="stylesheet" href="screen.css" type="text/css" /><title>Php sol mag</title></head><body><div id="container"><div id="header"><h1><a href="./">PHP Solution</a></h1><div id="utility"><ul><li><a href="about.html">A propos</a></li><li><a href="auteur.html">Auteurs</a></li></ul></div><div id="nav"><ul><li><a href="vieux _ magazines.html">Anciens magazines</a></li><li><a href="Abonnement.html">Abonnement</a></li><li><a href="contact.html">Contact</a></li></ul></div></div><div id="content"><h2>A propos</h2><p> PHP solutions magazine est un journal consacré à...</p></div><div id="sidebar"><img alt="Dernier numero"src="images/dernierNumero.png"<p>Le dernier numéro est paru...</p></div><div id="footer"><ul><li><a href="contact.html">Contact</a></li><li><a href="about.html">A propos</a></li><li><a href="auteur.html">Auteurs</a></li></ul><p class="subtle">PHP solution magazine copyright</p></div></div></body></html>

Page 19: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

www.phpsolmag.org ��

Dossier

Constituer un environnement de développementNous allons constituer un environnement spécifique de développement d’application iPhone Web sous Windows XP, a fortiori sans le SDK de Apple, ni de iPhone.

En plus de l’environnement classique de dévelop-pement :

• navigateur Safari version 5.0.2,• activer le menu développement (édition préférences

– avancées – cocher, afficher le menu de dévelop-pement),

• dans la barre d'adresse taper javascript:window.scrollTo(0,0);resizeTo(320,480);

• pour paramétrer entre autres choses l'userAgent, on peut utiliser le plugin TcpCatcher. Le java est né-cessaire : http://www.tcpcatcher.org/index.php. Il existe de même un plugin de switcher userAgent pour Firefox très performant,

• émulateur iPhone : http://www.emulateurmobi-le.com/ et http://app.protofluid.com/, et l’excellent http://www.opera.com/developer/tools/ pour Opera mobile,

• il existe une extension pour la complétion HTML 5 et CSS 3 pour Dreamweaver,

• une feuille imprimée avec les dimensions de l'iPho-ne, que l'on trouve à http://www.imagescreations.fr/telecharger-iphone-mockup.html.

Cela ne constitue pas un environnement professionnel, mais permet de faire les premiers tests tout en étant vigilant sur les rendus. Par exemple, le flash peut fonc-tionner en émulation!

L’idéal est d’avoir un iPhone et le SDK Apple moyen-nant 99$ et un Mac OX Snow Leopard.

Note : l’émulateur peut permettre avec le client qui ne possède pas encore d’iPhone, de valider des points du projet, voire commencer à former les futurs utilisa-teurs et d’avoir ainsi les premiers retours. Ceci est très utile dans le cas de développement avec les méthodes agiles.

Premiers pas dans le codeLa 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 :

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3

On peut soit le détecter en JavaScript ou en PHP. Si le mobile est identifié comme iPhone, on fait une redirection sur un répertoire spécifique à ce mobile.

Listing 3B. CSS style iPhone

body {background-color: #ddd; /* couleur de fond :gris pale! les digits sont doublés*/color: #222; /* couleur du texte noir bleuté*/font-family: Helvetica; /*font par défaut Apple iPhone */font-size: 14px;margin: 0; padding: 0; }#header h1 {margin: 0;padding: 0;}#header h1 a {background-color: #ccc;border-bottom: 1px solid #666;color: #222;display: block;font-size: 20px;font-weight: bold;padding: 10px 0;text-align: center;text-decoration: none;}#header ul {list-style: none;margin: 10px;padding: 0;}#header ul li a {background-color: #FFFFFF;border: 1px solid #999999;color: #222222;display: block;font-size: 17px;font-weight: bold;margin-bottom: -1px;padding: 12px 10px;text-decoration: none;}#header ul.hide {display: none;}/* bouton de menu dans la barre supérieure */#header div.leftButton {position: absolute;top: 7px;left: 6px;height: 30px;font-weight: bold;text-align: center;color: white;text-shadow: rgba(0,0,0,0.6) 0px -1px 0px;line-height: 28px;border-width: 0 8px 0 8px;-webkit-border-image: url(images/button.png) 0 8 0 8;}#header div.pressed {-webkit-border-image: url(images/button _ clicked.png) 0 8 0 8;}#content, #sidebar {padding: 10px;}

Listing 5. Manipulation du bouton menu

if (window.innerWidth && window.innerWidth <= 480) {$(document).ready(function(){$('#header ul').addClass('hide');$('#header').append('<div class="leftButton" onclick="toggleMenu()">Menu</div>');});

function toggleMenu() {$('#header ul').toggleClass('hide');$('#header .leftButton').toggleClass('pressed');}}

Page 20: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0�0

iPhone

Tableau 1. Caractéristiques pour une liste de blocs contiguës

Item ValeurHauteur cadre (ligne du bas incluse) ��px

Largeur cadre ��0px (portrait),��0px (paysage)

Police Helvetica, �0pt bold

Couleur police Black

Ligne horizontale (entre les cellules) #d�d�d� (RGB=���, ���, ���)

Padding gauche �0px

Padding bas ��px

Hauteur controle ��px

Control alignement droit �0px

Control rectangle arrondi � degrés

Control texte Helvetica, ��pt

Couleur de fond White

Tableau 2. Zones de texte à bords arrondis

Item ValeurCell height ��px

Rectangle coin arrondi avec angle �0px × �0px angle (-we-bkit-border-radius:�0px)

Rectangle arrondi marge gauche et droite

�0px

Rectangle arrondi marge haut et bas ��px

Horizontal lines (entre les cellules) #d�d�d� (RGB=���, ���, ���)

Police étiquette Helvetica ��pt, bold

Couleur de la police étiquette #�c5��c (RGB=��, ��, �0�)

Police de la cellule Helvetica ��pt, bold

Couleur de la police de la cellule Black

Position du texte dans la cellule �0px du côté gauche, ��px à partir du bas

Couleur du fond #c5ccd� (RGB= ���, �0�, ���)

Tableau 3. Zones de saisies

Dimension de l’élément visé par un doigt

Taille recommandée

Hauteur de l’élément �0px (min. ��px)

Largeur de l’élément Min. �0px

Sélection, entrée hauteur �0px

Hauteur d’une cellule de liste sélec-tionnable

��px

Espace entre les éléments �0px

Détection en JavaScript :

if( navigator.userAgent.match(/iPhone/i) ){document.location= "/dirPourIphone/";}

Détection en PHP :

On utilise la variable globale $_SERVER[‘HTTP_USER_AGENT]

if (stristr($_SERVER['HTTP_USER_AGENT],"iPhone")header("location:/dirPourIphone/");

Sélection de la feuille de style CSSLa séparation des feuilles de style se conforme au prin-cipe DRY (Don’t Repeat Yourself) ainsi qu’à une logi-que économique singularisée par la bande passante, en évitant de surcharger avec des instructions inutiles ou inadaptées. Il est possible que lors des émulations sur un navigateur, celui-ci tienne compte de la largeur réelle de l’écran, dans ce cas, il faut remplacer le para-mètre du média max-device-width par max-width.

Maintenant, si on utilise Safari sous IPhone, ce der-nier considère la page en 980 pixels et affiche une pa-ge miniaturisée. C’est pourquoi il faut préciser au navi-gateur Safari mobile le paramètre user-scalable=no dans la head de la page :

<meta name"viewport" content="user-scalable=no, width=device-width" />

Ce tag meta est uniquement reconnu par Safari mobile.

Détection de l’orientationL’iPhone peut se manipuler horizontalement (mode paysage) et verticalement (mode portrait). Une maniè-re de faire si l’on désire affiner une feuille de script en fonction de l’orientation de la page, est d’indiquer à la balise body une classe d’orientation telle que <body class="portrait"> (voir Listing 2)

En JavaScript, on ajoute les écouteurs d’événement sur les évènements onload et onorientationchange (voir Listing 3). Le code JavaScript affecte la classe de la balise body.

Style de base iPhoneLe style de base à adopter pour faire une application Web conforme en termes de visualisation et d’ergono-mie est décrit dans la feuille CSS du Listing 3. Les don-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-rienter l’utilisateur avec des nouveaux codes visuels de façon à rendre son expérience agréable.

Le style, le look and feel, iPhone peut être celui-ci du Listing 4 pour un fichier html présentant un menu

avec une liste dont les éléments sont sélectionnables. Le bouton de menu est piloté par du JavaScript (voir Listing 5).

La littérature donne d’autres indications techniques du design iPhone. Voir les Tableau 1, Tableau 2 et Tableau 3.

Page 21: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

www.phpsolmag.org ��

Dossier

Présentation de jQTouchJQTouch est une librairie JavaScript qui propo-se tous les éléments nécessaires au développe-ment d’applications mobiles. D’autres librairies existent et sont très plébiscitées dans la littérature comme iUI ou WebApp.Net, mais il semble qu’elles comportent des bugs importants, peut-être vaut-il mieux attendre les versions suivantes. Ô tempora, Ô mores!

JQTouch s’appuie sur le moteur de rendu WebKit qui est utilisé par les navigateurs Safari, Google et Chrome et qui provient des librairies KJS et KHTML du projet KDE. jQTouch est un plugin de jQuery, cela signifie qu’il faudra charger jQuery. La version Beta 2 du 25 octobre 2010 s’appuie sur jQuery 1.4.2. Ce plugin est souple pour accepter la modification de ses thèmes et suppor-te d’autres plates-formes que iPhone comme Android, ce qui est un gage d’efficience.

La bibliothèque jQTouch doit être appelée après jQuery. Le thème CSS jqtouch.min.css avant les CSS spécifiques à la page pour profiter du cascading.

JQTouch simplifie la détection d’événements spé-cifiques comme les glissées (swipe) et les frappes au doigt sur l’écran (tap). Ces événements sont intercep-tés par une méthode callback.

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 AJAXL’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 qui économise la bande passante en terme de volume et de vitesse. En effet, une application web sur smart-phone est à rapprocher des contraintes imposées par le logiciel embarqué.

iPhone et les bases de donnéesLes navigateurs sur les mobiles, en particulier Safari, autorisent la permanence des données. Quid novi? Il existe depuis longtemps les cookies et les variables de sessions. Il peut être nécessaire de passer la limite des cookies en raison de leurs tailles et de leurs ac-cessibilités trop faciles, et les sessions ne sont là que le temps de la session web. Pour palier à cela, il exis-te d’une part deux objets JavaScript localStorage et sessionsStorage et d’autre part la base de don-nées SQL locale (SQLite) propre au navigateur, ac-cessible par JavaScript. L’intérêt premier est d’avoir une base de données avancée de type SGBD em-barquée, ce qui évitera la sollicitation excessive de la bande passante ainsi que des temps de réponse longs rédhibitoires. La base de données permet le questionnement SQL, les transactions, les rollbacks en cas d’échecs, etc.

Il est à remarquer que pour les puristes, que l’implé-mentation de la base de données repose sur SQLite ce qui n’est pas acceptable pour une normalisation et en ce moment le W3C est dans une impasse.

Figure 2. Géométrie iPhone

Figure 3. Inspecteur Web dans Safari

Page 22: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

iPhone

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-ment avec l’instruction JavaScript openDatabase().

Les requêtes peuvent être paramétrées pour parer les injections SQL. Voir le Listing 8.

Dans Safari, le menu développement offre l’affichage de l’inspecteur Web pour agir sur la base de données. Celui-ci possède une ligne de commande JavaScript en bas qui permet la complétion. Le traitement de la base

se fait à droite par la console SQL, la complétion SQL existe. Ce sont des outils de développement utiles pour la base de données et l’exécution de script SQL. (Voir la Figure 3). Il existe d’autres outils comme le profilage, l’exécution de script, l’inspection d’éléments. Les utili-sateurs de Firebug ne seront pas perdus.

ConclusionUn des premiers risque lorsqu’on développe pour un smartphone, c’est le faire pour une plate-forme parti-culière, développer uniquement pour l’ iPhone serait une erreur. En ce sens, il faut se méfier des librairies trop spécifiques. Plus que jamais, les phases de tests 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. L’utilisation de simulateur ou émulateur ont leurs limites et l’on doit tester sur le matériel cible.

Les problèmes de sécurité des données ainsi que leurs confidentialités doivent être abordés sérieuse-ment. La possibilité de stocker des données en locale ne doit pas se faire au détriment de la confidentialité. 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 de bureau.

Les applications que l’on peut télécharger peuvent être source de fuite d’information comme l’ont montré les récents événements sous smartphones Android avec l’application Wall paper. C’est un spyware qui ré-coltait les IMEI (identifiant unique téléphone) et numéro de carte SIM.

Le développement pour les smartphones permet de se plonger dans les nouvelles possibilités offertes par 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 utilisateur.

De même, une réflexion poussée sur l’ergonomie, avec des pages plus simples et des accès directs à l’es-sentiel de l’information, apportera un plus qualitatif.

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.

Listing 6. Glisser et taper avec jQTouch

$.jQTouch({ …touchSelector: 'a, .touchable', slideSelector: 'a.slide' ...});

$(function(){ $('#glissezmoi').swipe( function(event, info){ // info.direction donne des précisions sur le glissé: left ou right // info.deltaX et info.deltaY informent sur le métrique du déplacement });});$(function(){ $('#tapezmoi').tap( function(e){ // traiter l'équivalent du click au doigt });});

Listing 7. Détection de l’orientation avec jQTouch

...$(function(){ $('body').bind('turn', function(event, info){ // info.orientation renverra le type d'orientation: portrait ou landscape (paysage) var msg = 'Vous orienter votre smartphone en mode ' + info.orientation; alert(msg) ; });});

Listing 8. Création d’une base locale avec table et requęte SQL

//signature de openDatabase/* HYPERLINK „http://dev.w3.org/html5/webdatabase/" \l „dom-opendatabase"openDatabase (in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);};*///ouverture d'une base avec creation d'une tablevar db = openDatabase(" nomBase ", " 1.0 ", " NomAffichable", 65535 ,function (db) { db.changeVersion('', '1.0', function (t) { t.executeSql('CREATE TABLE maTable (id, nom, prenom)'); } )});//parametrage de requêtedb.readTransaction(function (t) { t.executeSql('SELECT nom, prenom FROM maTable WHERE id=?', [id], function (t, data) { report(data.rows[0].nom, data.rows[0].prenom); });});

JEAn TATAREAUDiplômé en ingénierie et qualité du logiciel au CNAM de Bordeaux, l’auteur s’ intéresse à la programmation et à la réalisation logiciel-le depuis de nombreuses années. Depuis plus de deux ans, il a créé et dirige la société Kiwi Engineering. Les domaines de prédilection sont le travail à façon d’applicatifs pour le professionnel ou le par-ticulier au travers d’interfaces Web. Contact http://www.kiwi-engi-neering.net.

Page 23: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

iPhone

www.phpsolmag.org ��

Page 24: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Dossier

L es smartphones connaissent un boom plané-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 s’arrachent ces nouveaux téléphones. Les plus évolués d’entre eux tels que l’iphone d’Apple, ou le Blackberry de RIM font fureur. Le consommateur lambda est séduit par la variété des fonctions de cette petite machine : consul-ter ses mails, son compte bancaire, téléphoner, envoyer un SMS, poster un comment sur Facebook, twitter le der-nier film qu’on a vu, tout est permis avec le smartphone. Il me manque une application ? Je peux la télécharger illico grâce à une plateforme comme l’AppStore d’Apple ou Android Market de Google. Les smartphones sont tel-lement pratiques, et rapides d’utilisation, que certaines personnes ne se connectent même plus à leur ordina-teur. Ce succès ne pouvait pas laisser les entreprises indifférentes. Mais une interrogation subsiste : Dans un environnement où la sécurité des données est primordia-le, dans quelle mesure les smartphones garantissent-ils la sécurité du système d’information des entreprises ?

Présentation des smartphonesLes systèmes les plus répandus de smartphones sont les suivants :

• L’iPhone OS,• Le Blackberry OS,• Windows Mobile,• Symbian OS.

Nous allons nous pencher sur la sécurité de ces systè-mes dans un contexte professionnel. Nous nous consa-crerons à l’étude de la sécurité d’un OS spécifique dans un prochain article.

Les faiblesses des smartphonesLes faiblesses des smartphones se situent à la fois sur les plans technique et fonctionnel. Tout d’abord, il n’y a aucune notion de privilège au niveau des systè-mes des smartphones. Chaque utilisateur de smart-phone est totalement libre de faire ce qu’il veut sur son système. Cela implique donc que dès que nous avons accès au système nous sommes capables d’y installer et de récupérer n’importe quel type d’infor-mations.

De plus, aucun outil système n’existe sur les smart-phones, contrairement aux systèmes d’exploitation classiques.

Les smartphones peuvent également échanger des informations via de multiples canaux : le bluetooth, la SD card, les ports USB ou encore le WiFi. Autant dire que le risque de transmission de virus est élevé.

Autre problème : les smartphones sont utilisés à des fins personnelles, mais aussi professionnelles, ce qui implique des synchronisations d’informations entre l’ordinateur de bureau et l’ordinateur personnel. Par conséquent, la propagation de virus et de malware de-vient relativement aisée. En effet, les smartphones ne disposent pas des mêmes protections que l’ordinateur professionnel.

La sécurité des smartphonesCet 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 :• La sécurité des smartphones.

Ce qu'il faut savoir :• Quelques notions sur les smartphones.

Page 25: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Smartphones

www.phpsolmag.org �5

Avertir tout de suite le service informatique de l’entreprise.

Couper l’accès VPN à l’entreprise pour l’utilisa-teur ayant perdu son smartphone.

Modifier les mots de passe d’accès au système d’information.

Ce ne sont évidemment que des exemples, bien d’autres actions doivent être entreprises dans un tel cas.

– Utiliser des antivirus pour smartphones. Des édi-teurs tels que Norton ou encore Kaspersky déve-loppent des antivirus pour smartphone.

– Appliquer des solutions de chiffrement pour mobile.– Utiliser un firewall pour mobile. On peut ici citer Mo-

bile Firewall pour Windows Mobile ou encore Fi-rewall IP pour l’iPhone.

– Mettre à jour les logiciels et systèmes afin de palier les éventuelles failles.

Néanmoins, les solutions de sécurité pour smartphones présentent encore de nombreuses faiblesses. En effet, certains ne sont pas capables de reconnaître certains virus/spyware très répandus sur la toile.

ConclusionLes smartphones se répandent de plus en plus, dans les sphères aussi bien professionnelles que privées. Mais ils présentent de nombreuses faiblesses. De nom-breux moyens, techniques et fonctionnels existent pour améliorer leur sécurisation. Ils représentent une base intéressante, mais pas encore suffisante pour affirmer que les smartphones disposent du niveau de sécuri-té requis pour être intégrés à l’environnement critique d’une entreprise.

D’abord développés pour le consommateur lamb-da, les smartphones n’ont pas été prévus pour un usage professionnel. Si vous l’utilisez dans un contex-te professionnel, prenez garde à optimiser la sécuri-sation de vos données afin d’éviter toute fuite d’infor-mations.

Autre problème majeur : les utilisateurs sont très peu sensibilisés aux bonnes pratiques d’utilisation des smartphones. Peu d’entre eux pensent à activer un co-de de protection pour restreindre l’accès à leur télépho-ne. Un élément parmi tant d’autres qui rend les don-nées du smartphone très facilement accessibles.

Un simple câble USB peut également suffire à dé-rober les données d’un smartphone. En réalité, aucune session d’utilisateur, ni aucun mot de passe n’empê-chent l’intrusion au sein du système. Prenons l’exem-ple d’un iPhone : seul un mot de passe de quatre chif-fres permet le vérouillage, et donc le dévérouillage de l’écran. Dans ces conditions, déjouer la sécurité d’un iphone s’avère relativement facile.

Les risquesLa compromission d’un smartphone peut être dange-reuse. En effet, prenons l’exemple d’un salarié d’une entreprise X qui synchronise son smartphone sur un uti-lisateur personnel infecté. Le smartphone professionnel se trouve alors infecté. Il suffit ensuite que ce salarié synchronise son smartphone sur son ordinateur profes-sionnel pour que ce dernier soit infecté. Cela pourrait alors donner accès au réseau de l’entreprise à un at-taquant.

Comment sécuriser les smartphonesAprès avoir étudié les faiblesses des smartphones, il convient de passer en revue les différents moyens de les sécuriser. Tout d’abord, nous tenons à préciser que le but premier des smartphones est une utilisation per-sonnelle. En ce sens, l’aspect sécurité n’a donc pas été privilégié par les développeurs bien que les nouvelles versions d’OS l’améliorent grandement. En effet, de plus en plus de sociétés s’interrogent et réalisent des analyses de risques car l’utilisation des smartphones en entreprise est en passe de devenir incontournable.

Afin de sécuriser au mieux les smartphones, voici quelques bonnes pratiques à suivre :

– Utiliser une bonne politique de mot de passe. 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

perte ou de vol d’informations afin d’éviter de gra-ves conséquences pour l’entreprise. Cela peut être une série d’actions à effectuer auprès du service in-formatique de la société telles que :

TOnY FACHAUXL’auteur travaille en tant que consultant sécurité pour la société LE-XSI (Laboratoire d’EXpertise en Sécurité Informatique). Il se passion-ne pour toutes les problématiques liées à la sécurité dans un conte-xte professionnel.

Page 26: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Fiche technique

L ’industrialisation de PHP c’est le processus de fa-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 m’attarderai sur la phase de développement et précisé-ment sur les tests, une partie très importante et souvent la première à outiller lorsque l’on souhaite industrialiser ses développements. Une première partie sera consa-crée aux différentes manières de tester une application web en rappelant brièvement pourquoi il est important d’écrire des tests. Suite à cela, quelques outils à connaî-tre (et à mettre en place !) seront présentés. Pour termi-ner, j’évoquerai d’autres outils présents en amont et en aval de la phase de développement.

Vous avez dit tests ?En effet. Tester son application est de loin la meilleure chose à faire. C’est ce qui fera gagner le plus de temps et beaucoup de développeurs croient (encore) le contraire. Le calcul est simple : le temps passé à écrire quelques tests sera bien moindre face au temps passé en débogage.

L’exemple le plus marquant est peut-être celui de la régression de code. PHP excelle en la matière : un pe-tit point-virgule oublié, une portion de code mort, une méthode qui n’est plus appelée, … Ces erreurs sont fréquentes et quelques tests unitaires permettront de surveiller votre code qui deviendra robuste.

Avec le framework Symfony, vous générez vos classes Model à chaque fois que vous faites une mo-

dification dans votre schema.yml (le schéma qui repré-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-ter l’ensemble des changements amenés par une mo-dification dans le schéma. L’écriture de tests unitaires permet de surveiller vos classes Model, c’est-à-dire le fonctionnement interne de votre application : les acces-seurs (getters/setters), les méthodes de calcul et tou-tes autres méthodes publiques de vos objets. Le débat intéressant est le suivant : doit-on tester les méthodes privées ou protégées ? Oui mais attention, il ne s’agit pas de casser la visibilité de nos méthodes. Une mé-thode privée ou protégée sera utilisée dans au moins une méthode publique, c’est celle-ci que nous devrons tester en faisant en sorte de tester les appels de mé-thodes privées ou protégées dont elle se sert. Je viens de vous présenter les tests unitaires, des tests simples garant d’un code solide, voyons maintenant d’autres types de tests.

Les tests fonctionnels suivent généralement les tests unitaires. Généralement, on en distingue deux types :

• Les tests fonctionnels du client qui va voir comment le système réagit ;

• Les tests fonctionnels appliqués au code (les for-mulaires par exemple) que l’on confond parfois avec les tests d’intégration.

Introduction à l’industrialisation de PHPPHP 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 :• Le terme industrialisation et ses enjeux.• Une forme d’industrialisation possible.

Ce qu’il faut savoir :• Des connaissances en matière de bonnes pratiques PHP (tests

notamment).

Page 27: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Industrialisation de PHP

www.phpsolmag.org ��

Attention, la rédaction des tests unitaires ne sera pas traitée dans cet article. Passons donc aux tests fonc-tionnels.

Symfony embarque un mini framework de tests fonc-tionnels. Celui-ci permet de faire des tests qualifiés de techniques. En d’autres termes, nous allons tester des for-mulaires, des navigations de pages et autres mais sans pour autant profiter d’un vrai rendu et de toutes les interac-tions possibles avec un vrai navigateur. En effet, la clas-se sfBrowser de Symfony ne fait que des requêtes HTTP sans possibilité de tester les requêtes AJAX par exemple.

Pour cela, il existe un outil très pratique nommé : selenium. C’est une application disposant de plusieurs éléments dont un plugin pour Firefox permettant d’enre-gistrer un scénario de tests et de le rejouer par la suite. C’est puissant puisque, une fois enregistré, nous pou-vons tester à peu près tout ce que l’on souhaite et le re-jouer sur plusieurs navigateurs sans souci. Vous voyez aisément l’intérêt ?

Les tests d’intégration forment une troisième famille de tests. Ils visent à tester la cohésion de l’application lors-qu’on y ajoute de nouvelles fonctionnalités, modules, etc.

Des outils pour les tests !Pour tester une application, il faut avoir les outils qui vont bien et en PHP, il y en a rassurez-vous. Voici deux librairies incontournables pour nos tests uni-taires :

• lime : framework de tests embarqué dans le fra-mework Symfony 1.x ;

• PHPUnit : semblable à JUnit en Java, il tend à de-venir le framework principal de tests pour PHP. Je ne peux que vous le recommander. Ce dernier vous permettra de profiter de sur-couches issues du monde Java pour vos développements PHP com-me nous allons le voir par la suite.

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).

Page 28: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Fiche technique

En complément, nous avons le test de couverture de code. Ce test quantifie le code testé avec les tests uni-taires, autrement dit l’efficacité de ces tests. Cette cou-verture se mesure avec Xdebug couplé à l’un des deux frameworks de tests énoncés ci-avant.

Il nous est possible de faire des tests unitaires et fonctionnels mais leurs exécutions restent manuel-les. Il serait bon d’affranchir nos développeurs du fait de lancer nos tests. Il existe des outils pour cela, regrou-pés autour du terme intégration continue.

L’intégration continueContinuous Integration (CI) est l’action d’automatiser les tests et de les lancer périodiquement. Le logiciel employé est appelé serveur d’intégration continue, en voici deux :

• phpUnderControl : qui utilise en sous-couche CruiseControl, le serveur CI Java ;

• Hudson : directement emprunté à Java.

phpUnderControl (Figure 4) est très sexy mais com-pliqué à installer. Un projet vise à le rendre plus simple

de prise en main notamment par le biais d’un paquet officiel Debian.

Hudson (Figure 5) quant à lui est très simple, doté d’énormément de plugins et, bien qu’outil Java, très uti-lisé dans le monde PHP professionnel.

Un serveur CI se connecte à un gestionnaire de ver-sions et possède la capacité d’effectuer une série de tâ-ches périodiquement. On pourra, par exemple, choisir de lancer nos tests après chaque commit ou à interval-le de temps spécifié. Nous reviendrons sur les gestion-naires de versions dans la dernière partie de cet article.

Brancher nos tests unitaires et fonctionnels est très simple puisque lime et surtout PHPUnit reprennent le format de sortie de JUnit, une référence en matière de tests unitaires Java.

Cependant, le vocabulaire est peu commun, il fau-dra d’abord se familiariser avec le terme build qui signi-fie étape de création. Autrement dit pour une application PHP, la récupération des sources depuis un gestionnai-re de versions, l’exécution des tests, des analyses sur le code, la remontée d’indicateurs ou métriques et l’in-tégration avec d’autres outils extérieurs que je présen-terai plus loin.

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

Figure 4. Exemple de graphiques dans phpUnderControl.

Page 29: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Industrialisation de PHP

www.phpsolmag.org ��

Page 30: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0�0

Fiche technique

Mais que sont ces analyses sur le code ? C’est l’ob-jet de ma prochaine partie.

Analyser pour mieux régnerLorsque notre serveur CI est fonctionnel, il est intéres-sant de lui ajouter des fonctionnalités qui seront lan-cées après l’exécution de nos tests et la réussite de ceux-ci. Analyser le code source est une bonne idée. Il existe trois niveaux d’analyse :

• L’analyse lexicale : pour le code redondant, les er-reurs dans le suivi du guide de style ;

• L’analyse syntaxique : pour les erreurs de paramè-tres, code mort, non respect de règles Objet ;

• L’analyse du bytecode PHP (opcode).

Au niveau lexical, on dispose de PHP_Codesniffer qui va vérifier le respect de règles prédéfinies. L’utilisation courante est d’écrire une série de règles définissant son guide de style et de valider notre code source. Si une portion de code ne respecte pas notre guide, PHP_Co-desniffer l’indiquera dans son rapport. Couplé à Hud-son et à son plugin Checkstyle, nous aurons directe-ment l’information. C’est très pratique lorsque plusieurs développeurs travaillent sur un même projet et dispo-sent du guide de style de l’entreprise.

Au niveau syntaxique, PHP_depend va nous four-nir des informations sur le niveau d’abstraction de no-tre code, le nombre moyen de méthodes par classe, la

complexité cyclomatique, le nombre de classes héritées et bien d’autres. Notez que PHP_depend est l’équiva-lent PHP de Jdepend en Java.

On dispose également de PHP mess detector qui est proche de PHP_depend et qui lui va détecter les portions de code mort ou encore le nombre excessif de paramètres pour une méthode. On utilisera le plugin drY d’Hudson pour visualiser les résultats.

Troisième et dernier outil, PHP Copy/Past detector qui va détecter la duplication de code. Un must have lorsque l’on suit la logique Don’t Repeat Yourself !

Analyser notre code au niveau byte code est plus compliqué, les outils sont moins connus et je ne m’y at-tarderai pas. Pour les intéressés, voyez Vulcan logic disassembler, bytekit et bytekit-cli.

L’ensemble des outils présentés dans cette partie ne nous servent à rien si l’on ne peut pas exploiter les indicateurs retournés. Pour visualiser les informations, on peut utiliser directement Hudson ou phpUnderCon-trol mais il existe également sonar pour PHP (Figure 6). sonar est l’arme ultime en Java pour l’analyse de code et il est porté pour PHP, foncez ! Certaines métri-ques (celles de PHP_depend par exemple) ne seront pas très explicites dans Hudson, il sera préférable de connecter PHP_depend à sonar et Sonar à Hudson.

Dernier outil de cette partie : phpdocumentor qui va générer une documentation complète de l’applica-tion en se basant sur les commentaires dans les sour-ces. Bien évidemment, si des erreurs sont présentes

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

Page 31: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Industrialisation de PHP

www.phpsolmag.org ��

dans les commentaires (exemple : s’il n’y en a pas …), l’outil fera remonter l’information.

La plupart de ces outils seront mis en place via Phing, un automatiseur de tâches open source comme peut l’être Ant en Java. On utilise un fichier XML nommé

build.xml contenant une série d’actions possibles pou-vant être dépendantes les unes des autres.

Nous avons à présent totalement défini les outils supplémentaires attachés à notre build. Elle est com-plètement configurée, les résultats des analyses sont

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.

Page 32: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Fiche technique

visibles. Nous pouvons désormais travailler en amont et en aval de celle-ci. C’est ce qui suit.

Préparons et automatisonsNous 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. Des outils existent pour faciliter cette phase critique.

Capistrano est le premier. C’est un outil écrit en Ru-by et initialement fait pour déployer des applications Ru-by On Rails. Le fonctionnement est simple : on initialise une configuration pour un projet donné, on configure nos accès serveurs, gestionnaire de versions, base de données, … Éventuellement, nous pouvons surcharger certains comportements. Capistrano sait gérer autant de serveurs qu’on le souhaite, il va exécuter une suc-cession de commandes sur chaque serveur : récupéra-tion des sources, liaison à la base de données, efface-ment des caches, rotation des logs, etc.

Capistrano met en place une arborescence de fi-chiers qui lui est propre sur chaque serveur web (Figure 7). Le dossier releases contient l’ensemble des versions

déployées du projet, le dossier shared contient les élé-ments partagés entre toutes les releases et un lien sym-bolique current pointe sur la dernière version déployée de l’application. Ce système de releases permet de faire un roll back si un problème survient lors du déploiement.

Enfin, Capistrano pourrait gérer les migrations des bases de données mais il faut faire attention.

Une migration de base de données est très criti-que car elle a un impact directement sur l’intégrité des données : une requête plante et toute la base peut être cassée. Pour éviter cela, on peut soit faire les migra-tions à la main, soit faire confiance à certaines appli-cations PHP. doctrine sait gérer les migrations et le

Figure 7. Arborescence créée par Capistrano sur chaque serveur web distant.

Page 33: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

Industrialisation de PHP

www.phpsolmag.org ��

fait plutôt bien, moyennant la relecture des scripts de migration générés. Là encore, il faut soit être de nature confiant, soit passer les migrations à la main.

Notre application est maintenant déployée, accessi-ble aux utilisateurs finaux. Pourtant, des problèmes sur-viennent et les utilisateurs nous submergent de mails. Un type d’application est dédié à cette récolte de retours utilisateurs (feedbacks) : les bug-trackers ou encore rapporteurs d’erreurs. Les utilisateurs saisissent directe-ment leurs mésaventures via une interface web et sont tenus au courant par mail des avancées : demande de précisions, résolution, rejet, prise en compte, ...

mantisbT est une solution répandue, qui peut se connecter à un serveur Hudson et recevoir des infor-mations lorsque les erreurs sont corrigées dans une build. Il existe également bugzilla utilisé par Mozilla, plus complet et donc moins simple à prendre en main.

ConclusionAprès cette introduction qui présente de nombreux outils, que pouvons-nous en retenir ? Premièrement que nous disposons de beaucoup d’outils et qu’il ne reste qu’à s’en servir. Il existe un bon nombre d’articles techniques sur le sujet.

La progression décrite ici est une logique d’indus-trialisation : commencer par écrire des tests, les auto-

matiser puis mettre en place des outils d’analyse et les automatiser. Après cela, on va pouvoir changer d’autres phases : un gestionnaire de version pour centraliser les sources, différents environnements de développement, une automatisation du processus de déploiement et une gestion des retours clients.

S’industrialiser est un fait, de nombreuses entrepri-ses s’y attèlent. De plus, les frameworks actuels facili-tent les choses, les concepts agiles sont bien en phase avec l’industrialisation et PHP est clairement profes-sionnel.

L’unique problème reste la gestion du changement, qui n’est ni lié à PHP, ni lié au monde informatique mais intimement mêlé au genre humain. Il faudra alors prépa-rer l’équipe aux changements, montrer l’efficacité et la nécessité de s’industrialiser. Une industrialisation réussie est une industrialisation convaincante et performante.

WILLIAM DURAnDL’auteur est élève ingénieur et développeur web indépendant spéc-ialisé dans le développement PHP avec le framework Symfony et Ja-va depuis près de deux ans. Il est également fondateur de Bazinga, une agence spécialisée en développement web et rythmée par les pratiques agiles.Contact direct : http://www.willdurand.fr

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

Page 34: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Pratique

U n framework permet de simplifier considérable-ment le processus d’internationalisation, mais chacun a ses spécificités. Internationaliser une

application existante peut s’avérer complexe et laborieu-se si l’implémentation initiale ne suit pas certains princi-pes … il vaut donc mieux en tenir compte dès le départ !

Cet article vous présentera les principales étapes d’internationalisation d’une application utilisant le fra-mework CakePHP.

Internationaliser les chaînes statiques.Les fonctions gettextLes 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-riel, de grouper des chaînes par domaine (pour avoir

par exemple un fichier de langue par plugin) ou de dé-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.

Remarque : si aucune correspondance n’est trou-vée, le texte passé en paramètre est affiché / retourné. Si votre site n’est pas multilingue, il est tout de même re-commandé (et peu contraignant) d’utiliser les fonctions gettext pour vos chaînes. En effet, cela vous fera ga-gner un temps très important le jour où vous voudrez réutiliser du code dans une application internationalisée

Internationaliser une application CakePHPL’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 :• La gestion de la traduction des chaînes statiques.• Une stratégie de gestion des urls facilitant la détection auto-

matique de la langue et permettant de proposer des urls spéc-ifiques à chaque langue.

• Les bases de la création de modèles contenant des informa-tions multilingues.

Ce qu'il faut savoir :• Être à l'aise avec le fonctionnement de CakePHP : routes, clas-

se Configure, modèles, plugins.• Utiliser le shell cake en ligne de commande.

Figure 1. Arborescence des fichiers de langue d’une application CakePHP

Page 35: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

CakePHP

www.phpsolmag.org �5

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

_ _ ('Hello world'); // Affichera "Bonjour monde"_ _ ('Hello world', true); // Retournera "Bonjour monde"_ _ n('Hello world', 'Hello worlds', $count); // "Bonjour monde" ou "Bonjour mondes" suivant la valeur de $count_ _ d('mon-plugin', 'Hello world'); // Afficherait "Bonjour monde du plugin" (fichier "mon-plugin.po")_ _ c('January', 5); // Afficherait "Janvier" (fichier "LC _ TIME/default.po")// Il existe différentes combinaisons possibles. Par exemple :_ _ dcn('mon-plugin', 'Monday', 'Mondays', $count, 5, true); // Retournerait "Lundi" si $count = 1 (fichier "LC _ TIME/mon-plugin.po");

Listing 2. Trace d'exécution d'un shell cake i18n extract

mac-mini:phpsol pierremartin$ cake i18n extractWelcome to CakePHP v1.3.6 Console---------------------------------------------------------------App : phpsolPath: /Users/pierremartin/www/phpsol---------------------------------------------------------------What is the full path you would like to extract?Example: /Users/pierremartin/www/myapp[Q]uit [D]one [/Users/pierremartin/www/phpsol] >

What is the full path you would like to extract?Example: /Users/pierremartin/www/myapp[Q]uit [D]one [D] >

What is the full path you would like to output?Example: /Users/pierremartin/www/phpsol/locale[Q]uit [/Users/pierremartin/www/phpsol/locale] >

Would you like to merge all domains strings into the default.pot file? (y/n) [n] >

Extracting...---------------------------------------------------------------Paths: /Users/pierremartin/www/phpsolOutput Directory: /Users/pierremartin/www/phpsol/locale/---------------------------------------------------------------Processing /Users/pierremartin/www/phpsol/app _controller.php...[...]

Error: default.pot already exists in this location. Overwrite? [Y]es, [N]o, [A]ll (y/n/a) [y] > Done.

Listing 3. Configuration de la langue courante avec détection de la langue de l'utilisateur

if (!class _ exists('L10n') { App::import('Lib', 'L10n');}

$L10n = new L10n();

$currLang = $L10n->get(); // Configurera automatiquement "Config.lang"

debug($currLang); // Au besoin vous pouvez utiliser cette valeur pour votre propre logique

ou tout simplement internationaliser votre application existante !

Gestion des fichiers de traductionOrganisation des fichiersComme vous avez pu le comprendre, l’intérêt de l’utilisa-tion des fonctions gettext est qu’il vous permettra de gé-rer les traductions de vos chaînes dans des fichiers ex-ternes. CakePHP se base sur l’utilisation de fichiers *.pot (catalogue) et *.po (traductions) qui sont des formats de fichiers très répandus pour la gestion de traductions.

La Figure 1 illustre l’arborescence des fichiers de lan-gues tels qu’ils sont organisés dans une application Ca-kePHP. Tous les fichiers sont regroupés dans le dossier /locale de l’application. Les fichiers *.pot sont à la ra-cine du dossier et contiennent le catalogue des chaînes de caractères existantes. Les catalogues ne contiennent pas de traduction, mais sont utilisés comme point de ré-férence pour la génération des fichiers *.po.

Ces derniers contiennent une correspondance en-tre la chaîne originale (décrite dans le catalogue) et sa traduction dans une langue donnée. Ils sont organisés dans des sous-dossiers ayant le code de la langue de traduction (par exemple «fre» pour la langue Françai-se), et ensuite par catégorie de chaîne (LC_MESSAGES par défaut)

Remarque : il existe plusieurs outils permettant l’édi-tion des fichiers de traduction. Bien qu’un simple éditeur de texte suffise, nous vous recommandons l’utilisation du logiciel Open Source Poedit (http://poedit.net).Génération des fichiers *.potL’extraction des chaînes de votre application est l’éta-pe consistant à générer un ou plusieurs fichiers *.pot contenant les chaînes statiques utilisées dans votre ap-plication. Cette opération est très laborieuse à faire ma-nuellement, en revanche CakePHP fournit une applica-tion en mode console (un shell) vous permettant de le faire très facilement.

Pour l’utiliser, il vous suffit d’exécuter la commande cake i18n extract et de vous laisser guider par les questions qui vous seront posées. Le Listing 2 contient une trace d’exécution du shell d’extraction des chaînes de caractère d’une application phpsol.

Détection et choix de la languePrincipes de baseConfiguration de la langue couranteLa configuration de la langue actuelle que doit utiliser CakePHP se fait par le biais de la clé Config.lang de la classe Configure. Le framework n’implémente pas de stratégie par défaut pour le choix de la langue, et c’est au développeur de mettre en place la solution adaptée à ses besoins.

Il est recommandé de déterminer la langue actuelle grâce à l’url, soit par l’utilisation de sous-domaine soit par un paramètre de l’url. Le code ci-après présente

Page 36: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Pratique

plication. Elle permet notamment de définir la langue pré-férée de l’utilisateur comme langue courante. Le Listing 3 montre comment déterminer la langue de l’utilisateur.

Remarque : dans le cas où la langue de l’utilisa-teur ne peut pas être déterminée, c’est la valeur de la constante DEFAULT_LANGUAGE qui sera utilisée. Il est donc conseillé de la définir dans le fichier /config/bootstrap.php.

Utilisation des routes pour un peu de magie...Limites des implémentations les plus utiliséesIl y a différentes approches existantes pour déterminer et configurer la langue actuelle dans une application. Ce problème se résout facilement si le site utilise des sous-domaines ou des domaines différents pour cha-que langue (dans ce cas il suffit de définir la langue courante en fonction de l’url de base). En revanche cela s’avère plus complexe dans cas où le paramètre est propagé dans l’url : http://exemple.com/ (version anglai-se du site), http://exemple.com/fre (version française du site) …

Il existe différentes implémentations pour cette si-tuation, les principales étant :

• la détection de la langue courante dans AppController::beforeFilter() et la surcharge de AppHelper::url() pour ajouter automatiquement le code de langue à chaque lien généré dans la vue,

• l'extension du Router de CakePHP afin de traiter cette problématique à la racine.

La première solution est la plus répandue, mais po-se des problèmes pour propager le code de la lan-gue notamment lors de l’utilisation de Controller::redirect(). De plus la configuration de la langue est effectuée assez tard dans le processus de dispatch de l’url, ce qui peut notamment poser des problèmes pour les chaînes de caractères déclarées dans les modèles (messages de validation par exemple).

La seconde est celle qui est implémentée dans le CMS Croogo (http://croogo.org). Elle est assez effica-ce, mais la quantité de code à maintenir est assez im-portante et l’implémentation dépend fortement du cœur du framework (ce qui peut poser des problèmes en cas de mises à jour par exemple).

L’implémentation que nous détaillerons par la suite se base sur une nouvelle fonctionnalité apportée par la version 1.3 du framework : les routes personnalisées.

Routes personnaliséesLes routes sont utilisées dans CakePHP pour faire un mapping entre l’url courante et le trio contrôleur / action / paramètres qui seront exécutés. A l’inverse, elles sont aus-si utilisées pour convertir un tableau représentant ce trio en une url correcte. Elles permettent ainsi de centraliser la gestion des urls (dans le fichier /config/routes.php)

une manière simple pour définir la langue courante en fonction des paramètres de la requête :

Configure::write(‘Config.lang’, $this->params[‘named’][‘lang’]);

Détection automatique de la langue de l’utilisateurCakePHP fournit une classe L10n contenant diverses méthodes utiles dès que l’on souhaite localiser son ap-

Listing 4. Implémentation de base d'une route permettant la gestion des urls internationalisées

App::import('Core', 'Router');class I18nRoute extends CakeRoute {

public function _ _ construct($template, $defaults = array(), $options = array()) { // Ajoute une contrainte sur les codes de langue corrects pour le préfixe $options = array _ merge((array)$options, array( 'lang' => implode('|', Configure::read('Config.languages')), )); parent:: _ _ construct($template, $defaults, $options); }

public function match($url) { // Ajoute la langue courante en tant que paramètre pour l'url générée if (empty($url['lang'])) { $url['lang'] = Configure::read('Config.language'); } return parent::match($url); }

public function parse($url) { $params = parent::parse($url); // Configure la langue courante en fonction du paramètre de l'url if ($params !== false && array _ key _exists('lang', $params)) { Configure::write('Config.language', $params['lang']); } return $params; }}

Listing 5. Configuration des langues de l'application dans le bootstrap

define('DEFAULT _ LANGUAGE', 'fre');Configure::write('Config.languages', array('eng', 'spa');

Listing 6. Modification / Configuration des routes dans config/routes.php

App::import('Lib', 'I18n.I18nRoute');Router::connect( '/', array('controller' => 'pages', 'action' => 'display', 'home'), array('routeClass' => 'I18nRoute'));

// Cette route contiendra le code de langue en milieu d'url (/pages/eng/* au lieu de /eng/pages/* par défaut) Router::connect( '/pages/:lang/*', array('controller' => 'pages', 'action' => 'display'), array('routeClass' => 'I18nRoute'));

// Appels permettant une configuration complète des routes I18nRoute::connectDefaultRoutes();I18nRoute::promoteLangRoutes();

Page 37: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

CakePHP

www.phpsolmag.org ��

et de modifier très simplement le schéma d’urls utilisé par votre application.

CakePHP depuis sa version 1.3 donne la possibilité au développeur d’étendre la classe de route par défaut du framework pour ajouter de la logique personnalisée. Cette classe étant assez bas niveau dans l’architecture du framework, elle est appelée très tôt dans le proces-sus de dispatch … ce qui en fait un très bon endroit pour la gestion du changement des langues.

Les deux principales méthodes que doit implémenter une route sont : match() pour générer une url à partir d’un tableau (trio contrôleur / action / paramètres), et parse() pour parser une url et générer le trio correspondant. Le Listing 4 présente une implémentation simple de ce prin-cipe. Heureusement pour nous, il existe une version tes-tée et améliorée de cette route … en Open Source ! La partie suivante explique comment l’utiliser.

Utilisation du plugin i18n de CakeDCLe plugin i18n proposé par CakeDC est un plugin Open Source (licence MIT) contenant notamment une route 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 :

1. Téléchargez le plugin (https://github.com/cake-dc/i18n) et ajoutez les fichiers dans le dossier /plugins/i18n de votre application.

2. Configurez les langues de votre application dans 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).

3. Modifiez vos routes existantes dans le fichier /config/routes.php pour utiliser la route personna-lisée I18nRoute fournie par le plugin. Par défaut le code de la langue sera ajouté en début d’url (exem-ple: http://exemple.com/spa/articles/view/4) mais vous pouvez choisir vous même son emplacement avec le paramètre nommé :lang (voir le Listing 6).

4. Appelez la méthode I18nRoute::promoteLangRoutes() en fin de fichier. Ceci est nécessaire pour rétablir l’or-dre correct des routes déclarées (il serait assez long et peu utile d’expliquer la raison exacte dans cet ar-ticle car cela touche au fonctionnement interne du framework). Il est également nécessaire d’appeler la méthode I18nRoute::connectDefaultRoutes(); si vous souhaitez configurer les routes par défaut du fra-mework pour utiliser ce schéma d’url (voir le Listing 6).

C’est tout ce qu’il faut pour mettre en place très simple-ment la gestion de différentes langues sur votre site ! Pour rediriger l’utilisateur vers une page dans une langue différente (par exemple en anglais), il suffira d’ajouter le paramètre ‘lang’ => ‘eng’ au tableau décrivant l’url.

Internationalisation des contenus dynamiquesL’internationalisation d’une application ne se limite pas à la traduction de chaînes statiques dans la langue de l’utilisateur. Il faut le plus souvent également gérer les contenus dynamiques ou publiés par les utilisateurs soit gérés par les administrateurs.

Cette section propose des solutions à ces problé-matiques.

Contenus spécifiques à une languePrenons le cas d’une base de données partagée entre les différentes langues du site, mais dont les contenus postés par les utilisateurs ne doivent être affichés que sur l’interface correspondant à une seule des langues. Par exemple, un commentaire posté par un utilisateur sur la version Française du site sera visible uniquement sur la version Française.

La solution la plus simple est d’ajouter un champ lang dans la table commentaires afin de stocker la lan-gue dans laquelle est le contenu.

Les callbacks du modèle peuvent être utilisés pour remplir automatiquement le champ avec la langue

Listing 7. Utilisation des callbacks des Modèles pour manipuler des contenus spécifiques à une langue

public function beforeFind($query) { if (empty($query['conditions'][$this->alias. '.lang')) { $language = Configure::read('Config.language'); $query['conditions'][$this->alias . '.lang'] = $language; } return $query;}

public function beforeSave() { if (empty($this->data[$this->alias][$this->primaryKey]) && empty($this->data[$this->alias]['lang'])) { $this->data[$this->alias]['lang'] = Configure::read('Config.language'); } return true;}

Listing 8. Configuration d'un Modèle Article pour utiliser le TranslateBehavior

class Article extends AppModel { public $actsAs = array( 'Translate' => array('titre', 'contenu') );}

Le plugin i��n

Nous avons illustré l’utilisation de la route personnalisée fournie par le plugin i��n de CakeDC, mais sachez que ce plugin contient d’autres classes utiles pour la création de si-tes multilingues. Nous vous invitons à regarder ce que pro-pose le plugin (Google Translate, I18nableBehavior...).

Page 38: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Pratique

PIERRE MARTInPierre Martin est développeur web, expert CakePHP au sein de la société CakeDC. Passionné de programmation, il s’est spécia-lisé dans le développement web en parallèle de ses études avec une activité de développeur web indépendant durant deux années, avant d’intégrer CakeDC. Il travaille désormais à plein temps autour du framework pour des clients internationaux, et est un membre actif de la communauté francophone de CakePHP.

courante lors d’une sauvegarde, et ajouter une condi-tion avant chaque recherche. Le Listing 7 illustre cette implémentation.

Remarque : Cette implémentation peut bien sûr être améliorée et rendue générique. Le plugin i18n mention-né précédemment propose par exemple le comporte-ment I18nableBehavior qui répond à cette probléma-tique.

Contenus multilinguesAbordons enfin le cas de contenus dynamiques devant être disponibles dans plusieurs langues. Par exemple un CMS proposant à l’administrateur d’administrer les pages pour chacune des langues du site.

Il y a en général plusieurs implémentations possi-bles pour ce type de problématique :

• la création de plusieurs champs en base de don-née pour chaque langue (exemple : titre _ fr, titre _ en),

• la duplication des entrées, avec un code de langue différent pour chacune (voir la section précédente sur la gestion des contenus spécifiques à une lan-gue),

• l'externalisation des champs multilingues dans une table différente.

C'est cette dernière implémentation qui est supportée de base par CakePHP grâce au TranslateBehavior. En effet, ce comportement permet de sauvegarder et de retrouver les informations de chaque contenu de manière transparente … celles-ci étant stockées dans une table séparée.

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 aller plus loin (http://book.cakephp.org/fr/view/1328/Translate).

Voici les principales étapes pour l’utilisation du TranslateBehavior et rendre multilingue un modè-le existant. Nous utiliserons l’exemple d’un modèle Article dont nous voulons rendre les champs titre et contenu multilingues.

1. Créez la table i18n : il suffit simplement de lancer la commande cake i18n initdb dans un shell de-puis la racine de votre application.

2. Supprimez les champs superflus de votre schéma actuel. Vous n’aurez plus besoin d’avoir les champs multilingues dans la table utilisée par le Modèle. Dans notre exemple nous supprimerons les champs articles.titre et articles.contenu de notre ba-se de données.

3. Ajoutez le comportement Translate dans votre Mo-dèle, en le configurant avec la liste des champs multilingues. Le Listing 8 illustre cette configuration dans le cas de notre exemple.

Dorénavant le titre et le contenu des Articles seront sau-vegardés dans la table i18n, avec des informations sur la langue utilisée. CakePHP fera ensuite les jointures nécessaires pour retourner les traductions correctes en fonction de la langue configurée dans l’application.

Remarque : l’utilisation d’une seule table d’interna-tionalisation peut poser des problèmes de performance lorsque la quantité de données stockées augmente. Heu-reusement il est possible de définir des tables différentes pour stocker les traductions de chaque modèle dans des tables séparées grâce aux attributs $translateModel et $translateTable du Modèle multilingue.

Attention : il existe une limite connue de cette im-plémentation, due au fonctionnement interne de Cake-PHP. Les callbacks des comportements ne sont pas appelés pour les modèles associés durant la récupéra-tion de données. Il faudra donc implémenter leur appel de manière manuelle … nous n’entrons volontairement pas dans les détails, mais sachez que c’est possible !

ConclusionNous avons donc vu quelles étaient les principales éta-pes et techniques pour internationaliser une application CakePHP. Le framework propose des outils permettant de faciliter la tâche du développeur, et la communauté propose également des ressources dans ce sens.

Que vos besoins soient simples (traduction de l’in-terface d’un site) ou plus complexes (détection automa-tique de la langue, contenus multilingues) il suffira en règle générale de quelques lignes de code pour attein-dre votre but, dans le cas où votre application respecte les quelques principes de bases présentés ici.

Sur Internet

• https://github.com/cakedc/i18n – Le plugin i��n de Ca-keDC (licence MIT),

• http://book.cakephp.org/fr/view/1328/Translate – Docu-mentation du TranslateBehavior,

• http://www.poedit.net/ – Site web du logiciel POEdit po-ur l’édition de fichiers de traduction,

• http://www.cakephp-fr.org – Site de la communauté fran-cophone de CakePHP (forums …),

[email protected] – Adresse de l’auteur de l’article pour toutes questions ou remarques.

Page 39: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

CakePHP

www.phpsolmag.org ��

Page 40: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0�0

Pour les débutants

Dans l’article précédent, sur le langage de défi-nition des données, vous avez appris à créer une base et des tables. Vous allez maintenant

apprendre à insérer des données dans cette base, à les modifier ou à les supprimer tout en tenant compte des contraintes établies.

Pour appliquer les notions présentées, vous devez uti-liser un serveur de base de données MySQL, de préféren-ce la version 5, un serveur web avec PHP version 5 et le client graphique phpMyAdmin. Les distributions XAMPP (Windows, Linux, Mac OS), WAMP (Windows), EasyPHP (Windows) ou MAMP (Mac OS) vous fourniront l’environ-nement de travail nécessaire.

Dans cet article, nous allons utiliser l’exemple d’une bibliothèque privée dont le schéma est représenté par la Figure 1. Le Listing 1 donne les instructions SQL de création de tables.

Insérer une ligne de donnéesLa commande SQL INSERT permet d’insérer des don-nées dans une table. Il faut préciser le nom de la table et éventuellement la liste des colonnes dans lesquelles les données vont être insérées. La première valeur in-diquée sera liée au nom de la première colonne listée, la seconde valeur à la seconde colonne, etc... La com-mande suit la syntaxe :

INSERT INTO nom _ table (col1, col2, ...) VALUES (val1, val2, ...);

Type de donnéesLorsque la valeur insérée est de type chaîne de carac-tères, il faut indiquer la valeur entre quotes. Par exem-ple, pour insérer un nom dans la colonne nom de la table auteur, la valeur 'Tolkien' est utilisée. Les nombres

SQL : langage de manipulation des donnéesLes 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 :• Comment insérer des données.• Comment les mettre à jour ou les supprimer.• Comment les afficher.

Ce qu’il faut savoir :• Aucun prérequis.

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

Page 41: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

SQL

www.phpsolmag.org ��

sont entrés tels quels. Par exemple, la colonne clé pri-maire id_auteur prend la valeur 7. Les dates doivent suivre un format prédéfini (YYYY-MM-DD) et être écrites entre quotes. Tolkien est né un 03 janvier 1892 ce qui se traduit en MySQL par : '1892-01-03'. Pour signaler l’absence d’information, il suffit d’utiliser la valeur NULL, sans quotes afin qu’elle ne soit pas considérée comme une chaîne de caractères, comme dans l’exemple sui-vant :

INSERT INTO auteur (id _ auteur, nom, prenom, date _ naissance) VALUES (7,'Tolkien',NULL,'1892-01-03');

La valeur NULL ne doit pas être confondue avec la chaî-ne vide ou le chiffre 0. Elle est utilisée pour symboliser l’absence d’information.

Ordre d’insertionSi toutes les colonnes sont renseignées, il n’est pas né-cessaire de les lister dans la commande. Dans ce cas, il faut donner les valeurs dans l’ordre de déclaration des colonnes. Par exemple, dans la table auteur, l’instruc-tion suivante est équivalente à celle proposée ci-des-sus :

INSERT INTO auteur VALUES (7,'Tolkien',NULL,'1892-01-03');

Lister le nom des colonnes permet d’insérer des valeurs dans un ordre différent de celui de la déclaration dans la table. L’exemple suivant est équivalent aux deux re-quêtes précédentes :

INSERT INTO auteur (nom, prenom, id _auteur, date _ naissance) VALUES ('Tolkien',NULL,7,'1892-01-03');

Clés primaires et uniquesLa déclaration d’une colonne comme clé primaire ou uni-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 comme clé primaire ce qui provoquera une erreur :

INSERT INTO auteur VALUES (7,'Hugo','Victor','1802-02-26'); #1062 - Duplicate entry '7' for key 'PRIMARY'

Limite de champsLors de l’insertion d’une valeur qui sort des limites auto-risées par le domaine du champ et ses contraintes, le SGBD doit refuser l’opération. Le comportement de MySQL dépend du mode défini dans le fichier de confi-guration (my.ini ou my.cnf selon le système d’exploita-tion). Par défaut, MySQL attribue la valeur de la bor-

ne la plus proche d’un champ numérique, ou tronque les chaînes de caractères. Pour éviter cela, il faut indi-quer que le mode du SGBD doit être strict (sql_mode = strict_all_tables). Par exemple, l’insertion d’un nombre de pages négatif dans la table livre enregis-trera la valeur 0 par défaut ou refusera l’insertion en mode strict :

INSERT INTO livre (isbn, titre, gen-re, date_parution, langue, nb_pa-ges) VALUES ('102-2-35419-5','Les four-mis','roman',1991,'francais',-300); #1264 - Out of range value for column 'nb_pa-ges' at row 1

Listing 1. Création tables

-- selectionner la base de travailUSE biblio;

-- creer les tablesCREATE TABLE zone (code _ zone CHAR(10) NOT NULL,piece VARCHAR(20),meuble VARCHAR(20),CONSTRAINT pk _ zone PRIMARY KEY (code _ zone))ENGINE = InnoDB;

CREATE TABLE livre (isbn CHAR(20) NOT NULL,titre VARCHAR(30) NOT NULL,genre ENUM('roman','policier','theatre','historique','fantastique'),date _ parution INTEGER,langue ENUM('francais','anglais','allemand','espagnol','chinois') DEFAULT 'francais',nb _ pages INTEGER UNSIGNED,preface ENUM('oui','non'),code _ zone CHAR(10),CONSTRAINT pk _ livre PRIMARY KEY (isbn),CONSTRAINT fk _ zone FOREIGN KEY (code _ zone) REFERENCES zone(code _ zone) ON DELETE SET NULL ON UPDATE CASCADE)ENGINE = InnoDB;

CREATE TABLE auteur (id _ auteur INTEGER NOT NULL AUTO _ INCREMENT,nom VARCHAR(45) NOT NULL,prenom VARCHAR(45),date _ naissance DATE,CONSTRAINT pk _ auteur PRIMARY KEY (id _ auteur))ENGINE = InnoDB;

CREATE TABLE ecrit (isbn CHAR(20) NOT NULL ,id _ auteur INTEGER NOT NULL ,CONSTRAINT pk _ ecrit PRIMARY KEY (isbn, id _ auteur) ,CONSTRAINT fk _ livre FOREIGN KEY (isbn) REFERENCES livre (isbn) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT fk _ auteur FOREIGN KEY (id _ auteur ) REFERENCES auteur (id _ auteur) ON UPDATE CASCADE)ENGINE = InnoDB;

Tableau 1. Contenu de la table ZONE

code_zone piece meublec�0 chambre armoire en pin

c�0 chambre armoire en pin

s� salon bibliotheque noire

c5 chambre bibliotheque grise

Page 42: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Pour les débutants

Insérer un sous-ensemble de donnéesPour ne renseigner qu’un sous-ensemble de colonnes, il suffit de les lister dans la commande INSERT. Les va-leurs non renseignées seront gérées automatiquement par le SGBD : un nouveau numéro en cas d'auto incré-mentation, NULL, une valeur prédéfinie par défaut lors de la création de la table...

Valeur par défautSi une valeur par défaut a été attribuée à une colonne lors de la création de la table, cette valeur sera utilisée si la colonne n’est pas renseignée. Dans la table livre, la colonne langue prend la valeur 'francais' par défaut. Aussi, si aucune langue n’est définie dans l’instruction, la valeur prise par le champ langue sera le français :

INSERT INTO livre (isbn, titre, genre, date_parution, nb_pages, code_zone) VALUES ('320-2-02365-5','Le bourgeois gentilhomme','theatre',1670,152,NULL);

null / not nullLes colonnes non renseignées prendront automatique-ment la valeur NULL sauf si une autre valeur par défaut a été définie. Par exemple, pour insérer un livre dont le nombre de pages, la présence de préface et le code zone sont inconnus, la requête suivante mettra auto-matiquement la valeur NULL dans le champ nb_pages, preface et code_zone de la table livre :

INSERT INTO livre (isbn, titre, genre, date _ parution, langue) VALUES ('152-5-55695-2','Le seigneur des anneaux','fantastique',1954,'francais');

Attention, si la colonne concernée a été déclarée comme NOT NULL, l'insertion sera rejetée si le SG-BD a bien été placé en mode strict. Le cas échéant,

l'insertion enregistrera une chaîne vide. Par exem-ple, dans la table livre, c'est le cas de la colonne titre. Nous travaillons ici en mode strict. L'instruc-tion suivante va donc générer une erreur :

INSERT INTO livre (isbn, genre, date _parution, nb _ pages, code _ zone) VALUES ('598-5-55596-2','roman',1831,123,NULL); #1364 - Field 'titre' doesn't have a default value

Auto incrémentLorsqu’une colonne numérique a un auto incrément, elle n’a pas à être renseignée. L’insertion d’une nouvelle ligne provoque l’ajout automatique d’une valeur dans la colon-ne. Celle-ci est égale à l’entier immédiatement supérieur à la valeur maximale de la colonne. Dans la table auteur, la colonne id_auteur est auto incrémentée. L’instruction suivante génère donc un identifiant automatiquement :

INSERT INTO auteur (nom, prenom, date _naissance) VALUES ('Hugo','Victor','1802-02-26');

Clé primaireUne colonne référencée comme clé primaire doit obli-gatoirement être renseignée (sauf si elle est auto incré-mentée). Une instruction qui omet d’entrer une clé pri-maire provoque une erreur. Si le numéro ISBN d’un livre n’est pas indiqué, l’insertion est refusée :

INSERT INTO livre (titre, genre, date_parution, langue, nb_pages, code_zone) VALUES ('David Copperfield','roman',1850,'anglais',458,NULL); #1364 - Field 'isbn' doesn't have a default va-lue

Insérer avec phpMyAdminL’interface web phpMyAdmin permet d’insérer des don-nées dans la base sans avoir de connaissances SQL. Elle présente l’avantage d’afficher la requête d’insertion après exécution de cette dernière. Ceci permet de for-muler des requêtes qui pourront être adaptées et utili-sées dans un script PHP.

Pour insérer des données dans une table, il faut sélectionner la table en cliquant sur son nom dans le

Tableau 2. Contenu de la table LIVRE

isbn titre genre date_parution langue nb_pages preface code_zone

���-5-5���5-5 Fall of giants historique �0�0 anglais �55 oui c�0

5��-5-555��-� Notre Dame de Paris roman ���� francais ��� non s�

�0�-�-�5���-5 Les fourmis roman ���� francais �00 NULL c�0

5��-5-�5���-� David Copperfield roman ��50 anglais �5� oui s�

��0-�-0���5-5 Le bourgeois gentilhomme theatre ���0 francais �5� NULL NULL

�5�-5-55��5-� Le seigneur des anneaux fantastique ��5� francais NULL NULL NULL

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

code_zone piece meublec�0 chambre armoire en pin

s�� salon bibliotheque noire

c5 chambre bibliotheque grise

Page 43: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

SQL

www.phpsolmag.org ��

cadre de gauche de l’interface. Le formulaire d’insertion est disponible à partir de l’onglet Insérer dans le cadre droit (Fi-gure 2). Une fois le formulaire soumis, la requête est géné-rée automatiquement, affichée et envoyée à MySQL.

Extraire des donnéesLa commande SELECT extrait des données de la base. Dans cet article, vous allez apprendre à afficher toutes les données d’une table. Dans les prochains numéros, vous verrez comment restreindre l’affichage des don-nées et comment réaliser des jointures entre plusieurs tables. Pour afficher toutes les données d’une table, la commande suit la syntaxe suivante :

SELECT * FROM nom _ table;

Pour afficher la liste des auteurs enregistrés dans la base, il suffit de taper la commande suivante dans la console :

SELECT * FROM auteur;

Si vous utilisez phpMyAdmin, il faut cliquer sur le nom de la table dans le cadre de gauche (Figure 3).

Cette opération permet de vérifier que les insertions se sont bien déroulées.

Mettre à jour des donnéesUne fois les données insérées dans les tables, elles peuvent être modifiées grâce à la commande UPDATE. Celle-ci permet la modification d’une ou plusieurs lignes d’une table. Il est possible d’indiquer les nouvelles va-leurs pour plusieurs colonnes en les séparant par des virgules :

UPDATE nom_table SET col1 = val1 [, col2 = val2, ...];

Pour ajouter un an aux dates de parution des livres, il faut utiliser la commande :

UPDATE livre SET date_parution = date_parution + 1;

Toutes les lignes de la table livre seront concernées par la mise à jour. Pour restreindre la modification à un

sous-ensemble de lignes, il faut utiliser la clause WHERE suivie d’une condition. Seules les lignes qui satisfont la condition sont modifiées. Par exemple, pour mettre à jour seulement les livres en français :

UPDATE livre SET date _ parution = date _parution + 1 WHERE langue = 'francais';

Pour changer le genre du livre Les fourmis, il est pos-sible d’utiliser la commande suivante :

UPDATE livre SET genre = 'fantastique' WHERE titre = 'Les fourmis';

Si plusieurs livres portaient ce nom dans la base, le gen-re aurait été modifié pour chacun. Pour éviter cette si-tuation, il vaut mieux utiliser la clé primaire de l’ouvrage car elle identifie une seule et unique ligne de la table :

UPDATE livre SET genre = 'fantastique' WHERE isbn ='102-2-35419-5';

Lors de mises à jour, MySQL indique le nombre de li-gnes qui satisfont la condition (Rows matched) et le nombre de modifications effectuées (Changed). La mi-se à jour peut échouer dans plusieurs cas : la valeur ne correspond pas au type de données attendu, la va-leur viole une contrainte (clé primaire, clé unique, clé étrangère), … Attention, si vous n’êtes pas en mode strict, l’attribution de valeurs hors des bornes autori-sées peut entraîner l’enregistrement de fausses don-nées (cf Insérer une ligne de données >>> Limite de champs).

Dans phpMyAdmin, lorsque vous avez affiché la lis-te des données de la table, vous pouvez en modifier le contenu en cliquant sur l’icône en forme de crayon (Figure 3). Un formulaire identique à celui de l’insertion est affiché pré rempli avec les valeurs de la ligne sé-lectionnée. L’envoi du formulaire génère et affiche une requête UPDATE.

Supprimer des donnéesLa commande SQL DELETE permet de supprimer des lignes dans une table. Pour restreindre la suppression, il faut indiquer une condition.

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

isbn titre genre date_parution langue nb_pages preface code_zone

���-5-5���5-5 Fall of giants historique �0�0 anglais �55 oui c�0

5��-5-555��-� Notre Dame de Paris roman ���� francais ��� non s��

�0�-�-�5���-5 Les fourmis roman ���� francais �00 NULL s��

5��-5-�5���-� David Copperfield roman ��50 anglais �5� oui s��

��0-�-0���5-5 Le bourgeois gentilhomme theatre ���0 francais �5� NULL NULL

�5�-5-55��5-� Le seigneur des anneaux fantastique ��5� francais NULL NULL NULL

Page 44: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Pour les débutants

DELETE FROM nom _ table [WHERE condition];

Pour effacer le livre Notre Dame de Paris, il faut utili-ser la commande :

DELETE FROM livre WHERE isbn = '598-5-55596-2';

Attention, si vous n’indiquez aucune condition, toutes les lignes de votre table seront supprimées.

Dans phpMyAdmin, l’icône en forme de croix à côté du crayon permet de supprimer la ligne (Figure 3).

Manipuler des clés étrangèresUne clé étrangère peut prendre la valeur NULL ou une valeur issue de la clé primaire de la table qu’elle référence. Cette restriction entraîne parfois des dif-ficultés lors des insertions, des mises à jour ou des suppressions. Lors des insertions dans la base bi-blio, aucune valeur n’a été attribuée aux clés étran-gères. Pour les exemples suivants, les tables zone

et livre comporteront les valeurs définies dans les tableaux 1 et 2.

Ainsi, l’attribution de la zone s10 au livre Les four-mis est refusée car le code_zone n’existe pas dans la table zone :

UPDATE livre SET code_zone = 's10' WHERE isbn = '102-2-35419-5'; #1452 - Cannot add or update a child row: a foreign key constraint fails ('biblio'.'livre', CONSTRAINT 'fk_zone' FOREIGN KEY ('code_zone') REFERENCES 'zone' ('code_zone') ON DELETE SET NULL ON UPDATE CASCADE)

L’attribution de la zone s8 qui existe ne pose pas de problème, ici pour le livre Les fourmis :

UPDATE livre SET code _ zone = 's8' WHERE isbn = '102-2-35419-5';

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

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

Page 45: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

www.phpsolmag.org �5

Les propriétés indiquées lors de la création de la ta-ble (cf Article SQL : langage de définition des données) influent sur le comportement lors de mises à jour ou de suppressions de valeurs référencées (clauses ON UPDATE ou ON DELETE). Par exemple, la modification ou la suppression du code_zone dans la table zone en-traînera une mise à jour automatique de la table livre grâce aux clauses ON UPDATE CASCADE et ON DELETE SET NULL.

UPDATE zone SET code _ zone = 's11' WHERE code _ zone = 's8'; DELETE FROM zone WHERE code _ zone = 'c10'; SELECT * FROM livre;

La commande SELECT affiche la table livre avec les valeurs s8 remplacées par s11 et la valeur c10 rempla-cée par NULL (tableaux 3 et 4).

Si le comportement en cas de mise à jour ou de sup-pression de la valeur d'une colonne référencée n’a pas été défini lors de la création de la table, aucune de ces opérations ne sera acceptée. Par exemple, sans clau-se ON DELETE SET NULL dans la table livre, la sup-pression du code_zone c10 aurait été refusée car uti-lisé dans la table livre. Par contre, la suppression de c5 aurait été autorisée car le code n’est pas référencé ailleurs.

Dans phpMyAdmin, le formulaire d’insertion ou de mise à jour d’une table qui en référence une autre pro-pose seulement les clés possibles pour les colonnes clés étrangères.

ConclusionVous avez appris dans cet article les bases du langa-ge de manipulation de données : insertion, mise à jour, suppression et extraction globale d’information. Dans le prochain numéro, vous apprendrez à affiner les extrac-tions de données.

CILIA MAURO, MAGALI COnTEnSInCilia Mauro est gestionnaire de bases de données et développeur d’applications web au CNRS. Elle enseigne les bases de données et PHP à l’université.Contact : [email protected] Contensin est chef de projet en développement d’applica-tions au CNRS. Elle enseigne depuis plus de dix ans le développe-ment d’applications web à l’université et est l’auteur de nombreux articles sur le développement web en PHP.Contact : http://magali.contensin.online.fr

Sur Internet

• http://www.mysql.fr – MySQL,• http://www.phpmyadmin.net – phpMyAdmin.

Pour plus de renseignement : [email protected]

Rejoignez le Club .PRO

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 applicatifs et portails web à l'ergonomie travaillée et des sites Internet à forte valeur ajoutée. http://www.cognix-systems.com

é é é

Stonfield Inworld propose aux entreprises des solutions globale d'intègration d'Internet et des Univers Virtuels dans leur strat giede développement. Au-delà de ses services, la société consacre 30% de ses ressources à des travaux de R&D sur le e-Commerce et le e-Learning dans les Mondes Virtuels

é

WEB82Création et hébergements de sites web pour particuliers, associations, entreprises, e-commerce. Développement entierement aux normes W3C (www.w3.org) de sites web de qualité, au graphisme soignéet employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2). http://www.web82.net

WEB82Cr ation et h bergements de sites web pour particuliers, associations, entreprises, e-commerce. Développement entierement aux normes W3C (www.w3.org) de sites web de qualité, au graphisme soigné et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2). http://www.web82.net

é é

Expert des solutions de gestion et de communication d'entrepriseen Open Source, Core-Techs conçoit, integre, déploie et maintient dessystemes de Gestion de Contenu Web, de Gestion Documentaire,de Gestion de la Relation Client (CRM), d'ecommerce et de travailollaboratif.http://www. core-techs. fr

PoP Factory,SSII sp cialis e Web. D veloppement de solutions applicatives spécifi ques ; offre de solutions packagées : catalogue numérique, e-commerce, livre/magazine numérique, envoi SMS. Nous accompagnons nos clients tout au long de leur projet : audit, conseil, développement, suivi et gestion. http://www.popfactory.com / [email protected]

é é é

Sp cialistes en CRM Open Source, nous proposons une offrecomplète de prestations sur la solution SugarCRM. Notre valeur ajoutée réside dans une expertise réactive et une expérience des problématiques de la GRC. Nous vous aidons à tirer le meilleur parti de votre solution CRM. http://www.bluenote-systems. com

é

Conseil, Expertises, Formations et Projets E-business centr s au tour du cœur de métier : la Business Intelligence. Intelligence Power vous propose des solutions innovant.es pour aligner la technologie sur la stratégie de votre entreprise. http://www. intelligencepower. com

é

Vous souhaitez être en première page des moteurs de recherche ? Rejoignez-nous, 100% des clients Web Alliance sont en 1ère page de Google. Web Alliance, société de conseil spécialisée dans le référencement internet, vous propose son expertise (référencement, liens sponsorisés, web-marketing). www. web-alliance. fr

Intelligence Power

Web Alliance

Core-Techs

POP FACTORY

Blue Note Systems

COGNIX Systems

Stonfield Inworld

49

Club .PRO

Pour plus de renseignement : [email protected] Rejoignez le Club .PRO

Ston eld InworldSton eld Inworld propose aux entreprises des solutions globale d’intègration d’Internet et des Univers Virtuels dans leur stratégie de développement. Au-delà de ses services, la société consacre 30% de ses ressources à des travaux de R&D sur le e-Commerce et le e-Learning dans les Mondes Virtuels.

COGNIX SystemsConseil, 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 applicatifs et portails web à l’ergonomie travaillée et des sites Internet à forte valeur ajoutée.http://www.cognix-systems.com

Intelligence PowerConseil, Expertises, Formations et Projets E-business centrés au tour du cśur de métier : la Business Intelligence. Intelligence Power vous propose des solutions innovantes pour aligner la technologie sur la stratégie de votre entreprise.http://www.intelligencepower.com

Web AllianceVous souhaitez être en première page des moteurs de recherche ? Rejoignez-nous, 100% des clients Web Alliance sont en 1ère page de Google. Web Alliance, société de conseil spécialisée dans le référencement internet, vous propose son expertise (référencement, liens sponsorisés, web-marketing).www.web-alliance.fr

Anaska FormationAnaska est le spécialiste des formations sur les technologies OpenSource. En partenariat avec MySQL AB, Mandriva, Zend et d'autres acteurs de la communauté, Anaska vous propose un catalogue de plus de 50 formations dédiés aux technologies du Libre.http://www.anaska.com

WEB82Création et hébergements de sites web pour particuliers, associations, entreprises, e-commerce. Développement entierement aux normes W3C (www.w3.org) de sites web de qualité, au graphisme soigné et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2).http://www.web82.net

Core-TechsExpert des solutions de gestion et de communication d’entreprise en Open Source, Core-Techs conçoit, integre, déploie et maintient des systemes de Gestion de Contenu Web, de Gestion Documentaire, de Gestion de la Relation Client (CRM), d’ecommerce et de travail ollaboratif.http://www.core-techs.fr

POP FACTORYPoP Factory,SSII spécialisée Web. Développement de solutions applicatives spéci ques ; offre de solutions packagées : catalogue numérique, e-commerce, livre/magazine numérique, envoi SMS. Nous accompagnons nos clients tout au long de leur projet : audit, conseil, développement, suivi et gestion.http://www.popfactory.com / [email protected]

Blue Note SystemsSpécialistes en CRM Open Source, nous proposons une offre complète de prestations sur la solution SugarCRM. Notre valeur ajoutée réside dans une expertise réactive et une expérience des problématiques de la GRC. Nous vous aidons à tirer le meilleur parti de votre solution CRM.http://www.bluenote-systems.com

Pour plus de renseignement : [email protected]

Rejoignez le Club .PRO

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 applicatifs et portails web à l'ergonomie travaillée et des sites Internet à forte valeur ajoutée. http://www.cognix-systems.com

é é é

Stonfield Inworld propose aux entreprises des solutions globale d'intègration d'Internet et des Univers Virtuels dans leur strat giede développement. Au-delà de ses services, la société consacre 30% de ses ressources à des travaux de R&D sur le e-Commerce et le e-Learning dans les Mondes Virtuels

é

WEB82Création et hébergements de sites web pour particuliers, associations, entreprises, e-commerce. Développement entierement aux normes W3C (www.w3.org) de sites web de qualité, au graphisme soignéet employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2). http://www.web82.net

WEB82Cr ation et h bergements de sites web pour particuliers, associations, entreprises, e-commerce. Développement entierement aux normes W3C (www.w3.org) de sites web de qualité, au graphisme soigné et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2). http://www.web82.net

é é

Expert des solutions de gestion et de communication d'entrepriseen Open Source, Core-Techs conçoit, integre, déploie et maintient dessystemes de Gestion de Contenu Web, de Gestion Documentaire,de Gestion de la Relation Client (CRM), d'ecommerce et de travailollaboratif.http://www. core-techs. fr

PoP Factory,SSII sp cialis e Web. D veloppement de solutions applicatives spécifi ques ; offre de solutions packagées : catalogue numérique, e-commerce, livre/magazine numérique, envoi SMS. Nous accompagnons nos clients tout au long de leur projet : audit, conseil, développement, suivi et gestion. http://www.popfactory.com / [email protected]

é é é

Sp cialistes en CRM Open Source, nous proposons une offrecomplète de prestations sur la solution SugarCRM. Notre valeur ajoutée réside dans une expertise réactive et une expérience des problématiques de la GRC. Nous vous aidons à tirer le meilleur parti de votre solution CRM. http://www.bluenote-systems. com

é

Conseil, Expertises, Formations et Projets E-business centr s au tour du cœur de métier : la Business Intelligence. Intelligence Power vous propose des solutions innovant.es pour aligner la technologie sur la stratégie de votre entreprise. http://www. intelligencepower. com

é

Vous souhaitez être en première page des moteurs de recherche ? Rejoignez-nous, 100% des clients Web Alliance sont en 1ère page de Google. Web Alliance, société de conseil spécialisée dans le référencement internet, vous propose son expertise (référencement, liens sponsorisés, web-marketing). www. web-alliance. fr

Intelligence Power

Web Alliance

Core-Techs

POP FACTORY

Blue Note Systems

COGNIX Systems

Stonfield Inworld

Page 46: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

Interview

PHP Solutions : Bonjour, tout d’abord nous vous re-mercions de nous accorder du temps pour cette in-terview. Pourriez-vous vous présenter aux lecteurs de PHP Solutions ?Félix Chassagne : eziHost est un service d’héberge-ment sur Internet (depuis 2001) spécialisé dans l’héber-gement de sites Web en PHP/MySQL. Nous proposons, en outre, des noms de domaines (bureau d’enregistre-ment Network Solutions depuis 2002 et AFNIC depuis 2008) et des mails à nos clients ainsi que des services complémentaires, dont :− installation de systèmes de gestion de contenu

(blog, wiki, forum…),− suivi statistique de l'activité du site, tableau des logs

et bande passante…− audits de performance simplifiés semestriels avec

l'option Full Services.

PS : Quels sont les projets à venir d’eziHost ?FC : Nos clients peuvent gérer leur compte grâce à une interface Web. Cette interface est donc au cœur de no-tre prestation. Ainsi, nous prévoyons de poursuivre les améliorations de ce panel de gestion, et de pousser une automatisation plus complète de notre architecture de serveurs.

PS : Comment vous voyez le Web de demain ?FC : «Comme au supermarché», des solutions clé en main, prêtes à l’emploi, mais personnalisables. Nous nous efforçons donc de proposer des offres simples mais souples pour répondre au mieux aux attentes de chacun de nos clients.

PS : Quels sont les types d’entreprises qui se tour-nent vers vos solutions ?FC : Nous avons essentiellement des petites et moyen-nes entreprises, la plupart implantées aux alentours de 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-nuaires LDAP, certificats SSL, Web-services…).

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

PS : Pouvez-vous nous présenter les avantages de vos solutions d’hébergement ?FC : Pour garantir la sécurité des données nous utilisons la technologie RAID au niveau des disques durs asso-ciée à un système de sauvegarde externe. Nous ne sur-chargeons pas les machines, en limitant le nombre de sites à 45 par serveurs et en séparant les services Web et mail.

PS : Quels sont les outils que vous utilisez pour as-surer à vos clients la qualité du service ?FC : Nous sommes présent si un client nous contac-te par mail ou par téléphone, mais nous essayons de trouver des solutions en amont. En ce sens, au niveau des outils, nous avons mis en place un système de gestion des tickets nous permettant d’être plus réactif et efficace dans la résolution des problèmes de nos clients. Nous diffusons en complément une lettre d’in-formation afin de les tenir informés de l’actualité d’ezi-Host (évolution des services, mise à jour système, pro-motions…).

Pouvez-vous nous donner quelques exemples d’en-treprises qui ont fait appel à vos services ?FC : Internet touche toutes les branches, nos clients sont donc représentatifs de ce phénomène. En voici quelques exemples : Airria, AST Groupe, Crédit Agricole, Externat Notre Dame, IMGR, Innovia, Le Périscope, Nouveau mon-de DDB, Sanisère, Somudimec, Tenerrdis, Vercors Tra-versées, Vi TECHNOLOGY, Volubill, Ydesign, Zamst...

Quelques informations clés sur eziHost ?

− Adresse : www.ezihost.fr− Ancienneté : 9 ans− Nombre de serveurs : 13− Nombre de clients : plus de 150

Merci beaucoup pour le temps que avez bien voulu nous accorder.

Page 47: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

SQL

www.phpsolmag.org ��

Page 48: 5/2009ddepoort.free.fr/phpsolution/Iphone_et_smartphone_PHP_11_2010.pdf · 11/2010 / 0 0 Le périodique phpsolutions est publié par Software Press Sp. z o.o. SK Bokserska 1, 02-682

��/�0�0��

SQL