25 Jul 2010

Loguer les erreurs de Tidy dans ZFDebug

Category: PHP,Zend

L'article de Ryan David Mauger, Keeping your HTML valid with Zend Framework, Tidy and Firebug montre comment créer un filtre Zend et loguer les erreurs de Tidy dans FireBug afin de rendre le code html généré sans aucune erreur. Cette méthode très intéressante a cependant l'inconvénient de parser en permanence le code html. Si cela n'a pas de conséquence sur un petit site avec peu de paramètres et en conjonction avec un proxi ou un cache, il en est autrement dans la majorité des autres cas.

Pour ma part, le log des erreurs est suffisant car, si l'application est correctement conçue, il suffit de vérifier la page avec quelque paramètres pour savoir si le rendu sera toujours correct… ou pas. Comme de plus je n'aime pas trop être dépendant de Firebug, je vous propose ici de loguer les erreurs décelées par Tidy dans l'excellente barre de débogage ZFDebug

Pour ce faire il faut remplacer la version originale du fichier library/ZFDebug/Controller/Plugin/Debug/Plugin/Html.php par celle-ci. On peut aussi voir le diff des modifications.

Enfin, pour charger ZFDebug j'utilise la méthode préconisé par ZFDebug en ajoutant un simple test pour que la barre de débogage disparaisse en mode staging ou production. Voici ce que cela donne, à placer dans votre fichier Bootstrap.php :

protected function _initZFDebug()
{
    if(APPLICATION_ENV == 'development' || APPLICATION_ENV == 'testing') {return;}
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('ZFDebug');

    $options = array(
        'plugins' => array('Variables',
            'File' => array('base_path' => '/PATH/TO/PROJECT'),
            'Memory',
            'Time',
            'Html',
            'Registry',
            'Exception')
        );

    // Instantiate the database adapter and setup the plugin.
    // Alternatively just add the plugin like above and rely on the autodiscovery feature.
    if ($this->hasPluginResource('db')) {
        $this->bootstrap('db');
        $db = $this->getPluginResource('db')->getDbAdapter();
        $options['plugins']['Database']['adapter'] = $db;
    }

    // Setup the cache plugin
    if ($this->hasPluginResource('cache')) {
        $this->bootstrap('cache');
        $cache = $this-getPluginResource('cache')->getDbAdapter();
        $options['plugins']['Cache']['backend'] = $cache->getBackend();
    }

    $debug = new ZFDebug_Controller_Plugin_Debug($options);

    $this->bootstrap('frontController');
    $frontController = $this->getResource('frontController');
    $frontController->registerPlugin($debug);
}

Le rendu, avec les logs de Tidy dans l'onglet HTML:

zfdebug and Tidi log