Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Après avoir contrôlé sur plusieurs tutoriels, je n'arrive toujours pas à étendre les aides de vues standards.
Je me suis basé sur le tutoriel suivant :
http://devzone.zend.com/article/3412
En gros, j'ai créé un fichier se trouvant dans /public/view/helpers/navigation/Menu.php
son contenu :
<?php class My_View_Helper_Navigation_Menu extends Zend_View_Helper_Navigation_Menu { public function htmlify(Zend_Navigation_Page $page) { // get label and title for translating $label = $page->getLabel(); $title = $page->getTitle(); // translate label and title? if ($this->getUseTranslator() && $t = $this->getTranslator()) { if (is_string($label) && !empty($label)) { $label = $t->translate($label); } if (is_string($title) && !empty($title)) { $title = $t->translate($title); } } $img = ''; $properties = $page->getCustomProperties(); if(isset($properties['img'])){ $img = '<image style="border:0px;background:white;" src="'.$properties['img'].'"/> '; } // get attribs for element $attribs = array( 'id' => $page->getId(), 'title' => $title, 'class' => $page->getClass() ); // does page have a href? if ($href = $page->getHref()) { $element = 'a'; //FLA : 22/06/2010 : décodage de l'URL car pas besoin de l'encoder quand elle arrive du fichier de configuration $attribs['href'] = urldecode($href); $attribs['target'] = $page->getTarget(); } else { $element = 'span'; } return '<' . $element . $this->_htmlAttribs($attribs) . '>'. $img . $this->view->escape($label) . '</' . $element . '>'; } }
En gros, je n'utilise plus l'urldecode des liens sinon mes "/" sont mis en %2F (problème d'encodage je suppose vu que je suis en iso-8851).
Ensuite j'ai rajouté une propriété img me permettant de définir une image à côté de mes liens du menu.
Au tout début j'avais mis ca dans le helper du ZF mais je ne trouve pas ca propre (maj du ZF => pertes des données).
Dans mon bootstrap, j'ai mis ces lignes :
$view ->addHelperPath($view->baseUrl().'/view/helpers/navigation', 'My_View_Helper_Navigation');
Pour info, la ligne suivante fonctionne parfaitement :
$view -> headLink()->appendStylesheet($view->baseUrl().'/css/charte.css');
Le dossier view et css sont tous les deux à la racine du dossier public. J'ai mis le helper ici car je sais que cela fonctionne (vu que j'arrive à gérer mes scripts etc.).
Donc je me dis que mon baseUrl() fonctionne bien, que je suis bien dans la bonne fonction (_initView) et que théoriquement, j'ai respecté ce que le tutoriel demandait....
J'ai essayé aussi d'ajouter le lien vers le helper dans la fonction _initNavigation mais rien n'y fait.
Quelqu'un aurait-il donc une idée sur mon erreur ? Quelqu'un saurait comment faire pour contrôler que mon helper a bien été ajouté (beaucoup d'exemples sur les aides d'action mais de vue ....)
Merci d'avance.
[EDIT]
J'ai essayé de déporté mon helper dans /application/views/helpers car il semblerait que ce répertoire soit instancié par défaut avec Zend_View_Helper_Menu au lieu de My_View_Helper_Navigation_Menu mais rien y fait :s
Dernière modification par laville (12-07-2010 14:14:08)
Hors ligne
Bon, en attendant une validation des "experts" ZF, je mets une solution qui est ce qu'elle est et quelques questions à valider avant de mettre le tag résolu :
Le code ci-dessous fonctionne :
/** * @return Zend_Navigation */ protected function _initNavigation() { $router = new Zend_Controller_Router_Rewrite(); $controller = Zend_Controller_Front::getInstance(); $controller ->setControllerDirectory('./application/controllers') ->setRouter($router) ->setBaseUrl('/zend') ->setParam('noErrorHandler', TRUE) ->dispatch(); $view = $this->bootstrap('layout')->getResource('layout')->getView(); $view ->setEncoding('ISO-8859-1'); // On ajoute le dossier des helpers communs $view ->addHelperPath('Zend/../../../SNR/ZendSNR/views/helpers/', 'SNR_View_Helper_Navigation'); $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); $view->navigation(new Zend_Navigation($config)) -> setDefaultProxy('menuSNR'); }
Par la suite, le dossier ZendSNR sera accessible comme pour le dossier Zend (utilisation en mode zend Server, le ZF étant donc dans le répartoire share).
Le helper s'appelle "MenuSNR.php" et son contenu est :
<?php class SNR_View_Helper_Navigation_MenuSNR extends Zend_View_Helper_Navigation_Menu { public function menuSNR(){ return $this -> menu(); } public function htmlify(Zend_Navigation_Page $page) { // get label and title for translating $label = $page->getLabel(); $title = $page->getTitle(); // translate label and title? if ($this->getUseTranslator() && $t = $this->getTranslator()) { if (is_string($label) && !empty($label)) { $label = $t->translate($label); } if (is_string($title) && !empty($title)) { $title = $t->translate($title); } } $img = ''; $properties = $page->getCustomProperties(); if(isset($properties['img'])){ $img = '<image style="border:0px;background:white;" src="'.$properties['img'].'"/> '; } // get attribs for element $attribs = array( 'id' => $page->getId(), 'title' => $title, 'class' => $page->getClass() ); // does page have a href? if ($href = $page->getHref()) { $element = 'a'; //FLA : 22/06/2010 : décodage de l'URL car pas besoin de l'encoder quand elle arrive du fichier de configuration $attribs['href'] = urldecode($href); $attribs['target'] = $page->getTarget(); } else { $element = 'span'; } return '<' . $element . $this->_htmlAttribs($attribs) . '>'. $img . $this->view->escape($label) . '</' . $element . '>'; } }
En gros désormais, je peux éditer et ajouter autant de fonctionnalités à mon menu sans devoir modifier les helper de base.
- Est-ce que quelqu'un a un avis sur ce qui a été fait (plus simple/propre/normalisé de faire cela suivant une autre méthode ??) ?
- Est-il possible de générer un seul addHelperPath pour tous les helper que je vais faire ? (mettre SNR_View_Helper ne semble pas fonctionner, et il n'aime pas non plus les sous répertoires) ? Sinon je peux faire un helper m'effectuant tous les addHelperPath mais bon ... (je pense que c'est une solution, un helper qui génère tous les addPath + gestion de l'entête etc, un gros helper pour la charte graphique en somme ) Qu'en pensez vous ? Avez vous un retour d'expérience à me communiquer ?
Merci d'avance pour vos commentaires même si c'est une idée en l'air (parfois cela peut être constructif).
Hors ligne
Pages: 1