Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-09-2010 23:16:59

neilime
Membre
Date d'inscription: 28-04-2009
Messages: 42

Gestion des fichier javascripts et css personnalisée

Bonjour à tous, dans le développement de mon application web, j'ai envie de gérer les fichier ks et css d'une façon un peu particulière

En ce qui concerne les fichiers js, j'ai des fichiers qui sont commun à toute l'application (comme le framework par exemple). Cependant, il y a des fichiers qui sont propres à certaine partie de l'appli (comme des plugins).

Le fonctionnement pour les css est le même.

Pour gérer tous cela, j'aimerai que lorsque je suis en environnement de développement, j'inclue tous les fichier dont j'ai besoin, si je suis en production, j'inclue un seul fichier qui comporte l'ensemble du code js ou css.

En gros ce que j'aimerai faire c'est définir des fichier communs, et des fichiers spécifiques par controllers.

Pour commencer j'ai définit un helper

Code:

<?php 
class Zend_View_Helper_JavascriptHelper extends Zend_View_Helper_Abstract{
    function javascriptHelper(){
        $oRequest = Zend_Controller_Front::getInstance();
        if('development' === APPLICATION_ENV){
            
        }
        else{
            
            $sFileUri = '/js/cacheJS/'.$oRequest->getControllerName().'.js';
            if (file_exists($sFileUri)) {
                
                $this->view->headScript()->appendFile('/'.$sFileUri);
            }            
        }    
    }
}

Ce que je voudrait maintenant c'est pouvoir récupérer les fichier à inclure lorsque l'on est en development
Mon idée, mais je ne sais pas si elle est bonne, est la suivante :

Dans le helper, je définit les fichiers commun à toutes l'application.
Dans chaque controller, je définit une variable qui stocke l'uri des fichiers nécessaires.

Est ce que mon raisonnement est bon? si ce n'est pas le cas j'aimerai bien quelque suggestions.

Merci d'avance pour vos réponses.

Hors ligne

 

#2 02-09-2010 00:02:25

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Gestion des fichier javascripts et css personnalisée

je vois, tu voudrai faire un headscript / headlink en fonction de tes parties de site. En incluant chaque js et chaque css dans un seul js et css? Car avec ça, ça peut faire un plus smile

Hors ligne

 

#3 02-09-2010 00:21:24

neilime
Membre
Date d'inscription: 28-04-2009
Messages: 42

Re: Gestion des fichier javascripts et css personnalisée

Oui en effet je veux faire ça quand je suis en production et si je suis en development, je fait un headscript pour chaque fichier js et un headlink pour chaque fichier css

Voilà mon état d'avancement (pour les fichier css):

Code:

<?php 
class Zend_View_Helper_CssHelper extends Zend_View_Helper_Abstract{
    function cssHelper(){
        
        $oFrontController = Zend_Controller_Front::getInstance();        
        $aDefaultCssFiles = array(
            'global'
        );
        $aControllerCssFiles = array();
        if('production' === APPLICATION_ENV){
            $oRequest = $oFrontController->getRequest();
            $sFileUri = 'styles/css/cacheCSS/'.$oRequest->getControllerName().'.css';
            if (file_exists($sFileUri)) {
                $this->view->headLink()->appendStylesheet('/'.$sFileUri);
                return $this->view->headLink();
            }
        }
        $aCssFiles = array_merge($aDefaultCssFiles,$aControllerCssFiles);
        foreach ($aCssFiles as $sCssFile){
            $sFileUri = 'styles/css/'.$sCssFile.'.css';
            $sProductionCss = '';
            if(file_exists($sFileUri)) {
                error_log(print_r('ok',true));
                if('development' === APPLICATION_ENV)$this->view->headLink()->appendStylesheet($sFileUri);
                else $sProductionCss .= file_get_contents($sFileUri);
            }
        }
        if('production' === APPLICATION_ENV){
            $sFileUri = 'styles/css/cacheCSS/'.$oRequest->getControllerName().'.css';
            file_put_contents($sFileUri, $sProductionCss);
            if (file_exists($sFileUri)) {
                $this->view->headLink()->appendStylesheet($sFileUri);
            }
        }
        return $this->view->headLink();
    }
}

