php zend-framework2 zend-form formcollection

php - ¿Cómo pasar opciones/parámetros a formCollection fieldset en ZendFramework 2?



zend-framework2 zend-form (1)

Tengo un Formulario que contiene una formCollection con un elemento select que quiero rellenar con valores (de SQL) en función de un parámetro POST.

Pasar este parámetro de controlador a formulario no fue un problema, pero ahora no puedo encontrar una manera de establecer / leer ese parámetro en el elemento objetivo de formCollection. ¿Alguna idea sobre cómo hacer que eso funcione?

Aquí está mi código:

Controlador

class MyController extends AbstractActionController{ public function indexAction() { $form = $this->serviceLocator->get(''FormElementManager'')->get(''Module/Form/myForm''); $form->init([ ''param'' => $this->params()->fromPost(''param'') ]); } }

Formar

class myForm extends Form { private $sm; public function __construct($sm = null) { parent::__construct(); $this->sm = $sm; } public function init($params=[]) { $this->add([ ''name'' => ''choices'', ''type'' => ''Zend/Form/Element/Collection'', ''options'' => [ ''label'' => ''SelectLabel'', ''count'' => 1, ''should_create_template'' => true, ''allow_add'' => true, ''template_placeholder'' => ''__placeholder__'', ''target_element'' => [ ''type'' => ''Module/Form/choicesFieldset'', ''options'' => [ ''param'' => isset($params[''param'']) ? $params[''param''] : 0, ] ], ], ]); } }

Fieldset

class choicesFieldset extends Fieldset{ private $sm; public function __construct($sm = null){ parent::__construct(); $this->sm = $sm; } public function init(){ $param = $this->getOption(''param''); $availableChoices = /* SQL_QUERY_BASED_ON_PARAM; */ $this->add([ ''name'' => ''choice_1'', ''type'' => ''Select'', ''options'' => [ ''label'' => ''First choice'', ''value_options'' => $availableChoices, ] ]); } }

Gracias de antemano por tu ayuda.


Todo lo que tendría que hacer es buscar la instancia de Request en el administrador de servicios; verifique el parámetro que desea y luego ''inject'' en el formulario.

Tendría más sentido hacerlo en la fábrica de formularios; en lugar de repetirse dentro de los controladores.

Por ejemplo:

public function getFormElementConfig() { return array( ''factories'' => array( ''MyModule/Form/MyForm'' => function($formElementManager) { $serviceManager = $formElementManager->getServiceLocator(); $request = $serviceManager->get(''Request''); // defaults to 0 if not set $param = $request->getPost(''the_posted_variable_name'', 0); $options = array( ''my_custom_option_name'' => $param, ); // You should maintain the Zend/Form/Element::__construct() method signuture // as it allows for the ''options'' to be passed in. // Alternatively you could use $form->setOption(''param'', $options) // and inject the options as a soft dependency $form = new Form/MyForm(''my_form'', $options, $serviceManager); // ... other form stuff here return $form; }, ), ); }

Ahora puede usar la opción dentro del formulario usando:

$param = $this->getOption(''my_custom_option_name'');