Monthly Archives

6 Articles
Installation de ZendX Jquery

Installation de ZendX Jquery

Tant que j’ai un peu de temps, autant vous faire des explications sur l’installation de ZendX_JQuery.

Comme je vous l’ai expliqué dans l’installation de Zend, nous pouvons rajouter des librairies externes dans le dossier Library. Ici, nous allons donc ajouter la librairie ZendX. Nous devons donc trouver le dossier Zend et le dossier ZendX directement dans Libray.

Ensuite, il faut savoir que par défaut, Zend peut trouver les classes qui se trouvent dans le dossier ZendX mais, les aides de vue ne peuvent pas être utilisées directement. Pour se faire, il faut rajouter les lignes suivantes dans le bootstrap, de préférence dans la partie _initView() :
protected function _initView()
{
// Initialize view
$view = new Zend_View();
$view->doctype('XHTML1_STRICT');
$view->headMeta()->appendHttpEquiv('Content-Type',
'text/html; charset=utf-8');
$view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
$view->addHelperPath('App/View/Helper/', 'App_View_Helper');
$view->addHelperPath('ZendX/JQuery/View/Helper', 'ZendX_JQuery_View_Helper');
Zend_Dojo::enableView($view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml');
// Add it to the ViewRenderer
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$viewRenderer->setView($view);
//seulement si on utilise d'autres frameworks ajax
ZendX_JQuery_View_Helper_JQuery::enableNoConflictMode();
// Return it, so that it can be stored by the bootstrap
return $view;
}

Si vous avez mis la ligne ZendX_JQuery_View_Helper_JQuery::enableNoConflictMode(); alors faites attention, dans vos codes JQuery, vous devrez avoir $j et non $.

Mais, ceci ne suffit toujours pas, en effet, il va falloir ajouter les lignes suivantes dans les balises header de votre page afin que Zend intègre directement les fichiers JavaScript et style rattachés à JQuery (de préférence dans le Layout). Voici les lignes à rajouter :
$this->jQuery()->enable();
echo $this->jQuery();

Je rajoute toujours $this->jquery->enable() ; au cas où car dans certaines pages, même si je l’intègre dans un script de vue, sa ne marche pas donc je préfère l’intégrer ici en plus pour en être certain.

Voilà, maintenant ZendX_JQuery est fonctionnel sur votre projet. Les aides de vue sont utilisables et vous avez maintenant accès aux ZendX_JQuery_Forms.

Aides de vue JQuery

Aides de vue JQuery

Cet article m’a été demandé et donc je le fais, peut-être en retard mais je n’ai pas eu le temps de le faire plus tôt. Il a pour but l’utilisation de code JQuery à travers l’aide de vue associé à cet effet. Je vais utiliser un exemple concret avec l’utilisation du module « thickbox » permettant l’affichage d’images d’un format plus grand dans une nouvelle fenêtre.

Tout d’abord, il faut avoir installé l’extention ZendX_JQuery dans votre projet. Un sujet détaillant l’installation va arriver prochainement. Ensuite, il faut savoir utiliser les aides de vue qui nous intéresse, ici il s’agit des aides suivantes :
//permet d'ajouter des feuilles de script dans la pile de JQuery
$this->jQuery()->addJavascriptFile();
//permet d'ajouter une feuille de style dans la pile de JQuery
$this->jQuery()->addStylesheet();

Ensuite, il nous faut télécharger le module JQuery Thickbox à cette adresse : http://jquery.com/demo/thickbox/ Par contre ce module n’est plus maintenu à jour. Mais il convient parfaitement pour créer une galere d’image. Je ne vais pas revenir sur l’utilisation et la mise en page de ce module. Vous trouverez toutes les aides sur le site. Juste que nous, avec nos aides, nous allons intégrer dynamiquement, pour la page seulement qui nous intéresse, les lignes script et styles concernées dans le header.

Tout en haut de notre script de vue, nous ajoutons les lignes suivantes afin de mettre en place thickbox :
$this->jQuery()->addJavascriptFile($this->BaseUrl().'/scripts/thickbox-compressed.js')
->addStylesheet($this->BaseUrl().'/styles/thickbox.css')
->enable();

La fonction enable() est ici obligatoire sinon le module JQuery ne se chargera pas.

Dans la vue nous avons aussi la mise en forme décrite dans la documentation de thickbox.

Voilà, ici nous voyons l’intérêt de telles fonctions afin d’intégrer de l’ajax directement dans les pages qui nous intéressent afin de ne pas prolonger inutilement le chargement des autres pages.

Vue d’ensemble

Comme vous le savez sûrement, à chaque action est rattachée une vue. Par exemple dans votre contrôleur vous avez l’action fooAction() et la vue foo.phtml.

Là ça deviens plus dur pour un découpage fonctionnel. Effectivement pour votre blog vous voulez afficher sur la même page l’action articleAction() et commentaireAction().

Cette question m’a souvent taraudé l’esprit et en regardant la documentation, je tombai sur cette aide de vue :
$this->action(string action, string controller, string module, array params) ;
Pour simplifier voici une image montrant un plan de découpe d’une page de news:

L’action que l’on appelle dans le lien sera notre action news : http://monsite.com/news/index/index/ A l’intérieur on fait notre mise en page html et aux endroits où on veut qu’apparaisse nos autres actions (ici menu haut et menu bas) il vous suffira de faire par exemple:


Voilà. Cet article est terminé, ici j’ai juste essayer de vous montrer une possibilité offerte par le framework.

Introduction au Framework Zend – Partie 1

Quelques personnes me demandent toujours des bouts de code afin de voir comment fonctionne le framework Zend, comment on fait pour avoir plusieurs controllers, modules, views, … Pourtant, la plupart des tutoriels fournis sur le site officiel et sur certains sites de développeurs sont amplement suffisants.

Je vais donc revenir pas à par sur le fonctionnement et l’organisation du framework. Bien entendu, la partie Bootstrap sera omise, vu qu’un sujet le traite déjà sur mon site. Vous trouverez cet article ici.

Tout d’abord, vous devez savoir que je préfère travailler en module. Chaque module gère un cas d’utilisation de mon site et me permet ainsi une meilleure portabilité et une meilleure gestion de ceux-ci.

Voici donc l’organisation typique de mes projets. (ici vous avez l’organisation d’un de mes sites).

A l’intérieur, il y a 3 dossiers principaux :

Application : ce dossier contient toute la partie développement du site.

Library : ce dossier, qui est l’un des plus importants, va contenir le framework Zend ainsi que des bibliothèques annexes (html2pdf par exemple). – Public : ce dossier va contenir tous les fichiers publics du site (images, fichiers à télécharger, styles CSS, scripts JS, …) ainsi que notre fichier d’amorçage et notre fichier .htaccess.

Revenons aux modules qui se trouvent être la partie qui nous intéresse ici. Le dossier module va contenir les dossiers de chaque modules (news, article, …) et chacun de ces dossiers contient les dossiers suivants :

controllers : contient chacun des controllers du module. – Forms : contient chacun des formulaires du module (choix perso). – Models : contient chacun des models du module (les abstract table). – Views : contient toutes les vues, aides de vues et paginations du module.

Jusque là, c’est assez simple. Sachez tout de même qu’un module nommé default est automatiquement créé, il s’agit du module contenant le controller et l’action d’accueil du site. Chose importante, toutes les classes contenues dans ce module n’ont pas besoin d’avoir Default_ en début de nom (voir ci-dessous) et ce module n’a pas besoin de bootstrap.

Chaque module a besoin d’une règle particulière pour bien fonctionner. En effet, le framework doit savoir à quel module correspond le controller et dans quel dossier il est stocké.

Pour le dossier controllers, rien de plus simple, votre controller doit se présenter de la façon suivante :
class Blog_IndexController extends Zend_Controller_Action {
}

Pour les models et les formulaures par contre, c’est de cette forme ci :
class Blog_Forms_Blog extends Zend_Form {
}

class Blog_Models_Tables_ArticleBlog extends Zend_Db_Table_Abstract{
}

Tout ceci afin de permettre au framework de trouver vos fichiers. Les « _ » sont remplacés en interne par le caractère de séparation de dossier donc si votre formulaire s’appelle Blog_Forms_Blog, il sera compris de cette forme par Zend : blog/forms/Blog.php

Pour le moment je ne vous ai fait que l’introduction au fonctionnement et à la mise en place d’un projet. D’ici quelques jours je parlerai du lien entre le controller et la vue et nous mettrons ensuite en place un Layout afin d’avoir l’apparence globale de nos sites.

Optimiser Zend – Partie 1

Cela fait un moment que je ne vous ai pas refait de tutoriaux pour le Framework Zend. Aujourd’hui je vous propose une adaptation d’un tutoriel en anglais que l’on m’avait fait parvenir et qui m’a grandement aidé (malheureusement, il n’est plus sur la toile).

Vous savez comme moi que l’un des points faibles de Zend Framework, c’est la performance, il est beaucoup plus lent que du PHP objet de base du fait de la majeur partie des classes qui sont chargées lors du lancement d’une page. Je vais donc réaliser ce tutoriel en plusieurs parties.

Aujourd’hui, je vais juste vous expliquer comment diminuer les chargements inutiles et redéfinir le fichier d’amorçage (le fameux index.php). Vous vous souvenez tous comment est composé le fichier index.php ? Et bien voici un petit rappel pour ceux qui ne savent pas :
/**
* Fichier index.php permettant de lancer le bootstrap
*
*/

//Définition du chemin vers le dossier application
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH',
realpath(dirname(__FILE__) . '/../application'));

