Archives de l’auteur : dwmjf

Aide de vue dans les layouts de Zendframework 2 : Exemple

Présentation de l'exemple

Une aide de vue, ou ViewHelper, sert à factoriser des bouts de code pour nos views ou layouts.

L'appel à notre aide de vue se fera très simplement. Prenons par exemple le cas où on a besoin de déclarer des feuilles de style dont les noms sont contenus dans un tableau :

Dans cet exemple, on utilise deux aides de vue, basePath() qui est fournie dans le package Zendframework 2 et getHeadLinks() que je vais développer ci-dessous.

Pour mon aide de vue je passe trois paramètres :

  • $base_path : la racine du service fournie par l'aide de vue de ZendFramework
  • $favicon_file : le favicon à utiliser pour cette page
  • $config['css'] : le tableau provenant du config/module.config.php

Dans config/module.config.php, je décris les feuilles de style à charger de la façon suivante :

cela devra donner dans le code de la page :

Implémentation de notre aide de vue

Une aide de vue, ou ViewHelper, est une classe dérivée de Zend\View\Helper\AbstractHelper. Pour mon cas, je l'appelerai HeadLinks et elle sera placée dans le src du module, dossier View/Helper :

Sa méthode _invoke() retournera le résultat en invoquant son nom déclaré dans module.php dans la méthode getViewHelperConfig().

Dans mon aide de vue, j'ai besoin d'utiliser l'aide de vue headLink de Zendframework. Or, je ne peux pas utiliser l'alias headLink qui n'est pas invokable. Je vais donc utiliser la classe directement.

Utilisation de mon aide de vue dans un layout

Pour utiliser mon aide de vue dans un layout, je dois disposer d'une variable $this->config qui contient notamment la clé 'css' donnant la structure à monter (en fait, je passe également dans ce tableau tous les éléments constitutifs du layout comme les composants du header, du footer, etc.).

Comment passer une variable à un layout ?

Première façon : depuis un contrôleur

Dans un contrôleur, on a accès au layout par la méthode layout(). On crée donc les variables directement :

En particulier pour mon cas, je trouverai la valeur de ma variable de configuration de la façon suivante :

Deuxième façon : depuis la classe Module

Etant donné que la configuration est disponible dans la classe Module, on peut créer la variable depuis la méthode onBootstrap() de cette classe :

Troisième façon : en dérivant la classe Module de ZfcBase\Module\AbstractModule

On devra alors restructurer le fichier module.config.php de la façon suivante :

Ainsi, on pourra utiliser dans le module la méthode getOptions() :

Cela va permettre d'utiliser une configuration particulière pour chaque module de l'application. Mais ça, ce sera l'objet d'un prochain article.

Voir aussi un article complet sur la création d'un ViewHelper dans ZF2.

Utilisation de composer.phar

Le fichier composer.phar doit être présent à la racine du projet qu'il va gérer.

S'il n'est pas présent, on peut l'installer par la commande :

S'il est présent, on peut lancer une recherche pour obtenir sa dernière version stable :

Ensuite, il faut créer un fichier composer.json qui va décrire le projet. On peut utiliser la commande :

Cette commande va demander d'indiquer les renseignements décrivant le projet :

  • package name : le nom se donne sous la forme <vendor>/<name><vendor> est le nom de votre organisation et <name> est le nom de votre projet
  • description : description de votre projet
  • author : votre nom et adresse email
  • minimum stability : les valeurs possibles sont stable, RC, beta, alpha, dev
  • license : nom de la licence indiquant les droits sur ce logiciel
  • dependencies : indiquer ici les noms et versions des bibliothèques nécessaires au projet en production comme par exemple zendframework 2.3.* (require)
  • dev dependencies : indiquer ici les noms et versions des bibliothèques nécessaires uniquement au développement comme par exemple zendframework/zftool ou bjyoungblood/bjy-profiler, etc. (require-dev)

