Développement Web, PHP, Zend Framework

Zend Framework : Une feuille de style par action

Posté par seiyar81 le 19 juillet 2010 | Laisser un commentaire (1)

Je partage une petite astuce qui m’est venue en développant aujourd’hui. Quand on travaille sur des applications plutôt importantes, on peut être amené à vouloir segmenter le CSS.

En effet un seul gros fichier avec toutes les classes dedans, c’est pas beau et c’est beaucoup plus difficile à maintenir que plusieurs fichiers, chacun contenant les classes et styles utilisées dans la vue.

Pour ajouter automatiquement une feuille de style correspondante à une action,  rien de plus simple, il suffit de placer le code suivant dans le(s) contrôlleur(s) souhaités :

  public function init()
  {
    $this->view->headLink()->appendStylesheet('/css/'.$this->getRequest()->getActionName().'.css');
  }

Ainsi, l’action index aura son fichier index.css et ainsi de suite !

Catégorie: Développement Web, PHP, Zend Framework | Laisser un commentaire (1)

DataTables en version beta 1.7

Posté par seiyar81 le 28 mai 2010 | Laisser un commentaire (0)

Datatables ce plugin pour jQuery, que j’ai déjà présenté par deux fois, permettant la gestion des tableaux HTML créé et maintenu par Allan Jardine viens d’être mis à jour en version beta 1.7.

Au programme, plusieurs corrections de bug concernant les cookies, les performances, les données, l’ajout du scrolling vertical et horizontal dans le tableau, on peut maintenant récupérer l’objet dataTables créé ou bien d’empêcher qu’on le récupère etc.
Pour essayer cette nouvelle version, plus d’infos sur la page officielle du plugin.
Catégorie: Brèves, Développement Web, Javascript | Laisser un commentaire (0)

Des statistiques en temps réel avec Clicky

Posté par seiyar81 le 12 avril 2010 | Laisser un commentaire (0)
Clicky

La concurrence est rude sur le marché des statistiques en ligne. Difficile de trouver sa place quand les mastodontes tels que Analytics de Google, Userfly ou Xiti occupent une place importante.
Les alternatives Open Source offrent des services équivalent avec par exemple Piwik (nouvelle version de phpMyVisites), SlimStat, JoomlaStats ou Joomla-Visites (composants pour Joomla) ou WP-Stats pour WordPress.
Mais je vais présenter une solution que j’utilise depuis 1 mois et qui a su se rendre indispensable a mes yeux : Clicky !

Clicky c’est quoi ?

Clicky, au même titre que ses collègues cités ci-dessus, est une solution de tracking. Elle existe depuis quelques années déjà et analyse à ce jour plus de 203 000 sites !
Clicky est un outil de tracking « comme les autres », on y retrouve donc toutes les informations classiques : détails des visites, recherches, graphes, objectifs etc … tout ceci dans une interface claire très agréable à utiliser.

Qu’est-ce que Clicky apporte de plus ?

Clicky se démarque de ses concurrents grâce à trois points bien précis :

  • Son interface claire et moderne
  • Sa version dédiée IPhone/Mobile
  • Les statistiques en temps réel

L’interface est une question de goût certains apprécieront d’autres pas, mais il faut avouer, une fois de plus, que l’utilisation est très agréable.
De même la version mobile servira à ceux qui possèdent un téléphone avec abonnement 3G.
Mais les statistiques en temps réel, c’est le gros point fort de Clicky, c’est le petit plus qui justifie son utilisation plutôt qu’une autre solution.

Là où la plupart des autres solutions de tracking ne rendent les données disponibles que le lendemain, Clicky met à jour en temps réel vos statistiques. Vous pouvez même (et ça c’est bien le pied) voir les visiteurs actuellement sur votre site grâce à un mode Espion. Vous voyez ainsi toutes les actions effectuées par les visiteurs, vous pouvez les suivre, les espionner ! Vraiment très pratique et indispensable une fois qu’on l’a essayé.

La question qui fâche : le prix ?

Oui tout ceci a un prix, car même si Clicky peut être utilisé en mode gratuit pour un site jusqu’à 3000 pages par jour, le mode Espion est réservé au compte payants.
Mais les prix restent raisonnable avec des offrent allant de 5$ à 20$ par mois. Il est possible de créer une offre personnalisée en choisissant le nombre de sites à tracker ainsi que le nombre de pages vues par jour. Enfin vous pouvez payer 1 an au prix de 6 mois, soit 30$ pour la version « Blogger » ou 60$ pour la version « Pro ».