//Définition de la variable de d'application (utile pour les fichiers de configuration
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV',
(getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
: 'production'));

//Partie permettant d'inclure les différentes librairies
//du dossier library (en théorie).
//Nécessite un complément côté bootstrap.
set_include_path(implode(PATH_SEPARATOR, array(
dirname(dirname(__FILE__)) . '/library',
get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Créer l'application, le bootstrap et démarre
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configurations/app.ini'
);
$application->bootstrap()
->run();

Nous allons juste ajouter une petite partie permettant d’inclure plus rapidement les classes de Zend en repassant par Zend_Autoloader et nous redéfinirons sa méthode d’inclusion. Voici donc le nouveau index.php qui vous parlera mieux que mes explications :
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH',
realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV',
(getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
: 'production'));

// Typically, you will also want to add your library/ directory
// to the include_path, particularly if it contains your ZF install
set_include_path(implode(PATH_SEPARATOR, array(
dirname(dirname(__FILE__)) . '/library',
get_include_path(),
)));

//redéfinition de l'autoloader par défaut afin d'optimiser le chargement
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setDefaultAutoloader(create_function('$class',
"include str_replace('_', '/', \$class) . '.php';"
));

/** Zend_Application */
//require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configurations/app.ini'
);
$application->bootstrap()
->run();