Pour trouver plus facilement les bibliothèques (dependencies et dev dependencies), répondez yes à la question : Would you like to define your dependencies (require) interactively [yes]?

Ensuite, voici un exemple pour ajouter bjyoungblood/bjy-profiler

Puis on lance le téléchargement des bibliothèques indiquées par

Par la suite, on peut rajouter une bibliothèque en lançant la commande :

[paquet1] ... [paquetN] sont les noms des bibliothèques à installer séparés par un espace
et --dev indique qu'il faut ajouter la bibliothèque à la liste des dev dependencies

La mise à jour des bibliothèque se fait en lançant la commande :

WampServer et ZendFramework

Je développe plusieurs projets sous Zendframework 1 et 2. Par commodité j'ai choisi de mettre en place un virtualhost par projet afin ce coller au mieux à la configuration de production propre à chacun de mes clients.

Jusqu'à maintenant, j'utilisais pour le développement un Zend Server Community Edition 5.6 (licence gratuite) mais je n'ai pas trouvé comment faire évoluer gratuitement les versions de Php. Aussi je viens d'installer WampServer 2.4 comme serveur de développement, sous Windows 7. Il est composé de :

  • Apache 2.4.4
  • MySql 5.6.12
  • Php 5.4.12
  • PhpMyAdmin 4.0.4
  • SqlBuddy 1.3.3
  • XDebug 2.2.3

Si les mises à jour de WampServer semblent plus faciles à gérer, ce service semble légèrement plus lent (pas grave en développement) et sa configuration diffère sensiblement de celle de Zend Server.

Cet article détaille les configurations que j'ai faites.

Configuration de MySql

Avant d'installer WampServer, il faut s'assurer que le service MySql n'est pas démarré, sinon l'installation risque à bloquer au moment de la mise en place de MySql.

Un dump des bases de données est fait avant l'arrêt du service MySql précédent.

Une fois l'installation de WampServer terminée, je constate que le service MySql fonctionne :

 

Reste quelques opérations à faire :

  • créer un mot de passe pour root. J'utilise la console pour plus de facilité :
  • s'assurer que le path de l'ordinateur pointe bien sur le répertoire bin de la bonne version de MySql (chez moi, il pointait toujours sur la version précédente ce qui fait que mysqladmin et mysqldump ne correspondaient pas à la bonne version).
    variables-d-environnement
    (On en profite aussi pour rajouter le chemin de php.exe qui sera utile par la suite)
  • recharger en premier le dump de la base mysql et ensuite ceux des autres bases.

 Configuration d'apache

Comme toujours, la configuration d'apache se trouve dans son répertoire conf, dans le fichier httpd.conf. On aura besoin de charger le module rewrite et de faciliter la création des virtualhosts. Pour cela, j'apporte les modifications suivantes :

  • décommenter la ligne suivante :
  • ajouter la ligne suivante :

    Ainsi, chaque virtualhost sera configuré dans un fichier indépendant du répertoire vhosts de wamp et il n'y aura plus à retoucher ce fichier httpd.conf. Le nom du fichier doit commencer par vhost_ et l'extension est .conf.
  • créer un virtualhost pour localhost.
    En effet, lorsqu'on crée un virtualhost, l'alias localhost ne fonctionne plus. Pour régler ce problème, je crée le fichier vhosts/vhost_localhost.conf suivant :

    La définition des droits de ce répertoire est contenue dans httpd.conf donc on n'a pas besoin d'y retoucher.
  • exemple d'un virtualhost pour un projet jobeet utilisant Zendframework 2 :

importantPassant de la version 2.2 à la version 2.4 d'apache, on notera ici la nécessité de se référer à la documentation d'Apache pour remplacer les directives Order, Allow et Deny par la directive Require.

Il peut être intéressant pour les projets qui n'utilisent pas Zendframework de rajouter dans le bloc <Directory> la ligne :

