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'');