Cette partie ne suffit pas, pour gagner encore du temps, je vous invite à suivre le conseil donné par l’équipe Zend en fin de documentation, à savoir, supprimer tous les require_once inutiles de la bibliothèque Zend. (je vous invite aussi à les enlever de vos controller, formulaires, …).

En effet, pour chaque require_once, le serveur va effectuer des accès disque et c’est ces accès disques qui ralentissent le serveur. La méthode est donc de les enlever et ensuite, notre redéfinition faite dans le index.php prendra le relais, elle effectuera tardivement le chargement de tous les fichiers nécessaires afin d’optimiser le chzrgement de nos classes. La documentation Zend explique mieux que moi cette partie:

Le chargement tardif (« lazy loading ») est une technique d’optimisation conçue pour repousser l’opération coûteuse de chargement d’une classe jusqu’au dernier moment possible – c’est-à-dire lors de l’instanciation d’un objet de cette classe, ou lors de l’utilisation d’une constante de classe ou d’une propriété statique. PHP supporte tout ceci via l’autoloading (ou « chargement automatique »), ce qui vous permet de définir un ou plusieurs callbacks à exécuter dans le but de faire correspondre un nom de classe à un fichier.

Cependant, la plupart des avantages que vous pourrez retirer de l’autoloading sont diminués si le code de votre librairie exécute toujours des appels à require_once – ce qui est précisément le cas de Zend Framework. La question est donc : comment éliminer ces déclarations require_once dans le but de maximiser les performances de l’autoloader.

Pour ce faire, il ne vous suffit que d’exécuter cette commande sous Linux (je rajouterai celle sous Windows et FreeBSD quand je les aurais retrouvé) :
% cd chemin/vers/la/librarie/ZendFramework
% find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0 | \
xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

Pour finir, nous définissons une nouvelle fonction dans notre Bootstrap principal afin que lui aussi tire parti de ces changements :
public static function autoload($class)
{
include str_replace('_', '/', $class) . '.php';
return $class;
}

Voilà, après ces quelques modifications, votre site devrait se charger un poil plus vite et consommer moins de mémoires.

Dans la seconde partie, je vous expliquerai comment créer une méthode qui mesure la charge mémoire de chacune de vos pages. Si vous avez des questions, des remarques, des critiques ou même des corrections, n’hésitez pas à me les faire parvenir.