afin de pouvoir lister le contenu des répertoires (nous sommes sur un serveur de développement). Cela n'a pas d'utilité avec Zendframework puisque tout démarre de public/index.php.

Configuration de PHP

La spécificité de WampServer  est d'utiliser deux fichiers php.ini, l'un  pour la console (pour moi dans le dossier phpphp5.4.12) et l'autre pour le serveur web (pour moi dans apacheApache2.4.4bin). Or l'activation d'une extension par l'outil d'administration de wamp n'intervient que sur le fichier php.ini d'apache ... et encore, de façon imparfaite.

Pour activer une extension, il faut décommenter la ligne de cette extension dans les deux fichiers php.ini.
importantPour l'extension intl, il faut en outre copier les fichiers icu*.dll du dossier phpphp5.4.12 dans le dossier apacheApache2.4.4bin. Sans cela, apache ne charge pas cette extension dans php.

Ne pas oublier de redémarrer les services après toute modification de php.ini.

Installation de PEAR

Bien évidemment, on aura besoin de pear, ne serait-ce que pour effectuer des tests unitaires avec PhpUnit... et pear n'est pas dans le paquet d'installation de WampServer.

Voici la procédure à suivre :

  • télécharger go-pear.phar et l'enregistrer dans le répertoire de la version de php (celui qui contient php.exe - ici, j'ai le dossier php5.4.12 au moment où je rédige cet article).
  • ouvrir une console (démarrer / cmd) et se placer dans ce répertoire et lancer la commande :

    console-dossier-php Répondre local et valider.
  • Il y a maintenant 12 paramètres à fournir pour l'installation. Valider tous les répertoires proposés par défaut (chez moi de 1 à 11). Compléter éventuellement (pour le 12e paramètre - Path to CLI php.exe - j'indique le chemin C:Program Fileswampbinphpphp5.4.12).
  • Autoriser la modification de php.ini pour prendre en compte le chemin des extensions de pear (ici, C:Program Fileswampbinphpphp5.4.12pear) dans la variable include_path.
  • Il semble qu'il y ait 2 fichiers php.ini, l'un dans le dossier de la version de php (ici php5.4.12) et l'autre dans le dossier d'Apache. Le gestionnaire de WampServeur propose de modifier le fichier php.ini. Il s'agit de celui contenu dans le dossier d'Apache, alors que la procédure d'installation de pear modifie celui du dossier de la version de php. On va donc rapporter la modification réalisée dans le php.ini d'Apache :
  • Il reste à surcharger les variables d'environnement de l'ancienne installation de pear avec Zend Server :
    • PHP_PEAR_BIN = C:Program Fileswampbinphpphp5.4.12
    • PHP_PEAR_DAT = C:Program Fileswampbinphpphp5.4.12data
    • PHP_PEAR_DOC = C:Program Fileswampbinphpphp5.4.12docs
    • PHP_PEAR_INSTALL_DIR = C:Program Fileswampbinphpphp5.4.12pear
    • PHP_PEAR_PHP_BIN = C:Program Fileswampbinphpphp5.4.12php.exe
    • PHP_PEAR_SYSCONF_DIR = C:Program Fileswampbinphpphp5.4.12
    • PHP_PEAR_TEST_DIR = C:Program Fileswampbinphpphp5.4.12tests
  • Maintenant on vérifie que pear fonctionne. console-pear-list

 Installation de PhpUnit

  • Ajout des channels nécessaires :
  • Installer PhpUnit :
  • Pour le bon fonctionnement de PhpUnit, notamment phpunit --self-update, on doit pouvoir charger l'extension openssl. L'outil d'administration qui permet de charger les extension ne suffit pas parcequ'il n'intervient que sur le fichier php.ini d'Apache alors que phpunit sera lancé en console. Il faut donc modifier manuellement le fichier php.ini du répertoire de la version de php (ici wamp/bin/php/php5.4.12/php.ini).
    Dans ce fichier, décommenter la ligne :

    puis redémarrer les services de wamp. On vérifiera à partir d'une console (cmd) que l'extension openssl est chargée en lançant la commande :

