Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Hello,
Dans mon layout, j'ai un partial :
<div class="grid_16" id="header_search_engine"> <?php echo $this->partial("/searchengine/index.phtml"); ?> </div>
Ensuite, j'ai formulaire dans /forms/SearchEngine.php, et un controlleur (SearchengineController.php) qui créer l'objet $form :
<h1>Moteur de recherche</h1> <?php echo $this->translate('search engine'); echo $this->form; ?>
Comment faire que le formulaire d'affiche ? Faut-il passer dans un $this->view->placeholder(...) ou autre ?
Merci
Fabrice
Dernière modification par __fabrice (13-10-2010 12:44:14)
Hors ligne
Salut,
Tu peux passer des paramètres à ton partial:
<?php echo $this->partial("/searchengine/index.phtml", array( 'form' => $this->form )); ?>
Tu pourras y accéder depuis ton partial comme une variable de vue classique ($this->form).
A+ benjamin.
Hors ligne
Ok merci.
J'avais déjà testé, mais je me demande d'ou viens le $this->form ?... De n'importe quelle action d'un controlleur (le partial est dans un layout) ?, pas de risque de conflit ?
Dans mon cas, c'est pour faire un moteur de recherche inclus dans toutes les pages(dans un layout avec un partial), avec un autocomplete (ZendX) ou avec Zend_Lucene.
PS : Ou peut-être pas obligé de se servir de Zend_Form non ?. Mais cela ne résoud pas le soucis ; je dois bien avoir une action pour le partial.
Merci
Fabrice
Dernière modification par __fabrice (08-10-2010 23:59:24)
Hors ligne
Salut,
Le partial peut être considéré comme une vue. Des variables lui sont assigné comme à n'importe quelle vue, il n'y a pas de collision possible.
Quand tu assignes des variables à une vue depuis le contrôleur, tu assignes des valeurs à des clés, en interne Zend_View va stocker ça dans un tableau et va (je suppose) utiliser la méthode magique __get (invoquée automatiquement sur un $this->variable) pour retrouver ta valeur par sa clé dans ce tableau.
Dans un partial c'est le même fonctionnement, tu assignes des variables à des clés au moment d'invoquer le partial, tout comme tu le fais dans l'action de contrôleur avant de rendre ta vue.
Pour ton formulaire de recherche, le partial est une bonne solution. Nous les utilisons essentiellement pour isoler des morceaux d'html qui sont indépendants et réutilisables dans d'autres pages. Ça n'a pas de rapport avec les actions de contrôleur.
Tu peux très bien avoir un partial dans l'index qui contient un formulaire qui invoque une action d'un autre contrôleur, ça ne pose aucun problème. Zend_Form n'a rien à voir là dedans.
A+ benjamin.
Hors ligne
hello,
Merci.
En fait, utiliser Zend_Form dans un partial (appelé depuis un layout) n'est pas une bonne solution.
Car pour assigner le formulaire avec Zend_Form (au partial du layout) il faut le faire dans chaque controlleur... c'est idiot.
Du coup, dans le phtml du partial, j'ai mis directement le code html, c'est plus simple
Par contre, j'aurai bien voulu faire un autocomplete dans ce partial là. Mais c'est pareil, comment assigner une fois pour toute l'autocomplete au partial dans le layout :
public function autocompleteAction($search='') { $this->view->autocompleteElement = new ZendX_JQuery_Form_Element_AutoComplete('ac'); $this->view->autocompleteElement->setLabel('Moteur de recherche : '); $this->view->autocompleteElement->setJQueryParam('source', '/searchengine/getsearch'); $this->view->autocompleteElement->setJQueryParam('minLength', $this->configApplication->autocomplete->max_cars); }
On doit bien appeler l'action dans un controlleur. Utiliser un placeholder, ou this->action(...) ne change rien au problème...
Fabrice
Hors ligne
Salut,
Tu cherches à faire du actionStack, il faut effectivement utiliser l'aide de vue action().
Je n'utilise jamais cette technique, donc je te laisse te référer à la doc : http://framework.zend.com/manual/fr/zen … ial.action
Ou alors, je laisse d'autres personnes te renseigner mieux que moi
A+ benjamin.
Hors ligne
Merci,
Je vais aller voir de ce coté alors
Fabrice
Hors ligne
Hello,
Bon voila, j'ai fait çà avec l'ActionStack, simplement :
class Custom_Controller_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract { public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { if(!$request->isXmlHttpRequest()) { $front = Zend_Controller_Front::getInstance(); if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) { $actionStack = new Zend_Controller_Plugin_ActionStack(); $front->registerPlugin($actionStack, 97); } else { $actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack'); } $menuAction = clone($request); $menuAction->setActionName('autocomplete')->setControllerName('Searchengine'); $actionStack->pushStack($menuAction); } } }
L'action :
public function autocompleteAction() { $this->view->autocompleteElement = new ZendX_JQuery_Form_Element_AutoComplete('ac'); $this->view->autocompleteElement->setLabel($this->view->translate('')); $this->view->autocompleteElement->setJQueryParam('source', '/searchengine/getsearchautocomplete'); $this->view->autocompleteElement->setJQueryParam('minLength', $this->configApplication->autocomplete->max_cars); // ActionStack $this->_helper->viewRenderer->setResponseSegment('autocomplete'); }
Layout :
<div class="prefix_11 grid_5" id="header_search_engine"> <?php echo $this->partial("/common/_search_engine.phtml"); echo $this->layout()->autocomplete; ?> </div>
Faut que je vois pour arranger le design de l'autocomplete, car il a un décorateur par défaut qui sort le code html du formulaire recevant.
Fabrice
Hors ligne
Pages: 1