vendredi 28 février 2014

Tutorial : Créer une application avec Zend Framework – Préparation de l’environnement de l'application

Dans cette première partie, nous allons voir comment préparer son environnement de développement pour créer une application avec le Zend Framework.
Nous allons aussi télécharger les éléments nécessaire à la réalisation de notre application.

Plan de l’épisode #1

  1. Les logiciels que nous allons utiliser
  2. Mise en place du framework
  3. Mise en place des fichiers de démarrage
  4. Vérifications
  5. Conclusion
  6. Notes

Les logiciels que nous allons utiliser

Dans cet épisode, nous allons nous concentrer sur la mise en place de l’environnement pour que le Zend Framework puisse être utilisé.
  • Il faudra vous munir d’un éditeur de texte ou d’un IDE : Je vous conseille donc Eclipse avec le mode PHP
  • Un environnement LAMP (Linux) avec WAMP (Windows) ou MAMP (Mac)
  • Le Zend Framework en version 1.8.4 (au moment où est écrit cette série)

Mise en place du Framework

Pour commencer nous allons nous occuper du Zend Framework, et de sa position au cœur de la hiérarchie de nos fichiers.
Pour cela, nous allons nous rendre dans le dossier de MAMP (ou WAMP) ressemblant a cela :
mamp-filesystem
Nous allons créer un dossier nommé frameworks à la racine de façon à mettre notre Zend Framework.
mamp-folder-frameworks
Ainsi, nous pouvons mettre le dossier library de notre Zend Framework dans le dossier frameworks créé en suivant cette hiérarchie :
add-zend-framework-mamp
Une fois cela fait il faut créer un dossier contenant votre application dans le dossier htdocs (MAMP) ou www (WAMP) que l’on nommera watchmydesk pour s’y retrouver tout au long des épisodes.
Dans ce dossier nous allons ajouter tous les dossier qui vont être obligatoires pour notre application :
folders-zend-app
C’est brut de décoffrage, je sais mais je viens aux explications sur l’utilité des dossiers créés !

Le dossier application

Dans ce dossier on retrouve 8 dossiers qui ont tous une fonction bien déterminée.
  • configs
    Dans ce dossier, nous allons mettre notre fichier application.ini qui représentera la configuration de notre application. On aura donc l’adapter pour correspondre à la version de MySQL utilisée, la config pour le MVC, l’include path (pour inclure le Zend Framework à notre projet)
  • forms
    On retrouvera dans ce dossier tout les formulaires de notre application.
  • languages
    Comme son nom l’indique, ici on mettra les fichiers de langue pour avoir une application en anglais et en français !
  • layouts
    Ce sont les fichiers qui vont permettre de définir le style commun a certaines pages, par exemple vous ne voulez pas répéter la structure HTML du header de votre site, c’est ici ! Mais nous y reviendrons par la suite.
  • models/DbTable
    Les modèles sont les classes PHP qui permettent de faire des requêtes SQL sur la base de données sans avoir a écrire cette même requête.
  • modules
    Ici, comme vous pouvez le voir, nous avons deux dossiers backend et frontend représentants les pages de l’administration et du site en lui même ! Dans ces deux dossiers, on retrouve le dossier controllers et views .
    Le contrôleur est une classe PHP qui permet d’effectuer des actions dès que l’utilisateur appelle une certaine page et ce contrôleur envoie les informations à une vue correspondante qui affiche le résultat au visiteur .
  • plugins
    Les plugins de notre application.
  • views/helpers
    Les helpers sont des aides qui permettent d’exécuter des actions dans la vue (la partie HTML).

Le dossier library

Ce dossier est à utiliser pour ajouter des composants ou étendre des composants de Zend qui ne vous conviennent pas pour votre application. Par exemple vous voulez ajouter une fonctionnalité à un composant, il faut le mettre dans ce dossier, mais nous y reviendrons le moment venu !

Le dossier public

C’est le point d’entrer de votre application. Il contient donc les styles CSS, les images de votre application ainsi que les fichiers javascripts.

Mise en place des fichiers de démarrage

Les fichiers de démarrage sont très importants pour que votre application fonctionne correctement. Nous allons devoir coder au total 8 fichiers pour pouvoir voir si notre application fonctionne.

Le fichier index.php

Ce fichier doit être situé dans le dossier public/ de votre application qui représente notre point d’entrée et doit contenir ces lignes de code :
defined('APPLICATION_PATH')
      || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

  defined('LIBRARY_PATH')
      || define('LIBRARY_PATH', realpath(dirname(__FILE__) . '/../library')); 

  defined('ZEND_PATH')
       || define('ZEND_PATH', realpath(dirname(__FILE__) . '/../../../frameworks'));

  defined('APPLICATION_ENV')
      || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

  // On modifie l'include path de PHP
  set_include_path(implode(PATH_SEPARATOR, array(
   realpath(ZEND_PATH),
      get_include_path(),
  )));

  // On a besoin de Zend Application pour lancer notre application
  require_once 'Zend/Application.php';
                // On lance la session
  require_once 'Zend/Session.php';
  Zend_Session::start();

  // On créé l'application, on lance le bootstrap et on lance l'application !
  $application = new Zend_Application(
      APPLICATION_ENV,
      APPLICATION_PATH . '/configs/application.ini'
  );
  $application->bootstrap()
              ->run();