console-phpunit-channels

 Installation de Zendframework 1

Etant donné que ces projets évolueront peu, j'ai choisi de placer la librairie de Zendframework 1 dans un seul répertoire qui sera disponible pour tous les projets. J'y ai rajouté la documentation.

 

Cela nécessitera de référencer ce dossier library dans l'include_path de php. Toutefois, afin de pouvoir facilement faire évoluer les versions de Zendframework et de rester indépendant de le configuration, j'ai décidé de placer cette référence dans le .htaccess du projet et de modifier le fichier public/index.php des projets.

Voici le .htaccess :

A noter qu'il sera sans doute nécessaire de supprimer de l'affichage les alertes de compatibilité que PHP 5.4 envoie. Pour cela, il faut rajouter dans .htaccess la ligne :

Voici l'entête de mes fichiers index.php :

Installation de Zendframework 2

Pour ZF2, j'utilise composer.phar qui installe une librairie ZF2 dans chaque projet et met à jour les fichiers autoloader. Je n'ai donc pas trouvé utile d'installer la librairie du framework.

Soit on part du projet Zend Skeleton, soit on installe composer.phar dans le dossier racine du projet par la commande :

à condition que curl soit installé, bien évidemment.

PHPUnit sous Windows 7 et la couleur sur la console

Lors des tests unitaires avec PHPUnit, un code couleur (code ANSI) apparaît en fin de message mais n'est pas interprété par la console windows.
D:\www\projet\tests>phpunit
..........
Time: 98 ms, Memory: 9.75Mb
←[30;42m←[2KOK (11 tests, 18 assertions)
←[0m←[2K
D:\www\projet\tests>

Pour obtenir la couleur, on peut utiliser le programme ansicon.

Décompresser ce zip et copier le contenu du répertoire x64 ou x86 (respectivement pour systèmes 64 bits ou 32 bits) dans un dossier référencé dans le path.

A chaque ouverture d'une console, exécuter ansicon avant de lancer les phpunit.
C:\Users\moi>ansicon
Microsoft Windows [version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.
C:\Users\moi>d:
D:\>cd www\projet\tests
D:\www\projet\tests>phpunit
..........
Time: 98 ms, Memory: 9.75Mb
OK (11 tests, 18 assertions)D:\www\projet\tests>

Zend Framework 2 Tool

Qu'est-ce que ZFTool ?

ZFTool est un utilitaire qui facilite la gestion d'un projet ZF2 lors du développement.
Cet outil permet de :

  • créer un projet de ZF2 par l'installation d'une application squelette;
  • créer un nouveau module dans une application de ZF2 existante;
  • obtenir la liste de tous les modules installés à l'intérieur d'une application;
  • obtenir le fichier de configuration d'une application ZF2;
  • installer la bibliothèque ZF2 en précisant une version spécifique.

Comment l'installer pour l'utiliser dans un projet ?

Sous windows, il faut placer le fichier zftool.phar dans la répertoire qui va contenir le projet.

php composer.phar require zendframework/zftool:dev-master

En savoir plus…

On obtient le résultat suivant :

./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing zendframework/zendframework (2.2.5)
Loading from cache

- Installing zendframework/zftool (dev-master d73bf6f)
Cloning d73bf6f0ae6ce9b92acc72ecc8f336e2352f3ae0

zendframework/zendframework suggests installing doctrine/annotations (Doctrine Annotations >=1.0 for annotation features)
zendframework/zendframework suggests installing ircmaxell/random-lib (Fallback random byte generator for Zend\Math\Rand if OpenSSL/Mcrypt extensions are unavail
able)
zendframework/zendframework suggests installing ocramius/proxy-manager (ProxyManager to handle lazy initialization of services)
zendframework/zendframework suggests installing zendframework/zendpdf (ZendPdf for creating PDF representations of barcodes)
zendframework/zendframework suggests installing zendframework/zendservice-recaptcha (ZendService\ReCaptcha for rendering ReCaptchas in Zend\Captcha and/or Zend\
Form)
Writing lock file
Generating autoload files

D:\www\monprojet>

Utilisation de ZFTool

L'installation de ZFToll a créé un dossier vendor\zendframework\zftool\.
On lancera les commandes en exécutant le fichier zf.php de ce dossier.

Liste des modules du projet
php vendor\zendframework\zftool\zf.php modules list

Version de ZendFramework
php vendor\zendframework\zftool\zf.php version
Diagnostic
php vendor\zendframework\zftool\zf.php diag [options] [module name]
[module name] (Optionnel) nom du module à tester.
-v --verbose Affiche des informations détaillées.
-b --break Arrête le test à la première erreur.
-q --quiet N'affiche rien sauf les erreurs.
--debug Affiche les information de débogage provenant des tests.
Création d'un projet
php vendor\zendframework\zftool\zf.php create project <path>
<path> Dossier dans lequel on veut créer le projet.
Création d'un module
php vendor\zendframework\zftool\zf.php create module <name> [<path>]
<name> Nom du module à créer.
<path> (Optionnel) Dossier racine de l'application ZF2.
Création d'un contrôleur
php vendor\zendframework\zftool\zf.php create controller <name> <module> [<path>]
<name> Nom du module à créer.
<module> Le module dans lequel le contrôleur doit être créé.
<path> (Optionnel) Dossier racine de l'application ZF2.
Création d'une action
php vendor\zendframework\zftool\zf.php create action <name> <controller> <module> [<path>]
<name> Nom du module à créer.
<controller> Nom du contrôleur dans lequel l'action doit être créée.
<module> Le module dans lequel le contrôleur doit être créé.
<path> (Optionnel) Dossier racine de l'application ZF2.
Configuration de l'application
php vendor\zendframework\zftool\zf.php config list
liste des options de configuration.
php vendor\zendframework\zftool\zf.php config get <name>
affiche la valeur de l'option demandée.
php vendor\zendframework\zftool\zf.php config set <name> <value>
enregistre une option et l'affecte de sa valeur.
Générateur de classmap
php vendor\zendframework\zftool\zf.php classmap generate <directory> <classmap file> [--append|-a] [--overwrite|-w]
<directory> Le répertoire à scanner pour les classes PHP (mettre "." pour analyser le répertoire courrant)
<classmap file> Nom du fichier à generer. S'il n'est pas fourni, par défaut ce sera 'autoload_classmap.php' dans .
--append | -a Ajoute au fichier s'il existe.
--overwrite | -w Indique si on remplacera le fichier s'il existe.
Installation de la bibliothèque ZF2
php vendor\zendframework\zftool\zf.php zf <path> [<version>]
<path> Le répertoire où doit être installé la bibliothèque ZF2.
<version> La version à installer, si non spécifiée la dernière version disponible sera installée.

School Bus Manager – Les scénarios

Utilisateurs anonymes

U1 : Page d'accueil
Elle présente un flash-info, des infos défilantes, l'accès à la carte, aux documents, au règlement du service, un lien pour s'identifier ou demander un compte.
U2 : Page des informations
Elle présente les articles publiés par le service, paginés, du plus récent au plus ancien.
U3 : Carte du service et horaires
Elle présente une carte interactive, un formulaire de recherche pour obtenir les circuits et les horaires à partir d'un point d'arrêt.
U4 : Page des documents à télécharger
Elle présente une liste de documents à télécharger, avec, pour chacun, une description.

Parents

P1 : Page d'accueil
Elle présente la liste des enfants inscrits et la liste des sommes dues. Un menu permet d'accéder aux différentes fonctions.
P2 : Page d'inscription
Elle permet d'inscrire un enfant ou de modifier son inscription (si c'est possible).
P3 : Page du compte du parent
Elle présente un formulaire permettant de modifier les renseignements (emails, mot de passe, adresse, téléphone).
P4 : Page de paiement des sommes dues
Elle propose de payer les sommes dues s'il y en a.

Gestionnaires

G1 : Page d'accueil
Elle présente un menu général et des données statistiques.
G2 : Page de gestion des élèves
Affichage de la fiche des élèves en mode consultation et d'un menu pour accéder aux différentes fonctions.
G3 : Page de gestion financière
Affichage de données sur les sommes facturées, les impayés, les sommes payées avec répartition par mode de paiement. Un menu permet d'accéder aux différentes fonctions.
G4 : Page de gestion du réseau de transport
Accès aux différentes tables annexes en consultation, modification. Edition des données. Composition des circuits à partir de ces données.
G5 : Page de simulation de scénarios sur le réseau de transport
à décrire

Administrateurs

A1 : Page d'accueil
Elle présente un tableau de données sur le service et un menu d'accès aux différentes fonctions.
A2 : Page de préparation d'une année scolaire
Elle présente un formulaire de paramétrage.

Cette liste est à compléter ...

School Bus Manager – Les utilisateurs

Le site sera accessible aux utilisateurs suivants :

  • utilisateurs anonymes.  Ils arrivent sur la page d'accueil qui propose de s'identifier, de consulter la carte des circuits, les horaires, les informations et le règlement du service, de télécharger les documents et formulaires mis à disposition.
  • parents. Ils peuvent inscrire leurs enfants, consulter la fiche de leurs enfants, payer les sommes dues, modifier leur compte.
  • gestionnaires. Ils peuvent gérer les tables annexes, inscrire les élèves, modifier le réseau de transport en déplaçant les élèves inscrits, effectuer la gestion financière, éditer des documents, extraire des données comptables (prélèvements, rôles).
  • administrateurs. Ils peuvent paramétrer les documents, changer d'année scolaire, accéder en ajout et modification à toutes les tables.

Les scénarios seront notés U pour les utilisateurs anonymes, P pour les parents, G pour les gestionnaires et A pour les administrateurs.

Utiliser Git et GitHub

1. Utiliser GitHub

Un bon tutoriel vidéo à l'adresse : http://www.youtube.com/watch?v=La3SaI2hjzE

2. Utiliser Git

Un tutoriel complet en français à cette adresse.

Une présentation vidéo détaillée de Sébastien Dawans (CETIC Université de Mons) : environ 1h30 sur youtube.

3. Récupérer les sources en écrasant les fichiers locaux

Se placer dans le dossier des fichiers locaux.

Eclipse

IDE de développement

Zend Eclipse for PHP Developers version 3.2.0

Choix du ZendFramework à inclure dans les nouveaux projets

Le réglage se fait par :

  • Menu Window / Preferences
  • Section PHP / Editor / ZendFramework
  • Choisir le ZendFramework dans la liste
  • Si nécessaire, ajouter une nouvelle version (dans C:\Program Files (x86)\Zend\ZF1 ou ZF2)

Attention, si on utilise composer.phar dans les projets, il est inutile de référencer ZF2 dans Eclipse.

Choix du ZendFramework pour un projet particulier

Le réglage se fait par :

  • Clic droit sur le projet pour obtenir le menu contextuel
  • Include Path / Configure Include Path...
  • Onglet Libraries
  • Sélectionner la version proposée puis Edit
  • Choisir la version désirée

Préparer des photos pour le web

On va utiliser ImageMagick

  • copier les photos à préparer dans un répertoire.
  • ouvrir une boite DOS ( lancer cmd)
  • se placer dans le répertoire contenant les photos à traiter
  • lancer la commande mogrify -resize 800x600 *.jpg

Les photos sont transformées sans conserver l'original.

Pour conserver l'original des photos, on peut utiliser la commande convert à la place de la commande mogrify. La syntaxe est décrite à cette page.