Sunteți pe pagina 1din 50

JQUERY | CAKEPHP | MAGENTO | DRUPAL | DOM | KANNEL | ZEND

PHP NO 7/2010 (43) ISSN 1731-4593

MAGENTO ET DRUPAL
CRÉEZ VOTRE PORTAIL E-COMMERCE

JQUERY
REQUÊTES AJAX ET PLUGIN JQUERY UI
DOCUMENT OBJECT MODEL
MANIPULEZ DU XML À L’AIDE DE L’API DOM DE PHP5
KANNEL
CRÉEZ UN SVA AVEC LA PASSERELLE SMS/WAP
SE
SERVEUR : AMI OU ENNEMI ?
RÉALISEZ VOS PROJETS WEB !

FICHE TECHNIQUE

CAKEPHP
DÉVELOPPEZ RAPIDEMENT VOS APPLICATIONS

OUTILS

PRESTASHOP
SOLUTION E-COMMERCE OPEN SOURCE

1 5/2009
Hetzner DeDICAteD
rOOt SerVer eQ 4

2 7/2010
Table des matières

www.phpsolmag.org 3
7/2010

Le périodique phpsolutions est publié par


TABLE DES MATIÈRES
Software Press Sp. z o.o. SK
Bokserska 1, 02-682 Varsovie, Pologne

VARIA
Tél. 0975180358, Fax. +48 22 244 24 59
www.phpsolmag.org

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


Paweł Marciniak Actualités du monde du développement.
Christophe Villeneuve
Directrice de la publication :
Ewa Łozowicka

Dépôt légal :
OUTILS
à parution 8 PrestaShop, solution e-commerce Open
ISSN : 1731-4593 Source
Sabrina Maréchal
Rédacteur en chef : Forte d’une communauté Open Source de plus de
Łukasz Bartoszewicz
85000 membres (dont 50000 développeurs !), la solu-
tion PrestaShop est aujourd’hui leader dans le secteur
Couverture : de l’e-commerce Open Source. Vous verrez comment
Sławomir Sobczyk
l’installer, la configurer et la personnaliser pour créer
DTP : une boutique en ligne.
Sławomir Sobczyk Studio2W@gmail.com

Composition :
Sławomir Sobczyk PROJETS
10 Le DOM avec PHP5
Correction : Demazy Mbella
Valérie Viel, Thierry Borel
Le terme DOM est l’abréviation pour Document Object
Model ; il s’agit d’une spécification du W3C (World
Bêta-testeurs :
Fabrice Gyre, Brice Favre, Valérie Viel, Cyril David, Wide Web Consorsium) définissant la structure d’un
Christophe Milhau, Alain Ribault, Stéphane Guedon, document sous forme d’une hiérarchie d’objets, afin de
Eric Boulet, Mickael Puyfages, Christian Hernoux,
Isabelle Lupi, Antoine Beluze, Timotée Neullas,
simplifier l’accès aux éléments constitutifs de celui-ci.
Yann Faure, Adrien Mogenet, Jean-François Montgaillard, Vous vous êtes toujours demandés s’il était possible
Turmeau Nicolas, Jonathan Marois, Wilfried Ceron, de faire des manipulations du DOM avec PHP ? Ou
Wajih Letaief, François Van de Weerdt,
Jeremy Rafflin, Eric Vincent. alors vous savez que cela est possible mais vous ne
savez pas comment. Dans ce cas, cet article est fait
Les personnes intéressées par la coopération pour vous.
sont priées de nous contacter :
editor@phpsolmag.org
16 jQuery: tour d’horizon de cette librairie
JavaScript
Publicité :
publicite@software.com.pl Jonathan Danse
jQuery est devenu désormais
incontournable lors de la
Pour créer les diagrammes on a utilisé le programme
réalisation d’une application
web. Utilisée aussi bien avec
PHP qu’en développement
Windows, on ne peut passer
AVERTISSEMENT à côté de cette librairie aussi
Les techniques présentées dans les articles
ne peuvent être utilisées qu’au sein des réseaux simple d’utilisation que puis-
internes. La rédaction du magazine n’est pas sante en terme de fonction-
responsable de l’utilisation incorrecte des techniques
présentées. L’utilisation des techniques présentées peut nalités. Grâce à cet article,
provoquer la perte des données ! vous découvrirez les possibi-
lités de jQuery.

4 7/2010
Table des matières

DOSSIER 36 CakePHP le framework pour développer


rapidement vos applications
21 Développer un portail e-commerce Pierre-Emmanuel Fringant, Pierre Martin
Communautaire avec Magento et Drupal Démarré en 2005 lorsque Ruby On Rails devenait
Pierre Mourier populaire, le projet CakePHP compte désormais de
Les solutions Magento et Drupal sont aujourd’hui deux nombreux utilisateurs et une communauté toujours
poids lourds de l’e-commerce et de la gestion de conte- plus active. Désormais en version 1.3, le framework
nu Open Source. On compte aujourd’hui plusieurs di- se veut avant tout simple et efficace, en se basant
zaines de milliers de boutiques utilisant Magento avec sur le paradigme des conventions plutôt que de la
des références importantes telles que Wonderbox, configuration. Voici une présentation des points clés
Tf1shopping ou encore Discounteo. Découvrez le fonc- de CakePHP permettant de se lancer dans son ap-
tionnement de la brique Magento – Drupal, les logiques prentissage.
de développement et d’amélioration de celles-ci.

POUR LES DÉBUTANTS


PRATIQUE 45 Serveur : un ami ou un ennemi ?
25 Créer un SVA avec la passerelle SMS/WAP : Christophe Villeneuve
Kannel Un serveur est indispensable pour réaliser un projet
Maodo Diop web. C’est lui qui va mettre à disposition votre projet.
L’ère de la téléphonie mobile a entraîné ces dernières Si celui-ci est correctement paramétré, il sera votre
années l’emploi de service à valeur ajoutée. Ce der- ami, mais il peut très vite devenir votre ennemi s’il
nier a permis aux usagers de pouvoir participer à des n’est pas configuré ou sécurisé correctement. Après
services que l’opérateur et/ou une entreprise mettent avoir suivi cet article, vous saurez comment adapter
à leur profit en temps réel. Les services à valeur ajou- votre application au serveur.
tée sont devenus incontournables dans le monde de la
télécommunication. Dans cet article, vous apprendrez
à créer un service à valeur ajoutée depuis un script
PHP et aussi à administrer votre serveur à travers un
script bash par l’envoi de SMS.

FICHE TECHNIQUE
30 Acquérir de la vitesse avec
Zend Framework – 2ème partie
Stéphane Guédon
Nous vous présentons le second article de la série Ac-
quérir de la vitesse avec Zend Framework. Dans ce-
lui-ci, l’auteur vous présente la connexion d’une ba-
se de données et l’accès aux données de celle-ci, la
connexion avec Doctrine, puis l’usage des helpers
Zend ! Vous découvrirez également l’usage de Zend_
config qui est un outil très utile et dont l’usage néces-
site une organisation particulière de votre file system
de fichier.
Actualités

PHP 5.2.14 et PHP 5.3.3


Deux nouvelles versions de PHP vien-
PHP pour Android
Les téléphones mobiles sont depuis de nombreuses années, les nouveaux
nent de sortir. La version PHP 5.3.3
apporte de nombreux correctifs mais supports de communications, mais depuis quelques mois, de nouvelles po-
aussi une amélioration de la stabilité. ssibilités vous sont proposées, entre autre avec la sortie en juillet 2010 de
La version de PHP 5.2.14 apporte prin- PFA. Le projet PFA (PHP For Android) est un nouveau projet, qui va vous
cipalement des correctifs de sécurité. permettre d’installer un environnement PHP CLI dans un terminal Android.
Par ailleurs, il est important de signa-
ler que le support de la branche 5.2 Ainsi, vous pouvez maintenant créer des pages Webs dynamiques en PHP,
de PHP est arrêté et cessera à partir tout en exécutant ces pages sur vos téléphones Android.
de cette version. Par conséquent si Pour réaliser votre première page PHP sous Android, vous devez posséder :
de nouvelles versions doivent appa-
• Un environnement ACE (Android Script Environnement) qui va vous
raître, elles seront liées autour des
problèmes de sécurités. C’est pourqu- permettre d’exécuter des scripts.
oi il est important de migrer vers une • Installer le patch PhpForAndroid.apk.
version de PHP 5.3
http://www.php.net
Ensuite, vous pouvez exécuter vos scripts PHP sans serveur web, et même
xDebug 2.1 obtenir la liste des fonctions avec phpinfo() :
La nouvelle version de xDebug vient
de sortir. Elle est compatible PHP 5.3 et <?php
fonctionne à partir de PHP 5.2. Elle ne require_once("Android.php");
supporte donc plus les versions de PHP phpinfo();
inférieures. Dans les nouveautés : Les
erreurs de connexion, interpréter les Mais aussi interagir avec le hardware
entêtes HTTP, tracer l’assignation des
variables, désactiver les opérateurs @,
de votre téléphone mobile comme de-
tracer la pile, débogage à distance. mander à votre téléphone de vibrer :
http://xdebug.org
<?php
DotClear 2.2 require _ once("Android.php");
Dans les nouveautés de la version $vibre= new Android();
2.2 de Dotclear pour réaliser un blog, $vibre->vibrate();
vous trouverez un nouvel assistant
d’installation, une évolution des tags Site officiel : http://phpforandroid.net/
et du moteur. Cette nouvelle version
est compatible PHP 5.3 et aussi avec la
création de plugins et de thèmes.

AR-PHP
Toutes les évolutions sont présentées
dans le communiqué du site.
http://fr.dotclear.org/blog/post/2010/
06/30/Dotclear-2.2 AR-PHP est un ensemble de librairies PHP
qui offre de nombreux outils pour les utilisa-
Sugar CRM 6 teurs qui souhaitent proposer un site web
La nouvelle version 6 de Sugar CRM,
réalisée toujours en PHP, se veut être en version Arabe. Ce projet est réalisé en
plus rapide et plus simple. Bien sûr, PHP, sous licence Open source et néces-
cette version apporte de nombreuses site PEAR.
nouveautés et améliorations comme Avec cette configuration, vous pourrez répon-
l’ouverture vers d’autres applications,
une recherche contextuelle, une no- dre aux nombreuses attentes des internau-
uvelle barre de raccourcis, une aide tes, lorsqu’un site web veut proposer un site
à la configuration. avec une version Arabe.
http://www.sugarcrm.com
Cette librairie propose de nombreuses fonc-
PHP commit hooks tionnalités de bases comme :
PHP commit Hooks est une application • La Conversion des dates entre le calendrier grégorien et hégirien.
réalisée en PHP, vous permettant d’avo- • Traduction Anglais vers Arabe et Arabe vers Anglais.
ir un développement avec des numéros
de versions comme le versionning. Vos • Différents types de détections (texte en arabe, character set...).
dossiers et fichiers PHP seront alors • Utilisation de la location GPS pour définir les heures.
représentés avec des crochets pour • Clavier virtuel pour écrire en langue Arabe.
vous permettre d’avoir une conception • Normalisation du texte arabe.
simple et structurée. Cette application
propose par ailleurs les mêmes fonc-
tionnalités qu’un SVN comme laisser Site officiel : http://www.ar-php.org
un message d’informations...
http://github.com/kore/php-commit-
hooks Rédaction des actualités :
Christophe Villeneuve

6 7/2010
<<TOP>>

<<BODY>>
Rejoignez le Club .PRO <<SHORT_NEWS>>
Pour plus de renseignement : editor@phpsolmag.org

Stoneld Inworld
Ston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 Systems
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

Anaska Formation
Anaska 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

WEB82
Cré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-Techs
Expert 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 FACTORY
PoP 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 / info@popfactory.fr

Blue Note Systems


Spé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

Intelligence Power
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 innovantes pour aligner la technologie sur
la stratégie de votre entreprise.
http://www.intelligencepower.com

Web Alliance
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

Club .PRO 7
49
www.phpsolmag.org
Outils

PrestaShop,
solution e-commerce Open Source leader
du marché
Forte d’une communauté Open Source de plus
de 85 000 membres (dont 50 000 développeurs !),
la solution PrestaShop est aujourd’hui leader dans
le secteur de l’e-commerce Open Source.

Cet article explique : Ce qu’il faut savoir :


• Ce qu’est PrestaShop, comment l’installer, le configurer et le • Connaissances en PHP/MySQL, XHTML / CSS pour les dévelop-
personnaliser pour créer une boutique en ligne. peurs.

T
rois ans seulement après le lancement de Pre- bien sur le Front-Office (affichage des fabricants, d’un
staShop, plus de 40 000 boutiques l’utilisent dans bloc newsletter…) que sur le Back-Office : outils de sta-
plus de 50 pays à travers le monde, et en plus de tistiques, recherche rapide…
45 langues. Sur les neuf derniers mois, PrestaShop a vu
sa communauté Open Source tripler, passant de 30 000 Quelques fonctionnalités phares :
membres à plus de 85 000, et propose aujourd’hui plus
de 200 fonctionnalités dédiées aux marchands. Focus • Parrainage, points de fidélité, liste cadeaux,
sur cette solution prometteuse, conçue en PHP/MySQL. • + de 20 blocs de fonctionnalités configurables pour
la page d’accueil.
Qu’est-ce que PrestaShop ? • Consultation en temps réel des paniers créés par
PrestaShop est une solution e-commerce Open Source, les clients.
téléchargeable gratuitement, permettant d’ouvrir une bo- • Statistiques détaillées de l’activité du site, et de la
utique en ligne en quelques clics. D’une part, elle propose qualité du catalogue.
un back-office très puissant permettant de gérer en temps • Alertes e-mail et SMS en cas de nouvelles com-
réel la boutique (catalogue, historique des commandes, mandes, ruptures de stocks…
frais de port, clients, paniers remplis ...). D’autre part, elle • Nombre de transporteurs et de moyens de paie-
offre aux clients une boutique conviviale aux couleurs du ment illimités.
marchand, avec de nombreux modules (80 sont inclus en • Jusqu’à plus de 100 000 ventes mensuelles (scalabilité).
standard) et offre plus de 200 fonctionnalités. • Modules de paiement intégrés (cartes bancaires
et portefeuilles électroniques) : PayPal, Moneybo-
Le Back-Office, puissant et intuitif okers, Hipay, Google Checkout, chèque, virement,
PrestaShop offre un panneau d’administration complet, comptant à la livraison.
à la prise en main aisée, aussi bien pour les marchands • Optimisations pour le référencement naturel, ge-
que les développeurs. Outre la gestion des profils utilisa- stion des métas etc.
teurs et de leurs droits respectifs, ce dernier est le cœur
de la boutique : conçu autour d’un système modulaire,
la solution PrestaShop propose plus de 80 modules en
standard, permettant de compléter ou personnaliser la
boutique et ses outils : il est ainsi possible d’activer ou
de désactiver certaines fonctions de la boutique, aussi

8 7/2010
PrestaShop

Créer une boutique avec PrestaShop endroit sur le Front-Office. Le cœur de PrestaShop re-
PrestaShop s’installe sur un serveur web, via FTP. Con- ste ainsi toujours propre, ce qui facilite grandement les
figuration minimale requise : Linux, Unix, ou Windows ; mises à jour.
Apache 1.3 ou supérieur, IIS 6 ou supérieur ; PHP 5.0
ou supérieur ; MySQL 5 ou supérieur. Le Processus d’in- Front-Office et personnalisation du thème
stallation détecte automatiquement la configuration du Le thème standard de PrestaShop est codé en XHTML
système, et permet une mise en place en cinq minutes. 1.1, le plus récent des standards HTML, HTML 5 n’étant
A noter, de nombreux hébergeurs (PrestaBox (http:// pas encore la norme. Plus d’une dizaine de plugins de la
www.prestabox.com), OVH) permettent l’installation de librairie JQuery sont utilisés, aidant à obtenir un site flui-
PrestaShop en 1 seul clic pour permettre à tous de se de et dynamique.Le référencement naturel est optimisé,
lancer dans l’e-commerce. Une fois installée, la bouti- par le respect des balises sémantiques, et sa compatibili-
que est prête à être configurée (transporteurs, taxes, in- té avec les navigateurs Internet s’étend d’IE6 à Chrome.
formations légales…) et son catalogue, rempli. Sa prise Il offre une apparence claire et intuitive aux visiteurs.
en main est rapide et intuitive. Quelques touches d’Ajax sont distillées sur l’ensemble
de la boutique afin de la rendre plus attrayante en gar-
PrestaShop côté technique dant toujours à l’esprit que l’ergonomie est primordiale.
L’équipe de développement de PrestaShop a dès le Par exemple, lorsqu’un produit est ajouté au panier, le
début choisi d’éviter l’utilisation d’un framework PHP déplacement du produit vers le panier est illustré. Il est
existant pour se consacrer à la construction de son pro- par ailleurs possible d’installer des blocs de contenu (in-
pre framework. Avec ce choix technique, PrestaShop scription newsletter, publicité…) à des endroits stratégi-
n’est pas dépendant d’une solution tierce et les perfor- ques de la boutique, tels que les colonnes de gauche
mances sont immédiatement au rendez-vous. et de droite, le header et le footer. Ces blocs sont pré-
Ainsi, PrestaShop inclut dans son framework tous sentés sous forme de modules au sein du Back-Office.
les éléments essentiels au confort du développeur web Le thème standard de PrestaShop est entièrement
PHP : valide W3C, c’est une bonne base lorsqu’il s’agit de dé-
velopper son propre thème personnalisé. Car person-
• Une gestion objet des cookies, très simple à utili- naliser une boutique PrestaShop est facile : l’utilisateur
ser, peut se procurer un thème prêt à installer au sein de
• Sa propre classe d’abstraction de base de données PrestaStore, la place de marché officielle de thèmes
qui va même jusqu’à gérer la réplication SQL, et modules pour PrestaShop, dont le catalogue dépasse
• Une gestion des moteurs de rendus de graphiques les 700 références. Il peut également créer son thème
(utilisant différentes librairies comme Artichow, Visi- sur mesure, grâce au système de templates Smarty, le
fire, GoogleCharts ou encore xmlswfcharts), HTML, le CSS et Javascript.
• Une gestion de l’envoi d’e-mails personnalisés avec
SwiftMailer, Tout le monde peut participer
• La création de documents PDF avec FPDF, PrestaShop est un projet Open Source qui a une poli-
• Et de nombreux autres outils concernant la sécuri- tique de développement contrôlé : seule l’équipe de Pre-
té, l’internationalisation, etc. staShop peut intégrer de nouvelles fonctionnalités. Cette
restriction est nécessaire pour garder un minimum de co-
PrestaShop respecte naturellement autant que possible hérence technique pour le projet. En revanche, il existe
une architecture MVC, la couche modèle étant gérée de nombreux moyens de contribuer au développement
avec un design pattern Active Record et la vue grâce du projet. N’importe qui peut soumettre un bug dans l’o-
au moteur de templates Smarty. Le travail d’équipe est util de rapport de bug du site communautaire http://www.
ainsi largement facilité, et le développement de nouvel- prestashop.com/bug_tracker/, et si vous fournissez le
les fonctionnalités est généralement très rapide. patch avec le problème, c’est encore mieux !
La toute-puissance de PrestaShop ne vient cepen- Pour les passionnés, PrestaShop dispose égale-
dant pas uniquement de son framework, mais surtout ment d’une place de marché, PrestaStore, qui permet
de son système de modules permettant à tout un cha- aux développeurs, graphistes et intégrateurs de pro-
cun de développer ses propres fonctionnalités pour sa poser à toute la communauté leurs propres modules
boutique. Il suffit donc de quelques lignes pour greffer et thèmes. Avec un marché de plus de 40 000 mar-
une portion de code à un point stratégique de la solu- chands avides de nouvelles fonctionnalités, PrestaSto-
tion. Lors du passage d’une commande par exemple, re permet à ses supporters la meilleure diffusion po-
PrestaShop va automatiquement appeler les modules ssible pour leurs contributions. Enfin, un SVN est bien
qui souhaitent effectuer du traitement. Sur le même évidemment à la disposition de tous pour bénéficier de
modèle, les modules peuvent ajouter des éléments gra- la toute dernière version de la solution : http://www.pre-
phiques qui seront positionnés par PrestaShop au bon stashop.com/en/downloads/#svn.

www.phpsolmag.org 9
Projets

Le DOM
avec PHP5
Vous vous êtes toujours demandé s’il était possible de faire
des manipulations du DOM avec PHP ? Ou alors vous savez
que cela est possible mais vous ne savez pas comment.
Dans ce cas, cet article est fait pour vous.

Cet article explique : Ce qu’il faut savoir :


• Comment manipuler du XML à l’aide de l’API DOM de PHP5. • Les bases de la programmation avec le langage PHP.
• La POO et son implémentation dans PHP 5.
• Les bases du XML et du XPATH.