Le composant Zend_Application permet de lancer notre application sans se soucier de grand chose, en effet, vous avez à lui passer l’environnement de l’application ainsi que le fichier de configuration, et c’est parti !

Le fichier application.ini

Ce fichier doit être situé dans le dossier applications/configs et doit contenir ces lignes de code :
  [production]
  phpSettings.display_startup_errors = 0
  phpSettings.display_errors = 0
  phpSettings.date.timezone = "Europe/Paris"
  includePaths.library = LIBRARY_PATH
  bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  bootstrap.class = "Bootstrap"

  ; so auto-loading will find our classes in library/App
  autoloaderNamespaces[] = "App_"

  ; initialize database
  resources.db.adapter = "MYSQLI"
  resources.db.params.host = "localhost"
  resources.db.params.username = "root"
  resources.db.params.password = "root"
  resources.db.params.dbname = "watchmydesk"
  resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
  resources.db.isDefaultTableAdapter = true

  ; initialize front controller resource
  resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
  resources.frontController.defaultControllerName = "index"
  resources.frontController.defaultAction = "index"
  resources.frontController.defaultModule = "frontend"

  ; initialize layout resource
  resources.layout.layoutPath = APPLICATION_PATH "/layouts"

  [development : production]
  phpSettings.display_startup_errors = 1
  phpSettings.display_errors = 1
Ici, on déclare tout ce qui touche à la base de données (qui sera créée dans le prochain épisode), les ressources pour le frontController ainsi que les dossiers à inclure dans votre application. Par exemple ici, on a inclut le dossier library, le dossier application et le dossier où est contenu le Zend Framework.
Les données correspondant au frontController indique à votre application où chercher les modules, le contrôleur par défaut, l’action par défaut et le module par défaut.

Le fichier Bootstrap.php

Ce fichier doit être situé dans le dossier application/ de votre application et doit contenir ces lignes de code :
  class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  {
      public function run()
      {
    // Cela permet d'avoir la configuration disponible de partout dans notre application
          Zend_Registry::set('config', new Zend_Config($this->getOptions()));
          parent::run();
      }

      protected function _initAutoload()
      {
    // On enregistre les modules (les parties de notre application), souvenez-vous : Backend et Frontend
          $loader = new Zend_Application_Module_Autoloader(array(
              'namespace' => '',
              'basePath'  => APPLICATION_PATH));

          return $loader;
      }

      protected function _initSession()
      {
    // On initialise la session
          $session = new Zend_Session_Namespace('watchmydesk', true);
    return $session;
      }

      protected function _initView()
      {
    // Initialisation de la vue et des helpers de vue
          $view = new Zend_View();
          $view->doctype('XHTML1_STRICT');
                        // On ajoute le dossier des helpers
          $view->addHelperPath(APPLICATION_PATH . '/views/helpers');
                        // On charge l'helper qui va se charger de la vue
          $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
          $viewRenderer->setView($view);

          return $view;
      }

  }
Au cours de notre développement, nous reviendrons dans ce fichier ajouter des éléments.

Le fichier IndexController.php

Ce fichier doit être situé dans le dossier application/modules/frontend/controllers de votre application et doit contenir ces lignes de code :
  class IndexController extends Zend_Controller_Action {
   public function indexAction(){

   }
  }

Le fichier ErrorController.php

Ce fichier doit être situé dans le dossier application/modules/frontend/controllers de votre application et doit contenir ces lignes de code :
class ErrorController extends Zend_Controller_Action
{

    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

        $this->view->exception = $errors->exception;
        $this->view->request   = $errors->request;
    }

}
Comme vous pouvez le voir, nous utilisons beaucoup le mot clef $this qui représente l’objet courant. C’est ainsi que nous pouvons accéder à la vue et affecter des variables à la vue. Nous y reviendrons plus en détails dans quelques épisodes.

Le fichier index.phtml

Ce fichier doit être situé dans le dossier application/modules/frontend/views/scripts/index de votre application et doit contenir ces lignes de code :
  Vous êtes sur mon site
Ce fichier représente la vue associée à l’action index (indexAction) dans le controller index (IndexController)

Le fichier error.phtml

Ce fichier doit être situé dans le dossier application/modules/frontend/views/scripts/error de votre application et doit contenir ces lignes de code :

An error occurred

<?= $this->message ?>

<? if ('development' == APPLICATION_ENV): ?>;

Exception information:

Message: <?= $this->exception->getMessage() ?>

Stack trace:

<pre><?= $this->exception->getTraceAsString() ?> </pre>

Request Parameters:

<pre><? var_dump($this->request->getParams()) ?> </pre> <? endif ?>

Le fichier layout.phtml