Utilisée conjointement à Analytics pour son intégration d’AdSense et/ou AdWord, Clicky offre une très bonne alternative aux autres solutions de tracking.

Catégorie: Développement Web, Yriase | Laisser un commentaire (0)

Zend Framework / jQuery : Exemple de « view helper »

Posté par seiyar81 le 29 mars 2010 | Laisser un commentaire (0)

Dans la continuité du précédent billet sur le Zend Framework et jQuery, j’ai codé un view helper pour la ProgressBar de jQuery UI.

Je suis tout simplement parti du code du slider que j’ai bien rogné et un peu modifié pour arriver à un code fonctionnel.

Sans plus attendre le voici :

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category    ZendX
 * @package     ZendX_JQuery
 * @subpackage  View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license     http://framework.zend.com/license/new-bsd     New BSD License
 * @version     $Id: Slider.php 20165 2010-01-09 18:57:56Z bkarwin $
 */

/**
 * @see ZendX_JQuery_View_Helper_UiWidget
 */
require_once "ZendX/JQuery/View/Helper/UiWidget.php";

/**
 * jQuery ProgressBar View Helper
 *
 * @uses 	   Zend_Json
 * @package    ZendX_JQuery
 * @subpackage View
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class ZendX_JQuery_View_Helper_ProgressBar extends ZendX_JQuery_View_Helper_UiWidget
{
    /**
     * Create a jQuery progressbar
     *
     * @link   http://docs.jquery.com/UI/Progressbar
     * @param  string $id
     * @param  string $value
     * @param  array  $params
     * @param  array  $attribs
     * @return string
     */
    public function progressBar($id, $value, array $params = array(), array $attribs = array())
    {
        if(!isset($attribs['id'])) {
            $attribs['id'] = $id;
        }

        $jqh = ZendX_JQuery_View_Helper_JQuery::getJQueryHandler();

        if(count($params) <= 0) {
            $params = ZendX_JQuery::encodeJson(array('value'=>$value));
        } else {
            $params = ZendX_JQuery::encodeJson($params);
        }

        $js = sprintf('%s("#%s").progressbar(%s);', $jqh, $attribs['id'], $params);
        $this->jquery->addOnLoad($js);

        $html = "<div ".$this->_htmlAttribs($attribs)." >";
        $html .= '</div>';

        return $html;
    }
}

C’est simple et ça fonctionne !
Il suffit de créer le fichier : « ZendX/JQuery/View/Helper/ProgressBar.php » et d’y placer ensuite le code ci-dessus.

Ensuite pour l’utiliser c’est très simple dans vos vues :

echo $this->progressBar("progressBarId", 65);

Voilà en espérant que cela serve :)

Catégorie: Développement Web, PHP, Zend Framework | Laisser un commentaire (0)

Zend Framework et jQuery une équipe qui gagne

Posté par seiyar81 le 27 mars 2010 | Laisser un commentaire (0)

Si Zend a fait le choix d’intégrer Dojo à son Framework, il faut bien avouer qu’aujourd’hui jQuery a acquit une certaine popularité auprès des développeurs. Notamment grâce à sa modularité, qui est son principal atout, mais également par sa simplicité d’utilisation qui rend accessible à tous le développement d’applications évoluées en Javascript.

Et bien sachez qu’il est possible (i.e. déjà prévu) d’intégrer jQuery au Zend Framework. En effet un package existe et est fournit avec le framework dans le dossier “extras/library/ZendX”.

Mise en place

Pour pouvoir l’utiliser vous devez d’abord copier le dossier ZendX dans le même répertoire que le dossier Zend.

Vous obtenez ensuite l’architecture suivante : 

zendx

Ensuite il va nous falloir utiliser le “view helper” fournit par ZendX_JQuery. Plusieurs méthodes s’offrent à nous :

  • Dans les contrôleurs/vues où l’on souhaite utiliser JQuery on ajoute
    	$this->view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    	// ou bien, et cela revient au même
    	ZendX_JQuery::enableView($this->view);
    	
  • Pour l’utiliser dans toute l’application on ajoute à notre fichier BootStrap
          $view = new Zend_View();
          $view->addHelperPath('ZendX/JQuery/View/Helper/', 'ZendX_JQuery_View_Helper');
    
          $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
          $viewRenderer->setView($view);
          Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
        

