Un contrơleur hérite donc des propriétés de cette super-classe, notamment de $this->view qui est le composant Vue avec lequel nous pouvons produire le document résultat.. On peut placer
Trang 1∗ Q u e l q u e s i n f o r m a t i o n s s u r l a c o n f i g u r a t i o n
∗ /
f u n c t i o n c o n f i g A c t i o n ( )
{
$ t h i s−>view−>t i t r e _ p a g e = " Contenu du f i c h i e r de
c o n f i g u r a t i o n " ;
/ / On p r e n d l a c o n f i g u r a t i o n d a n s l e r e g i s t r e , on l a m e t d a n s / / l a v u e
$ r e g i s t r y = Z e n d _ R e g i s t r y : : g e t I n s t a n c e ( ) ;
$ t h i s−>view−>c o n f i g = $ r e g i s t r y −>g e t ( ’ c o n f i g ’ ) ; ;
}
}
On remarque d’abord que tout contrơleur est une sous-classe de Zend_Controller_Action Un contrơleur hérite donc des propriétés de cette super-classe, notamment de $this->view qui est le composant Vue avec lequel nous pouvons produire le document résultat On peut placer des informations dans
la vue avec une affectation $this->view->nom = valeur.
On peut se demander d’ó vient le fragment HTML qui constitue la page d’ac-cueil du site ZSCOPE, produite par cette action Dans le Zend Framework, beaucoup
de décisions s’appuient sur des conventions de nommage et d’emplacement, ce qui évite de se répéter La convention pour les vues est la suivante : Le fragment (ou
script) associé à une action nommée act du contrơleur ctrl se trouve dans le
répertoire views/scripts/ctrl, et se nomme act.phtml Ici, l’action index se conclut
donc automatiquement par l’exécution du scriptviews/scripts/index/index.phtml
Vous pouvez consulter ce fichier Il contient le code HTML qui s’affiche dans la zone principale de la page d’accueil de ZSCOPE Tout le reste de la page, incluant
le logo, le menu, les différents tableaux imbriqués spécifiant le positionnement des
différentes parties et notamment de la zone principale d’affichage, relève du layout.
La gestion de ce dernier sera présentée page 376
Prenons un autre exemple avec l’action configAction() du contrơleur Index (voir ci-dessus) Le code est très simple : on récupère dans le registre l’objet de configuration et on l’affecte à la vue
La vue, un script PHP un peu spécial, est alors exécutée Au sein de ce script
on dispose de l’objet $config que l’on vient d’affecter, ainsi que de la chaỵne de caractères titre_page
Exemple 9.4 zscope/application/views/scripts/index/config.phtml : Le script Vue de l’action config
du contrơleur Index
V o i c i q u e l q u e s i n f o r m a t i o n s e x t r a i t e s du f i c h i e r de c o n f i g u r a t i o n
<h4> I n f o r m a t i o n s g é n é r a l e s s u r l ’ a p p l i c a t i o n < / h4>
Trang 2< o l >
< l i >Nom de l ’ a p p l i c a t i o n : <? php echo $ t h i s−>c o n f i g −>app−>name ;
? > </ l i >
< l i > A f f i c h a g e d e s e r r e u r s : <? php echo $ t h i s−>c o n f i g −>app−>
d i s p l a y _ e r r o r s ; ? > </ l i >
< l i > A d m i n i s t r a t e u r : <? php echo $ t h i s−>c o n f i g −>app−>admin_mail ;
? > </ l i >
</ o l >
<h4>Connexion à l a b a s e de d o n n é e s < / h4>
< o l >
< l i > P i l o t e PDO : <? php echo $ t h i s−>c o n f i g −>db−>a d a p t e r ; ? > </ l i >
< l i > S e r v e u r : <? php echo $ t h i s−>c o n f i g −>db−>params −>h o s t ; ? > </ l i
>
< l i > B a s e : <? php echo $ t h i s−>c o n f i g −>db−>params −>dbname ; ? > </ l i
>
< l i > L o g i n : <? php echo $ t h i s−>c o n f i g −>db−>params −>username ;
? > </ l i >
</ o l >
On programme dans la vue comme dans n’importe quel script PHP, avec la particularité que les données « dynamiques » sont disponibles dans l’objet $this parce qu’elles ont été placées là par l’action associée à la vue Le script-vue ne sert qu’à mettre en forme ces données, pas à les créer ou les modifier Nous reviendrons sur la gestion de la vue dans le Zend Framework page 376
Le moment est probablement venu pour vous de faire une pause Parcourez l’arborescence des fichiers, et modifiez ceux qui interviennent dans l’exécution de l’action index du contrôleur Index Il s’agit de controllers/IndexControlller.php et views/s-cript/index/index.phtml Clarifiez les interactions entre ces compoants (contrôleur, action
et vue : nous n’avons pas encore vu le modèle) La suite revient plus longuement sur les composants Zend relatifs au MVC et aux bases de données
9.2 ACCÈS À LA BASE DE DONNÉES
Le contrôleur bd de l’application ZSCOPEmontre comment utiliser la connexion à
la base, instance de Zend_Db_Adapter, pour accéder classiquement à une base de données par des requêtes SQL Sur ce point, le ZF s’appuie très largement sur PDO (voir page 238) qui propose déjà tout ce qui est nécessaire à un accès normalisé aux bases relationnelles Ce qui suit n’est donc qu’une introduction assez rapide, que vous pouvez compléter avec la documentation PDO en ligne
Trang 39.2.1 Interrogation
La méthode query() prend une requête et retourne une instance de Zend_Db_Statement qui permet de parcourir le résultat Le mécanisme est totalement standard et conforme à ce que nous utilisons depuis le début du livre
Voici l’action queryfetch() qui interroge la table Film.
f u n c t i o n q u e r y f e t c h A c t i o n ( )
{
/ / On r é c u p è r e l a c o n n e x i o n d a n s l e r e g i s t r e
$bd = Z e n d _ R e g i s t r y : : g e t I n s t a n c e ( )−>g e t ( ’ db ’ ) ;
/ / E x é c u t i o n d e l a r e q u ê t e
$ r e s u l t =
$bd−>que r y ( "SELECT id , t i t r e , annee FROM Film WHERE annee
> 1980 " ) ;
/ / I t é r a t i o n s u r l e s f i l m s
$ t h i s−>view−>f i l m s = a r r a y ( ) ;
w h i l e ( $ f i l m = $ r e s u l t−>f e t c h ( Zend_Db : : FETCH_OBJ) ) {
$ t h i s−>view−>f i l m s [ ] = $ f i l m ;
}
}
Essentiellement, on interroge la base, puis on itère sur le résultat en plaçant chaque objet dans un tableau de $this->view Le paramètre de la méthode fetch() indique le format dans lequel on souhaite récupérer chaque ligne Comme d’habitude, au lieu d’OBJ, on peut utiliser ASSOC pour des tableaux associatifs, NUM pour des tableaux indicés, et quelques autres options moins utiles Le script de vue parcourt ce tableau et crée le document HTML de présentation Notez la méthode escape() de la vue qui s’assure que les caractères perturbant le document HTML sont neutralisés
Exemple 9.5 zscope/application/views/scripts/bd/queryfetch.phtml : La vue affichant la liste des films
V o i c i l a l i s t e d e s f i l m s t r o u v é s d a n s l a b a s e
< o l >
<? php f o r e a c h ( $ t h i s−>f i l m s a s $ f i l m ) { ? >
< l i > <? php echo $ t h i s−>e s c a p e ( $film −> t i t r e ) ; ? > </ l i >
<? php } ? >
</ o l >
En général, on utilise des requêtes contenant des paramètres venant de formu-laires ou autres, qu’il faut prendre garde d’échapper pour éviter les caractères posant problème Les méthodes quoteInto() et quote() effectuent cet échappement en tenant compte des règles propres au serveur auquel on est connecté Ces régles
Trang 4varient d’un SGBD à un autre Pour MySQL, nous savons qu’il faut placer une barre oblique inversée devant les « ’ », pour ORACLE il faut les doubler, etc Voici un exemple avec quoteInto()
f u n c t i o n q u o t e A c t i o n ( )
{
/ / On r é c u p è r e l a c o n n e x i o n d a n s l e r e g i s t r e
$bd = Z e n d _ R e g i s t r y : : g e t I n s t a n c e ( )−>g e t ( ’ db ’ ) ;
/ / Le t i t r e du f i l m c h e r c h é
$ t i t r e = " J e a n n e d ’ Arc " ;
$ t h i s−>view−> t i t r e = $ t i t r e ;
/ / P r é p a r a t i o n d e l a r e q u ê t e
$ r e q u e t e = $bd−>q u o t e I n t o ( "SELECT ∗ FROM Film WHERE t i t r e =? " ,
$ t i t r e ) ;
$ r e s u l t = $bd−>que r y ( $ r e q u e t e ) ;
/ / I t é r a t i o n s u r l e s f i l m s
$ t h i s−>view−>f i l m s = a r r a y ( ) ;
w h i l e ( $ f i l m = $ r e s u l t−>f e t c h ( Zend_Db : : FETCH_OBJ) ) {
$ t h i s−>view−>f i l m s [ ] = $ f i l m ;
}
}
Il existe tout un catalogue de méthodes fetch pour récupérer, au choix, toutes les lignes d’un résultat, ou bien sa première ligne, ou bien la première colonne de sa première ligne, etc Voici l’action fetch qui vous donnera une idée de l’utilisation
de ces méthodes La documentation de Zend sur le composant Zend_Db détaille la liste de toutes les possibilités
/ ∗ ∗
∗ Q u e l q u e s m é t h o d e s f e t c h ∗∗∗ d e f Zmax_Db_Adapter
∗ /
f u n c t i o n f e t c h A c t i o n ( )
{
/ / On r é c u p è r e l a c o n n e x i o n d a n s l e r e g i s t r e
$bd = Z e n d _ R e g i s t r y : : g e t I n s t a n c e ( )−>g e t ( ’ db ’ ) ;
/ / Tous l e s f i l m s c o n t e n a n t un ’ v ’ ,
$ r e q u e t e = " SELECT t i t r e , annee , g e n r e FROM F i l m WHERE t i t r e LIKE ’%v%’ " ;
$ t h i s−>view−>r e q u e t e = $ r e q u e t e ;
/ / A t t e n t i o n , on v e u t t o u j o u r s r é c u p é r e r d e s o b j e t s
$bd−>setFetchMode ( Zend_Db : : FETCH_OBJ) ;
/ / F e t c h : comme un t a b l e a u d ’ o b j e t s
$ t h i s−>view−>f i l m s = $bd−>f e t c h A l l ( $ r e q u e t e ) ;
/ / On p r e n d u n e s e u l e l i g n e , l a p r e m i è r e du r é s u l t a t
$ t h i s−>view−>f i l m = $bd−>fetchRow ( $ r e q u e t e ) ;
Trang 5/ / On p r e n d u n e v a l e u r d a n s u n e l i g n e
$ t h i s−>view−> t i t r e = $bd−>fetchOne ( $ r e q u e t e ) ;
}
Avec ces méthodes fetch, l’exécution de la requête et la récupération du résultat s’effectuent en un seul appel Il est souvent pratique de pouvoir récupérer facilement une ligne ou une valeur spécifique dans la base de données
9.2.2 Insertion et mise à jour
Les modifications de la base, que ce soit insertion ou mises à jour, bénéficient également de méthodes génériques Ces méthodes effectuent automatiquement les échappements nécessaires pour s’assurer que les modifications s’exécutent sans pro-blème Voici l’action insert illustrant une insertion
/∗ ∗
∗ Comment i n s é r e r d a n s une t a b l e
∗ /
f u n c t i o n i n s e r t A c t i o n ( )
{
/ / On r é c u p è r e l a c o n n e x i o n d a n s l e r e g i s t r e
$bd = Z e n d _ R e g i s t r y : : g e t I n s t a n c e ( )−>g e t ( ’ db ’ ) ;
/ / On v e u t i n s é r e r l ’ E s p a g n e On co mmence p a r s u p p r i m e r
/ / s i e l l e e x i s t e d é j à
$bd−>que r y ( "DELETE FROM Pays WHERE code = ’ES ’ " ) ;
/ / M a i n t e n a n t on d é f i n i t l e t a b l e a u d e s d o n n é e s à i n s é r e r
$ e s p a g n e = a r r a y ( " c o d e " => " ES " , " nom " => " E s p a g n e " , " l a n g u e
" => " E s p a g n o l " ) ;
/ / On i n s è r e e t on r é c u p è r e l e n o m b r e d e l i g n e s i n s é r é e s
$ t h i s−>view−>n b _ l i g n e s = $bd−> i n s e r t ( " Pays " , $espagne ) ;
}
Pour être complet, voici le code d’une mise à jour
f u n c t i o n u p d a t e A c t i o n ( )
{
/ / On r é c u p è r e l a c o n n e x i o n d a n s l e r e g i s t r e
$bd = Z e n d _ R e g i s t r y : : g e t I n s t a n c e ( )−>g e t ( ’ db ’ ) ;
/ / T a b l e a u d e s c o l o n n e s à m o d i f i e r
$ u p d a t e _ v a l = a r r a y ( " l a n g u e " => " A n g l a i s US" ) ;
/ / C l a u s e w h e r e p o u r l a m o d i f i c a t i o n
$where [ ] = " c o d e = ’US ’ " ;
$ n b _ r o w s = $bd−>update ( " Pays " , $update_val , $where ) ;
}