L
e terme DOM est l’abréviation pour Document • DOMComment : elle représente un noeud de com-
Object Model ; il s’agit d’une spécification du mentaire, délimité par <!-- et --->.
W3C(World Wide Web Consorsium) définissant • DomDocument : elle représente un document HTML
la structure d’un document sous forme d’une hiérarchie ou XML entier.
d’objets, afin de simplifier l’accès aux éléments constitu- • DomDocumentType : elle représente les types de
tifs de celui-ci. C’est une interface, API (Application Pro- document.
gramming Interface) indépendante de toute plateforme • DomElement : pour représenter un élément XML.
et de tout langage, permettant à une application de par- • DomException : elle dérive de la classe Exception,
courir la structure d’un document et d’agir de manière et permet de gérer les exceptions provoquées par
dynamique sur celui-ci. Les langages comme le javas- des opérations DOM.
cript par exemple l’utilisent pour naviguer au sein d’un • DOMNode : pour la manipulation des nœuds XML.
document HTML afin par exemple de récupérer les don-
nées d’un formulaire. Nous nous proposons dans cet Listing 1. compagnie.xml
article de présenter comment l’utiliser pour manipuler
<?xml version="1.0" encoding="UTF-8"?>
du XML en PHP5.
<!-- exemple de fichier XML -->
<root>
Les classes de l’extension Dom de PHP5 <option value="AA">American Airlines (États-Unis)</
Contrairement à PHP4 qui était fortement porté sur un option>
<option value="AB">Air Berlin (Allemagne)</option>
fonctionnement procédural et non procédurier, du fait <option value="AC">Air Canada (Canada)</option>
des prémices des mécanismes objet qu’il commençait <option value="AD">Air Paradise (Indonésie)</option>
<option value="AE">Mandarin Airlines (Taďwan)</option>
tout juste à implémenter, PHP5 intègre, lui, les notions <option value="AF">Air France (France)</option>
de POO très avancées et l’extension DOM n’est pas en <option value="AG">Air Contractors (UK) Ltd. (Irlande)</
option>
marge de cette logique. Cette dernière possède donc <option value="AH">Air Algérie (Algérie)</option>
un ensemble de classes parmi lesquelles nous avons : <option value="AI">Air India (Inde)</option>
<option value="BS">British International Helicopters
(Royaume-Uni)</option>
• DOMAttr : elle représente un attribut dans l’objet <option value="BT">Air Baltic (Lettonie)</option>
<option value="BU">Braathens groupe SAS (Norvège)</
DOMElement. option>
<option value="CE">Nationwide Airlines (Afrique du Sud)</
• DOMCharacterData : elle représente un noeud conte-
option>
nant des données. Aucun noeud ne correspond </root>
à cette classe, mais d’autres noeuds en héritent.

10 7/2010
Document Object Model

• DOMNodeList : pour manipuler une liste de nœuds.


Listing 2. Manipulation1
• DOMText : elle représente le contenu textuel de
DomElement ou DomAttr. $dom = new DOMDocument();
//ajout de la version et de l'encodage
• DomXpath : cette classe permet de faire des requê- $dom = new DOMDocument('1.0', 'utf-8');
tes Xpath sur un document XML avec le DOM. //chargement du document depuis une chaîne de caractères
$dom->loadXML('<root><node/></root>');
//chargement du document depuis un fichier
Mise en œuvre $dom->load('compagnie.xml');
//enregistrement du document sur le système de fichier
Pour illustrer la manipulation du DOM avec PHP5, $dom->save('NomFichier.xml');
nous utiliserons le document XML du Listing 1. Il est //récupération de l'arbre xml du document pour
//l'afficher par exemple
constitué d’un ensemble d’options correspondant cha- $machaine = $dom->saveXML();
cun au nom d’une compagnie aérienne et possédant echo $machaine ;
//test pour la validation du document suivant une DTD
un attribut value ayant pour valeur le code de cette if ($dom->validate())
compagnie. {
echo "Ce document est valide";
Nous allons donc procéder à un ensemble de mani- }
pulation de ce fichier tel que le montre le listing 2 : else
{
echo("ce document n'est pas valide") ;
• Création d’une représentation DOM d’un document }
XML la plus simple possible sans préciser de para- //validation dans le cas d'un schema xml
$dom->schemaValidate($path) ;
mètres.
• On complète la déclaration en ajoutant la version Listing 3. Manipulation2
du document: 1.0 et l’encodage utf-8.
//manipulation
• Chargement du document XML dans un premier
temps depuis une chaîne de caractère, et dans un $dom->load(realpath('compagnie.xml'));
$root = $dom->documentElement;
deuxième temps depuis un fichier (le fichier compa- echo $root->nodeName."<br>";
gnie.xml). $compagnie = $dom->getElementsByTagName('option');
foreach ($compagnie as $name)
• Parfois, on a besoin de pouvoir récupérer l’ensem- {
ble de l’arbre XML à des fins d’affichage ; cela se echo $name->firstChild->nodeValue."<br>";
}
fait grâce à la méthode saveXML().
• Il est possible via le DOM de valider un document Listing 4. Résultat
XML relativement à une DTD (Document Type Defi- root
nition) via la méthode validate(). American Airlines
Air Berlin
• Si par contre à la place d’une DTD nous avons plu- Air Canada
tôt un schéma XML alors nous utiliserons la métho- Air Paradise
Mandarin Airlines
de schemaValidate() qui prend en paramè- Air France
tre le chemin vers le fichier contenant le Air Contractors
Air Algérie
schéma. Air India
British International Helicopters
Air Baltic
Manipulation d’un document XML via le DOM Braathens groupe SAS
Pour manipuler un document XML via le DOM nous Nationwide Airlines

pouvons nous servir des classes que nous avons vues Listing 5. Lecture des attributs
précédemment, telles qu’illustrées dans le Listing 3 :
$compagnie = $dom->getElementsByTagName('option');

• affichage du nom de l’élément racine du docu- foreach ($compagnie as $name)