Je préfère personnellement choisir les vues auxquelles je souhaite appliquer le “view helper” plutôt que de l’utiliser dans toute l’application.

Vous pouvez tout d’abord choisir entre utiliser les fichiers de jQuery et jQuery UI du CDN de Google ou bien utiliser vos propres fichiers.

  • CDN de Google : utilisé par défaut, vous pouvez spécifier la version à charger avec
    		$view->jQuery->setVersion('1.4.2');
    		$view->jQuery->setUiVersion('1.8'); // pour jQuery UI
           
  • Vos fichiers :
    	// Pour inclure vous-même les fichiers dans la balise head.
    	$view->jQuery()->setRenderMode(ZendX_JQuery::RENDER_JAVASCRIPT | ZendX_JQuery::RENDER_JQUERY_ON_LOAD);
    	// Pour indiquer le chemin de vos fichiers et laisser le framework gérer le tout
    	$view->jQuery()->
    	

Petite précision toutefois, les fichiers de thèmes de jQuery UI ne sont pas disponibles sur le CDN, vous devez donc les inclure vous-même avec par exemple la fonction jQuery->addStylesheet($pathToFile);

Utilisation

Tout ceci ne nous dit pas comment faire pour utiliser jQuery dans notre application, rassurez-vous c’est on ne peut plus simple.

Imaginons par exemple un simple lien pour charger une partie de la page en Ajax :

echo $this->ajaxLink("Get Index", "/index",
                        array('update' => '#mydiv',
                              'method' => 'POST',
                              'beforeSend' => 'aCallbackFunction()',
                              'complete' => 'alert(data)')); ?>

Rien de bien compliqué ici, #mydiv indiquant la div au sein de laquelle il faut insérer le contenu, /index l’url de la page à récupérer, beforeSend et complete les callback à utiliser.

Pas plus de code à écrire, le code généré sera inséré à l’appel de $this->jQuery();.

Mais on peut utiliser jQuery pour plus que des simples liens. Ainsi on peut dans des formulaires :

// Créé un input avec auto-complétion
echo $this->autoComplete("country", "",
                             array('source' => array('France', 'United Kingdom', 'United States', 'Germany', 'Italy', 'Spain')));
// On peut donc facilement charger la source via une base de données

// Créé un input avec un calendrier
echo $this->datePicker("datePicker", '',
                        array('defaultDate' => date('d/m/Y', time()),
                                'onClose' => new Zend_Json_Expr('myFunction')));

// Créé un slider
echo $this->slider("slider", "",
                        array('min'=>'0', 'max'=>'100', 'step'=>'5'));

On peut également utiliser le framework pour créer des dialogs, tabContainer, accordionContainer.

Vous pouvez en apprendre plus avec la documentation, attention toutefois car des helpers sont toujours disponibles tels que ZendX_JQuery_View_Helper_ColorPicker ou ZendX_JQuery_View_Helper_Spinner alors que jQuery UI ne supporte plus les éléments.

Avec cette gestion de jQuery, ce dernier devient une bonne alternative à Dojo pour développer avec le Zend Framework.

Je l’ai personnellement adopté, et vous comptez-vous un jour passer à jQuery grâce à cette utilisation simplifiée ?

Catégorie: Développement Web, Javascript, PHP, Zend Framework | Laisser un commentaire (0)

Programmer un envoi de SMS avec le Zend Framework et Google Agenda

Posté par seiyar81 le 22 mars 2010 | Laisser un commentaire (5)
Google Agenda

Si vous développez déjà avec le Zend Framework vous devez connaître ou avoir entendu parler de Zend_Gdata. C’est, comme son nom l’indique, un ensemble de classes qui permettent l’accès aux services en ligne de Google (Google Data API). On a ainsi accès à :

Aujourd’hui je vais expliquer comment se servir de Zend_Gdata pour communiquer avec Google Agenda. Si vous en connaissez le fonctionnement, vous savez qu’on peut définir des rappels pour les rendez-vous de trois façons : Email, Pop-up ou SMS.

C’est au SMS que nous nous intéresseront, en effet, utiliser Google Agenda pour l’envoi de SMS ne vous coutera pas un centime !

