Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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
<?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
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
Hors ligne
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):
<?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
pourquoi pas dans une variable de registre ou bien en session? c'est le meilleur moyen pour les garder non?
Hors ligne
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
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
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
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
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
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
[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
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 :
; 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 :
<?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 :
<?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
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
Pages: 1