Ça marche très bien pour les fichier CSSque je définit dans $aDefaultCssFiles (est ce que c'est une bonne solution de les définir ici ?)

Cependant je ne sais pas trop ou définir les fichiers propres à chaque controller...


Deuxième problématique : je ne sais pas ou stocker les fichiers nécéssaires à chaque controller.

Dernière modification par neilime (02-09-2010 00:21:59)

Hors ligne

 

#4 02-09-2010 08:11:17

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Gestion des fichier javascripts et css personnalisée

pourquoi pas dans une variable de registre ou bien en session? c'est le meilleur moyen pour les garder non?

Hors ligne

 

#5 02-09-2010 10:31:48

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Gestion des fichier javascripts et css personnalisée

j'ai mis en place un fichier ini associer (non obligatoire) à chaque contrôleur
/application
  /controllers
    /MonControleur.php
  /Config
    /moncontroleur.ini

dans ce fichier .ini je met des paramètre propre au contrôleur
de cette façon lorsque j'ai un module il me suffit de prendre le module et le mettre dans une nouvelle apli pour que cela fonctionne (pas besoin de modifier le ini de l'application)

le fichier ini permet de gérer facilement les attribut Dev, Qualif, préProd, Prod, formation
de la sorte tu peux definir des tableaux de paramètres cssfiles et jsfiles qui vont contenir les noms des fichiers à lier
et ce en fonction de la plateforme cible.

le reste est simple dans le ini du contrôleur tu charge le fichier ini et tu instancie tes tableau
dans les actoins le nécessitant il te reste plus qu'à les utiliser

A+JYT

Hors ligne

 

#6 03-09-2010 19:58:28

neilime
Membre
Date d'inscription: 28-04-2009
Messages: 42

Re: Gestion des fichier javascripts et css personnalisée

Ton idée a l'air pas mal, un peu de code pour m'orienter (exemple du fichier ini et appel dans le contrôleur) ?

Hors ligne

 

#7 04-09-2010 17:18:30

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Gestion des fichier javascripts et css personnalisée

j'ai une classe générique dans une lib perso qui dérive de Zend_Controller_Action
mes contrôleur dérivent de cette classe du coup plus besoin de charger quoi que ce soit (plugin ou autre helper) tout la mécanique fait partie de mon framework Zend amélioré

ma classe Action (générique) contient dans la méthode ini

Code:

        if (!isset($this->_configPath))
        {
            $this->_configPath = Zend_Registry::get('_configpath')
            . $this->_request->getModuleName()
            . ucfirst($this->_request->getControllerName()) . '.ini';
        }

j'ai aussi dans cette classe (et donc tous mes contrôleurs en héritent) la méthode

