Documente Academic
Documente Profesional
Documente Cultură
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
VARIA
Tél. 0975180358, Fax. +48 22 244 24 59
www.phpsolmag.org
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
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
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
Stoneld Inworld
Stoneld 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éciques ; 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
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.
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.
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
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');
www.phpsolmag.org 11
Projets
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 :
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
14 7/2010
Byoos
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.
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
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
18 7/2010
jQuery
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.
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
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
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.
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.
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
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
www.phpsolmag.org 27
Kannel
28 7/2010
Pratique
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 .
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 !
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
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
32 7/2010
Zend Framework
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.
www.phpsolmag.org 33
Fiche technique
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.
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.
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é.
www.phpsolmag.org 37
Fiche technique
) ;
'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
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.
www.phpsolmag.org 39
Fiche technique
40 7/2010
CakePHP
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
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
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.
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.
• 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
à 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";
• 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 :
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
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