Pré-requis

Vous devez avant tout disposer de :

  • Un compte Google
  • Un agenda activé dans Google Agenda
  • Un numéro de portable associé au compte Google Agenda et vérifié
  • La dernière version du Zend Framework disponible ici
  • Un serveur HTTP avec le support de PHP (peut-être pas besoin de le préciser mais on ne sait jamais :p )

Mise en situation (enfin essai ^^)

C’est bien joli d’écrire ce tutoriel mais sans un exemple pratique il peut être difficile d’en voir l’intérêt.

Imaginez que vous développez pour une entreprise qui installe et gère le fonctionnement de panneaux solaires (vous pouvez remplacer panneaux solaires par chaudières, fenêtres, voire même par l’adoption de poissons rouges birmans, si si ça marche aussi !).

Imaginez maintenant que vos clients aient la possibilité via une interface web de créer des “tickets”, ou “alertes” comme vous le sentez, dès lors qu’ils rencontrent un problème auquel ils ne peuvent faire face seuls !

C’est alors que par malheur, vous n’êtes pas joignable au bureau et le client n’a pas votre numéro de portable (si si c’est possible) ! Drâme ! Horreur ! Comment faire ?

Et bien tout simplement en créant un évènement sur votre Google Agenda avec l’option “reminder by SMS” !

Formulaire

Vous créez donc un formulaire pour que vos clients puissent expliquer en quelques lignes ce qui se passe avec en bonus une liste pour choisir la priorité du ticket.

class Default_Form_Ticket extends Zend_Form
{
    public function __construct($sitesList, $options = null)
    {
        parent::__construct($options);
        $this->setName('ticket_form');
        $this->setAction('/tickets/new')
     	->setMethod('post');
     	$this->setDecorators(array(
	    'FormElements',
	    array('HtmlTag', array('tag' => 'table')),
	    'Form',
		));

        $title = new Zend_Form_Element_Text('title');
        $title->setLabel('Sujet : ')
        ->setRequired(true)
        ->addFilter('StripTags')
        ->addFilter('StringTrim')
        ->setAttrib('size', '50')
        ->addValidator('NotEmpty');
        $title->setDecorators(array(
	    'ViewHelper',
	    'Errors',
	    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element-input')),
	    array('Label', array('tag' => 'td'), array('tag' => 'td', 'placement' => 'prepend')),
	    array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
		));

        $priority = new Zend_Form_Element_Select('priority');
        $priority->setLabel('Priorité : ')
        ->setRequired(true)
        ->addFilter('StripTags')
        ->addFilter('StringTrim')
        ->addValidator('NotEmpty');
        $priority->addMultiOptions(array('Basse'=>'Basse', 'Normale'=>'Normale', 'Haute'=>'Haute', 'Urgente'=>'Urgente'));
        $priority->setDecorators(array(
	    'ViewHelper',
	    'Errors',
	    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element-input')),
	    array('Label', array('tag' => 'td'), array('tag' => 'td', 'placement' => 'prepend')),
	    array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
		));

        $message = new Zend_Form_Element_Textarea('message');
        $message->setLabel('Message : ')
        ->setRequired(true)
        ->addFilter('StripTags')
        ->addFilter('StringTrim')
        ->setAttrib('cols', '50')->setAttrib('rows', '15')
        ->addValidator('NotEmpty');
        $message->setDecorators(array(
	    'ViewHelper',
	    'Errors',
	    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element-input')),
	    array('Label', array('tag' => 'td'), array('tag' => 'td', 'placement' => 'prepend')),
	    array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
		));

        $submit = new Zend_Form_Element_Submit('Soumettre');
        $submit->setAttrib('id', 'submitbutton');
        $submit->setValue('Soumettre');
        $submit->setDecorators(array(
	    'ViewHelper',
	    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element-submit')),
	    array(array('label' => 'HtmlTag'), array('tag' => 'td', 'placement' => 'prepend')),
	    array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
		));

        $this->addElements(array($title, $priority, $message, $submit));
    }
}