Code:

    function getParams($param)
    {
        if (!$this->_params && is_readable($this->_configPath)) {
            $this->_params = Fast_Config::loadFile($this->_configPath);
        }
        if ($this->_params) {
...

par exemple pour vérifier mon formulaire dans la classe user je fais

Code:

    protected function _verifForm() {
        Zend_Loader::loadClass('Fast_Validate');
        return parent::_performVerif(new Fast_Validate($this->context->formData, $this->getParams('verify')));
    }

il est ainsi possible de modifier les validations d'un formulaire sans toucher au code juste par paramètre
mais ce qui faut voir ici c'est l'utilisation du paramètre vérif.

la partie du fichier ini correspondante

Code:

[verify]
usr_ident.ident       = "L'identifiant n'a pas le bon format"
usr_pwd.required        = Le mot de passe est obligatoire
usr_name.required       = Le nom est obligatoire
usr_firstname.required  = Le prénom est obligatoire
usr_mail.emailOrNull    = Le format du mail est invalide
usr_begin_dt.dateOrNull = la date de début n'est pas valide
usr_end_dt.dateOrNull   = la date de fin n'est pas valide

A+JYT

Hors ligne

 

#8 04-09-2010 21:57:36

neilime
Membre
Date d'inscription: 28-04-2009
Messages: 42

Re: Gestion des fichier javascripts et css personnalisée

Bon, j'ai réussi à faire ce que je voulais en suivant un peu ton raisonnement sekaijin

Dans mon fichier application.ini je définit les fichier globaux :

Code:

; initialize css and js default files
cssFiles[] = "global"
cssFiles[] = "button"

jsFiles[] = "mootools/mootools-core"
jsFiles[] = "mootools/mootools-more"

et ensuite pour chaque controller je definit un fichier ini du même nom par exemple index.ini et je stocke ces fichier dans le dossier config

Ensuite mon layout exécute ce code :

Code:

<?php        
        $oConfig = Zend_Registry::get('config');
        echo $this->cssHelper($oConfig->get('cssFiles')->toArray());
        echo $this->javascriptHelper($oConfig->get('jsFiles')->toArray());
    ?>

Et mon ccsHelper et javascriptHelper de font le reste :

Code:

<?php 
class Zend_View_Helper_CssHelper extends Zend_View_Helper_Abstract{
    function cssHelper($aDefaultCssFiles = null){
        $oFrontController = Zend_Controller_Front::getInstance();        
        $oRequest = $oFrontController->getRequest();

        $sConfigPath = APPLICATION_PATH.'/configs/'.$oRequest->getControllerName().'.ini';
        if(is_readable($sConfigPath)){
            $oControllerConfig = new Zend_Config_Ini($sConfigPath, APPLICATION_ENV);
            $oControllerConfig->get('cssFile');
            $aControllerCssFiles = ($oControllerConfig->get('cssFiles'))?$oControllerConfig->get('cssFiles')->toArray():null;
        }
        else $aControllerCssFiles = null;
        
        if('production' === APPLICATION_ENV){
            $sFileUri = 'styles/css/cacheCSS/'.$oRequest->getControllerName().'.css';
            if (file_exists($sFileUri)) {
                $this->view->headLink()->appendStylesheet($sFileUri);
                return $this->view->headLink();
            }
        }
        $aDefaultCssFiles = (is_array($aDefaultCssFiles))?$aDefaultCssFiles:array();
        $aCssFiles = (is_array($aControllerCssFiles))?array_merge($aDefaultCssFiles,$aControllerCssFiles):$aDefaultCssFiles;
        $sProductionCss = '';
        foreach ($aCssFiles as $sCssFile){
            $sFileUri = 'styles/css/devCSS/'.$sCssFile.'.css';            
            if(file_exists($sFileUri)){
                if('development' === APPLICATION_ENV)$this->view->headLink()->appendStylesheet($sFileUri);
                else $sProductionCss .= file_get_contents($sFileUri);
            }
        }
        if('production' === APPLICATION_ENV){
            $sFileUri = 'styles/css/cacheCSS/'.$oRequest->getControllerName().'.css';
            file_put_contents($sFileUri, $sProductionCss);
            if (file_exists($sFileUri)) {
                $this->view->headLink()->appendStylesheet($sFileUri);
            }
        }
        return $this->view->headLink();
    }
}

Et ça marche comme je le souhaitais.

Merci pour les conseils.

Hors ligne

 

#9 28-02-2012 17:08:12

neilime
Membre
Date d'inscription: 28-04-2009
Messages: 42

Re: Gestion des fichier javascripts et css personnalisée

Je relance cette discussion, car je viens de trouver ce projet https://github.com/hobodave/bundle-phu qui me semble pertinent. Est ce que quelqu'un l'a déjà utilisé, je serai curieux d'avoir des retour d’expérience sur ce plugin.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages