2017-03-13 2 views
1

De https://docs.zendframework.com/zend-form/quick-start/#using-annotations:Comment puis-je modifier le nombre d'un champ de collection dans un formulaire Zend lorsque vous utilisez des annotations?

Via en utilisant Zend\Form\Annotation, je peux émets cette directive:

/** 
* @ComposedObject({ 
*  "target_object":"Namespace\Model\ComposedCollection", 
*   "is_collection":"true", 
*   "options":{"count":2} 
*  }); 
*/ 
private $property; 

Ce que cela fait est de créer une collection de ComposedCollection éléments, dans le cas ci-dessus, de la taille 2.

C'est génial quand j'ai besoin d'un formulaire statique avec 2 éléments, mais comment puis-je le changer quand je veux le modifier dynamiquement? c'est-à-dire en interne que je veux être en mesure de remplir le formulaire avec 4 ou 5 ensembles de données, avec le nombre étant inconnu à l'avance.

L'utilisation des annotations est statique et non dynamique. Est-ce qu'il y a un moyen de faire ça?

J'ai essayé d'utiliser

$form->get("element_name")->setOption("count", $numericValue); 

mais cela ne fonctionne pas, parce que je devine au moment où je l'utilise, le formulaire a déjà été construit par le moteur Annotation ($annotationBuilder->createForm(MyEntity::class);

Est il un moyen de reconstruire la forme?

J'ai essayé $form->prepare()

mais il ne supprime effectivement mon Colle éléments de ction à la place.

J'ai également essayé $form->init() mais il semble ne rien faire.

Je suis en train de réécrire la forme en n'utilisant PAS les annotations, mais ce n'est pas ce que j'essaie d'accomplir, puisque je perds effectivement mon entité en la réécrivant de manière programmatique.

Répondre

0

Utilisez la méthode .

$form->get("element_name")->setCount($numericValue); 

De même, vous pouvez également définir un jeu de champs par programmation. Placez @Annotation\Exclude() sur le $property et créer un Fieldset comme ceci:

$c = new Element\Collection('collection'); 
    $c->setOptions([ 
     'label' => 'Collection', 
     'count' => 1 , 
     'should_create_template' => true, 
     'allow_add' => true, 
     'target_element' => [ 
      'type' => ComposedCollectionFieldset::class 
     ] 
    ]); 

ComposedCollectionFieldset contient le Elements que vous avez besoin.