Ensuite dans le contrôlleur on instancie le formulaire et on l’ajoute à la vue et dans le même temps on met en place le code pour la création de l’évènement.

    public function newAction() {
        $form = new Default_Form_Ticket($sitesList);

        if($this->_request->isPost() && $form->isValid($_POST)) {
            try {
	    /*
		Vous pouvez enregistrer le ticket dans une base de données.
		Nous nous contenterons simplement de l'ajout de l'évènement.
	    */

            $title = 'New Ticket - '.$this->view->user->mail.' - ' . $_POST['title'];
            $message = $_POST['message'];

            $this->createAgendaEvent($title, $message);

            $this->_redirect('/tickets');
            } catch(Exception $e) {
                $this->view->error = 'Une erreur est survenue pendant la création du ticket.';
            }

        }
        $form->populate($_POST);
        $this->view->form = $form;
    }

Il ne nous reste plus qu’à implémenter la fonction createAgendaEvent. Un petit détail toutefois avant de commencer, le reminder se déclenche au minimum 5 min avant le début de l’évènement. Nous créerons donc un évènement à H+6min.

    public function createAgendaEvent($title, $message) {
	// On charge toutes les classes qui vont nous servir
        Zend_Loader::loadClass("Zend_Gdata");
        Zend_Loader::loadClass("Zend_Gdata_ClientLogin");
        Zend_Loader::loadClass("Zend_Gdata_Calendar");
        // On récupère le nom du service
        $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;

        // On s'authentifie
        $client = Zend_Gdata_ClientLogin::getHttpClient('IDENTIFIANT_COMPTE_GOOGLE', 'PASSWORD_COMPTE_GOOGLE', $service);

        // On crée un nouvel objet Calendar
        $calendar = new Zend_Gdata_Calendar($client);

        // On lui ajoute un évènement
        $event = $calendar->newEventEntry();

        // On met en place le reminder
        $reminder = $calendar->newReminder();
        $reminder->method = "sms";
        $reminder->minutes = "5";

        // Date de début à H+6min
        $startDate     = date("Y-m-d");
        $startTime     = date("H:i", time() + 6*60);
        // Date de fin à H+7min
        $endDate     = date("Y-m-d");
        $endTime     = date("H:i", time() + 7*60);
        // Offset GMT+01 pour Paris
        $tzOffset     = "+01";

        // On assigne tout ça au calendrier
        $when = $calendar->newWhen();
        $when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
        $when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00";
        $when->reminders = array($reminder);
        $event->when = array($when);

        // Enfin on ajoute le titre et le message
        $event->title = $calendar->newTitle($title);
        $event->content = $calendar->newContent($message);

        // Et on envoit le tout à Google Calendar
        $newEvent = $calendar->insertEvent($event, "http://www.google.com/calendar/feeds/IDENTIFIANT_COMPTE_GOOGLE/private/full");
    }

Et là, comme par magie vous recevrez une minute plus tard (oui H+6min – 5min = 1min !) un gentil SMS de Google avec le titre de l’évènement.
Si c’est pas beau ça :)

J’espère que ce tutoriel vous aura plu et/ou servi, je continue avec d’autres articles sur le Zend Framework très bientôt.

Catégorie: Développement Web, PHP, Zend Framework | Laisser un commentaire (5)

jQuery : poster un formulaire simplement avec AJAX

Posté par seiyar81 le 18 mars 2010 | Laisser un commentaire (1)

jQuery, ce merveilleux framework qui nous permet de faire tellement de choses … Bien souvent je suis passé à côté de fonctionnalités on ne peut plus simple à utiliser mais tellement utiles.

Du genre, je dois envoyer ce formulaire avec AJAX, il contient plein de champs différents, comment faire pour que ce soit le plus simple et rapide possible ?

Tout d’abord imaginons un formulaire regroupant plusieurs champs sur toute la page.

Coordonnées

... ...

Rien de bien compliqué jusque là mais n’oubliez pas d’inclure la librairie jQuery !
On créé ensuite la page qui va traiter nos données, appelons-la post.php :

    <?php foreach($_POST as $key => $value) echo "
  • $key => $value
  • "; ?>

Il ne nous reste plus que la partie qui nous intéresse ici, le code javascript :

$(document).ready(function(){
	$("#formulaire").submit(function(){
		$.ajax({type:"POST", data: $(this).serialize(), url:"post.php",
			success: function(data){
				$("#post").html(data);
			},
                        error: function(){
			        $("#post").html('Une erreur est survenue.');
			}
		});
		return false;
	});
});

