Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai une problématique avec un formulaire, j'utilise beaucoup Zend Form que j'essaye de pousser au max de ses possibilités, mais là j'arrive pas trop a voir comment faire simple. J'explique :
J'ai un formulaire de recherche sur une page avec un champ lié a un bouton. Ce bouton ouvre une popup.
Dans cette popup se trouve une arborescence dépliable. A chaque clic d'un parent, je fais une requête pour afficher les enfants de la liste (impossible vu le model de donnée de faire toute la liste d'un coup sa me tuerai les perfs).
Ces deux élements sont indissociable, et seront utilisé un peu partout dans mon application.
Au clic d'un élément de la liste finale, je dois ajouter l’élément cliqué a la valeur du champ de formulaire. Le composant que je souhaite donc ajouter a l'élément Zend\Form\Element\Text est un autre champ du fieldset ? Un service attaché ? Je vois pas trop comment définir ce bouton(le composant entier en fait), quel périmètre lui donner.
Avez vous des idées pour faire ça de façon élégante ?
Ma première idée était de faire un custom Zend\Form\Element pour ce composant que j'ajouterai ensuite au fieldset de formulaire. Mais j'ai pas l'impression que c'est un element de formulaire puisqu'il n'a pas besoin de validator, seulement le champs qui prendra la valeur de cette liste sera validé. A moins que le custom element a créer soit en réalité le champs Text accompagné de son bouton et que ce soit l'association des deux qui fasse l’élément custom.
Hors ligne
Bonjour,
J'aurais dit un champ custom qui a principalement un custom view helper en fait. Ton bouton et ta popup, c'est juste de l'affichage, pas un vrai composant du formulaire, la seule partie composant du form c'est ton field qui reçoit la valeur de retour de la popup.
Du coup :
CustomElement => CustomElementViewHelper
Le view helper c'est celui de l'élément de base (text je pense), puis tu ajoutes ton html et javascript de décoration (le bouton et la popup), puis les données de la dropdown de la popup viendrons en ajax (j'imagine), ou alors il te faut une option en plus dans ton CustomElement qui te permette de remplir le dropdown.
Je pense que ce que je viens d'écrire veut dire quelque chose dans ton contexte, dis moi si je me trompes
Hors ligne
Merci de ta réponse Théocrite, je vais implémenter un truc dans ce gout la ce jour, je reviens faire un feedback avec la solution si sa fonctionne
Au passage bravo avec un peu de retard pour ta certification ZFCA du mois dernier. Il va falloir que je m'y mette bientôt aussi pour la passer !
Hors ligne
Bon j'ai avancé dans la conception voilà ce que sa donne :
Attention ce n'est qu'un prototypage
[lang=php] // Classe permettant de render l'element avec son bouton associé class FormEntityRow extends FormText { public $listService; public function __construct(ListService $listService) { $this->listService = $listService; } public function render(ElementInterface $element) { $input = parent::render($element); $string = $this->addEntityButton($input); return $string; } /** * Partial a inclure voir les best practises * @param $input * @return mixed */ public function addEntityButton($input) { $html = "<div class='col-xs-10'>%s</div><div class='col-xs-1'>%s</div>"; $button = "<button class='button btn' onclick='javascript:getList()'>Liste</button>"; return sprintf($html, $input, $button); } public function generateListTree() { } }
[lang=php] /** * Class EntityElement * @package Application\Entities\Form\Element */ class EntityElement extends Element implements InputProviderInterface { public function getInputSpecification() { return array( 'type' => 'Zend\InputFilter\Input', 'name' => 'entityList', 'required' => true, 'filters' => array( array('name' => 'Zend\Filter\StringTrim'), array('name' => 'Zend\Filter\StripTags'), ), 'validators' => array( array('name' => 'EntityValidator') ), ); } }
[lang=php] class EntityValidator extends AbstractValidator { protected $messageTemplates = array( 'not_managable' => "you_cant_manage_this_entity" ); public function isValid($entity, $context = null) { return true; } }
[lang=php] // ajout dans un formulaire quel qu'il soit $this->add( array( 'type' => 'Application\Entities\Form\Element\EntityElement', 'name' => 'entityList', 'options' => array( 'label' => 'entity_label' ), 'attributes' => array( 'id' => 'entityList', 'class' => "form-control", ) ) );
Maintenant que j'ai toute la boucle, j'ai bien le formulaire qui apparait avec le bouton. Mais j'ai une brique qui pose soucis : Le javascript du bouton doit afficher la popup, qui elle meme va m'afficher une arborescence complète issue de la base, et dans cette arbo j'aurais del'ajax aussi.
Mon souhait c'est que pour les formulaire qui auront besoin de ce champ n'est pas a toucher au javascript de ce form, du coup il faut qu'il embarque tout et que l'utilisateur est juste a déclarer le dernier bout de code que j'ai mis, avec l'appel au viexHelper dans la vue et c'est tout. Le reste mon code le gère ce qui comprend naturellement la partie Javascript.
Ma question est : je pensais appeler un partial dans la classe 'FormEntityRow' et render ce partial avec le viewrenderer que je mettrai en dépendance, toutefois je ne sais pas s'il est possible d'appeler le partial dans ce contexte.
EDIT : Bon apparemment inclure le viewrenderer et donner un partial en paramètre au render fait très bien taf, je dirais même qu'il est conçu pour !
Hors ligne
En effet ça semble être une bonne solution !
Du coup là tu as réussi à faire tout ce que tu voulais à ce niveau ?
Pour la certif, j'ai principalement basé mes révisions sur zf2 certification study guide, et bien sûr toute la doc (et essayer moi même).
Pour le reste, on ne peut pas trop en discuter (ça fait parti du disclaimer au début auquel on agree), mais c'est assez précis comme questions (paramètres d'une fonction, options possibles, etc). On pourra en reparler sur Slack ou IRC si tu veux. En tout cas bien content de l'avoir fait, ne serait-ce que pour valider mon niveau (c'est toujours un peu dur quand on bosse en indépendant sans forcément d'équipe de dev...)
Hors ligne
J'ai bien modifié le code ci dessus, pour que tout soit embarqué avec les partial en tant que composant all in one. Mais oui j'ai pu faire tout ce qu'il fallait.
Je te remercie pour ton aide
Et pour la certif oui on en discutera a l'occasion j'aimerai valider mon niveau également, peut être même passer quelque heure de CIF dedans avec le voucher d'examen.
Hors ligne