Et enfin il va nous falloir un fichier layout.phtml qui va se trouver dans le dossier application/layouts de votre application.
Ce fichier va nous permettre de ne pas répéter la description de notre page HTML (header et footer) tout en pouvant modifier certaines variables dans le HTML du layout. Ici on appelle la méthode layout()->content pour afficher dans notre div container le contenu des vues qui sont appelées.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WatchMyDesk </title>
</head>
<body>
 <div id="container">
  <?php echo $this->layout()->content ?>
 </div>
</body>
</html>

Vérifications

Maintenant il vous suffit d’aller sur la page http://localhost/watchmydesk/ et si vous pouvez voir le message « Vous êtes sur mon site»  l’installation est finit et votre application fonctionne.

Conclusion

Comme vous avez pu le voir, en quelques minutes nous avons mis en place notre environnement de développement à la main. Nous avons abordé pas mal de notions comme le MVC, les exceptions ainsi que les variables passées à la vue depuis le Controller. Ces notions seront approfondis au cours de la série.




Notes

  1. Vous allez me dire que la phase de mise en route est longue mais ici, le fonctionnement est détaillé. De plus, le Zend Framework possède un composant nommé Zend_Tool qui vous permet de générer tous ces fichiers avec une ligne de commande ! Plaisant non ?
  2. L’architecture présentée ici est l’architecture que nous obtenons avec le composant Zend_Tool. Je me suis juste permis de détailler un peu plus.
Source

lundi 17 février 2014

Empêchez Google de vous traquer tout en restant loggé

 il existe une solution qui allie le meilleur des 2 mondes. Ça s'appelleSearchonymous et c'est une extension pour Firefox qui anonymise le moteur de recherche du géant américain. Pas de cookie ni d'URL de tracking avec Searchonymous. Jusque là, rien de bien nouveau sauf qu'une fois loggé sur Google+, YouTube, Gmail et compagnie, la partie moteur de recherche du site reste totalement anonymisée.
Tous les cookies sont éjectés à part celui de vos préférences, ce qui a pour effet de vous garder loggé sur tous les services Google SAUF le moteur de recherche.

Statistiques en temps réel de votre site en mode console

Si vous êtes scotché à votre Google Analytics et plus particulièrement à la section "Temps réel" qui permet de voir ce qui se passe en live sur votre site web, j'ai une bonne nouvelle !
Vous allez pouvoir dégager Analytics et passer sur un outil beaucoup plus barbu puisque open source et en ligne de commande.
Son nom ?
GoAccess ! Il s'agit d'un analyseur de logs web qui fournit des tonnes de stats en temps réels tels que le top de vos visiteurs, le top des pages et des fichiers statiques appelés, le temps pris pour répondre aux requêtes, la bande passante consommée, les sites référents, les mots clés, la localisation géographique de vos visiteurs...etc.,etc.
goaccess screenshot1M 03L Les stats temps réel de votre site web dans votre console
goaccess screenshot2M 03L Les stats temps réel de votre site web dans votre console
goaccess screenshot3M 03L Les stats temps réel de votre site web dans votre console
Les formats de logs supportés sont :
  • Common Log Format (CLF) Apache
  • Combined Format (XLF/ELF) Apache|Nginx
  • W3C format (IIS)
  • Amazon CloudFront (Download Distribution)
  • Apache virtual hosts
Rassurez-vous, même si tout se passe en ligne de commande, vous pouvez quand même, avec GoAccess, générer des exports JSON, HTML ou encore CSV.
Si cet outil vous intéresse, c'est par ici que ça se passe.

Un assistant pour télécharger des séries sous Mac OSX

Si vous êtes fan de séries des Amériques, vous devez surement en pomper des tonnes sur The Pirate Bay tel un petit porc accro à la cocaïne.
Le hic, c'est qu'à force, on se mélange, on oublie ce qu'on a vu, on loupe des mises en ligne...etc. Du coup ça agace.
La bonne nouvelle, c'est que si vous êtes sous Mac OSX, il existe une application open source qui s'appelle TvShows qui permet de "s'abonner" à des séries (ou d'ajouter ses propres flux RSS). Ensuite dès qu'un nouvel épisode sera disponible, TvShows l'ajoutera automatiquement dans le client bittorrent que vous utilisez sur votre OS (Transmission par exemple).
tvshows1 Un assistant pour télécharger vos séries sous Mac OSX
tvshows2 Un assistant pour télécharger vos séries sous Mac OSX
Reste plus qu'à choper ensuite les sous-titres avec un outil comme SolEol.

SolEol – Un utilitaire pratique pour les sous titres

SolEol est un bon petit utilitaire qui tourne sous Mac, Windows et Linux et qui permet, simplement en glissant déposant un film sur l'icône appropriée, de télécharger automatiquement les sous-titres correspondants, dans la langue de votre choix.

cap 2012 05 08 a 09.40.51 SolEol   Un petit utilitaire bien pratique pour ne plus perdre de temps à trouver des sous titres
C'est pratique, rapide et SolEol propose même des fonctionnalités de renommage automatique des SRT. L'outil permet aussi d'uploader vos propres sous-titres sur OpenSubtitles.org.
cap 2012 05 08 a 07.49.01 SolEol   Un petit utilitaire bien pratique pour ne plus perdre de temps à trouver des sous titres