Tout ce qu’on a à faire c’est ré-implémenter la fonction submit du formulaire et sérialiser ses champs avec la fonction ‘serialize()’ pour envoyer les données.
C’est tout bête mais je ne connaissais pas cette fonction et on ne développe pas toujours avec un IDE qui liste pour nous les fonctions à utiliser !
Enfin comme dit le vieil adage : RTFM !

Catégorie: Développement Web, Javascript, PHP | Laisser un commentaire (1)

Accélerer et optimiser son intallation PHP avec eAccelerator

Posté par seiyar81 le 12 février 2010 | Laisser un commentaire (0)

Quand on doit gérer un serveur Web, on doit s’occuper avant tout de la sécurité de l’installation, de sa stabilité, etc mais il ne faut pas pour autant négliger les performances. Car oui l’utilisateur final ne se préoccupe pas vraiment de savoir si le serveur risque de tomber à la moindre attaque, et si l’application est trop longue à répondre il ira voir ailleurs s’il peut ou alors va commencer à s’énerver.

J’ai déjà présenté quelques modules pour accélérer Apache, mais aujourd’hui je vais expliquer comment installer très simplement un système de cache d’opcode : eAccelerator.
Avant cela quelques explications.

Qu’est-ce que l’opcode ?

Comme vous le savez tous sûrement, PHP n’est pas un langage compilé, mais interprété. C’est à dire qu’à chaque exécution le code est parcouru puis PHP génère ce qu’on appelle l’opcode qui est en réalité un code compréhensible par la machine qui pourra donc l’exécuter.
Ce processus peut très vite devenir lourd pour la machine dès lors que l’application fait face à un nombre important de clients et les temps de réponses n’en sont que plus long.

Quelles solutions ?

C’est pourquoi on va s’intéresser aux systèmes de cache d’opcode. Ces derniers améliore grandement les performances de PHP en plaçant dans un système de cache ces fameux opcodes.
Il existe plusieurs solutions dont voici une courte liste (non exhaustive) :

  • IonCube: http://www.ioncube.com/sa_encoder.php
  • Zend Platform: http://www.zend.com/en/products/platform/
  • XCache: http://xcache.lighttpd.net/
  • APC: http://pecl.php.net/packages/APC
  • EAccelerator: http://www.eaccelerator.net/

Nous nous intéresserons ici à eAccelerator.
Attention toutefois, eAccelerator ne fonctionne pas si PHP est CGI, il est seulement utilisable avec mod_php ou PHP en FastCGI.

On commence par récupérer la dernière version :

cd /usr/src
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
tar -xf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6

Ensuite il nous faut compiler les sources, donc dans le dossier entrez les commandes suivantes :

phpize
./configure
make

Si le programme phpize n’est pas trouvé, il faut le télécharger :

sudo apt-get install php5-dev

Si tout s’est bien passé, on lance l’installation :

make install

Il nous faut maintenant configurer PHP pour qu’il charge l’extension, on modifie donc le fichier /etc/php5/conf.d/eaccelerator.ini :

zend_extension="/usr/lib/php4/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

Enfin on créé le dossier dans lequel eAccelerator va stocker son cache :

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator

Enfin on vérifie que tout fonctionne bien :

/etc/init.d/apache2 reload
php5 -v
...
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
...

Et voilà votre installation de PHP est maintenant plus rapide et plus stable.
J’expliquerais prochainement comment mettre en place très simplement un reverse proxy afin de soulager le serveur Web.

Catégorie: Apache, Développement Web, PHP | Laisser un commentaire (0)

Zend Framework : Détails de la version 1.10.0

Posté par seiyar81 le 3 février 2010 | Laisser un commentaire (0)

Sortie depuis quelques jours la toute dernière version du framework apporte son lot de nouveautés. Ainsi la documentation a été réorganisée de façon a être plus accessible et plus claire, avec un « Quick Start« , une section « Reference Guide » qui permet de découvrir le framework et d’apprendre à programmer avec.

De plus la documentation est maintenant propulsée par le même moteur que Php.net : PhD. Le rendu de la documentation est ainsi simplifié pour les différentes versions du framework.
La page de téléchargement a également été revue est propose maintenant directement le téléchargement de différent packages : Zend Framewrok + Zend Server CE, Zend Framework Complet, Zend Framework Minimal, Documentation etc.

