forms - texttype - Opciones de campo de cambio de Symfony2 de un formulario incrustado
texttype symfony (5)
Mi pregunta básicamente es, ¿es posible cambiar una opción de un campo de un formulario incrustado desde el formulario principal?
Para ilustrar el problema considera esto; Tengo una clase de tipo de formulario principal como esta:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''name'', ''text'')
->add(''apple'', new AppleFormType())
;
}
y una clase de tipo de formulario hijo que está en un paquete separado y preferiría no editar, como esto:
class AppleFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''name'', ''text'')
->add(''qty'', ''integer'', array(''label'' => ''rubbish label'')
;
}
y quiero cambiar la etiqueta de qty
a otra cosa, pero quiero hacer esto solo en FruitForm
, no en todos los lugares donde se utiliza AppleForm
. Esperaba poder hacer algo como:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''name'', ''text'')
->add(''apple'', new AppleFormType(), array(''qty'' => array(''label'' => ''better label'')))
;
}
o:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''name'', ''text'')
->add(''apple'', new AppleFormType())
;
$builder->get(''apple'')->get(''qty'')->setOption(''label'', ''better label'');
}
pero ninguno de estos (y varios otros intentos) me han fallado. No existe un método setOption
que pueda ver.
¿Alguien sabe de una manera de hacer esto?
Gracias
Estoy en un caso en el que no puedo acceder al código del generador de formularios, pero tengo que anular las opciones de un campo para agregar un ''required'' => true
.
Ampliando @ peter-wooster y @thedamnedrhino responden a un problema de Symfony en github ( https://github.com/symfony/symfony/issues/11188 ), termino con este código.
$field = $form->get(''combinaisons'');
$options = $field->getConfig()->getOptions();
$type = $field->getConfig()->getType()->getName();
$options[''required''] = true;
unset($options[''em'']);
$form->add(''combinaisons'', $type, $options);
Esto funciona bien con symfony / symfony: 2.3.21, doctrine / doctrine-bundle: 1.2.0 y doctrine / orm: 2.3.6
Intenta algo como esto:
class AppleFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''name'', ''text'')
->add(''qty'', ''integer'', array(''label'' => $options[''qtyLabel''])
;
}
public function getDefaultOptions()
{
return array(
''qtyLabel'' = ''rubbish label'';
);
}
}
y:
class FruitFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''name'', ''text'')
->add(''apple'', new AppleFormType(), array(''qtyLabel'' => ''better label''))
;
}
}
La modificación de la vista suele ser mucho más fácil para este tipo de cambio.
$view->vars[''label''] = ''New label'';
Por lo general, su vista será un formulario principal, por lo que podría verse así: cambie desde ''Fecha''> ''Fecha de publicación'':
$view = $form->createView(...);
$view->children[''date'']->vars[''label''] = ''Publication date'';
Si su formulario está encapsulado en su propio tipo, puede usar la función finishView:
public function finishView(FormView $view, FormInterface $form, array $options)
{
$view->children[''date'']->vars[''label''] = ''Publication date'';
}
Dado que la mayor parte de lo que finalmente se pasa al motor de plantillas para la representación es en forma de matriz directa, en este punto puedes meterte con muchas cosas.
Muchas gracias a @Peter Wooster. En Symfony 3.0, tuve que usar algo un poco diferente:
Tengo un tipo de formulario personalizado que agrega campos como este:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(''my_field'', ChoiceType::class, [
// Some options here...
''multiple'' => false,
]);
}
Y en otro tipo de formulario personalizado, necesito extender el tipo anterior y cambiar algunas opciones:
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$myField = $builder->get(''my_field'');
$fieldOptions = $myField->getOptions();
// Retrieve the FormType. That is the part that is different.
$fieldType = get_class($myField->getType()->getInnerType());
$fieldOptions[''multiple''] = true;
// I can obviously put the name ''my_field'' directly here
$builder->add($myField->getName(), $fieldType, $fieldOptions);
}
Gracias a las respuestas anteriores, espero que la mía ayude!
También quería cambiar las opciones, el caso obvio de "cambiar la etiqueta" para un campo existente de FOSUserBundle. Sé que podría hacer esto en Twig o con traducciones.
@redbirdo me señaló en la dirección correcta con "parece que agregar un campo con el mismo nombre lo reemplazará". Aquí está la solución:
$field = $builder->get(''username''); // get the field
$options = $field->getOptions(); // get the options
$type = $field->getType()->getName(); // get the name of the type
$options[''label''] = "Login Name"; // change the label
$builder->add(''username'', $type, $options); // replace the field