{
ment, if($name->hasAttribute('value'))
• retrouver un élément grâce au nom de sa balise : {
echo '--code: '.$name->getAttribute('
ici on recherche tous les élément ayant pour nom value').'<br>';
de balise option. Avec le code de ce listing, nous }
}
obtenons le résultat du Listing 4. Il est également
possible de lire la valeur d’un attribut. C’est ce qui
est fait dans le Listing 5 où nous obtenons la va-
leur de l’attribut value de nos éléments option . Le • on crée le nœud option que l’on souhaite ajouter au
Listing 6 présente le résultat obtenu. document,
• on crée le nœud textuel correspondant en restant
L’ajout d’un nœud peu également se faire en suivant la conforme à la structure de notre document,
procédure présentée dans le Listing 7. Les étapes sont • on crée ensuite l’attribut de l’élément ou alors celui-
les suivantes : ci est modifié s’il existe déjà,

www.phpsolmag.org 11
Projets

Listing 6. Affichage des attributs Listing 12. Résultat avec le xpath


--code: AA American Airlines
--code: AB Air Berlin
--code: AC Air Canada
--code: AD Air Paradise
--code: AE Mandarin Airlines
--code: AF Air France
--code: AG Air Contractors
--code: AH Air Algérie
--code: AI Air India
--code: BS British International Helicopters
--code: BT Air Baltic
--code: BU Braathens groupe SAS
--code: CE Nationwide Airlines

Listing 7. Ajout d’un noeud au dokument


//création d'un noeud
$newElement = $dom->createElement("option"); • et une fois ceci fait, le tout est lié à notre document
//crée le noeud textuel conformément a la structure XML de départ.
de notre document
$textNode = $dom->createTextNode("Toumai Air Tchad");
//création de l'attribut de l'element ou Pour être certain que le nœud a bien été ajouté au
//alors modification si l'attribut existe déjà
document, le code présenté au Listing 8 sera exécu-
$newAtt = $newElement->setAttribute("value","TT");
//attacher le noeud créer au reste du document
té. Le résultat est présenté au niveau du Listing 9 ou
en respectant sa structure //grace a la methode on constate une nouvelle ligne qui n’existait pas dans
appendChild
$newElement->appendChild($textNode);
notre document XML de départ : la ligne Toumai Air
//$root etant l'element racine de notre document Tchad.
$root->appendChild($newElement);

Listing 8. Verification de l’ajout du noeud au document Autres manipulations


D’autres manipulations sont également possibles avec
$compagnie = $dom->getElementsByTagName('option');
le DOM : on a par exemple la possibilité de :
foreach ($compagnie as $name)
{
echo $name->fi rstChild->nodeValue."<br>"; • créer un nœud par clonage d’un nœud existant,
} • supprimer un attribut d’un nœud,
• supprimer complètement un nœud,
Listing 9. Résultat de l’ajout du noeud
• énumérer les noeuds d’une liste de nœud : la
American Airlines
Air Berlin
méthode item() de la classe DomNodelist per-
Air Canada met de le faire aisément en passant en paramè-
Air Paradise
Mandarin Airlines
tre à cette méthode l’index du nœud recherché. Il
Air France est à noter que tout comme avec les tableaux en
Air Contractors
Air Algérie PHP, l’indexation ici commence à 0. Ces manipu-
Air India lations sont illustrées dans le Listing 11. Notons
British International Helicopters
Air Baltic que l’affichage du texte avec l’option ayant pour
Braathens groupe SAS indice 6 nous donne comme résultat Air Contrac-
Nationwide Airlines
Toumai Air Tchad tors.

Listing 10. Autres manipulations DOM dispose également d’une classe spécifique per-
$clone = $newElement->cloneNode(false); mettant d’effectuer des requêtes XPATH sur un docu-
$deleteAtt = $newElement->removeAttribute("value");
$deleteNode = $root->removeChild($newElement);
ment XML ; la logique est la suivante :

//affichage du texte l'option ayant pour indice 6


• on crée un objet DomXPath en lui passant en
$var = $dom->getElementsByTagName("option")->item(6); paramètre le document XML sur lequel sera effec-
echo $var->fi rstChild->nodeValue."<br>";
tuée la requête ;
Listing 11. Utilisation du xpath • on définit la requête à exécuter ;
• on l’exécute et on récupère les résultats que l’on
$xpath = new DomXPath($dom);
$xpath _ query = "//option"; exploite.
$resultat = $xpath->query($xpath _ query);

foreach ($resultat as $nom) Le Listing 12 en est une illustration où il est question de


{ récupérer tous les nœuds option de notre document en
echo $nom->fi rstChild->nodeValue."<br>";
} partant de la racine de celui-ci. Le résultat obtenu est
présenté au Listing 13.

12 7/2010
Document Object Model

Listing 13. Code récapitulatif de notre exemple //$root etant notre l'element racine de notre
document
$dom = new DOMDocument('1.0', 'utf-8'); $root->appendChild($newElement);
$dom = new DOMDocument();
//supprimer les espaces redondants dans le $compagnie = $dom->getElementsByTagName('option');
document : foreach ($compagnie as $name)
$dom->preserveWhiteSpace = false; {
//charger le document xml a partir d'un fichier echo $name->firstChild->nodeValue."<br>";
existant }
$dom->load(realpath('compagnie.xml')); //création d'un noeud par clonage d'un noeud
existant
//--------------utilisation des methodes du //cette methode prend en entrée un paramètre
DOMDocument-------------// booleen qui indique si oui ou non les noeuds fils
//sont également clonés
//affichage du nom de l'element racine $clone = $newElement->cloneNode(false);
$root = $dom->documentElement;
echo $root->nodeName; //on peut également supprimer un attribut de la
manière suivante
//retrouver un element grace au nom de la //cette methode prend en entrée le nom de
balise: l'attribut a supprimer
$compagnie = $dom->getElementsByTagName('option'); $deleteAtt = $newElement->removeAttribute("value");
echo("<br>nom balise<br>");
foreach ($compagnie as $name) //suppression d'un noeud grace à la methode
{ removeChild() qui permet de Supprimer un fils
echo $name->firstChild->nodeValue."<br>"; //de la liste des enfants d'un noeud
} $deleteNode = $root->removeChild($newElement);
//obtenir la valeur d'un attribut
$compagnie = $dom->getElementsByTagName('option'); //la methode item() de la classe DomNodelist
foreach ($compagnie as $name) Retourne un noeud spécifié par son index
{ $compagnie = $dom->getElementsByTagName('option');
if($name->hasAttribute('value')) foreach ($compagnie as $name)
{ {
echo '--code: '.$name->getAttrib echo $name->firstChild->nodeValue."<br>";
ute('value').'<br>'; }
}
} echo'----------------------------------';
$var = $dom->getElementsByTagName("option")->item(6);
//crée un noeud echo $var->firstChild->nodeValue."<br>";
$newElement = $dom->createElement("option");
//crée le noeud textuel conformément a la //manipulation avec le xpath
structure de notre document $xpath = new DomXPath($dom);
$textNode = $dom->createTextNode("Toumai Air //permettra de selectionner tout les noeuds
Tchad"); enfant ayant pour nom "option"
//création de l'attribut de l'element ou alors //en se basant sur le contexte actuel.
modification si l'attribut existe déjà $xpath _ query = "./option";
$newAtt = $newElement->setAttribute("value","TT"); $resultat = $xpath->query($xpath _ query);
foreach ($resultat as $nom)
//attacher le noeud créer au reste du document en {
respectant sa structure echo $nom->firstChild->nodeValue."<br>";
//grace a la methode appendChild }
$newElement->appendChild($textNode); $dom->load('compagnie.xml');

Conclusion ple mais il est tout à fait possible de faire des choses
Tout au long de cet article, nous avons pu parcourir plus complexes via cette interface. Cet article n’étant
les principales fonctionnalités et possibilités que no- pas exhaustif, nous vous invitons à faire un tour sur
us offres le dom avec PHP5. Nous sommes désor- Internet afin de compléter vos connaissances sur le
mais capable de construire un document XML, de le sujet. N’hésitez pas également à nous faire part de
stocker, de le parcourir, de l’interroger et même de vos remarques par mail, surtout si vous souhaitez
le modifier. Nous nous sommes focalisés sur des voir un aspect de l’interface approfondit dans les pro-
fonctionnalités basiques afin de faire un exemple sim- chains articles.

Sur Internet
• http://eusebius.developpez.com/php5dom/ – Un artic-
le très intéressant sur le DOM pour bien démarrer,
• http://www.php.net/docs-echm.php – Le manuel de MBELLA EKOUME K. DEMAZY
PHP pour plus de détails sur les classes du DOM, Technicien Supérieur en Réseaux & Télécom, il a poursuivi son cur-
• http://www.w3schools.com/dom/dom_text.asp – Un sus en faisant une maîtrise en développement logiciel. Très orien-
site didactique sur les technologies du web qui vous per-
té WEB, celui-ci se passionne pour les solutions Open Source et cela
mettra d’en apprendre d’avantage sur le DOM en général,
fait maintenant 3 ans qu’il travaille en tant que développeur pro-
• http://www.commentcamarche.net/ : l’encyclopédie en
ligne de l’informatique. fessionnel. Pour le contacter, envoyer un mail à l’adresse dembel-
lo85@yahoo.fr.

www.phpsolmag.org 13
Byoos

BYOOS solutions Open Source

continent en offrant des applications de type profession-


Qui sommes nous ? nel aux organisations africaines soucieuses de se déve-
BYOOS http://byoos.fr solutions Open Source est à l’ori- lopper et de rester en phase avec les pays les plus avan-
gine une entreprise Française spécialisée dans le logiciel cés en terme de gestion informatique en investissant
médical libre travaillant sur les technologies WEB ainsi massivement dans ce domaine plus que prometteur.
que les outils libres de droits ex LINUX, APACHE, PHP,
MYSQL. Ce choix est celui du promoteur de l’activité BO- Technique
BARD Gabriel Julien Pierre qui, passionné de nouvelles Bien évidement ceci ne s’est pas réalisé en un jour puis-
technologies, a permis à BYOOS d’acquérir un savoir fai- que la création de BYOOS en France date de l’année
re dans le domaine de l’informatique médicale en propo- 2005 et à cette époque les développements Intranet WEB-
sant la gestion du plateau technique via le WEB ainsi que Based n’étaient pas ttrès répandu voire inexistant. C’est
le site vitrine institutionel pour les Hôpitaux, cliniques, pour cela que nous avons lancé l’étude d’une GED médi-
pharmacies, laboratoires d’analyses. Ces organisations cale MLDOCS basée sur le Framework de XOOPS. Ce-
préférent faire appel à des spécialistes du domaine. lui-ci nous paraissant à ce moment le plus avancé ( entiè-
Nous sommes aussi implanté en Afrique Sub-Sa- rement écrit en PHP4 objet ).
harienne afin de promouvoir le logiciel médical Web Xoops représentait un héri-
Based MEDLINES+, MLDOCS, XMEDOO. Ces déve- tage intéressant, permettant
loppements sont issus de briques open sources et dis- de développer dans un cadre
ponibles sur la toile par simple téléchargement. modulaire et extensible sans
Afin d’atteindre ses objectifs de vulgarisation des logi- équivalent encore aujourd’hui
ciels libres, BYOOS solutions s’est dotée d’un centre de dans les offres de logiciels li-
formation au cœur de Yaoundé au Cameroun puis à Doua- bres PHP-MYSQL.
la et Kribi, grâce à l’engagement de son partenaire en Afri- Par la suite nous nous
que CTOOS Cameroun Technologies Open Source. sommes rapprochés de ME-
L’Afrique est en pleine mutation technologique. Le lo- DIBOARD http://mediboard.
giciel libre est l’un des vecteurs du développement de ce org, le logiciel médical open

14 7/2010
Byoos

source de référence porté par la société OpenXtrem, afin


de créer le « fork » MEDLINES+ pour l’Afrique avec la
prise en compte des spécificités du continent Africain.
Actuellement nous traduisons le noyau MEDLINES+
dans l’espoir de supporter en totalité la langue Anglai-
se. Nous proposons régulièrement aux équipes de dé-
veloppement MEDIBOARD des patchs d’évolution vers
l’internationalisation de la solution. MEDLINES+ qui est
totalement autonome et embarque les librairies PEAR
essentielles à son fonctionnement. Vous pouvez tester
les performances de la nouvelle version 2010v2 :http://
medlines.byoos.info ( serveur au États Unis ).
Maintenant notre travail est essentiellement basée sur
le Framework codeIgniter ( C.I ) version 1.7.2 qui, à notre
sens, est très loin devant en terme de fonctionnalités et sim- − du développement d'applications WEB, sites Inter-
plicité de mise en œuvre http://www.codeigniter.fr, La do- net, adaptation de logiciels existant aux besoins du
cumentation très complète est en cours de traduction de client, vTiger, Prestashop, Mediboard, IonizeCms,
l’anglais vers le français ; les ressources sont nombreuses. BambooInvoice ...,
C.I apporte une librairie extrêmement riche, de sorte que tou- − Installation de serveur LINUX
tes applications métiers ont une réponse au cœur de C.I.
Nous travaillons à l’intégration des fonctionnalités de Nos souhaits ?
XOOPS au niveau application de CodeIgniter, Trouver un ou plusieurs investisseurs intéressés par
le modèle open source afin de couvrir une zone plus
Un installateur simplifié et complet large de l’Afrique Gabon, Guinée EQ, Congo, Côte d’I-
Support de multiple base de données ( Mysql, Mssql, voire, Sénégal …
PostGresSql, Oracle … ) Voir le système LINUX se répandre dans les
Intégration des plugins modules avec installation et dé- ministères et autres administrations afin de faire bais-
sinstallation ser les coûts d’acquisition des licences ( le service lié
Gestion des versions au déploiement du logiciel libre est en général de 40%
Héritage du mode application de C.I inférieur à celui du logiciel propriétaire ). Autre argument
Gestion multi-langue de choc, l’absence de virus sur les plateformes LINUX
Support des templates SMARTY la version 3.0 étant en font un choix orienté sécurité.
déjà intégrée à C.I ( voir le tutoriel byoos.fr )

Nos missions ? Nos contacts


− BYOOS propose des formations de Webmaster et ad- EUROPE-FRANCE
ministrateur LINUX ( Debian 5.0 – Ubuntu 10.04 ) en BYOOS Solutions France 05000 GAP
salle ou en e-learning via notre plateforme WEB, +33 645 254 813
− de la vente de matériels pour les étudiants, des re-
vues et livres informatiques traitants des sujets AFRIQUE-CAMEROUN
LINUX et logiciels libres, BYOOS-Sarl WEB agency Solutions OPEN SOURCE
Informatique médicale-Entreprises-Technologies Web-
Intranet/Extranet
LINUX DEBIAN – UBUNTU – ANTIVIRUS
Situé à l’immeuble Beau Lieu sis au carrefour ABBIA,
face entrée manège
B.P 33543 Yaoundé Tel : +237 96 65 47 56,
e-mail : contact@byoos.fr, www.byoos.fr

www.phpsolmag.org 15
Projets

jQuery:
tour d’horizon de cette librairie JavaScript
jQuery est devenu désormais incontournable lors
de la réalisation d’une application web. Utilisée aussi bien
avec PHP qu’en développement Windows, on ne peut passer
à côté de cette librairie aussi simple d’utilisation
que puissante en terme de fonctionnalités.

Cet article explique : Ce qu’il faut savoir :


• Les bases de jQuery, afin de vous permettre d'en apprendre • Le lecteur devra avoir des notions en JavaScript.
plus sur ce dernier ainsi que de vous donner davantage l’envie • La réalisation d'un premier développement web est conseil-
de pousser votre curiosité autour de ce dernier. lée.

D
ans le numéro de PHP Solutions n°5/2010, Eric C’est en septembre 2007 que le plugin jQuery UI
Vincent vous parlait des frameworks JavaScript voit le jour.
et notamment de jQuery. Je vous propose de
(re)lire son article afin d’avoir une idée plus générale Installation
sur l’ensemble des frameworks qui sont disponibles en Avant d’aller plus loin dans l’utilisation de jQuery, il faut
JavaScript. avant tout procéder à son installation. Je rassure de su-
Pour l’heure, nous traiterons plus en profondeur ite les plus réfractaires de ce genre d’opération : jQuery
d’un framework très prisé ces derniers temps : jQuery. est – comme pour la plupart des composants tiers pour
Fin août 2005, John Resig publie une première version le web – simple d’installation et de configuration.
de cette librairie qui ne comporte que des modifications Pour commencer, rendez-vous sur le site officiel de
aux DOM ainsi que des animations basiques. En jan- jQuery, à savoir http://jquery.com/, afin de récupérer la
vier 2006, le premier plugin jQuery est développé. Ce dernière version courante. A l’heure actuelle, il s’agit de
plugin, JSON for jQuery, sera le premier d’une longue la v1.4.2. Vous avez le choix entre deux version : pro-
lignée. Un mois plus tard, l’Ajax est ajouté à jQuery. De- duction ou développement (version permettant de mo-
puis lors, la dernière version connue et courante est la difier le code original facilement). Par défaut, la version
v1.4.2. de production vous est proposée, et c’est celle que no-
Nous continuerons la présentation de cette us utiliserons. Nous n’avons nullement besoin de mo-
bibliothèque, de ce framework, par la mention de son difier la bibliothèque directement, et son poids est 85%
slogan : write less, do more. En effet, jQuery a la parti- plus faible. Ainsi, le lien direct pour la version courante
cularité de réduire le nombre de ligne de code mais de ressemblera à celui-ci: http://code.jquery.com/jquery-
faire toujours plus que si vous écriviez du code brut. 1.4.2.min.js.
Prenons un exemple succinct, afin de vous mont-
rer ce que vous pouvez éventuellement réaliser grâce Terminologie
à jQuery.
En ayant ce fragment de code dans un fichier Java- Document Object Model (ou DOM): recommandation du
W3C qui décrit une interface indépendante de tout langa-
Script $('img').addClass('borderDotted'); vous
ge de programmation et de toute plate-forme, permettant à
attacherez la classe CSS borderDotted à toutes les des programmes informatiques et à des scripts d’accéder ou
images présentes dans le DOM. Ainsi, chaque image de mettre à jour le contenu, la structure ou le style de docu-
qui sera rajoutée (dynamiquement ou non) à l’affichage ments.
aura la classe borderDotted attachée.

16 7/2010
jQuery

Tableau 1. Liste des sélecteurs


Sélecteur Sélection
* n’importe quel élément
E élément de type E
E:nth-child(n) élément E, le n-ième fils de son père
E:first-child élément E, le premier fils de son père
E:last-child élément E, le dernier fils de son père
E:only-child élément E, seul fils de son père
E:empty élément E qui n’a pas de fils (en incluant les nœuds textes)
E:enabled élément de type interface (élément de formulaire) E qui n’est pas désactivé
E:disabled élément de type interface E qui est désactivé
E:checked élément de type interface E qui est coché (case a cocher, bouton radio...)
E:selected élément de type interface E qui est sélectionné (options d’un select)
E.warning élément E dont la classe est „warning”
E#myID élément E dont l’id est „myID”. Ne retourne qu’un élément maximum
E:not(s) élément E qui ne répond pas a la condition du sélecteur s
EF élément F descendant d’un élément E
E>F élément F fils d’un élément E
E+F élément F immédiatement précédé d’un élément E
E~F élément F précédé d’un élément E
E,F,G sélectionne tous les éléments E, F et G
E[foo] élément E avec un attribut „foo”
E[foo=bar] élément E avec un attribut „foo” valant „bar”
E[foo^=bar] élément E avec un attribut „foo” dont la valeur débute par la chaine „bar”
E[foo$=bar] élément E avec un attribut „foo” dont la valeur se termine par la chaine „bar”
E[foo*=bar] élément E avec un attribut „foo” dont la valeur contient la chaine „bar”

Une fois celui-ci sauvé, il vous faut maintenant réa- L’instruction noConflitct() de jQuery vous permet ain-
liser la prise en charge de la librairie par votre applica- si de modifier l’alias de ce dernier. Le simple appel de
tion, au moyen de la ligne de code suivante - placée ju- jQuery.noConflitc() vous forcera à utiliser le nommage
ste après la balise <title> de votre document : <script par défaut (à savoir jQuery) en place et lieu de son alias
type="text/javascript" src="js/jquery- $ (dollar américain). Vous pouvez, grâce à une assigna-
1.4.2.min.js"></script>. Votre application est dé- tion de cet appel, modifier l’alias de nommage, comme
sormais prête à utiliser jQuery. Toutefois, il manque en- illustré dans le Listing 3. A partir de maintenant, il vous
core un léger détail qui fera toute la différence. est entièrement possible de réaliser des traitements
sur le document chargé. Afin de réaliser un traitement,
Utilisation jQuery a besoin de savoir sur quel(s) élément(s) vous
Afin de pouvoir réellement utiliser et activer jQuery dans voulez effectuer le traitement. Ainsi, outre les indéniab-
votre application, il vous faudra mettre le code à exé- les sélecteurs d’identifiant ou de classe, il vous est mis
cuter au sein d’une fonction propre à jQuery. Comme à disposition tout un ensemble de sélecteurs.
vous pouvez le voir, il n’y a quasiment rien à écrire pour Prenons par exemple la ligne indiquant que tout
ce faire. Procédons toutefois à l’analyse de ces quel- élément de type E sera la sélection. En reprenant no-
ques lignes, très rapidement. Nous demandons au do- tre exemple introductif, nous pouvons assimiler E à un
cument d’avoir entièrement chargé le DOM (Document élément de type image. La sélection basée sur $(‘img’)
Object Model) avant d’exécuter du code proprement dit. comporte dès lors autant d’objet d’élément image que
L’appel à jQuery se fait au moyen du $ (dollar américa- le document en comporte.
in). Pour plus de sûreté et de facilité, surtout dès le mo- Il existe aussi un mode de sélection différent : Xpath,
ment où vous utilisez d’autres bibliothèques telle que langage (non XML) pour localiser une portion d’un do-
Prototype, vous pouvez modifier le code en Listing 1 cument XML. Il permet de pointer (sélectionner) un
par celui-ci. élément du DOM via un chemin de localisation. Pour

www.phpsolmag.org 17
Projets

Figure 1. Rendu visuel du widget Tabs de jQuery UI

Listing 1. Fonction d’appel de jQuery Les plugins


Un des atouts majeurs de jQuery est sa possibilité
$(document).ready(function(){
//Du code ici à s’étendre sans devoir modifier le code source tout en
}); ayant à écrire le moins possible pour ce faire.
Listing 2. Fonction d’appel de jQuery, mode sans conflits Il existe un nombre incalculable de ces plugins. Ces
derniers vont tout aussi bien du domaine de la petite
jQuery.noConfl ict();
jQuery(document).ready(function(){
aide jusqu’à l’apport de fonctionnalités très complexes.
//Du code ici Nous n’avons malheureusement pas l’occasion d’en
});
couvrir une large sélection et il m’est impossible d’en
Listing 3. Fonction d’appel de jQuery, mode sans conflits avec sélectionner un parmi ceux-ci, du fait qu’ils sont tous
assignation aussi utiles les uns que les autres.
var j = jQuery.noConfl ict();
Nous allons donc profiter de ce fait pour expliquer le
// Utiliser jQuery avec son nouvel alias fonctionnement et la création d’un plugin.
j("div p").hide();
Comme je vous le disais au tout début de ce cha-
Listing 4. Constitution du plugin, nommé afficherChaine pitre, la conception d’un plugin se réalise très simple-
ment. Pour l’exemple, nous ne serons pas ambitieux
jQuery.noConfl ict();
jQuery(document).ready(function(){ dans le fonctionnement de ce dernier. Celui-ci, lorsqu’il
(function(jQuery) { le lui sera demandé, retournera une chaîne de carac-
jQuery.fn.extend({ afficherChaine:
function(options) { var defaults = { tères dans un élément donné (celui auquel est attaché
textToElement: «texte mis en option.» }
var options = jQuery.
l’appel du plugin).
extend(defaults, options); return Notre plugin est constitué et près à l’emploi, dès
this.each(function() { var o = options;
var obj = jQuery(this);
maintenant. Comme vous le constatez, il est très court
obj.text('Texte à afficher: ' + o.textToElement); et de nouveaux éléments sont présents. Nous allons de
}); }
});
suite les expliquer.
})(jQuery); Afin de créer et de déclarer un plugin pour jQuery,
});
vous devez utiliser sa fonction fn.extend(). Le nom
du plugin (dans le cas présent, afficherChaine) est lais-
sé à votre appréciation. Cependant, il est préférable de
exemple, /html/body pointera sur l’élément body de la trouver un nom unique car cela peut créer des conflits
page. Pour plus d’informations sur l’utilisation de ce mo- avec des plugins déclarés sous un nom identique.
de de sélection, je vous laisse le soin de visiter notam- Le plugin prend en charge deux données : defaults
ment le site suivant : http://www.w3schools.com/xpath/ et options. Ce mécanisme vous permet de laisser une
default.asp. certaine liberté lors de l’appel de votre propre plugin, tout

18 7/2010
jQuery

en assurant que ces paramètres ne soient pas oubliés.


Listing 5. Code Html, démo du widget tabs
De même, cela permet à l’appelant de ne pas être obligé
de fournir chaque paramètre du plugin, alors que ceux <div id="tabs">
<ul>
par défaut lui suffise. <li><a href="#tabs-1">Nunc tincidunt</a></li>
Dans notre exemple, nous n’avons qu’un paramètre, <li><a href="#tabs-2">Proin dolor</a></li>
<li><a href="#tabs-3">Aenean lacinia</a></li>
à savoir textToElement. Nous reviendrons sur ce der- </ul>
nier lors de l’appel à notre propre fonction. <div id="tabs-1">
<p>Proin elit arcu, rutrum commodo, vehicula
Chaque fonction jQuery retourne un objet : l’objet tempus, commodo a, risus. Curabitur nec arcu. Donec
(la sélection d’objets, plus précisément) modifié. sollicitudin mi sit amet mauris. Nam elementum
quam ullamcorper ante. Etiam aliquet massa et
C’est pourquoi il vous est tout à fait possible de chaî- lorem. Mauris dapibus lacus auctor risus. Aenean
tempor ullamcorper leo. Vivamus sed magna quis
ner les différentes fonctions en une seule ligne, telle ligula eleifend adipiscing. Duis orci. Aliquam
que jQuery('#foo').css('cursor', 'pointer'). sodales tortor vitae ipsum. Aliquam nulla. Duis
aliquam molestie erat. Ut et mauris vel pede varius
addClass('bar');
sollicitudin. Sed ut dolor nec orci tincidunt
De ce fait, nous terminons la constitution du plu- interdum. Phasellus ipsum. Nunc tristique tempus
lectus.</p>
gin par un return obligatoire, qui retourne l’objet mo- </div>
difié. Dans notre cas, nous modifions l’innerHTML via <div id="tabs-2">
<p>Morbi tincidunt, dui sit amet facilisis
la fonction text() de jQuery. Nous pouvons voir que la feugiat, odio metus gravida ante, ut pharetra massa
chaîne de caractères modifiée prend en considération metus id nunc. Duis scelerisque molestie turpis.
Sed fringilla, massa eget luctus malesuada, metus
le paramètre textToElement. eros molestie lectus, ut tempus eros massa ut
Pour l’appel suivant, jQuery(‘#foo’).afficherChaine(‘le dolor. Aenean aliquet fringilla sem. Suspendisse
sed ligula in ligula suscipit aliquam. Praesent
texte mis en option.’); nous aurons la chaîne de in eros vestibulum mi adipiscing adipiscing. Morbi
caractères, Texte à afficher : le texte mis en option, affi- facilisis. Curabitur ornare consequat nunc. Aenean
vel metus. Ut posuere viverra nulla. Aliquam erat
ché dans l’élément d’identifiant foo. volutpat. Pellentesque convallis. Maecenas feugiat,
tellus pellentesque pretium posuere, felis lorem
euismod felis, eu ornare leo nisi vel felis. Mauris
Jquery UI consectetur tortor et purus.</p>
Voyons maintenant un plugin des plus connus dans la </div>
<div id="tabs-3">
communauté jQuery : Jquery UI. Ce plugin est déve- <p>Mauris eleifend est et turpis. Duis id erat.
loppé par l’équipe de développeur propre à jQuery. UI Suspendisse potenti. Aliquam vulputate, pede vel
vehicula accumsan, mi neque rutrum erat, eu congue
voulant dire User Inteface, ou encore interface utilisa- orci lorem eget lorem. Vestibulum non ante. Class
teur, beaucoup d’élément liés à ce plugin sont purement aptent taciti sociosqu ad litora torquent per conubia
nostra, per inceptos himenaeos. Fusce sodales.
visuel. Quisque eu urna vel enim commodo pellentesque.
Nous pouvons aussi parler de nouvelles intéractions Praesent eu risus hendrerit ligula tempus pretium.
Curabitur lorem enim, pretium nec, feugiat nec,
lorsque nous introduisons ce plugin. De fait, ce dernier luctus a, lacus.</p>
amène la possibilité de faire du drag & drop, du resize, <p>Duis cursus. Maecenas ligula eros, blandit
nec, pharetra at, semper at, magna. Nullam ac lacus.
du selectable ou encore du sorting. Grâce à ces intérac- Nulla facilisi. Praesent viverra justo vitae neque.
tions, divers plugins amènent un traitement particulier Praesent blandit adipiscing velit. Suspendisse
potenti. Donec mattis, pede vel pharetra blandit,
basé sur ces dernières. magna ligula faucibus eros, id euismod lacus dolor
eget odio. Nam scelerisque. Donec non libero sed
De nombreux widgets sont disponibles via ce plugin. nulla mattis commodo. Ut sagittis. Donec nisi lectus,
Nous pouvons citer par exemple Dialog, DatePicker. feugiat porttitor, tempor ac, tempor vitae, pede.
Aenean vehicula velit eu tellus interdum rutrum.
Comme vous pourrez le constater, colede jQuery se Maecenas commodo. Pellentesque nec elit. Fusce
résume en une ligne : l’appel de la fonction implémen- in lacus. Vivamus a libero vitae lectus hendrerit
hendrerit.</p>
tant le widget. Voici le rendu de ce code. Citons aussi </div>
Tabs, via l’exemple présenté dans le Listing 1. </div>

Requêtes Ajax
A l’ère du web de nouvelle génération, où le visuel est requête synchrone s’opère et un ensemble de contenu
tout aussi important que le fonctionnel, alliant rapi- est rechargé. Afin d’être plus performant et rapide, cer-
dité et fiabilité, rien n’est plus utile et efficace que les tains navigateurs ont instaurés un système de cache.
requêtes de type Ajax. jQuery embarque des fonctions Toutefois, l’utilisation de requêtes asynchrones permet-
simples et puissantes pour réaliser vos traitements Ajax tant de ne (re-)charger les seuls éléments dont nous
en un tour de main. avons à nouveau besoin est de loin la méthode la plus
L’Ajax (Asynchronous JavaScript and XML) est performante.
l’utilisation conjointe de technologies déjà existantes Je ferai un détour rapide par la fonction load() qui
(Html, Css, DOM, ...) permettant des requêtes HTTP de vous permet de charger le contenu d’un fichier et de le
types asynchrones. Lorsqu’un visiteur se rend sur une restituer dans un élément du DOM. Pour exemple, si le
page avec formulaire et qu’il soumet ce dernier, une fichier mon_fichier.txt comporte la chaîne de caractères

www.phpsolmag.org 19
Projets

Listing 6. Code jQuery, démo du widget « tabs » fonction post() par le biais du code indiqué dans le
Listing 7, nous obtiendrons une alerte JavaScript in-
$(function() {
$("#tabs").tabs(); diquant un texte semblable au Listing 8.
}); Il vous est donc possible d’effectuer un traitement
Listing 7. Contenu du fichier returnPost.php
plus complexe au niveau du serveur, lorsque la page
PHP est appelée et de fournir à votre visiteur une indi-
<?php
cation sur la réussite de l’opération, tout en permettant
print _ r($ _ POST); à ce dernier de ne pas recharger le document en en-
?>
tier. Ce processus est notamment utilisé pour valider
l’utilisation d’un login en vérifiant dynamiquement et au-
Listing 6. Appel de la fonction post() tomatiquement que ce dernier ne soit pas déjà utilisé.
jQuery.post('http://mon _ url.com/plete/returnPost.php',
La fonction get() n’est pas différente de celle que
{ foo: "bar", titre: "jQuery" }, l’on vient de voir ensemble. Un seul détail la différencie
function(data){
alert("Le document retourne: " + et il ne s’agit pas de n’importe quel détail : son fonction-
data); nement est somme toute pareil, mais il demande un re-
});
tour de données à la page sans pour autant fournir des
Listing 8. Texte affiché dans l’alerte JavaScript données à cette dernière. Nous pourrions par exemple
utiliser cette fonction afin de récupérer le nombre de
Array
messages non lus d’un utilisateur, sans pour autant que
( ce dernier recharge sa page.
[foo] => bar
[titre] = > jQuery
) Conclusion
Nous avons vu dans cet article l’univers de jQuery.
Pourtant, nous sommes encore loin de l’avoir couvert
Ceci est dans le fichier et que vous effectuez un appel entièrement, vu l’ampleur des fonctions présentes au
du style jQuery(‘#foo’).load(‘http://mon_url.com/plete/ sein de jQuery ainsi que la multitude de plugins qui
mon_fichier.txt’); vous aurez le contenu de mon_fichier. s’articulent autour de ce dernier.
txt affiché dans l’élément d’identifiant foo. Il vous est po- De même, les possibilités qui nous sont offertes grâ-
ssible de mentionner un deuxième paramètre indiquant ce à l’ajax implémenté au sein de jQuery sont nombreu-
l’identifiant de l’élément contenu dans la page distante ses et vous permettent une utilisation variée et complète
à afficher. de cette bibliothèque.
Il existe une fonction nommée tout simplement J’espère toutefois que les quelques exemples in-
ajax() vous permettant d’effectuer une requête ajax, diqués dans cet article vous donnerons l’envie d’en
aussi bien en mode GET qu’en mode POST. Je fais le découvrir d’avantages, et – qui sait – devenir l’un des
choix de ne pas vous l’expliquer en privilégiant deux développeurs de plugins sous jQuery les plus acharnés
méthodes distinctes mais semblables et vous laisse le et réputés de la communauté jQuery.
soin de voir le détail de cette fonction par vous-même.
Les deux fonctions que je vais vous décrire sont
get() et post(). Si vous lisez cet article, et notamment
ce chapitre, vous êtes normalement familiarisés des
formulaires en (x)HTML. Le nom de ces deux métho-
des devraient donc vous mettre sur la voie de leur utilité
respective.
La fonction jQuery.post( url, data, success())
sera donc utilisée lorsque l’on veut effectuer une requête JONATHAN DANSE
sur un fichier (url) en lui transmettant des données (da- Autodidacte en matière de développement de sites en PHP, l’auteur
ta) et effectuer une opération spécifique lors de la réus- a toujours poussé plus loin sa curiosité sur le sujet et les outils que
site de cette requête. Si l’on effectue un appel de la font le web. Sa volonté d’apprendre et d’aller toujours plus loin dans
ses réalisations lui a permis de forger un bagage conséquent sur le
développement d’application PHP. Soucieux de réaliser des applica-
Sur Internet
tions valides (aux normes du W3C), il utilise le CSS et l’(x)HTML avec
• http://jquery.com/ – Site officiel de jQuery, parcimonie. Dans la même lignée, il s’attaque à l’apprentissage de
• http://plugins.jquery.com/ – Dépôt (repository) de plu- jQuery et s’en fait un allié dans ses développements.
gins jQuery,
L’auteur est actuellement en train de finir ses études en informati-
• http://jqueryui.com/ – Site officiel de jQuery UI.
que de gestion lui permettant d’être polyvalent et de voir d’autres
méthodes de développement existantes.

20 7/2010
Dossier

Développer
un portail ecommerce Communautaire
avec Magento et Drupal
Les solutions Magento et Drupal sont aujourd’hui deux
poids lourds de l’ecommerce et de la gestion de contenu
Open Source. On compte aujourd’hui plusieurs dizaines de
milliers de boutiques utilisant Magento avec des références
importantes telles que Wonderbox, Tf1shopping ou encore
Discounteo.

Cet article explique : Ce qu’il faut savoir :


• Le fonctionnement de la brique Magento – Drupal, les logiqu- • Connaissances sur les logiques d'e-commerce et de gestion de
es de développement et d’amélioration de celles-ci, les outils contenu.
indispensables...

L
a popularité de Drupal est encore plus éclatante : ages-sncf vient de lancer un outil de consultation publi-
des centaines de milliers de sites tournent sous que de ses voyageurs, les voyagistes en ligne propo-
Drupal, et pas des moindres : la Maison Blanche, sent des outils de forum et d’échange en ligne de bons
MTV, Rue89... Pourtant, lorsque les e-commerçants plans, les pages Twitter des e-marchands leur permet-
souhaitent ajouter du contenu, faire participer leurs tent de relayer les derniers bons plans et promotions,
consommateurs, offrir des outils qui ne sont pas uniqu- les catalogues produit mettent de plus en plus en avant
ement destinés à la vente, il devient alors nécessaire de les fonctions de recommandation, des applis qui permet-
réaliser d’importants développements sur la plate-for- tent de poster directement des achats sur les sites com-
me Magento. De manière symétrique, lorsque les dru- munautaires, voire même d’acheter sur Facebook ...
paliens souhaitent monétiser leur audience, la solution
Ubercart (bien que bientôt remplacée par Drupal Com- Faire converger les meilleurs outils de l’ecommerce
merce) reste trop peu fournie en fonctionnalités propres et du communautaire
aux processus d’ecommerce. C’est ainsi que, depuis Drupal et Magento sont chacun, dans leur domaine, les
quelque temps, de nombreuses voix se sont faite en- outils les plus performants du marché. Pour Magento, il
tendre pour coupler ces deux solutions. C’est la société n’existe pas, à ce jour, d’équivalent Open Source dispo-
Adyax qui a posé la première brique en développant sant d’une telle communauté d’utilisateurs et de con-
une API que nous avons mis en œuvre sur plusieurs de tributeurs, ni de solution aussi riche en fonctionnalités.
nos projets. Pour Drupal, la question peut être plus discutable au
regard de plate-formes telles que Wordpress, eZpublish
Magento – Drupal : Pourquoi ? ou encore Joomla, dont les philosophies de conception
La montée en puissance de l’ecommerce 2.0 divergent. Néanmoins, son principe de fonctionnement
Le choix de réunir ces deux briques fonctionnelles s’est modulaire et la richesse de ses extensions communau-
fait à partir d’un constat assez simple : l’un des leviers taires en fait une solution privilégiée pour des portails
essentiels de performance des boutiques en ligne rési- de type 2.0
de dans la mise en œuvre d’une stratégie 2.0. Il devient
ainsi crucial d’adapter les pratiques d’ecommerce aux Magento – Drupal : comment ça fonctionne ?
révolutions de l’ère du participatif où les internautes de- Lorsque l’on souhaite faire cohabiter deux solutions en-
viennent acteurs des produits qu’ils achètent. semble, plusieurs architectures techniques sont possi-
Les grandes marques ne s’y sont pas trompées : on bles. En fonction des objectifs du projet, chacune des
voit fleurir ainsi les pages Fan de sur Facebook, Voy- structures peut être pertinente.

www.phpsolmag.org 21
Magento et Drupal

Deux sites différents avec SSO et CAS


La première solution, la plus habituelle pour faire dia-
loguer différentes solutions, est de déployer un méca-
nisme de SSO avec l’ajout d’un serveur CAS. Cette
logique de fonctionnement oblige à conserver deux
Front-Office différents (bien que l’on puisse les habil-
ler avec une même charte graphique) et à mettre en
place des procédures de réplication de comptes utili-
sateurs.
Il faut ensuite prévoir de déléguer à un serveur CAS
les fonctions d’authentification pour éviter que les uti-
lisateurs n’aient à renouveler leur authentification lor-
squ’ils passent d’un front-office à un autre.
Mais l’intérêt de coupler Drupal – Magento ne réside
pas que dans la synchronisation des comptes utilisa-
teurs. Il faut aussi pouvoir multiplier les accès aux con-
tenus : proposer des produits depuis les outils commu-
nautaires et proposer des contenus depuis la boutique.
Il faut aussi prévoir de multiplier les contenus proposés
selon deux mécanismes, de plus ou moins grande sim-
plicité :

• mettre en place des flux RSS pour tous les conte-


nus que l'on souhaite afficher sur l'autre Front-Of-
fice,
• déployer des imports – exports XML permettant
d’alimenter la base Drupal / Magento, avec la prin-
cipale contrainte que la structuration de données de
Magento n’est pas forcément adaptée à un principe
de structuration de contenu tel que l’on peut l’enten-
Avantages de cette logique de fonctionnement :
•les deux plate-formes restent indépendantes : il n'y a pas besoin d'installer de modules complémentaires et

dre dans une logique CMS. • Si vous souhaitez intégrer un moteur de recherche
donc pas de risques liés aux montées de version de ces plate-formes.
•Pas de complexité particulière de synchronisation. Chaque plateforme conserve ses avantages.
Inconvénients :
unique au site, ce n'est pas possible, à moins d'aller
Nous vous présentons dans la Figure 1 une structura- installer un moteur tiers (et ces solutions sont so-
tion possible de cette architecture. uvent payantes).
• Dès que vous êtes amenés à faire des modifica-
Avantages de cette logique de fonctionnement : tions graphiques, il vous faut répercuter ces modi-
fications sur les deux instances, avec une double
• les deux plate-formes restent indépendantes : il n'y charge de travail puisque les moteurs de templating
a pas besoin d'installer de modules complémen- entre Drupal et Magento sont différents.
taires et donc pas de risques liés aux montées de • …
version de ces plate-formes.
• Pas de complexité particulière de synchronisation. En bref, outre la contrainte d'avoir à développer une
Chaque plateforme conserve ses avantages. extension CAS pour Magento, cette solution n'est pas
très efficace pour les internautes. Nous vous proposons
Inconvénients : donc une deuxième solution.

• L'intégration d'un serveur CAS sur des outils PHP Un seul Front, deux Back-Office
n'est pas d'une grande simplicité. CAS est à l'origi- La deuxième solution, celle que nous avons retenue,
ne une application développée en Java. Pour Dru- réside dans l’utilisation d’un seul Front-Office, celui de
pal, il est donc nécessaire d'utiliser la librairie php- Drupal. Pour les développeurs, il en résulte que l’en-
CAS, qui se retrouve intégrée dans le module CAS semble du site devra être conçu en utilisant les fonc-
(ici : http://drupal.org/project/cas). Et ce module tions de theming de l’outil, ce qui constitue certaine-
n’est pas compatible dès lors que vous utilisez des ment un avantage, au regard de la relative complexité
fonctions d’extension de profil sous Drupal. Pour de theming de Magento.
Magento, il n’existe tout simplement pas d’exten- En revanche, les administrateurs devront utiliser
sion CAS. Donc à vous d’en développer une... deux Back-Offices de gestion : le back-office Magento

22 7/2010
Dossier

nombre d’extensions pour pouvoir réaliser cette struc-


turation, notamment avec l’utilisation du classique mo-
dule CCK et Views.

L’intérêt d’utiliser Drupal côté Front-Office.


Des performances au rendez-vous
L’ensemble des pages du site ainsi conçu est généré
depuis Drupal. Quand on connait la certaine lourdeur
des applications Magento, un tel système est fortement
recommandé pour optimiser les temps de réponse,
et ce d’autant plus que la communauté Drupal propo-
se de nombreux modules d’optimisation, avec des fonc-
tions de générateur de cache statique, de load balan-
cing, de clustering...

Un moteur de recherche puissant


Cet avantage est renforcé par l’utilisation du moteur
de recherche Drupal, permettant notamment d’utiliser
SolR, extension du moteur de recherche de Drupal, (re-
posant sur la technologie Lucène).
Un certain nombre de grands commerçants ayant
décidé de migrer vers Magento se sont en effet vite tro-
uvés contraints par l’utilisation du moteur de recherche
natif de Magento, ce dernier devenant inefficace dès
que l’on dépasse un nombre de produits ou références
supérieures à 50 000.
Ainsi, au lieu d’intégrer directement un moteur de re-
cherche externalisé, l’utilisation de Drupal permet de pal-
lier aux faiblesses actuelles de Magento.

est utilisé pour alimenter le catalogue, gérer les règles Une gestion avancée du profilage des internautes
de promotion, consulter les commandes clients, … Le Enfin, l’utilisation de Drupal permet de recueillir un nom-
Back-Office Drupal sert à gérer l’intégralité des conte- bre très important d’information sur les internautes du
nus du site ainsi que les fonctions communautaires. portail. Tous les professionnels du marketing le savent
Nous vous présentons dans la Figure 2 un schéma bien : plus vous en savez sur vos consommateurs, plus
de fonctionnement de cette logique. vous pourrez leur proposer des offres adaptées qu’il au-
ront autant de chance d’acheter.
Utilisation de deux API : une API Magento, Si Magento permet d’augmenter sensiblement le
une API Drupal nombre d’informations demandées aux clients, ces der-
Cette deuxième solution utilise deux API, installées re- niers seront d’autant plus enclin à les diffuser s’ils peu-
spectivement sur Magento et Drupal. Ces deux API per- vent ainsi enrichir leur profil, et que vous leur donnez
mettent de réaliser la synchronisation XML – RPC entre l’occasion de s’exprimer au travers d’outils communau-
les bases de données Magento et Drupal. taires.
L’API Magento permet de mettre à disposition de
l’ensemble du catalogue produit et des règles de prix, Les fonctionnalités pertinentes
qui sont ensuite répliquées dans Drupal. Côté Drupal, Drupal est un outil qui propose différentes logiques de
cette API permet de récupérer l’ensemble des informa- fonctionnement multisite, permettant ainsi de créer,
tions catalogue saisies dans Magento et redistribue en- avec une boutique, différents espaces communau-
suite les commandes clients passées depuis le Front- taires. Dans cette logique, il est ainsi très efficace de
Office Drupal vers le Back-Office Magento. créer plusieurs instances thématiques, composées de
Cette logique de fonctionnement impose une struc- plusieurs boutiques, d’un espace communautaire, d’un
turation équivalente du catalogue et des produits : l’en- site institutionnel et éventuellement d’un blog. Cette lo-
semble du catalogue, à la fois présent sur Magento gique multisite permet de multiplier les liens internes
et sur Drupal, doit présenter des attributs strictement (pratique favorable au référencement), positionner des
équivalents. Si, du côté de Magento, cette structuration produits sur toutes les pages de contenu, et offrir de l’in-
est native, il faut, du côté de Drupal, installer un certain formation de qualité à vos visiteurs qui ne reviendront

www.phpsolmag.org 23
Les sites à consulter
• www.drupal.org,
• www.magentocommerce.com ,
• http://drupal.org/project/magento,
• http://www.magentocommerce.com/extension/1020/dru-
pal.

pas seulement pour acheter, mais aussi pour s’informer


et participer aux communautés ainsi créées.
Nous vous listons ci-dessous les fonctionnalités qu’il
peut être intéressant de proposer :

• outils de gestion de blogs, ou multi-blog avec la ge-


stion des commentaires et des notations des inter-
nautes,
• outils de forum et d'échanges entre internautes, qui
peut servir également de service client et relayer le
support téléphonique,
• outils de newsletter, permettant d'exploiter la riches-
se de composition de Drupal : newsletters thémati-
ques, newsletters produits, newsletters ciblées par
profil et intérêt des internautes, …
• ...

Conclusion
Nous vous avons fait découvrir ici le fonctionnement de
Magento – Drupal en utilisant les API proposées par la
communauté. Ces dernières restent cependant enco-
re à améliorer et de nombreux patchs sont à appliqu-
er avant de pouvoir vraiment les utiliser en production.
Néanmoins, cette logique d’association montre encore
une fois la force des logiques Open Source contribu-
tives, et combien également aussi les internautes at-
tendent d’une boutique en ligne : il ne s’agit plus de
reproduire des logiques marketing traditionnelles ma-
is bien d’offrir de nouveaux moyens de participation
et d’échange.

PIERRE MOURIER
Lead technique au sein de la société Core-Techs, l’auteur intervient
régulièrement auprès de nombreux clients pour des missions de
développement de sites Internet, de plate-forme d’ecommerce ou
de solutions métiers interactives. Il utilise quotidiennement les solu-
tions Magento et Drupal et a collaboré de façon active à l’améliora-
tion des API Drupal / Magento.

24 7/2010
Pratique

Créer un SVA
avec la passerelle SMS/WAP : Kannel
Les services à valeur ajoutée sont devenus incontournables
dans le monde de la télécommunication. Dans cet article
vous apprendrez à créer un service à valeur ajoutée depuis
un script PHP et aussi à administrer votre serveur à travers
un script bash par l’envoi de sms.

Cet article explique : Ce qu’il faut savoir :


• Ce qu'est un service à valeur ajoutée. • Vous devez connaître les bases du langage PHP, du bash et des
• Comment installer, configurer la passerelle SMS Kannel. notions sur la télécommunication.
• Comment créer un service à valeur ajoutée simpliste.
• Comment créer un service d'administration à distance par sms.

L
’ère de la téléphonie mobile a entrainé ces Quoiqu’il en soit, la taille actuelle des messages ne
dernières années l’emploi de service à valeur doit pas depasser les 160 caractères mais peut être qu-
ajoutée. Ce dernier a permis aux usagers de po- adruplée par concaténation.
uvoir participer à des services que l’opérateur et/ou La mise en place de ce service nécessite une inter-
une entreprise mettent à leur profit en temps réel so- connexion entre les systèmes GSM et informatique, ce
it à la demande des clients sur un service donné soit qui impose le déploiement d’une passerelle SMS.
par des informations en provenance d’une entreprise Prise au sens large, une passerelle est un outil per-
via l’opérateur. mettant de passer d’un système à un autre. Au sens
Il faut comprendre que le jargon de la télécommu- strict du terme, une passerelle est un dispositif destiné
nication parle de SMS-MO (Message Originated) si le à connecter des systèmes de téléinformatiques ayant
message envoyé provient de l’usager de la téléphonie des architectures différentes, des protocoles différents,
mobile ou dans un autre sens une requête dite PULL. ou offrant des services différents.
Si le message provient de l’opérateur ou centre de mes- La passerelle doit alors dépouiller la trame des in-
sagerie, il s’agira de SMS-MT (Message Terminated) ou formations spécifiques aux protocoles émetteurs et les
dans un autre sens, un envoi de type PUSH. remplacer par leurs équivalents dans les protocoles
Le principe de base est que les messages doivent récepteurs. L’inconvénient majeur de ce système est
être confiés à un centre de messagerie (SMSC ou Short
Message Service Center) du réseau GSM. C’est lui Listing 1. kannel.conf
qui se chargera de les faire parvenir dès que possible
group = core
à leurs destinataires, où qu’ils se trouvent. Dès que po- admin-port = 13000
ssible, signifie en l’occurrence dès que le mobile sera to- admin-password = admin
status-password = zoroastre
ut à la fois sous tension, dans une zone couverte par un smsbox-port = 13001
réseau GSM, et autorisé à communiquer sur celui-ci. # Fichier dans lequel les logs sont ecrits
log-file = "/var/log/kannel/log/kannel.log"
Tant que ces conditions ne sont pas remplies, le log-level = 1
message est archivé par le centre de messagerie # Fichier dans lequel les informations sur les SMS reçus/
envoyés sont stockés, en vue des statistiques.
jusqu’à concurrence de la durée de validité qui a été access-log = "/var/log/kannel/access/bearerbox-access.
spécifiée par son émetteur (souvent 72 heures, mais log"
# Fichier dans lequel tous les messages reçus sont
éventuellement beaucoup plus ou beaucoup moins) ou stockés jusqu'à la fin du traitement de messages.
refuser l’accés à d’autres SMSC autres que le sien, tout store-file = "/var/log/kannel/store/kannel.store"
en mettant celui-ci à la disposition de ses seuls clients.

www.phpsolmag.org 25
Kannel

qu’une telle application doit être disponible pour cha-


Listing 2. kannel.conf (suite)
que service (FTP, HTTP, Telnet, SMS, etc.).
L’une des difficultés de la messagerie SMS est que # Section SMSC
group = smsc
les SMSCs sont gérés par des protocoles de communi- smsc = http
cation propriétaires. En d’autres termes, il n’existe pas system-type = "kannel"
#Défi nit où envoyer les messages MT, l'emplacement de
encore de normalisation proprement dite. la passerelle qui va relayer les messages.
Il existe une pléiade de passerelles SMS dont certa- send-url = "http://localhost:13013/cgi-bin/sendsms"
# Port d'écoute des messages MO venant de la
ines sont propriétaires (Alligata, Ozeki SMS, Wapme, passerelle
Jataayu SMS Gateway), tandis que d’autres sont dans port = 13020
# Adresse IP (nom hôte) autorisé.
le monde de l’Open Source et en perpétuel developpe- connect-allow-ip = "*.*.*.*"
ment (Kannel, Gammu, ...). # Nom d'utilisateur associé à la connexion
smsc-username = bargny
Revenons sur le principe plus etendu du service # Mot de passe pour l'utilisateur
à valeur ajoutée. Le client envoie un sms contenant un smsc-password = maodo

mot-clé (keyword) suivi de texte vers un numéro court Listing 3. kannel.conf (suite)
(short number) pour bénéficier d’un service proposé
#section smsbox, variable obligatoire
par un éditeur. Le numéro court identifie le destinataire group = smsbox
du message et peut être obtenu suivant la régularisa- #Identifi ant d'instance smsbox, parametre optionnel.
smsbox-id = boxsms
tion des agences de télécommunication en vigueur. #La machine sur laquelle le bearerbox se trouve
Dans cet article, nous parlerons de service à valeur bearerbox-host = localhost
# Indique si le smsbox se connecte au bearerbox
ajoutée avec l’utilisation de la passerelle Open Source directement ou s'il passe par un sqlbox.
Kannel à travers le SMS. bearerbox-is-sqlbox = true
# Numéro de port auquel les requêtes HTTP d'envoie
de messages, sendsms, sont faites.
Kannel une passerelle Open Source sendsms-port = 13013
# Seuls ces caractères sont autorisés dans le
Kannel, passerelle Open Source sous licence FreeBSD paramètre "to" dans la requête HTTP de soumission de
conçue pour pouvoir communiquer avec plusieurs cen- message.
# Le caractère espace a une signification
tre de messagerie utilisant différents protocoles est particulière, utilisé pour séparer les numéros de
à l’initiative de la compagnie finlandaise Wapit. Elle est téléphones dans un multi-send.
sendsms-chars = "0123456789 +-"
écrite en langage C, et fourni une passerelle mixte SMS #Conversion des messages reçus avec un charset UCS-
et WAP. En outre, elle permet également de gérer le 2 en UTF-8,
# simplifi ant ainsi le travail du serveur externe.
push, le pull ou pull-push SMS c’est-à-dire respective- mo-recode = true
ment, l’envoi des messages aux entités extérieures, la # Pour fi xer l'expéditeur des messages (mettre en
commentaire , si on utilise le paramètre "from" dans
réception d’un SMS ou la réception de requête, puis la requête d'envoie de SMS).
global-sender = bargny _ sender
l’envoi de la réponse après traitement à partir de la pla- log-fi le = "/var/log/kannel/log/smsbox.log"
teforme. Au niveau de l’application se fait le traitement log-level = 0
access-log = "/var/log/kannel/access/smsbox-access.
de la requête, puis l’envoi de la réponse via le SMSC log"
de rattachement à l’abonné demandeur. L’architecture sendsms-url = /cgi-bin/sendsms
technique et fonctionnelle de cette passerelle n’est pas
Listing 4. kannel.conf (suite)
l’objet de cet article pour plus d’informations consulter
le site http://www.kannel.org. group = sendsms-user
username = bugsbunny
password = bipbip
Pre-requis max-messages = 3
concatenation = true
Kannel est développé sous les systèmes Linux, et de-
vrait facilement être exporté sur d’autres systèmes Unix- Listing 5. kannel.conf (suite)
like. Cependant, les autres plateformes ne sont pas in- group = sms-service
tégrés. Kannel exige l’environnement logiciel suivant : keyword = poids
post-url = "http://localhost/sav _ poids.php?fr=%p&to=%
P&txt=%a&smscid=%i"
• Compilateur C et les bibliothèques pour ANSI C, catch-all=true
concatenation = true
avec des extensions Unix normales telles que les
sockets BSD et outils relatifs.
• La bibliothèque Gnome XML (gnome-xml et libxml),
version 2.2.5 ou plus récente. Voire http://xmlsoft. • GNU Make.
org/xml.html. • GNU Bison 1.28, si vous voulez modifier le compi-
lateur WMLScript.
Si l’installation se fait à partir des paquets de distribu- • Les outils de traitement DocBook.
tion, il sera exigé libxml2-dev en addition du run-time • GNU Autoconf, s’il est nécessaire de modifier le
libxml2. script de configuration.

26 7/2010
Pratique

• configuration avec l'option d'utiliser mysql et le


Listing 6. sav-poids.php
mettre dans le répertoire, d'installation /usr/local :
<?php
<?php ./configure --with-mysql --enable-start-
$host = "localhost"; stop-daemon –bindir=/usr/local/gateway,
$db = "services";
$db _ user = "root"; • installation proprement dit : make && make install.
$db _ pwd = "sav _ sms";

$from = $ _ GET['fr']; Configuration


$to = $ _ GET['to']; Une fois l’installation faite, il suffit de configurer la pas-
$text = $ _ GET['txt'];
$smsc = $ _ GET['smscid']; serelle selon les besoins liés à l’implémentation de se-
//Connection au serveur de la base de données
$link = mysql _ connect($host,$db _ user,$db _ pwd)
rvice à valeur ajoutée. Pour le cas de notre article, nous
or die('POIDS : Not connected : ' . mysql _ error()); utiliserons la configuration minimale :
mysql _ select _ db($db) or die("POIDS : Could not
select database");
$date _ recep = date("Ymd"); • configuration du bearerbox obligatoire,
$id _ short _ numbers="0";
if($to == "70070" && $smsc == "platon"){ • configuration du smsbox pour l’envoi de SMS.
$id _ short _ numbers="66";
$smsc = "1";
} Configuration du bearerbox
if($to == "70070" and $smsc == "zeus"){
$id _ short _ numbers="67";
$smsc = "2"; Il suffit de configurer le groupe , l’accès à l’interface
}
$from = $from*1; d’administration (nom et mot de passe), le port d’éco-
//Insérer MO ute pour l’administration de kannel, son protocole, les
$query = "INSERT INTO recep _
msg set message='$text',date _ recep='$date _ fichiers de log et leur niveau de sévérité, le répertoire de
recep',date=now(),date _ recep2=now(),num _ stockage des messages reçus etc... Le Listing 1 detaille
expediteur='$from',num _ dest='$to',statut _ traitement
='10',compteur='0',smsc='$smsc',id _ service='1746',id _ la configuration du bearerbox.
short _ numbers='$id _ short _ numbers'";
$result = mysql _ query($query) or die("IMC :
Il suffira de configurer aussi les centres de messa-
Query failed"); gerie (SMSC) que Kannel pourra intercepter. Il suffira
// Libération des résultats
// mysql _ free _ result($result); d’ajouter ces lignes dans le fichier du Listing 1. Le Lis-
// Fermeture de la connexion ting 2 permet de configurer les centres de messagerie.
mysql _ close($link);
if ( $to!="70070"){
//MT : message envoyé à Configuration du smsbox
l'usager du service
echo "POIDS : erreur, merci d'envoyer votre Le groupe smsbox doit être définit dans le fichier de confi-
message au numero court indique. "; guration pour utiliser la passerelle SMS. Sa configuration
exit;
} permet de gérer l’envoi et la réception de sms et est déta-
$tab=explode(" ",$text);
if ( count($tab)<3 ){
illée dans le Listing 3. Pour les besoins de test d’envoi de
//MT : message envoyé à SMS via l’interface web, nous configurons le nombre ma-
l'usager du service
echo "POIDS : message incorrect. Envoyer ximal de SMS autorisé à envoyer par l’utilisateur concer-
POIDS espace TAILLE espace CIRCONFERENCE poignet. "; né à travers le Listing 4.
exit;
} C’est de là qu’interviennent les services à valeurs
//Calcul de l'IMC formule de Quetelet ajoutés. Chaque service utilisé doit être configuré en
$taille=$tab[1];
$circonf=$tab[2]; mettant le mot clé dédié à ce service et l’application qui
$imc=($taille-100+4*$circonf)/2;
$maxi=$imc+5;
se chargera de traiter les requêtes. Notre service à va-
$mini=$imc-5; leur ajoutée consiste à informer l’usager de son état de
//MT : Reponse envoyée à l'usager via la
passerelle santé par la formule de Quetelet. Le Listing 6 fournit
echo "Votre poids ideal est $imc kg. Pour une une implémentation en php de notre service à valeur
meilleure sante, essayez de maintenir votre poids
entre $mini kg et $maxi kg. Merci!."; ajouté.
?>
La table de réception des messages en vue de fa-
ire des statistiques à l’avenir sur le service est donnée
dans le Listing 7.
Installation Le Listing 5 permet de définir le service à valeur ajouté.
L’installation peut se faire à travers la récupération du code Parmi les variables qui spécifient le type de traite-
source soit par l’utilisation des utilitaires d’installation rpm, ment on peut citer :
apt. Nous allons récupérer le code source à l’adresse su-
ivante pour la version courante 1.4.1 gateway.1.4.1.tar.gz. • post-url définit l’application http qui traitera la
Il suffit de faire : requête Celle-ci est utilisée dans cet article,
• file donne le fichier local à retourner,
• décompression de l'archive : tar xzfv gate- • text indique le texte à retourner comme réponse
way.1.4.1.tar.gz, à la requête,

www.phpsolmag.org 27
Kannel

• exec permet de spécifier la commande shell


Listing 7. recep_msg.sql
à exécuter lorsque le mot clé est envoyé. Variable
utilisée en fin d’article pour une administration. CREATE TABLE IF NOT EXISTS 'recep _ msg' (
'ref _ msg' int(10) unsigned NOT NULL auto _
increment,
Une fois la passerelle configurée, il suffit de démarrer 'message' varchar(255) default '0',
'date _ recep' varchar(12) NOT NULL default '',
par ordre en tache de fond : 'heure _ recep' varchar(12) NOT NULL default '',
'date' datetime NOT NULL default '0000-00-00
00:00:00',
• Démarrer d'abord la bearerbox, 'date _ recep2' datetime NOT NULL default '0000-00-00
• /usr/local/gateway/gw/bearbox -v1 /etc/kannel/ 00:00:00',
'num _ expediteur' varchar(12) NOT NULL default '',
kannel.conf &. 'num _ dest' varchar(15) NOT NULL default '',
'msg _ id' varchar(10) default '0',
• Enfin démarrer le smsbox qui attends les conne- 'statut _ traitement' int(2) default '0',
xions du send_sms et envoies les données au be- 'compteur' int(2) NOT NULL default '0',
'smsc' int(3) unsigned default '1',
arerbox pour former le paquet adéquat. 'id _ short _ numbers' int(11) NOT NULL default '0',
• /usr/local/gateway/gw/smsbox -v1 /etc/kannel/ 'categorie _ msg' varchar(20) NOT NULL default '',
'id _ categorie' int(11) NOT NULL default '0',
kannel.conf &. 'id _ categorie _ service' int(7) default NULL,
'id _ service' int(11) NOT NULL default '0',
'ref _ msg _ init' int(11) NOT NULL default '0',
Une fois que la passerelle est bien démarrée, il suffit de PRIMARY KEY ('ref _ msg'),
faire le test qui consiste à l’envoi de sms via le navigateur KEY 'id _ service' ('id _ service'),
KEY 'id _ categorie' ('id _ categorie'),
avec l’utilitaire lynx ou un autre curl, elinks, w3m etc... KEY 'id _ short _ numbers' ('id _ short _ numbers')
) ;
[root@bargny]curl "http://localhost:13013/cgi- Listing 8. kannel.conf (suite)
bin/sendsms?username=bargny&password=maodo&text
#Ajouter un groupe sms-service
=POIDS 65 190 2 &to=+221777872806&from=70070". group = sms-service
#Défi nir un mot clé
keyword = service
Si le message arrive à destination, cela veut dire que #Défi nir le type d' application associé
notre service à valeur ajoutée peut être testée avec le exec = service %s %s

mobile en envoyant POIDS [poids] [taille] [circon-


férence] au numéro court 70070.
Au niveau des messages de logs de Kannel il suffit de fa- [msg:82:Votre poids ideal est 14kg. Pour une meilleu-
ire la recherche sur le numéro 221777872806 par un grep. re santé, essayez de maintenir votre poids entre
9kg et 19 kg. Merci !] [udh:0:]
[root@zorosatre /$ cat /var/log/kannel/access/bearer-
box-access.log | grep 221777872806 Les logs nous font part du message envoyé et celui re-
çu par l’utilisateur.
2010-06-13 13:13:41 Receive SMS [SMSC:zeus] [SVC:]
[ACT:] [BINF:] [FID:] [from:+221777872806] [to:70070] Arrêter la passerelle
[flags:-1:0:-1:0:-1] [msg:POIDS 65 120 6] [udh:0:] La manière classique d’arrêter la passerelle Kannel est
faite en ordre inverse de son démarrage à savoir.
2010-06-13 13:13:42 Sent SMS [SMSC:zeus]
[SVC:bargny] [ACT:] [BINF:] [FID:] [from:70070] • Smsbox,
[to:221777872806] [flags:-1:0:-1:-1:-1] • bearerbox.

Figure 1. Le status global de la passerelle

28 7/2010
Pratique

Figure 2. Le detail des centres de messageries configurés au niveau de la passerelle

Administration d’une machine par SMS NB : Pour éviter de rendre vulnérable le système,
La passerelle Kannel nous offre aussi la chance d’ad- nous n’allons réserver l’accès à ce service qu’à un seul
ministrer à distance nos machines via le paramétrage utilisateur (l’administrateur) en mettant son numéro seul
de service à valeur ajoutée. Le mécanisme est sembla- dans white-list.
ble à celui du paragraphe précédant mais à la différen-
ce que les paramètres seront transmis au shell qui se white-liste = "http://localhost/reserved/list.txt"
chargera de l’exécution.
La procédure est la suivante : Evidemment dans le fichier list.txt il y a les numéro de
ceux qui peuvent utiliser le service.
• Ajouter un groupe sms-service : Pour finir nous ajoutons un petit service qui permet aux
• group = sms-service. usagers de PHPSolmag de recevoir sur leur mobile la pa-
• Définir un mot clé : rution d’un nouveau numéro en envoyant magazine au
• keyword = service. 7070 très simple. Service qui sera rendu disponible une
• Définir le type d’application associé : fois que le numéro est disponible. Le sms reçu est Bienve-
• exec = service %s %s. nue ! Le numéro courant est disponible en version pdf ….

Où : group =sms-service
keyword = magazine
• service est la commande service Linux qui per- exec = /bin/echo 'Bienvenue ! Le numéro courant est
met de gérer les services par les options suivantes disponible en version pdf ….'
start, stop, restart .
• le premier %s représente la première chaîne de Ce petit service peut être adapté suivant les besoins du
caractère après le mot clé. Il s’agit des services di- magazine PHP le plus populaire au monde !
sponibles tels ssh, mysql, vsftp, ldap.
• le second %s représente la seconde chaîne après le Conclusion
mot clé pour les options des services start, stop, restart. On ne peut se passer des services à valeur ajoutée. Ils
sont devenus incontournables aujourd’hui. Le seul inco-
Ainsi lorsqu’on envoie à partir d’un mobile : service nvénient de Kannel est qu’il est écrit en langage C sous
ldap restart le système exécutera la même comman- Linux non portable et que les fichiers de configuration
de. La configuration complète du service d’administra- ne sont pas au format universel qu’est le XML.
tion se trouve dans le Listing 8 .

Sur Internet MAODO DIOP


Maodo DIOP, Consultant en Développement Logiciel a un backgro-
• http://www.kannel.org/userguide.shtml – Manuel de la und de maintenance logicielle et sur l’audit des systèmes Linux com-
passerelle SMS.
promis. Il s’intéresse aux SVA et à l’infographie.
Pour le contacter : dmaodo@{gmail,yahoo}.com

www.phpsolmag.org 29
Fiche technique

Acquérir de la vitesse
avec Zend Framework – 2ème partie
Voici le second article de la série Acquérir de la vitesse avec
Zend Framework. Dans celui-ci, je souhaite vous présenter
la connexion d’une base de données et l’accès aux données
de celle-ci, la connexion avec Doctrine, puis l’usage
des helpers Zend !

Cet article explique : Ce qu’il faut savoir :


• Comment choisir et utiliser les librairies PHP du framework Zend. • Rien, à part connaître PHP et je suppose que vous avez lu les
• Les règles de programmation à respecter pour chacune des li- autres articles sur Zend parus dans PHP Solutions.
brairies présentées.
• Les pièges à éviter pour avoir un développement propre et sécurisé.

P
our pouvoir accéder à une base de données la vos environnement de développement, de test et de
première étape consiste à configurer les con- production ont des bases différentes..
necteurs du framework. Cela peut se faire de J’en vois déjà quelques-uns qui se disent mais po-
plusieurs manières. Mais c’est avec la classe Zend_Db_ urquoi ne pas utiliser le fichier Application.ini ? Cela est
Adapter que l’on va créer un pont entre les classes de possible et il faut utiliser la Factory de la classe Zend_
manipulation des données et votre base de données Db. Le Listing 2 donne le code à utiliser dans applica-
physique. Pour cela, cette classe s’appuie sur l’interface tion.ini.
objet PDO (PHP Data Objects). Pour configurer ce con- Le gros avantage de cette pratique est que vous
necteur vous devrez définir le type de base, les don- pourrez facilement modifier les valeur de connexion en-
nées de connexion : adresse du Host (Localhost pour vironnent par environnement. Rappelez vous que dans
un WAMP ou l’adresse IP de votre serveur qui porte vo- le précédent article, je vous avais décrit la structure du
tre base de données), le login et mot de passe de con- fichier application.ini avec une zone [production], une
nexion à votre base et le nom de la base de données zone [developpement], … toute zone dont vous avez
à utiliser. besoin. Dans le cas présent, cela nous permet d’avoir
L’exemple du Listing 1 donne comment configurer une base données locale sous localhost pour le dev, une
une base de données locale en Mysql. Cette exemple avec une adresse IP différente pour la production et ce-
pose un problème, car il consiste à écrire, en dur, dans la sans modifier le moindre fichier de code source. Il su-
le code, vos données d’usage vers votre base de don- ffit de modifier la valeur de la variable d’environnement
nées. Ceci est une très mauvaise habitude surtout si d’exécution.

Bonne habitude n°1 : Toute les valeurs constantes doivent être mises dans des constantes centralisées dans un fichier dédié. Ce-
ci est une bonne pratique de développement, qui n’a aucun lien avec PHP ou le Framework Zend. Si on la pousse au maximum,
cela revient à mettre tous les textes utilisés dans notre site dans un fichier dédié. Cela nous facilitera l’internationalisation ulté-
rieure.
Bonne habitude n°2 : utiliser les fonctions de gestion des fichiers de configuration de Zend. La Zend_config permet d’utiliser des
fichier .ini ou .xml pour gérer les constantes du projet. Le fichier Application.ini (vu dans notre précédent article) utilise ces méca-
nismes mais de façon masqué pour le développeur. J’aime cette classe Zend _ config et je vous invite à l’utiliser. En utilisant des
fichiers .ini ou .xml, selon vos habitudes. J’utilise les deux. Les fichiers en .xml pour les constantes propres à l’application, car le
langage xml offre plus de possibilité de structuration que le .ini. Le .ini pour la configuration du framework car, a l’inverse, utili-
ser le xml pour cela c’est un peu lourd.

30 7/2010
Zend Framework

Le code du boostrap est améliorable. Le try catch


Listing 1. Connecter une base de données Mysql avec Zend
est améliorable et on verra cela plus tard, mais surtout
Framework
on peut s’interroger sur l’usage de Zend_registry.
L’objet Zend_registry est un singleton (c’est à dire $db = new Zend _ Db _ Adapter _ Pdo _ Mysql(
HYPERLINK "http://www.php.net/array"array(
qu’il n’existe qu’un seul objet – une seule instance – de 'host'=> '127.0.0.1', // ou 'localhost'
'username' => 'userlogin',
ce type) qui permet d’enregistrer des données parta- 'password' => 'BDDPassword',
gées ensuite par tous les fichiers php traversés pendant 'dbname'=> 'test'
));
l’appel en cours (associé à une URL ou une session
http). Ce n’est pas une mise en cache et ne fait que li- Listing 2. Connexion propre d'une base de données
miter à un, le nombre de connexion ouverte lors de l’ap-
// inclure dans application.ini dans
pel d’une URL. C’est très utile, même pour ne pas avoir l'environnement d'usage
à recréer des objets métiers. Ainsi, un petit test sur la # Database
resources.db.adapter = "pdo _ mysql"
présence d’un objet dans le registry (Zend_Registry::isR resources.db.params.host = "localhost"
egistered(‘nomdedonnée’) ) avant sa création (son ins- resources.db.params.username = "userlogin"
resources.db.params.password = "BDDPassword"
tanciation) évite une surconsommation de la mémoire. resources.db.params.dbname = "test"
Mais dans notre cas, cela ne servira à rien puisque resources.db.isDefaultTableAdapter = true

dans notre fichier de configuration nous avons défini //Dans le bootstrap il faut ajouter la fonction
que db serait notre adapter par défaut avec resources. d'init suivante
function _ initDb() {
db.isDefaultTableAdapter = true. La question su- $ressource = $bootstrap->getPluginResource ('db');
ivante à aborder est : comment accéder aux données try {
$db = $ressource->getDbAdapter();
de la table. L’approche du framework est assez simple, $db->getConnectipon();
} catch (Exception $e) {
peut être même simpliste, car on va créer un objet par exit ($e->getMessage());
table. Là, deux possibilités s’offrent à nous : utiliser les }
Zend _ registry::set ('db',$db);
outils de Zend_tools ou écrire les classes à la main. }
Avec l’outil zf, dont nous avons parlé le mois der-
nier, il est possible de créer automatiquement les clas- Listing 3. Lignes de commande pour créer les tables de votre
ses Zend_Db_Table associées aux tables de notre ba- application
se de données. Pour cela nous utilisons les fonctions // ligne de commande pour connecter zf et la base
de données
de l’univers dbtable avec zf create dbtable. Mais il faut zf configure dbadapter "adapter=Pdo _ Mysql&username
avant tout donner à zf les moyens de se connecter à la =userllogin&password=BDDPassword&dbname=test"
base de données en lui donnant les mêmes informa- //ligne de commande pour créer la classe Users
tions que celles déjà placées dans le fichier application. associée à la table user
zf create dbtable User user
ini … Attention, il n’y a pas de lien entre votre applica-
tion et l’outil zf. Le Listing 3 donne l’ensemble des lignes //lignes de commande pour créer les classes
associées à un modèle de base complet
de commande dont nous allons parler. zf create dbtable.from-database
La première, configure la connexion de l’outil zf à la
// ou
base de données, alors que la seconde, permet de zf -p create dbtable.from-database
créer la classe Users qui sera associée à la table user
// creation des objets d'accès à une table
de votre base de données. Les fichiers ainsi créés se-
ront rangés automatiquement dans le répertoire appli- $users = new Users ($db);
// ou si $db est défi ni comme adapter par défaut
cation/models/ de votre projet.
Un tel travail peut être fastidieux si vous avez de $users = new Users();

nombreuses tables dans votre schéma de base, l’outil // recherche par clé primaire
zf permet de créer entièrement une table en utilisant
$result = $users->fi nd(ID);
dbtable.from-database. Je vous conseille d’utiliser
l’option -p qui vous donnera plus de visibilité pendant la
phase de création des classes.
Une fois les classes du modèle créées, leur usage Conseil pour programmer efficacememnt ou plus propre-
est très simple, du moins tant que l’on reste dans des ment (dans le sens j’ai pas des tonnes de fichiers à changer) :
usages basiques. J’avoue ne pas avoir eu à l’utiliser Il est préférable d’éviter d’utiliser les objets d’accès aux tab-
récemment et que j’ai plus utilisé la méthode manuel- les directement dans les contrôleurs et de passer par des
le pour créer mes classes de connexion. Mais je reste objets de mapping qui vont venir abstraire la structure de
la table. Pourquoi vous demandez-vous ? Tout simplement
convaincu que zf est la méthode la plus rapide. pour éviter qu’à chaque modification de la structure de la
Le connecteur est directement utilisable dans vos base, vous soyez obligé de modifier le code de toutes vos
contrôleurs à l’aide d’un simple new. Comme le mon- actions.
trent les dernières lignes du Listing 3, la création d’un

www.phpsolmag.org 31
Fiche technique

objet d’accès à la table est très simple (surtout si on


Listing 4. Bootstrap de Doctrine
définit un adapter par défaut comme c’est notre cas).
/* Nous disposons maintenant de toutes les fonctions
* Configuration de Doctrine dans l'application.ini
*/ nécessaires pour faire des recherches (find(), fte-
doctrine.dsn = " HYPERLINK "mysql://root"mysql:// chAll(), fetchRow() ou select()) ou des enregistrements
userlogint:BDDPassword@localhost/user"
doctrine.data _ fi xtures _ path = APPLICATION _ PATH "/ (save($user), insert(), update(), delelet()).
doctrine/data/fi xtures" Dans la plupart des cas d’usage, l’objet Zend_Db_
doctrine.sql _ path = APPLICATION _ PATH "/doctrine/
data/sql" table suffira, mais si vous avez des bases très com-
doctrine.migrations _ path = APPLICATION _ PATH "/ plexes ou vous devez vous interfacer avec des bases
doctrine/migrations"
doctrine.yaml _ schema _ path = APPLICATION _ PATH "/ de données relationnelles comme Oracle, il se peut que
doctrine/schema/schema.yml" les fonctions proposées soient trop limitées et que vous
doctrine.models _ path = APPLICATION _ PATH "models"
ayez à utiliser une interface plus évoluée comme Pro-
function _ initDoctrine(){ pel ou Doctrine. Doctrine étant le plugin qui offre le plus
//Launch Doctrine
de fonctions sur ce registre, nous allons voir comment
$dbManager = Doctrine _ Manager::getInstance (); // l’installer et l’utiliser avec ZF.
permet de défi nir des attributs de Doctrine

// on récupère les options Utiliser Doctrine


$doctrineConfig = $this->getOption('doctrine'); La première chose à faire est d’ajouter Doctrine dans
notre environnement de travail. Le meilleur endroit pour
// On lance la connexion
le faire, vous l’aurez sans doute deviné … Allez, pour
$db = Doctrine _ Manager::connection
($doctrineConfig['dsn']);
les plus curieux ou les plus assidus, essayez de trouver
par vous même avant de lire la suite … relisez l’article
return $db;
de la semaine dernière si vous voulez … Non … vous
} ne trouvez pas ou vous pensez avoir trouvé et voulez
// On récupère les utilisateurs de la table user
avoir la solution ? … c’est très simple ! Il faut mettre
le code php de Doctrine (ce serait pareil pour Propel )
$users = Doctrine _ Query::create()
->select ('*')
dans le répertoire /library/Doctrine de votre projet ! C’est
->from ('user'); so simple comme dirait le chef Chaudard.
// ou pour faire comme dans Zend _ Db _ Table
La première opération va consister à ajouter le
répertoire de Doctrine dans notre include path et notre
$userTable = Doctrine _ Core::getTable('user);
$user = $userTable->fi nd($userId); Autoloder.
$users = $userTable->fetchAll(); Pour ce faire on ajoute dans le boostrap et dans la
fonction d’init de l’autoloader :$autoloader->regis
Listing 5. Exemple d'usage de Redirector
terNamespace('Doctrine_'). Ce qui nous permet-
// initialisation du Helper dans le contexte d'une tra d’accéder aux classes de Doctrine qui débutent
classe controller
par Doctrine_ et sont rangées dans le répertoire /libra-
$this->redirector = $this-> _ helper->getHelper('Red
irector');
ry/Doctrine. Il nous faut maintenant, lancer Doctrine lui
même.
// utilisation de ce redirector dans une action
L’enregistrement dans Zend Registtry de la configu-
$this->redirector->gotoSimple($url) ration de la structure de Doctrine sous entend que vous
// exemple d'initialisation plus complexe
ayez créé la structure de fichier dans application com-
me montré dans la Figure 1. Par la suite, l’usage de
class MonController extends Zend _ Controller _ Action
{
Doctrine dans votre application est assez simple. A la
/** différence de Zend_Db, où il faut construire un objet par
* redirector contient le helper de redirection
d'URL, de module, de controller ou d'action
table, nous allons devoir considérer Doctrine comme un
* @var Zend _ Controller _ Action _ Helper _ Redirector singleton et accéder à ses fonctionnalités via ses mé-
*/
protected $ _ redirector = null; thodes en mode statique avec l’opérateur ‘::’. Ainsi, po-
ur faire une requête sur notre table user, il faut utiliser
function _ init () {
$this-> _ redirector = $this-> _ helper->getHelper( la méthode Doctrine_Query::create(). Mon objectif
'Redirector'); n’étant pas de vous faire un cours pour utiliser Doctrine
}
mais comment vous pouvez l’interfacer avec Zend Fra-
function MonAction () { mework, je me contenterai de vous donner deux exem-
$this-> _ redirector->gotoSimple('mon _
action','mon _ controler','mon _ module', ples d’usage dans le Listing 4.
array('param'=>'data')); On peut aller beaucoup plus loin (notamment avec
}
} l’usage de Doctrine en ligne de commande pour géné-
rer des modèles – c’est encore plus puissant que zf)

32 7/2010
Zend Framework

et je vous y invite car Zend a décidé fin 2009, d’intégrer


Doctrine à son Framework plutôt que de développer les
fonctionnalités absentes du Framework. Donc cela de-
viendra un passage obligé à plus ou moins court ter-
me !
Cela tombe bien car Doctrine est l’ORM (Object Re-
lated Manager) le plus complet en PHP du moment.

Les Helpers
J’ai déjà évoqué certains helpers dans mon précédent
article, quand je vous présentais l’usage du JSON. Je
voudrais aller un peu plus loin maintenant et vous pré-
senter les Helpers ZF dans le détail. Ils sont très utiles
et sont répartis en deux groupes :

• action Helpers,
• view helpers.

On va les étudier un à un dans les deux prochains pa-


ragraphes. Je ferai un focus plus important sur ceux
qui me semble indispensables pour débuter. Ce qui fe-
ra que la partie helper de vue sera plus fournie que la
partie action.
Ce qui est notable dans les Helpers c'est qu'il sont
utilisables selon le contexte mais initialisables (ou char-
geables) à tout moment. Dans le bootstrap, dans les init
des controllers ou au moment même de leur utilisation.
C'est pour cette raison que l'on dit qu'ils peuvent être
appelés à la demande.
Figure 1. Ajout de doctrine dans votre arborescence projet
Les actions Helpers
La description complète de ces helpers est disponible
dans la documentation de la librairie Zend_controller.
Un rapide survol de ces Helpers nous donne :

• Zend_Controller_Action_HelperBroker qui gère


(charge et ajoute) les Helpers personnalisés ou
non.
• ActionStack qui comme sont nom l’indique permet
d’empiler des actions à réaliser. Ainsi si une action
consiste dans la réalisation de plusieurs que vous
avez déjà codées et testées pas besoin de faire du
copier coller vous définissez la liste d’action à réali-
ser avant votre rendu
• AjaxContext (que nous avons vu dans le précédent Figure 2. Exemple de structure de vue
article) et qui comme ContextSwitch permet de dé-
finir des formats de réponse particulier à Ajax ou un • FlashMessenger, n’a rien à voir avec le Flash ma-
context défini dans l’url. is permet d’échanger via la session des messa-
• AutoComplete qui facilite l’autocompletion en mode ges entre requêtes (URL) ou redirections succes-
Ajax avec des frameworks Javascript comme Do- sives.
jo ou scripta.coulo.us. Si comme moi vous préférez • JSON celui-ci aussi vous le connaissez déjà.
Jquery alors il vous faudra utiliser les aides du pro- • Redirector qui vous permet de rediriger vers un au-
jet ZendX_JQuery. tre couple Controller/action de façon logiciel (sans
• ContextSwitch qui vous permet donc de définir des changer l’URL initiale).
contexts de vue prédéfinis ou de forcer celui de vo- • ViewRender permet de définir des modes de ren-
tre réponse. du. Ainsi si vous n’avez pas différents modules

www.phpsolmag.org 33
Fiche technique

Mon expérience fait que les Helpers de context et Redi-


Listing 6. Exemple de Partials tirés de la doc Zend
rector sont ceux que l’on utilise le plus vite. Nous avons
<!--partialLoop.phtml--> vu l’usage des premiers dans le précédent article, alors
<dt><?php HYPERLINK "http://www.php.net/echo"echo
$this->key ?></dt> voyons maintenant Redirector.
<dd><?php HYPERLINK "http://www.php.net/echo"echo Le Listing 5 donne un exemple simple d’usage du
$this->value ?></dd>
Helper Redirector.
$model = HYPERLINK "http://www.php.net/array"array( Pour éviter d’avoir à l’initialiser (le charger) dans cha-
HYPERLINK "http://www.php.net/array"array('key' =>
'Mammifère', 'value' => 'Chameau'), que action, il est préférable d’utiliser la fonction _init()
HYPERLINK "http://www.php.net/array"array('key' => de votre classe controler comme dans la troisième par-
'Oiseau', 'value' => 'Pingouin'),
HYPERLINK "http://www.php.net/array"array('key' => tie de l’exemple du Listing 5. Pour cela, il est plus sa-
'Reptile', 'value' => 'Asp'),
HYPERLINK "http://www.php.net/array"array('key' =>
ge de créer une variable de type protected voire même
'Poisson', 'value' => 'Flounder') private pour limiter les risques d’usage externe et donc
);
les attaques de sécurité ! Une variable publique pour-
<dl> rait être utilisée par un Hacker pour vous rediriger chez
<?php HYPERLINK "http://www.php.net/echo"echo $this->
partialLoop('partialLoop.phtml', $model) ?>
lui sans que vous le sachiez !! Enfin, un bon Hacker …
</dl> voire même un très bon.
<dl>
Notez qu’il n’y a pas de return à la fin de l’action
<dt>Mammifère</dt> car par défaut, l’usage de GotoSimple entraine un exit
<dd>Chameau</dd>
de la fonction courante. Cela peut être paramétré, si
<dt>Oiseau</dt> vous le souhaitez. Pour cela il faut utiliser la méthode
<dd>Pingouin</dd>
setExit(). Vous pouvez aussi changer le code de re-
<dt>Reptile</dt> tour HTTP avec setCode() ...
<dd>Asp</dd>

<dt>Poisson</dt> Les view Helpers


<dd>Flounder</dd>
Le nombre de helpers de vue est très grand, car ils
</dl> couvrent de nombreux sujets. Ceux que je souhaite
Listing 7. Les PlaceHolders
mettre en avant concernent la structure de notre vue.
Pour cela, prenons la Figure 2 qui décrit une structure
// Dans l'action
de vue possible.
<?php $this->placeholder('MaDonnée')->set('LaValeurDeM On y voit qu’une vue est construite à partir d’un
aDonnée'); ?>
Layout et du template de vue dans lequel (associé
// Dans la vue au couple control/action) on peut utiliser des helpers
<?php echo $this->placeholder('MaDonnée'); ?>
pour y ajouter des morceaux de code définis dans
d’autre fichiers templates spécifiques. C’est une stru-
//Meta de notre Vue avec un exemple pour gérer le
chargement de vos css
cture assez standard, que vous connaissiez Sympho-
//issu de la doc Zend. ny ou Smarty ces principes existent plus ou moins.
<?php // régler les liens dans votre script de vue :
$this->headLink()->appendStylesheet('/styles/basic. Mais qu’est-ce qu’un Partial et qu’est-ce qu’un Place-
css') Holder ?
->headLink( HYPERLINK
"http://www.php.net/array"array('rel' => 'favicon', Le Partial est une portion de code constante qui
'href' => peut être réutilisée de vue en vue alors que le pla-
'/img/favicon.ico'),
'PREPEND') ceHolder est une portion de code dont les données
->prependStylesheet('/styles/ peuvent persister depuis les scripts d’action jusqu’aux
moz.css','screen',true,
array('id' instances de vue permettant de les manipuler alors …
=> 'my _ stylesheet')); Intéressant non. Il existe un troisième type de Helper
?>
de vue très pratique c’est celui (ou ceux) associé à la
<!-- effectuer le rendu --!> classe de navigation Zend_Navigation_Container
<?php HYPERLINK "http://www.php.net/echo"echo $this-
>headLink() ?> qui permettent notamment de faire des menus ou des
fils d’Ariane.

associés à différents terminaux de rendu (Web, Les Partials


mobile, Ipad, …) vous pouvez quand même défi - Voyons plus en détail les partials. Je vous disais, ci-
nir des règles de rendu différents associés à des dessus, qu’ils permettent de réutiliser du code HTML
extensions particulières. et ou Javascript qui se répète. Par exemple, vous de-
• Vos propres Helpers d'action que vous pourrez créer, vez afficher le même genre d’information de page en
en respectant quelques règles, et manager avec le page, qu’elle soit statique ou un peu dynamique, alors
Broker Zend_controller_Action_HelperBroker. le partial vous permet de faire cela facilement.

34 7/2010
Zend Framework

Sur Internet
• Télécharger Doctrine – http://www.doctrine-project.org/
projects/orm/download.
• Télécharger la documentation du Framework Zend :
http://zendframework.com/download/latest.
• Forum Français autour de Zend Framework : http://www.
z-f.fr/.

Les PlacesHolders
Les comprendre n’est pas aussi trivial qu’il y paraît,
car le contexte influe sur leur rôle. L’usage n°1 permet,
dans vos scripts d’action, de placer des valeurs qui se-
ront utilisées plus tard par la vue ou d’autres scripts
d’action, comme le montre la première partie du Lis-
ting 6. On peut tout aussi bien passer un tableau de
données avec exchangeArray($array). Tableau que
l’on pourra toujours utiliser dans la vue mais aussi
dans une autre action. Permettant ainsi d’avoir un ré-
ceptacle où ranger toutes les données (des textes par
exemples) utilisables par une vue. On peut même, pour
les blocs de textes ou de données, utiliser captureS-
tart et captureEnd pour placer le contenu HTML placé
entre ces deux méthodes dans une variable de type
placeHolders que nous pourrons utiliser dans d’autres
morceaux de vue.
Cette technologie sert de base à des placeHolders
dédiés qui vont gérés les meta de la page ou les scripts
comme le montre la seconde partie du Listing 6 qui don-
ne un exemple avec le meta link placé dans le header
de la page.

Conclusion
Voici le second volet de la série. Dans le prochain nu-
méro, je me pencherai notamment sur la gestion du
cache, les tests unitaires et le débugage d’application
sous Zend. A moins que vous ne préféreriez un appro-
fondissement de l’accès aux données d’une base.

Figure 3. Structure d'une vue

Il existe deux types de partial appelez par deux hel-


pers différents :

• $this->partial (partial.html, array('param'=>'data')) STÉPHANE GUÉDON


• $this->partialLoop (partial.html,$dataList) où data- L’auteur travaille au sein d’une société de développement
List est un tableau contenant plusieurs couples clé/ d’applications informatiques depuis quinze années. Aujourd’hui,
valeur sur lesquels appliquer le contenu de partial. consultant pour une grande société de service d’un groupe interna-
html. tional, il anime le projet PHP de la Direction Technique Nationale de
cette société et participe aux projets WEB 2.0 de cette même direc-
Les données sont à passées par des tableaux ou des tion. Adepte du PHP depuis ... l’ère des dinosaures, il œuvre à la com-
objets mais à condition que celui-ci dispose d’une munication et à la promotion du PHP au sein de cette entreprise.
fonction de type ToArray(). Sans cette fonction, tou- En complément de ces activités, l’auteur est également Coach Agile
tes les variables membres récupérées par la fonction et assiste les entreprises dans le déploiement des méthodes de déve-
PHP object_get_vars() seront passées au partial. loppement Agile.

www.phpsolmag.org 35
Fiche technique

CakePHP
le framework pour développer rapidement
vos applications
Démarré en 2005 lorsque Ruby On Rails devenait populaire,
le projet CakePHP compte désormais de nombreux
utilisateurs et une communauté toujours plus active.
Désormais en version 1.3, le framework se veut avant
tout simple et efficace, en se basant sur le paradigme
des conventions plutôt que de la configuration.

Cet article explique : Ce qu’il faut savoir :


• Les principales conventions utilisées par CakePHP. • Connaissance du langage PHP 4+.
• La génération automatique des actions de base (CRUD) d'une • Notions de l'architecture MVC.
application.
• Les opérations usuelles sur les modèles et leurs relations.
• Les principaux composants livrés avec le framework … pour
se simplifier la vie dans les actions courantes (modélisation,
formulaires, authentification, gestion des droits, i18n).

C
akePHP a été conçu afin de faciliter au maximum et à mesure de ses expériences. Il est ainsi vu comme
la vie du développeur qui l’utilise. Cependant il difficile (ou d’un intérêt limité) de changer sa manière de
faut au préalable comprendre la philosophie du coder afin de se plier à une technologie (en l’occurrence
framework et la suivre au départ de manière presque CakePHP), mais nous espérons que ce paragraphe et
aveugle. Ce n’est qu’une fois les principes clés assimilés toutes les belles choses décrites ci-après vous feront
et les applications de base réalisées avec succès que tenter l’expérience : vous avez beaucoup à y gagner !
l’on pourra se rendre compte de la réelle valeur ajoutée Les conventions sont tout d’abord le meilleur moyen
de CakePHP et de tous ses composants. Voici donc les de pérenniser un code. En effet, à l’heure actuelle le co-
points qui vous permettront de débuter sans encombre. de d’une application est amené à être maintenu, réutili-
sé ou partagé avec d’autres développeurs. D’autre part,
Des conventions plutôt que la lecture d’un code développé par une autre personne
de la configuration peut s’avérer initialement difficile car la manière de dé-
Un des principaux atouts de CakePHP contribuant à la velopper (le style, l’organisation des fichiers …) est ra-
mise en place rapide et à la magie du framework est son rement documentée. C’est là tout l’intérêt des conven-
fonctionnement par conventions. En effet, le framework tions ! Elles permettent d’avoir une base commune
ne nécessite que très peu de configuration comme nous et d’éviter de sur-documenter une application afin de se
le verrons plus tard et se base sur une découverte intel- focaliser sur la valeur ajoutée et les parties importantes
ligente de l’application d’après certaines conventions. du code. À l’échelle d’une entreprise, ces conventions
Les conventions permettent également de sous-traiter de codage et de nommage sont bien souvent en place
certaines tâches classiques et rébarbatives (intégrité en interne … avec CakePHP cependant, vos conven-
des relations, récupération et associations des modè- tions seront désormais compréhensibles par tous !
les, mise à jour de champs …) à CakePHP qui est livré Enfin, le respect des conventions permet une réduc-
avec un bon nombre de fonctionnalités utiles. tion non négligeable du code produit ce qui augmente
la lisibilité de celui-ci. Finis les fichiers de configuration
Avantages des conventions à rallonge, les bibliothèques de fonctions pratiques qui
En tant que développeur, chacun a pu se créer ses passent d’un projet à un autre, les bugs issus de mé-
propres règles de codage et façons de travailler au fur thodes de ces bibliothèques … CakePHP est livré avec

36 7/2010
CakePHP

de nombreuses fonctionnalités pratiques, grandement pects liés à votre modèle (validation, associations, ac-
testées et bien documentées ! tions métier …) et une classe contrôleur chargée de
gérer les évènements et d’appeler les méthodes adé-
Principales conventions quates du modèle pour transmettre les informations
Nous détaillerons ci-après la plupart des conventions utiles à la vue. Renseignez-vous sur le modèle MVC
à suivre dans un projet CakePHP, dans un but de com- pour mieux comprendre ces concepts !
préhension et d’apprentissage. Cette liste n’est cepen- Pour CakePHP les classes de modèle doivent por-
dant pas exhaustive, nous vous invitons à lire la docu- ter le nom de la table associée au modèle, au singulier
mentation ou les articles sur le web afin de connaître et CamelCased (c’est-à-dire que l’on supprime les un-
tous les détails. derscores du nom de fichier et on met la première lettre
de chaque mot en majuscule … comme les bosses d’un
Base de données et champs automagiques chameau !). De plus, les modèles doivent hériter de la
La modélisation de la base de données est l’élément classe AppModel. De même, les contrôleurs doivent
primordial d’un projet. Si les conventions sont respec- se nommer comme les modèles mais au pluriel (éga-
tées, il sera ensuite possible de générer la plus grande lement CamelCased), suivis du mot Controller et doi-
partie du code (CRUD) associé en quelques minutes ! vent hériter de la classe AppController. Par exemple :
Nous détaillerons ceci plus loin. la table my_messages aura pour modèle la classe My-
Concernant les conventions, elles sont les suivantes : Message extends AppModel et le contrôleur sera My-
MessagesController extends AppController.
• le nom de la table doit être en minuscules et au plu-
riel (exemple : my _ messages), Organisation des fichiers
• un champ id devra être présent et pourra être de Étant dans un framework MVC, les fichiers sont répar-
deux types : entier auto-incrémentable ou une chaî- tis dans trois principaux dossiers à la racine de l’ap-
ne de 36 caractères (CHAR(36)) auquel cas l’identi- plication : /models, views et controllers ! Un dossier
fiant généré sera un UUID, /webroot contiendra toutes les ressources utilisées
• une clé étrangère devra porter le nom du modè- (javascript, css …) et tiendra lieu de racine de docu-
le référencé au singulier suivi de _ id (exemple : ments. Cette structure est également valable pour un
user _ id). plugin, pour lequel les dossiers seront regroupés dans
le répertoire /plugins/nomduplugin de l’application.
D’autre part on trouve des champs automagiques. On Les noms de fichiers doivent être en minuscule et les
les nomme de cette manière car ces champs seront mots séparés par des underscores («_»). Le nom du
renseignés automatiquement par Cake lors de la sau- fichier correspond en général à la classe qu’il contient
vegarde d’informations (ils ne sont en aucun cas obli- (modèle ou contrôleur), ou à la vue à laquelle il est
gatoires !). associé.

• le champ created de type DATETIME contiendra la Chargement automatique de fichiers


date de création de l’élément, Ainsi, rien qu’en suivant les conventions précédentes
• le champ modified ou updated contiendra la date et sans ligne de code supplémentaire votre application
de dernière modification de celui-ci, est prête à être exécutée ! (Note : en réalité il faudra
• le champ title ou name sera utilisé comme inti- simplement relier votre application au cœur de Cake-
tulé de l’élément lors de son affichage sur le site. PHP et configurer la connexion à la base de données
Dans le cas où aucun de ces champs n’existe, c’est dans un fichier database.php). Voyons ce qui se pas-
l’identifiant qui sera utilisé, sera à l’appel d’une page :

Un dernier exemple un peu plus poussé : si un utilisa- • appel de l'URL http://www.helloworld.com/my _


teur est associé à plusieurs messages (c’est-à- dire que messages/hello,
la table messages contient un champ user_id), il suffit • exécution de la méthode hello() de la classe My-
d’ajouter un champ de type entier (INT) nommé messa- MessagesController située dans le fichier /
ge_count dans la table users afin que celui-ci soit auto- controllers/my _ messages _ controller.php,
matiquement incrémenté et décrémenté … et contienne • le contrôleur fera sans doute appel à une méthode
à tout instant le nombre de messages associés à l’utili- du modèle MyMessage située dans le fichier /mo-
sateur. dels/my _ message.php qu’il connaîtra automati-
quement,
Modèles et contrôleurs : Nommage des classes • le modèle interagira avec la table my _ messages
Afin d’utiliser votre base de données, vous aurez be- de la base de données et renverra des données au
soin d’une classe de modèle qui gérera tous les as- contrôleur,

www.phpsolmag.org 37
Fiche technique

• enfin le contrôleur transmettra ces informations à la


De base, l’anglais est préférable vue pour un affichage de la page, ce qui affichera le
contenu du fichier /views/my _ messages/hello.ctp.
CakePHP est livré avec des mécanismes de reconnaissance
singulier / pluriel optimisés pour la langue anglaise (exem-
ple : people / person). Ainsi, afin de ne pas avoir de mauvaise Nous voyons par ce simple exemple qu’il est ainsi pos-
surprise il est recommandé d’utiliser des mots anglais. (C’est sible de séparer clairement chaque partie de l’applica-
également une bonne chose pour le partage de votre code !) tion. Ceci rend plus simple le travail collaboratif, la ré-
Bien que la plupart des mots français soient gérés (exemple : daction de tests unitaires et la recherche d’une ligne de
personnes / personne), des cas propres à notre langue ne po-
urront être reconnus (exemple : choux / chou ou bases_de_
code : suivant ce que l’on cherche on sait exactement
donnees / base_de_donnees) dans la version actuelle du fra- dans quel fichier chercher. Note avancée : à chaque
mework. Par un système de configuration d’inflexions il est étape de ce processus il est possible d’intercaler des
néanmoins possible de tenir compte de ces cas particuliers actions grâce à l’existence de méthodes de callback,
et la communauté française travaille actuellement en ce sens pour une meilleure souplesse.
afin de proposer une version francisée du framework.
Si vous ne voulez pas des conventions
Il faut cependant noter que le suivi des conventions n’est
Listing 1. Création de la base de données pas obligatoire (de la même manière qu’une personne
peut construire sa maison toute seule !). Les irréductibles
CREATE TABLE 'users' (
'id' INT UNSIGNED NOT NULL AUTO_INCREMENT ou ceux qui n’ont pas la main sur les conventions de nom-
PRIMARY KEY , mage utilisées, dans le cas de la reprise d’une applica-
'name' VARCHAR( 100 ) NOT NULL ,
'email' VARCHAR( 100 ) NOT NULL tion existante par exemple, trouveront donc une solution
) ; à leur situation. Nous ne pouvons tout détailler ici, mais
CREATE TABLE 'messages' ( sachez qu’il est possible de modifier le comportement du
'id' INT UNSIGNED NOT NULL AUTO_INCREMENT framework et de se servir de sa puissance sur un code ne
PRIMARY KEY ,
'title' VARCHAR( 150 ) NOT NULL , respectant pas les conventions … il suffira simplement de
'content' TEXT NOT NULL , rajouter un peu de configuration à votre application !
'user_id' INT UNSIGNED NOT NULL ,
'created' DATETIME NOT NULL ,

) ;
'modified' DATETIME NOT NULL Le scaffolding ou prototypage rapide
CakePHP est avant tout un outil facilitant la mise en pla-
Listing 2. Création du modèle user dans le fichier /models/ ce rapide d’une application (framework de RAD). Com-
user.php me nous l’avons vu précédemment, une bonne modé-
<?php lisation de la base de données respectant certaines
class User extends AppModel { conventions peut vous faire gagner un temps précieux.
var $name = 'User';
} Il est désormais temps de voir tout ce que CakePHP
?>
vous propose !
Listing 3. Création du modèle «message» dans le fichier / Le prototypage rapide est une fonctionnalité permet-
models/message.php tant de vérifier la cohérence de votre base de données
<?php
et de vous fournir des formulaires permettant toutes les
class Message extends AppModel { actions CRUD (ajout, visualisation, mise à jour et sup-
var $name = 'Message';
var $belongsTo = 'User';
pression) d’un objet et de ceux qui y sont associés. Pre-
} nons l’exemple d’une base de données gérant des uti-
?>
lisateurs et leurs messages de manière simpliste. Nous
Listing 4. Création du contrôleur «users» dans le fichier / devrons donc créer deux tables telles que décrit dans
controllers/users_controller.php le Listing 1.
<?php
Le plus difficile est effectué, analysons désormais
class UsersController extends AppController { les modèles associés dans lesquels nous indiquons
var $scaffold; // Cette ligne permet de
passer en mode prototypage rapide pour ce contrôleur
qu’un message appartient à un utilisateur. Cette étape
} est présentée dans les Listing 2 et 3, notez au passage
?>
la simplicité de définition des associations (Listing 3).
Listing 5. Création du contrôleur «messages» dans le fichier « / Enfin demandons à Cake de faire le travail de prototy-
controllers/messages_controller.php » page rapide, ceci depuis les contrôleurs associés aux
<?php
Utilisateurs (Listing 4) et aux Messages (Listing 5).
class MessagesController extends AppController { C’est tout ! Désormais, en vous rendant sur les pa-
var $scaffold;
}
ges http://www.votresite.com/users et http://www.votre-
?> site.com/messages vous pourrez tout gérer. Les formu-
laires permettant les actions CRUD sont disponibles.

38 7/2010
CakePHP

La Figure 1 est une capture d’écran du formulaire d’ajout


d’un nouveau message. Nous voyons que la liste des uti-
lisateurs existants (un utilisateur a été créé auparavant)
s’affiche, afin de relier le message à son auteur. La Figu-
re 2 quant à elle montre le résultat de la création : le lien
avec l’utilisateur est bien sauvegardé et les champs auto-
matiques ont été renseignés. Magique n’est-ce pas ?

CakePHP en ligne de commande


CakePHP offre une interface en ligne de commande
permettant de réaliser certaines tâches très rapidement,
comme la création du squelette d’application, la généra-
tion interactive des fichiers pour chaque entité (modèle,
contrôleur et vues) ou encore l’extraction des chaînes
gettext présentes dans tous les fichiers de l’application Figure 1. Formulaire de création de message généré par CakePHP
dans le cadre d’une application multilingue. Il est égale-
ment possible de créer ses propres scripts exécutables
via cette console, les shells et les tasks.

Squelette d’application
Après avoir ajouté l’exécutable php dans les variables
d’environnement (sous Windows) et créé une nouvelle
base de données, nous pouvons ouvrir un terminal (Dé-
marrer > Exécuter > cmd.exe) et appeler la console :
cake bake. Figure 2. Récapitulatif du message créé
Le script nous propose de créer une nouvelle ap-
plication : il suffit d’indiquer le répertoire de destination
et la console crée toute l’arborescence de base, et gé-
nère une nouvelle clé de sécurité dans le fichier config/
core.php qui servira lors de la mise en place un systè-
me d’authentification.
Le script nous demande ensuite les codes d’accès
à la base de données, puis se termine. Nous pouvons
nous rendre à la racine de l’application dans un navi-
gateur, et nous voyons apparaître la page d’accueil de
notre nouvelle application.

Création d’un modèle


Contrairement au scaffolding, qui ne crée pas les fi-
chiers nécessaires dans l’application, la console per- Figure 3. Aperçu de l’application créée en ligne de commande
met de générer effectivement ces fichiers de manière
interactive. Appelons à nouveau la console, de la même La console propose ensuite de définir les associa-
manière que plus haut : cake bake. tions existantes entre cette table et les autres tables de
Cette fois la console a détecté que notre application la base. Quatre types d’associations sont gérées par
existe, et nous propose une liste d’actions possibles : CakePHP : hasOne (possède un seul), hasMany (pos-
ajouter une configuration de base de données, créer un sède plusieurs), belongsTo (appartient à) et hasAnd-
modèle, une vue, un contrôleur ou un nouveau projet. BelongsToMany (possède et appartient à plusieurs).
Nous choisissons de créer un modèle : la console pro- Si nous respectons les conventions de nommage des
pose la liste des tables de la base de données. Nous tables et des champs (nom des tables au pluriel, 'id'
choisissons l’une des tables : la console demande si pour les clés primaires, nom de table au singulier sui-
nous voulons définir des règles de validation pour les vi de '_id' pour les clés étrangères), CakePHP détec-
champs de cette table. Nous répondons oui : pour cha- te seul les paramètres de chaque association, mais il
que champ, nous pouvons choisir parmi 28 règles pré- reste tout à fait possible de créer les modèles à par-
définies (notEmpty, alphaNumeric, email, etc.), écrire tir de tables venant d’une ancienne application qui ne
notre propre expression régulière, ou bien ne pas défi- respecte pas ces conventions. Notre premier modèle
nir de règle de validation. est créé !

www.phpsolmag.org 39
Fiche technique

Tableau 1. Relations possibles entre différents modèles


Relation Nom de la relation Exemple
1à1 hasOne Un utilisateur a un profil

1àn hasMany Un utilisateur peut être l’auteur de plusieurs re-


cettes
nà1 belongsTo Une recette appartient à un utilisateur

nàn hasAndBelongsToMany Une recette est associée à plusieurs tags, et un


tag est associé à plusieurs recettes

Création d’un contrôleur communautaires maintenues par les utilisateurs telles


Passons maintenant à la génération d’un contrôleur : la que Amazon, fichiers CSV, SOAP ou XML-RPC.
console nous donne la liste des contrôleurs possibles Note : toutes les classes de modèles de l’application
en fonction des tables de la base, puis propose de créer étendent la classe AppModel, il est donc facile de facto-
dans ce nouveau contrôleur les actions de base (index, riser certaines actions redondantes sur plusieurs modè-
add, edit et delete), et éventuellement les actions de les à l’intérieur de cette classe mère.
base d’administration (admin_index, admin_add, ad-
min_edit et admin_delete). Opérations usuelles sur les données
Examinons un contrôleur créé plus tôt via la console :
Création d’une vue nous avions demandé à CakePHP de créer pour nous
Terminons par la création des vues : CakePHP se char- les actions de base de manipulation de données; pen-
ge de créer une vue pour chaque action du contrôleur. chons-nous dans le Listing 6 sur l’action add() permet-
Nous pouvons à présent parcourir l’application dans un tant d’ajouter une entrée à la base de données.
navigateur : tout est déjà prêt, il ne reste qu’à affiner la A l’intérieur d’une action d’un contrôleur, les don-
présentation des données ou certains traitements, mais nées issues d’un formulaire présent dans la vue de cet-
l’application en l’état est totalement fonctionnelle, après te action sont toutes regroupées dans $this->data. La
avoir tapé une ligne de commande et répondu à quel- première étape vérifie donc si cette variable existe (le
ques questions ! formulaire a été soumis) et dans ce cas, la méthode
Note avancée : dans le cadre d’industrialisation de create() du modèle Recette est appelée : CakePHP
vos développements, sachez que le code généré peut prépare une enveloppe vierge qui va accueillir les don-
être personnalisé en créant de nouveaux templates. nées à sauvegarder. Il essaie ensuite de sauvegarder
Vous pouvez donc améliorer la productivité de votre effectivement les données soumises, et redirige sur l’in-
équipe en ajoutant de meilleurs commentaires, des ex- dex du contrôleur en cas de succès (c’est-à-dire d’une
ceptions ou des tests unitaires pour le code généré. part que les données ont passé tous les tests de valida-
tion, et d’autre part que la ligne a bien été ajoutée dans
Les modèles la base).
Les modèles, l’une des trois couches du modèle MVC,
constituent le cœur de l’application. Ils encapsulent l’ac- Relations entre modèles
cès aux tables de la base de données et sont responsa- Une des grandes forces de CakePHP réside dans la ges-
bles de la plupart des manipulations de ces données : tion automatique des relations entre les modèles. Les qua-
lecture, écriture, suppression et validation du format des tre relations possibles sont décrites dans le Tableau 1.
données avant sauvegarde. Le framework est prévu pour Une fois les relations définies dans le modèle, on
pouvoir travailler avec un grand nombre de SGBD diffé- peut accéder directement à l’un des modèles associés :
rents de façon transparente (MySQL 4 et 5, Postgres, Fi- si par exemple dans l’action add() du contrôleur des re-
rebird, SQL Server, Oracle, SQLite, ODBC et ADOdb). cettes, nous souhaitons obtenir la liste des utilisateurs
Les modèles sont conçus dans l’optique d’une gran- nous utiliserons l’instruction présentée dans le Listing
de souplesse puisqu’il est possible d’utiliser un modè- 7. La gestion de ces relations permet aussi de rapatrier
le sans table (gestion d’un formulaire de contact par en un seul appel les données d’un ou plusieurs enregis-
exemple), que l’on peut spécifier des bases de don- trements du modèle ainsi que des modèles associés.
nées différentes d’un modèle à l’autre, et qu’un modèle La distance jusqu’à laquelle CakePHP doit parcourir les
peut manipuler des données issues d’une autre source associations peut être réglée grâce à la variable de mo-
qu’une table de base de données, par exemple une API dèle $recursive.
externe. Il suffit pour cela de créer sa propre datasour- Analysons l’action view() de notre contrôleur des re-
ce et de brancher le modèle dessus. Depuis la version cettes dans le Listing 8. La variable $recette contien-
1.3, un projet officiel regroupe des sources de données dra non seulement les données de la recette d’identifiant

40 7/2010
CakePHP

$id, mais aussi les informations sur l’utilisateur qui l’a


Listing 6. Méthode classique de création d'un nouvel objet en
écrite et les tags associés à la recette ! Ce formidable base de données
automatisme se retrouve également dans la sauvegar-
function add() {
de des enregistrements, puisque l’on peut sauvegarder if(!empty($this->data)) {
l’enregistrement d’un modèle et de ses modèles asso- $this->Recette->create();
if ($this->Recette->save($this-
ciés en un seul appel à save() ou saveAll(). >data)) {
$this->Session->setFlash(__
('The Recette has been saved', true));
Les callbacks $this->redirect(array('actio
Les callbacks sont des méthodes spéciales qui sont dé- n'=>'index'));
} else {
clenchées automatiquement par le framework lors de $this->Session->setFlash(_
chaque appel à une page. On trouve par exemple les _('The Recette could not be saved. Please, try
again.', true));
méthodes de modèle beforeSave() ou afterFind(), }
qui peuvent accueillir des traitements supplémentaires }
}
en plus des méthodes de base. D’autres callbacks sont
disponibles dans les contrôleurs (beforeFilter, befo- Listing 7. Exemple de récupération de tous les utilisateurs
reRender...). existants
class RecettesController extends AppController {
Extensions de modèle function add() {
$utilisateurs = $this->Recette-
Dans l’optique de produire du code le plus réutilisable >Utilisateur->find('all');
possible, CakePHP permet d’étendre les fonctionnalités ...

de base d’un modèle avec des Behaviors (Comporte- Listing 8. Récupération d'une entrée de la base de données et
ments), qui ajoutent des méthodes à un modèle existant des informations associées
ou utilisent les callbacks pour effectuer des traitements
class RecettesController extends AppController {
supplémentaires. CakePHP en fournit quelques-uns, function view($id) {
comme par exemple le comportement Tree qui permet $this->Recette->id = $id;
$this->Recette->recursive = 1;
de gérer une table comme une arborescence. La gestion $recette = $this->Recette->read();
des nœuds se fait en toute simplicité : la logique se trou- …

ve dans des callbacks du Comportement, appelés avant Listing 9. Association du comportement Translate à un
et après la sauvegarde classique d’un enregistrement. modèle et paramétrage
class Recette extends AppModel {
Exemple de Behavior : Translate var $actsAs = array(
Ce comportement, inclus dans le framework, permet de 'Translate' => array(
'titre' => 'Titres',
gérer une application multilingue. Il faut avant tout pré- 'description' =>
'Descriptions'
parer la base de données à accueillir plusieurs langues : )
pour ce faire nous devons créer une table i18n (dont le );

schéma est fourni dans le répertoire config/schema) qui
va contenir tous les champs textuels des autres tables,
et ces autres tables ne doivent pas contenir de champs
susceptibles d’être traduits. Nous associons ensuite le affaire à la table recettes avec les champs traduits en
comportement Translate au modèle en précisant quels anglais, alors qu’en réalité ces deux champs n’existent
champs textuels devront être traduits grâce à l’attribut pas dans la table recettes mais dans la table i18n.
$actsAs du modèle, tel que présenté dans le Listing 9.
La gestion des traductions se fait ensuite de manière Les vues
transparente : avant toute action sur un enregistrement, Les vues de CakePHP n’utilisent pas de langage spéci-
il suffit de préciser sur quelle(s) langue(s) on travaille, fique, et sont donc du pur (x)HTML au milieu duquel on
et Translate s’occupe du reste. Ainsi pour afficher une utilise le PHP classique pour afficher les données dyna-
recette en anglais : miques. Il est cependant possible d’utiliser des moteurs
de templates comme Smarty, mais c’est en pratique
function view($id) { très peu utilisé à cause des nombreux helpers disponi-
$this->Recette->locale = 'eng'; bles qui permettent de garder un code propre, minimal,
$this->Recette->id = $id; réutilisable et facile à prendre en main !
$recette = $this->Recette->read();
… Différents éléments composant une vue
Dans un but de ré-utilisabilité du code et pour diminuer
Et CakePHP renvoie un enregistrement avec les champs la redondance, les vues sont composées de plusieurs
‘titre’ et ‘description’ traduits, comme si nous avions fichiers.

www.phpsolmag.org 41
Fiche technique

• Layouts : un fichier gabarit qui contient toute la qu’il se chargera de générer automatiquement un lien
structure commune aux pages du site (menus, en- correspondant à ces paramètres afin de pouvoir mo-
tête et pied de page …), il est donc très simple de difier très simplement votre système d’urls. Note avan-
changer radicalement de structure de page entre cée : dans la version 1.3 du framework, il est possible
sections du site ou versions, de créer des classes personnalisées pour gérer les rou-
• Elements : certains éléments communs à plusieurs tes. Cela apporte de nombreuses nouvelles possibilités
pages (exemple : formulaires de connexion) peu- qui ne peuvent être décrites dans le cadre de cet article,
vent être mis sous forme d’un fichier séparé qui se- mais nous vous invitons à vous documenter sur ce sujet
ra inclus dans chacune des pages, avec possibilité (cf ressources mentionnées en fin d’article).
de passage de paramètres,
• Corps de la page : associés à chacune des actions, Le JsHelper
les fichiers de vue contiennent le code de la page Introduit dans la version 1.3 du framework, ce Helper
strictement nécessaire à l’action demandée (formu- vous permet d’utiliser du Javascript et de l’Ajax dans
laire, affichage des informations) ce qui permet de vos vues en tirant pleinement partie de la magie du fra-
les réutiliser simplement d’un projet sur l’autre. mework. Il est ainsi très simple de mettre en place des
formulaires, liens, glisser-déposer et autres effets en un
Des helpers pour se simplifier la vie seul appel de méthode.
Comme vous commencez à le voir, le framework contient La nouveauté apportée par ce Helper est qu’il est agnos-
énormément de fonctionnalités n’ayant qu’un seul but : fa- tique : il suffit d’un changement de configuration pour
ciliter le développement en s’abstrayant des tâches rébar- générer du code jQuery, Mootools ou Prototype. De
batives ! Ainsi, CakePHP est livré avec des classes conte- plus, un système de buffer vous permet de regrouper
nant des méthodes vraiment pratiques : les helpers. l’affichage de vos scripts en un seul et même endroit,
et ce peut importe d’où le helper a été appelé (layout,
Le FormHelper vue, helper ou élément).
Afin de gérer simplement les formulaires affichés sur
votre site et leur lien avec les données issues ou des- .… et bien d’autres
tinées à la base de données, une classe vous fournit RSS, Paginator (pour paginer simplement vos résul-
un tas de méthodes automatiques. Voici dans le Listing tats), Number, Session, XML … vous permettront de
10, à titre d’exemple, le code permettant de générer le mettre en place en toute simplicité des fonctionnalités
formulaire d’ajout de la Figure 1 (code généré automa- pratiques et répandues. Ceci est une liste non exhaus-
tiquement depuis la ligne de commande). tive se basant sur les helpers du cœur du framework :
Nous pouvons voir dans cette portion de code que la communauté en propose beaucoup d’autres, et vous
la création d’un formulaire se fait en définissant le mo- pouvez très simplement créer les vôtres !
dèle associé, et que Cake se chargera ensuite de dé-
terminer le type d’élément de formulaire à afficher en Des composants livrés avec le framework
fonction du type de données de la base de données : Au même titre que les Behaviors sont des extensions
ici le champ title est un VARCHAR, content un TEXT de modèle, les Components (composants) sont des ex-
et user_id une clé étrangère vers une entrée de la ta- tensions de contrôleur. Parmi ceux livrés avec Cake-
ble users. Sachez également que vous pourrez insé- PHP (Cookies, Sessions, Email, Security, etc.), nous en
rer directement un type d’élément précis (select, radio, aborderons deux : Auth et ACL.
checkbox …) par l’appel de la méthode correspondante
du helper … et qu’il existe beaucoup d’autres méthodes Auth
et options pour faire ce que vous voudrez ! Le composant Auth permet de mettre en place une
authentification par login / mot de passe sur certaines
Le HTMLHelper parties du site. L’utilisation typique de cette fonctionna-
De la même manière, une autre classe contient de nom- lité est la protection d’un espace d’administration du si-
breuses méthodes utiles pour vous faciliter l’affichage de te, c’est-à-dire l’authentification requise pour les actions
code HTML. Quelques exemples : insérer des balises doc- préfixées par ‘admin_’. Commençons pas activer le rou-
type conformes, un charset uniforme au site, des liens (vers tage automatique des actions réservées à l’administra-
des pages, images, fichiers) qui ne seront pas cassés par tion en décommentant une ligne dans config/core.php :
un changement de schéma d’url rewriting, créer simple-
ment des tableaux de données et bien d’autres choses. Configure::write('Routing.prefixes',
CakePHP contient un système de gestion d’url très array('admin'));
fin (les routes) qui vous permettra de personnaliser en-
tièrement vos urls en modifiant quelques lignes dans le Ainsi, une URL du type ‘/admin/recettes/edit/12’ renver-
fichier /config/routes.php. L’intérêt du HTMLHelper est ra sur l’action admin_edit($id = null) du contrôleur

42 7/2010
CakePHP

RecettesController, avec comme paramètre ‘12’,


Listing 10. Formulaire d'ajout d'un «message» dans le fichier /
l’identifiant de la recette à éditer. Depuis la version 1.3 views/messages/add.ctp
vous pouvez créer et gérer différents préfixes, ce qui est
<?php echo $this->Form->create('Message');?>
très pratique pour créer divers espaces membres ou sec- <fieldset>
tions d’une application. Toujours dans l’esprit convention <legend><?php __('Add Message');?></
legend>
au lieu de configuration, CakePHP attend que les utili- <?php
sateurs autorisés soient stockés dans une table 'users' echo $this->Form->input('title'); //
Affichera un "input text"
avec un champ 'username' (le login) et un champ 'pas- echo $this->Form->input('content');
sword'. Ce dernier devra être de type varchar (40) // Affichera un "textarea"
echo $this->Form->input('user_id');
pour stocker la clé de hashage du mot de passe, com- // Affichera un "select" contenant les couples id/
posée de la clé de sécurité générée lors de la création name des utilisateurs existants
?>
de l’application avec la console, suivie du mot de passe, </fieldset>
le tout crypté en SHA1 ce qui nous donne une chaine de <?php echo $this->Form->end('Submit');?>

40 caractères. Listing 11. Configuration du composant d'Authentification et


Afin de restreindre l’accès à toutes les actions de restriction des pages d'administration
nos contrôleurs commençant par admin_ aux seuls uti-
class AppController extends Controller
lisateurs logués, nous allons placer la logique d’authen- {
tification dans la classe AppController (Listing 11) var $components = array('Auth');

dont héritent tous les autres contrôleurs. Comme cette function beforeFilter()
logique doit intervenir avant toute autre opération lors {
$this->Auth->loginAction =
de l’appel à une action, nous utiliserons le callback be- array('plugin' => null, 'controller' => 'users',
foreFilter, qui comme son nom l’indique est appelé 'action' => 'login');
$this->Auth->loginRedirect =
avant l’action elle-même. array('controller' => 'recettes', 'action' =>
Il suffit de définir quelques propriétés du composant 'index');
$this->Auth->logoutRedirect = '/';
Auth (les URL de connexion, de déconnexion et de re- $this->Auth->loginError =
"Identifiant ou mot de passe incorrects.";
direction en cas de succès, les messages d’erreur, la $this->Auth->authError = "Vous
condition d’autorisation ou de refus) et l’accès à une n'avez pas accès à cette page.";
action d’administration demande maintenant de s’iden- if(empty($this->params['prefix']) or
tifier. Il ne nous reste qu’à créer les actions de login $this->params['prefix'] != 'admin')
{
et logout dans le contrôleur des utilisateurs, UsersCon- $this->Auth->allow();
troller présenté dans le Listing 12. }
}
L’action login reste vide, CakePHP se charge lui-mê- }
me de vérifier si le couple login / mot de passe, qui sera
fourni par le biais du formulaire à créer dans la vue de Listing 12. Contrôleur basique de gestion des utilisateurs, tout
cette action, correspond bien à un utilisateur de la table est fait par Cake !
users. L’action logout ne fait que rediriger sur l’URL dé- class UsersController extends AppController {
function login() {
finie comme URL de déconnexion dans le beforeFil-
ter, avec un message. }

function logout() {
ACL $this->Session->setFlash("Vous êtes
maintenant déconnecté.");
Le composant ACL (Access Control List) permet un $this->redirect($this->Auth-
contrôle poussé des autorisations d’accès en consi- >logout());
}
dérant d’une part des rôles (aros) et d’autre part des }
ressources (acos), avec des relations d’autorisation ou
d’interdiction entre un rôle et une ressource donnés.
Notons bien qu’il ne s’agit pas de la même chose que et une pour les ressources, il est donc possible (et pré-
l’authentification vue plus haut, mais d’un processus de férable !) de ne pas définir toutes les autorisations d’ac-
contrôle d’accès aux ressources une fois qu’un utilisa- cès pour tous les rôles vers toutes les ressources, mais
teur a été reconnu. de définir une autorisation pour un groupe d’utilisateurs
La solution proposée par CakePHP offre une granu- entier vers une ressource, et chaque membre du grou-
larité importante, puisqu’il est possible qu’un rôle soit pe héritera des mêmes droits. Il reste ensuite possible
un utilisateur ou un groupe d’utilisateurs, et qu’une res- de créer une exception sur l’un des membres du groupe
source soit un enregistrement précis d’une table, une sans influer sur les autres membres.
action, un contrôleur complet ou même l’application Le composant fournit des méthodes pour d’une part
dans son ensemble. Le framework gère ces données autoriser ou interdire l’accès d’un rôle à une ressource,
sous forme de deux arborescences, une pour les rôles et d’autre part pour contrôler si une autorisation d’accès

www.phpsolmag.org 43
Fiche technique

à la communauté et d’obtenir une aide rapide et préci-


Sur Internet se. Url : http://cakeqs.org/fre
• http://www.cakephp.org/ – Le site officiel du framework
contenant entre autres la documentation et l’API, Blogs et autres ressources
• http://www.cakephp-fr.org/ – Site de la communauté De nombreux blogs anglophones et francophones trai-
francophone principalement constitué d’un forum d’a- tent du développement CakePHP. En France on trouve
ide et de conseils, notamment le blog http://www.formation-cakephp.com
• http://www.formation-cakephp.fr/ – Blog francophone
qui est une mine d’or de tutoriaux de qualité. Pour les
présentant clairement diverses fonctionnalités de Cake-
PHP et leur mise en application, blogs non francophones, le site http://planetcakephp.org/
• http://www.planetcakephp.org/ – Site recensant les flux recense les flux des meilleurs blogs dédiés à CakePHP.
des différents blogs CakePHP. D’autre part, un channel IRC vous permettra de dia-
loguer avec les développeurs du cœur du framework
et d’autres utilisateurs pour avancer dans le dévelop-
existe entre un rôle et une ressource donnés. De plus, pement de vos applications : #cakephp-fr (ou #cakephp
il existe un comportement du même nom (ACL) qui per- pour la version anglophone) sur irc.freenode.net. C’est
met de gérer automatiquement les rôles, par exemple un passage recommandé lorsque vous débutez avec le
si nous voulons créer un rôle à chaque création d’un framework … la communauté vous attend !
utilisateur.
Participez au projet !
La communauté de CakePHP Après la récente publication de la version 1.3 du fra-
CakePHP est un projet open source avec une commu- mework, l’équipe de CakePHP a lancé des appels aux
nauté développé et très active. De nombreux blogs abor- utilisateurs pour contribuer au développement du pro-
dent diverses astuces ou donnent quelques conseils, jet. Ainsi, toutes les suggestions et contributions pour la
et les ressources officielles sont de très bonne qualité. version 2.0 entièrement PHP5 sont les bienvenues. Les
Voici donc les principales sources d’informations propo- outils de la communauté vont également être actualisés
sées par la communauté. et harmonisés pour devenir (à l’image de la documenta-
tion ou CakeQs) entièrement internationalisés et répon-
La documentation dre aux attentes des utilisateurs.
La documentation (également appelée le CookBook)
couvre la quasi-intégralité des sujets et est mise à jour Conclusion
/ améliorée régulièrement. Chacun peut y contribuer en Comme nous l’avons vu tout au long de cet article, Ca-
soumettant des modifications qui seront ensuite vali- kePHP a été conçu de manière à permettre un dévelop-
dées par les responsables. La traduction française cou- pement rapide d’applications web fonctionnelles sous
vre environ 90% du contenu, et ne cesse d’augmenter. tous les aspects. Historiquement anglophone mais dé-
Url : http://book.cakephp.org/fr sormais international, sa communauté est très vaste
et réactive. Vous pourrez ainsi débuter en vous basant
L’API sur de nombreux tutoriaux, la documentation et l’assis-
Basée sur la version actuelle du framework, l’API est tance à votre disposition, notamment en Français. Nous
automatiquement générée depuis le code de l’applica- vous invitons à suivre les quelques exemples présentés
tion et ses commentaires. Un moteur de recherche vous ici, puis à découvrir les nombreuses autres fonctionna-
permet de trouver rapidement une méthode afin de voir lités au fur et à mesure de vos besoins.
précisément quelle est sa spécification, et même d’en
lire le contenu. La navigation dans le code du cœur est
ainsi très simple ! Url : http://api.cakephp.org/classes PIERRE-EMMANUEL FRINGANT
PIERRE MARTIN
Forums d’aide Pierre-Emmanuel Fringant est webmaster indépendant à Caen dans
La communauté anglophone utilise un groupe Google le Calvados (Normandie). Après un DUT informatique obtenu à l’IUT
afin de fournir de l’assistance aux développeurs. En de Ifs, il acquiert six ans d’expérience dans plusieurs entreprises
France un forum permet de dialoguer, ou de demander (agence de communication, webagencies), puis se lance dans l’a-
de l’aide sur l’utilisation du framework. Url : http://forum. venture indépendante début 2007.
cakephp-fr.org/ Pierre Martin est développeur web, expert CakePHP au sein de la so-
ciété CakeDC. Passionné de programmation, il s’est tourné vers le
CakeQs développement web lors de stages et par son activité de dévelop-
Un nouvel outil international a récemment été mis en peur web indépendant ces deux dernières années avant d’intégrer
place par la Cake Software Foundation. Dans l’esprit CakeDC. Il travaille désormais à plein temps autour du framework,
de stackoverflow.com, il permet de poser une question pour des clients internationaux.

44 7/2010
Pour les débutants

Serveur :
un ami ou un ennemi ?
Un serveur est indispensable pour réaliser un projet web.
C’est lui qui va mettre à disposition votre projet. Cependant,
si celui-ci est correctement paramétré, il sera votre ami, mais
il peut très vite devenir votre ennemi s’il n’est pas configuré
ou sécurisé correctement.

Cet article explique : Ce qu’il faut savoir :


• Comment adapter votre application au serveur. • Notions de PHP.

S
uivre la vie de votre serveur correspond à pren- tocoles peuvent être IMAP ou encore SMTP. Ce service
dre soin de celui-ci car il peut cacher de nom- est souvent associé à un projet web, mais il peut aussi
breux services. Ces différents services peuvent être utilisé pour la redirection des emails auprès des
s’exécuter séparément ou être associés à votre projet. destinataires enregistrés.
Mais lorsqu’un serveur existe, il peut aussi proposer
d’autres projets réalisés par d’autres équipes. Cepen- Un serveur web
dant lorsque vous réalisez un projet informatique, sous Le serveur web, appelé AMP, comprend un environne-
la forme d’une application Web, qui utilisera les diffé- ment Apache, avec un langage PHP et une base de
rents réseaux informatiques comme l’intranet, l’internet, donnée MySQL. Des nombreuses extensions sont dis-
l’extranet, il peut être judicieux d’écouter votre serveur. ponibles et peuvent être installées pour contribuer au
Le but de ces tests n’est pas de remplacer les ad- bon fonctionnement de votre projet. Les extensions les
ministrateurs, ni les personnes qui gèrent le réseau. Il plus courantes lors de l’installation d’un serveur Web
s’agit plutôt d’adapter votre application au serveur pour concernent les fonctions de messageries, de FTP, de
définir des choix. Si ces choix ne sont pas appliqués ra-
pidement, cela pourrait être lourd de conséquences lors
de la mise en production. Ces conséquences concer-
nent avant tout, le risque provenant de visiteurs exté-
rieurs.

Décomposition d’un serveur


Un serveur informatique peut comprendre de nombreux
services comme :

• Un service de messageries.
• Un serveur web.
• Un serveur de base de données.

Un service de messageries
Un service de messageries correspond à une gestion
de Webmail. Suivant le choix de la messagerie, les pro- Figure 1. Le site existe

www.phpsolmag.org Figure 1. Le site existe 45


Serveur

mémoire cache, de communication externe (cURL par


Listing 1. Vérifier si un site internet est ouvert
exemple)...
<?php

Un serveur de base de données $url="www.alterway.fr";


Le serveur de base de données peut correspondre $port="80";

à une interface, permettant de gérer vos bases de don- $cnx = @fsockopen($url, $port);
nées. Ce type d’interface peut correspondre à PHP- if ($cnx)
{
myAdmin. echo "$url est ouvert sur le port $port";
fclose($cnx);
} else {
Le savoir echo "$url est fermé sur le port $port";
Lors de l’installation d’un nouveau serveur web, la confi- }
?>
guration de celui-ci propose de nombreuses informa-
tions qui vont vous être utiles. Sans ces informations, Listing 2. Test les ports
vous n’aurez pas le savoir requis pour continuer votre <?php
projet. Les informations principales concernent :
$adr="127.0.0.1";

• La version du langage PHP. for($i=1;$i<=100;$i++)


{
• Le format de la base de données. $cnx = @fsockopen($adr, $i, $errno, $errstr,
• Les extensions disponibles. 0.1);
if ($cnx)
{
Grâce à cela, vous possédez exactement les fonc- echo "Port $i est ouvert.<br>";
fclose($cnx);
tions mises à votre disposition. Or, pour utiliser les }
fonctions de votre langage, vous devez penser aux }
?>
protocoles disponibles comme :

• FTP,
• HTTP, La fonction fsockopen() se déclare de la façon sui-
• SMTP, vante :
• POP3,
• MySQL. fsockopen ( nom du serveur,
numéro du port,
La connaissance numéro de l'erreur du serveur
Lors du contrôle de votre serveur, les informations qui système,
vous sont proposées permettent de connaître exacte- le message d'erreur,
ment les ports ouverts. Ces ports sont uniques pour un le délai d'attente)
protocole donné. Il s’agit par exemple :
Dans notre premier exemple, nous utilisons les 2 pre-
• du port 80 dans le mode HTTP, miers arguments. L’exemple donné pour vérifier si un
• du port 21 qui sera utilisé pour l’accès FTP. site internet existe, consiste à fournir une URL si vous
ne connaissez pas l’adresse IP de la machine, et un nu-
Bien entendu, les ports peuvent être modifiés suivant méro de port (voir Listing 1). Ici, nous utilisons le port 80
les orientations et le choix des administrateurs des ser- car il s’agit du port de votre navigateur par défaut.
veurs. La définition de ces ports permet de savoir si le Comme le montre l’exemple (Listing 1), si le site
service est actif ou pas. La théorie permet d’effectuer existe et c’est bien le cas, un message de succès sera
un test interrogeant un service, en demandant si celui- affiché de la façon suivante (voir Figure 1).
ci est présent ou absent. Suivant la réponse retournée,
vous saurez si celui-ci est disponible. Contrôle des ports
Lorqu’un nouveau serveur est monté, une des étapes
Vérification que vous devez aussi effectuer pour votre projet web
Pour effectuer la vérification, vous pouvez utiliser le lan- consiste à vérifier les ports. Ces ports peuvent être
gage PHP pour contrôler si la connexion est toujours ac- considérés comme des portes et donc des voies d’accès
tive. En PHP, la fonction disponible est fsockopen(). à une application spécifique. Cette opération est com-
L’utilisation de la fonction permet de vérifier si l’adresse plémentaire aux tests qui sont déjà réalisés au niveau
d’un serveur fourni est accessible par un numéro précis de la sécurité.
et utilise un port spécifique comme celui de la naviga- Bien entendu, ce test s’effectue par l’intermédiaire
tion HTTP (port 80). du navigateur et permet de vérifier si un des services

46 7/2010
Pour les débutants

Listing 3. Fonction scan à distances. Ce deuxième serveur peut être votre ordi-
nateur avec un environnement AMP déjà installé. L’opé-
<?php
ration présentée propose 2 avantages :
function scan _ port($adresse,$port)
{
$cnx = @fsockopen($adresse, $port, $errno, • La possibilité de tester le réseau à tout moment mê-
$errstr, 0.1); me en cas de panne du serveur de production.
if ($cnx)
{ • Celle de contrôler les ports dont vous aurez besoin
fclose($cnx); lors des évolutions de votre projet.
return true;
}
return false; La réalisation de ces tests peut s’effectuer avec un petit
}
?> script en PHP. Le script devra proposer :

Listing 4. Sélection des ports


• Le test des ports.
<?php • La liste des numéros à tester.
$port = array( • Le résultat obtenu.
'80'=>'HTTP'
,'21'=>'FTP'
,'22'=>'SSH' Les ports
,'25'=>'SMTP' Pour faciliter les tests des ports, vous pouvez définir
,'110'=>'POP3'
,'143'=>'IMAP' une fonction qui sera interrogée à chaque fois qu’un
,'3306'=>'MySQL' port sera sollicité. La fonction nous retournera une va-
);
?> leur positive si celui-ci est ouvert (Listing 3 ) . Sinon il n’y
aura aucun message de retour.
Listing 5. Boucle de test
<?php La liste
echo "<table>";
Il est important de définir la liste des ports dont vous
foreach ($port as $id=>$nom) aurez besoin (voir Listing 4). Ces ports permettent
{
echo "<tr>"; de s’assurer du bon fonctionnement de votre projet
echo "<td>".$nom."</td>"; web.
echo "<td>";
$row=scan _ port ("127.0.0.1",$id); La liste présentée est une liste indicative car il
if ($row == TRUE) s’agit des ports classiques. Vous pouvez ajouter des
echo "Ouvert";
else ports supplémentaires à partir d’informations prove-
echo "Fermé"; nant entre autres du site frameip (http://www.frameip.
echo "</td>";
echo "</tr>"; com/liste-des-ports-tcp-udp/). Ce site propose une
} description de l’ensemble des 65543 ports qui existent
echo "</table>";
actuellement.

Les résultats
proposés sur votre serveur possède une faille de sécu- Pour obtenir un résultat clair, vous pouvez afficher ligne
rité. Si le cas se présente, il peut être corrigé en cours par ligne dans un tableau les ports que vous avez dé-
de réalisation de votre projet. L’opération de test est clarés dans le chapitre précédent. A partir d’une boucle
présentée dans le Listing 2. Foreach(), l’exemple (Listing 5 – boucle de test) va
L’exemple montre que vous testez votre serveur lo- afficher le nom du port et signaler si celui-ci est ouvert
cal, du port 1 à 100. Ici la fonction fsockopen est uti- ou fermé.
lisée avec l’ensemble des options pour accélérer l’affi- A chaque passage de la boucle, l’analyse du port
chage des résultats. On a défini 1 seconde d’attente si sera effectuée par rapport à l’adresse du serveur. Ici,
le port ne répond pas de suite. le test porte sur le serveur local. Le résultat obtenu est
Le résultat obtenu est montré dans la Figure 2. présenté dans la Figure 3. Le résultat montre que le
port de navigation et l’accès à la base de données sont
Le miroir ouverts.
La sécurité est très importante, mais vouloir trop pro-
téger peut bloquer certaines fonctions essentielles en Vérifier son code
PHP. Si vous bloquez le port 3306, vous ne pourrez pas Après avoir contrôlé le serveur au niveau des accès des
utiliser la base de données MySQL sauf si vous avez ports et donc de la sécurité, vous devez aussi contrô-
décidé d’utiliser un port différent. ler votre code. La sécurité de votre application est très
Pour effectuer ces tests, vous devez posséder un importante, car elle peut aussi être la cause d’infections
autre serveur pour vous permettre d’effectuer des tests de votre serveur.

www.phpsolmag.org 47
Serveur

Pour s’assurer d’un bon fonctionnement de votre


serveur, vous devez réaliser une programmation sécuri-
sée. Pour cela, de nombreuses fonctions existent, mais
la majorité doivent se limiter au serveur de développe-
ment et non à la production.
Attention cependant : cette partie ne va traiter que
les points de sécurité propres à un projet web, or lors-
que vous réalisez du code, vous pouvez être amené
à effectuer des relations extérieures comme l’échange
de données ou l’exécution de programmes annexes.
Et c’est ce point qu’il ne faut pas négliger envers votre
serveur.

Les exécutions
Les fonctions d’exécution disponibles en PHP 5 per-
mettent d’exécuter des commandes sur le systeme Figure 2. Liste des ports ouvert
Figure 2. Liste des ports ouvert
lui-même. Les fonctions disponibles vont vous permet-
tre d’exécuter un programme et d’obtenir un résultat,
comme les fonctions System(), passthru() , exec(),
Le miroir
shell_exec().
La sécurité
Il est possible d’approfondir ces éxécutions est très importante, mais vouloir trop protéger peut bloquer certaines fonctions
de pro-
essentielles en PHP. Si vous bloquez le port 3306, vous ne pourrez pas utiliser la base de d
grammes avec un degré de contrôle plus important.
MySQL sauf si vous avez décidé d'utiliser un port différent. Pour effectuer ces tests, vous
Vous pouvez trouver les fonctions comme posséder
proc_open() , serveur pour vous permettre d'effectuer des tests à distances. Ce deuxièm
un autre
proc_close()... mais avec la possibilité de modifier
peut lesordinateur avec un environnement AMP déjà installé. L'opération présentée
être votre
processus. 2 avantages :

Contrôle du processus • La possibilité de tester le réseau à tout moment même en cas de panne du serveur de
Le contrôle du processus de PHP implémenteproduction.
un systè-
me de création, de gestion des processus comme • Cellesous
de contrôler les ports dont vous aurez besoin lors des évolutions de votre proje
Unix. Le contrôle des processus s’utilise comme un mé-
La réalisation de ces tests peut s'effectuer avec un petit script en PHP. Le script devra prop
canisme de rappel du gestionnaire de signaux.
Les fonctions disponibles concernant les• fonctions
Le test des ports.
'pcntl_()' sont nombreuses, comme pour l’ouverture,
• La liste des numéros à tester.
la duplication ou la fermeture. Mais vous pouvez
• Leen plus obtenu.
résultat
autoriser des interactions avec des processus à travers
PTY ou les standards IEEE 1003.1 (POSIX.1). Figure 3. Les ports ouverts et fermés
Figure 3. Les ports ouverts et fermés
Les ports
L’extension sémaphore Conclusion
L’extension sémaphore propose une interface pour les
Pour faciliter Ledes
les tests serveur
ports, dans une entreprise
vous pouvez définir uneest un axe
fonction quitrès
seraimpor-
interrogée à cha
qu'un port sera sollicité. La fonction nous retournera une
fonctions de type System V IPC. Les fonctions inté- tant. Il est même considéré comme le cœur de l’entre- valeur positive si celui-ci est ouv
(Listing 3 ) . Sinon il n'y aura aucun message de retour.
grées vont vous permettre d’utiliser de la mémoire par- prise. Par ailleurs, il permet d’effectuer la relation entre
tagée et un système de communication inter-proces- les visiteurs et les différents services internes.
Listing 3. Fonction scan
sus (le IPC). Les fonctions proposées sont les fonctions
<?php C’est pourquoi il est important de bien le paramé-
'shm()', 'msg_send()', 'ftok()'... Vérifier son
function trer, de contrôler les ports à ouvrir et à bloquer, mais
code
scan_port($adresse,$port)
{
Après$cnx
avoir=contrôlé aussi de contrôler
le serveur
@fsockopen($adresse, certaines
au niveau$port,
des accès fonctions
des ports
$errno, etqui pourraient
donc
$errstr, de0.1); in- vous de
la sécurité,
Les fonctions communes contrôler votre code.
if ($cnx) directement
La sécurité devous poser
votre des problèmes
application à causecard’une
est très importante, elle peut aussi
Les fonctions communes sont des fonctions causestandards
{ d'infections de programmation
fclose($cnx);
nons'assurer
votre serveur. Pour sécurisée.
d'un bon fonctionnement de votre serveu
devez réaliser
à PHP, et donc très utilisées. Vous pouvez rencontrer une programmation sécurisée. Pour cela, de nombreuses fonctions existent, m
majorité doivent se limiter au serveur de développement et non à la production.
des fonctions telles que require(), include(), fi-
le(), fopen(), preg_replace, $_GETAttention / $_POST /
cependant CHRISTOPHE VILLENEUVE
: cette partie ne va traiter que les points de sécurité propres à un projet
$PHPSELF... Consultant,
lorsque vous réalisez auteurpouvez
du code, vous du livre PHP
être & MySQL-MySQLi-PDO,
amené Constru-
à effectuer des relations extérieures
Si vous n’utilisez pas correctement cesl'échange
fonctions en isezouVotre
de données l'exécution de programmes
Application, annexes.
livre français Et c'est
aux Éditions ce spécialiste
ENI, point qu'il ne faut p
négliger envers
plaçant des filtres aux variables pour la sécurité, elles votre
desserveur.
nombreux secteurs PHP (CMS, CRM...) pour Alter Way solutions
peuvent aussi provoquer des dommages pour votre et contributeur pour de nombreux sites touchant PHP dont Nexen,
projet, cela à moyen/long terme en permettant d’infec- PHP Team, PHPTV...
ter votre serveur. Les exécutions Contacter l’auteur : http://www.hello-design.fr
Les fonctions d'exécution disponibles en PHP 5 permettent d'exécuter des commandes sur l
systeme lui-même. Les fonctions disponibles vont vous permettre d'exécuter un programme
48 7/2010
d'obtenir un résultat, comme les fonctions System(), passthru(), exec(), shell_ exec(). Il est p
Pour les débutants

www.phpsolmag.org 49
Serveur

50 7/2010

S-ar putea să vă placă și