Enfin pour ce qui est des nouveautés on notera :

  • Zend_Barcode : création de code barre
  • Zend_Cache_Manager : gestion avancée du cache
  • Zend_Feed_Writer : génération de flux RSS et Atom
  • Zend_Oauth : authentification avec Oauth
  • Nouveaux Zend_Service : Zend_Service_LiveDocx, Zend_Service_WindowsAzure, Zend_Service_DeveloperGarden
  • Zend_Markup : faciliter l’intégration et l’édition de langages types BBCode et Textile
  • Plusieurs améliorations sur diverses classes et sur le Zend_Tool

Aller, direction la page de téléchargement !

Catégorie: Développement Web, PHP, Zend Framework | Laisser un commentaire (0)

Datatables : base de données, traduction et jQuery-UI

Posté par seiyar81 le 2 février 2010 | Laisser un commentaire (12)

J’avais présenté ce fabuleux plugin pour jQuery qu’est Datatables et expliqué rapidement ce dont il est capable.
Aujourd’hui je vous propose une mise en situation, avec comme objectif l’interaction avec une base de données, une traduction en français (ou une autre langue parmi les 29 disponibles), la mise en forme avec l’aide jQuery-UI, et d’autres fonctionnalités.

Tout d’abord si vous ne possédez pas encore le plugin téléchargez-le ici.
Ensuite nous allons placer le code de notre tableau dans notre page, imaginons que l’on souhaite afficher des utilisateurs :

<table id="datatable" >
  <thead>
       <tr>
            <th>Nom</th>
            <th>Prénom</th>
            <th>Inscription</th>
            <th>Mail</th>
            <th></th>
        </tr>
  </thead>
 <tbody>
       <tr>
            <td colspan="4">Chargement des données...</td>
        </tr>
  </tbody>
</table>

Maintenant le code Javascript. Nous allond indiquer que l’on souhaite récupérer les données via un fichier côté serveur :

$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php"
	} );
} );

Le plugin ira donc récupérer le fichier get_data.php pour remplir le tableau. Les données renvoyées par le fichier php doivent être au format JSON.
Voici un exemple du contenu de get_data.php inspiré de la documentation de Datatables mais vous êtes libre de modifier le code pour utiliser PDO, ou une autre méthode d’accès à la base de données si vous utilisez un autre SGBD que MySQL.

<?php
  /* MySQL connection */
	$gaSql['user']       = "username";
	$gaSql['password']   = "password";
	$gaSql['db']         = "mydb";
	$gaSql['server']     = "localhost";
	$gaSql['type']       = "mysql";

	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
		die( 'Could not open connection to server' );

	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or
		die( 'Could not select database '. $gaSql['db'] );

	/* Paging */
	$sLimit = "";
	if ( isset( $_GET['iDisplayStart'] ) )
	{
		$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
			mysql_real_escape_string( $_GET['iDisplayLength'] );
	}

	/* Ordering */
	if ( isset( $_GET['iSortCol_0'] ) )
	{
		$sOrder = "ORDER BY  ";
		for ( $i=0 ; $i<mysql_real_escape_string( $_GET['iSortingCols'] ) ; $i++ )
		{
			$sOrder .= fnColumnToField(mysql_real_escape_string( $_GET['iSortCol_'.$i] ))."
			 	".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
		}
		$sOrder = substr_replace( $sOrder, "", -2 );
	}

	/* Filtrage - Remplace le filtrage côté client, peut donc être long si la base de données est importante
	 */
	$sWhere = "";
	if ( $_GET['sSearch'] != "" )
	{
		$sWhere = "WHERE nom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
		                "prenom LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ".
		                "inscription = '".mysql_real_escape_string( $_GET['sSearch'] )."' OR ".
		                "mail = '".mysql_real_escape_string( $_GET['sSearch'] )."'";
	}

	$sQuery = "SELECT id, nom, prenom, inscription, mail FROM users $sWhere $sOrder $sLimit";
	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());

	$sQuery = "SELECT FOUND_ROWS()";

	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
	$iFilteredTotal = $aResultFilterTotal[0];

	$sQuery = "SELECT COUNT(id)	FROM users";
	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultTotal = mysql_fetch_array($rResultTotal);
	$iTotal = $aResultTotal[0];

	$sOutput = '{';
	$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', ';
	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
	$sOutput .= '"aaData": [ ';
	while ( $aRow = mysql_fetch_array( $rResult ) )
	{
		$sOutput .= "[";
		$sOutput .= '"'.addslashes($aRow['nom']).'",';
		$sOutput .= '"'.addslashes($aRow['prenom']).'",';
		$sOutput .= '"'.addslashes(date(H:i d/m/Y'', $aRow['inscription'])).'",';
		$sOutput .= '"'.addslashes($aRow['mail']).'"';
		$sOutput .= '"Détails"';
		$sOutput .= "],";
	}
	$sOutput = substr_replace( $sOutput, "", -1 );
	$sOutput .= '] }';

	echo $sOutput;

	function fnColumnToField( $i )
	{
		if ( $i == 0 )
			return "nom";
		else if ( $i == 1 )
			return "prenom";
		else if ( $i == 2 )
			return "inscription";
		else if ( $i == 3 )
			return "mail";
	}
?>

Et voilà notre tableau se remplit automatiquement avec les données renvoyées par le fichier get_data.php.
La méthode utilisée dans l’exemple pour renvoyer les données au format JSON est un peu barbare, utiliser json-encode sur un array serait à mon humble avis plus approprié, à vous de voir.

  intval($_GET['sEcho']),
				  'iTotalRecords'=>$iTotal,
				  'iTotalDisplayRecords'=>$iFilteredTotal);
 $aaData = array();        

	while ( $aRow = mysql_fetch_array( $rResult ) )
	{
            $tmp = array();
	    $tmp[] = addslashes($aRow['nom']);
		$tmp[] = addslashes($aRow['prenom']);
		$tmp[] = date(H:i d/m/Y'', $aRow['inscription']);
		$tmp[] = addslashes($aRow['mail']);
		$tmp[] = '<a href="user.php?id='.$aRow['id'].'">Détails</a>';

		$aaData[] = $tmp;
	}
   $sOutput['aaData'] = $aaData;

   echo json_encode($sOutput);

Je n’ai pas testé le code mais cela devrait fonctionner.

Bon tout ça c’est bien beau mais on aimerait bien avoir une traduction en français plutôt que d’avoir Show 10 entries, Search ect, car même si on comprend ça fait tâche.
Et bien le plugin nous offre la possibilité de traduire le plugin dans pas moins de 29 langues dont l’anglais, l’allemand, l’espagnol, le portugais, le chinois etc.
Pour mettre en place la traduction il n’y a rien de plus simple, on va rajouter une option dans la déclaration de notre tableau :

$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php",
                "oLanguage": { "sUrl": "datatable_fr.txt" }
	} );
} );

Il suffit ensuite de placer la traduction correspondante dans le fichier datatable_fr.txt. La liste des codes à placer est disponible ici.
Vous pouvez modifier les traductions ou bien créer les vôtres très simplement. Pour éviter un appel du fichier sur le serveur vous pouvez également faire comme ceci :

$(document).ready(function() {
	$('#datatable').dataTable( {
		"bProcessing": true,
		"bServerSide": true,
		"sAjaxSource": "get_data.php",
                "oLanguage": { "sProcessing":   "Traitement en cours...",
                   "sLengthMenu":   "Afficher _MENU_ éléments",
	           "sZeroRecords":  "Aucun élément à afficher",
	           "sInfo": "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
	           "sInfoEmpty": "Affichage de l'élement 0 à 0 sur 0 éléments",
	           "sInfoFiltered": "(filtré de _MAX_ éléments au total)",
	           "sInfoPostFix":  "",
	           "sSearch":       "Rechercher:",
	           "sUrl":          "",
	           "oPaginate": {
		        "sFirst":    "Premier",
		        "sPrevious": "Précédent",
		        "sNext":     "Suivant",
		        "sLast":     "Dernier"
	               }
                }
	} );
} );

Enfin on aimerait styliser notre tableau et donc utiliser la puissance de jQuery-UI. Pour cela rien de plus simple, il suffit de posséder les fichiers de jQuery-UI (.js, .css et les images) et de les avoir inclus. Comme pour la traduction une simple ligne suffit :

       ...
       "bJQueryUI": true,
       ...

Vous pouvez voir encore plus d’exemple sur cette page.

Catégorie: Développement Web, Javascript | Laisser un commentaire (12)