symfony2 isvalid form forms symfony default symfony-forms

forms - isvalid - symfony using form



Symfony2 Configuración de una selección de campo de elección predeterminada (12)

Creo que simplemente deberías usar $breed->setSpecies($species) , por ejemplo en mi forma que tengo:

$m = new Member(); $m->setBirthDate(new /DateTime); $form = $this->createForm(new MemberType, $m);

y eso establece mi selección predeterminada a la fecha actual. Debería funcionar de la misma manera para las entidades externas ...

Estoy creando un formulario de la siguiente manera:

$form = $this->createFormBuilder($breed) ->add(''species'', ''entity'', array( ''class'' => ''BFPEduBundle:Item'', ''property'' => ''name'', ''query_builder'' => function(ItemRepository $er){ return $er->createQueryBuilder(''i'') ->where("i.type = ''species''") ->orderBy(''i.name'', ''ASC''); })) ->add(''breed'', ''text'', array(''required''=>true)) ->add(''size'', ''textarea'', array(''required'' => false)) ->getForm()

¿Cómo puedo establecer un valor predeterminado para la lista de especies?

Gracias por su respuesta, me disculpo, creo que debería volver a formular mi pregunta. Una vez que tengo un valor que recupero del modelo, ¿cómo configuro ese valor como SELECTED = "yes" para el valor correspondiente en la lista de opciones de especies?

Entonces, esa salida de opción de selección de la vista TWIG aparecería así:

<option value="174" selected="yes">Dog</option>


De los documentos:

public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())

mixed $ data = null son las opciones predeterminadas. Entonces, por ejemplo, tengo un campo llamado estado y lo implementé como tal:

$default = array(''Status'' => ''pending''); $filter_form = $this->get(''form.factory'')->createNamedBuilder(''filter'', ''form'', $default) ->add(''Status'', ''choice'', array( ''choices'' => array( '''' => ''Please Select...'', ''rejected'' => ''Rejected'', ''incomplete'' => ''Incomplete'', ''pending'' => ''Pending'', ''approved'' => ''Approved'', ''validated'' => ''Validated'', ''processed'' => ''Processed'' ) ))->getForm();


El formulario debe asignar el valor de species-> id automáticamente al campo de selección de la entidad seleccionada. Por ejemplo, si tienes una entidad de raza que tiene una relación de OnetoOne con una entidad de especie en una tabla de unión llamada ''breed_species'':

class Breed{ private $species; /** * @ORM/OneToOne(targetEntity="BreedSpecies", mappedBy="breed") */ private $breedSpecies; public function getSpecies(){ return $breedSpecies->getSpecies(); } private function getBreedSpecies(){ return $this->$breedSpecies; } }

El campo ''especie'' en la clase de formulario debe recoger el valor de la especie-> id del objeto de atributo ''especie'' en la clase de Raza pasada al formulario.

Alternativamente, puede establecer explícitamente el valor pasando explícitamente la entidad de la especie a la forma usando SetData ():

$breedForm = $this->createForm( new BreedForm(), $breed ); $species = $breed->getBreedSpecies()->getSpecies(); $breedForm->get(''species'')->setData( $species ); return $this->render( ''AcmeBundle:Computer:edit.html.twig'' , array( ''breed'' => $breed , ''breedForm'' => $breedForm->createView() ) );


Establecer la opción predeterminada para el botón de opción Symfony2

$builder->add(''range_options'', ''choice'', array( ''choices'' => array(''day''=>''Day'', ''week''=>''Week'', ''month''=>''Month''), ''data''=>''day'', //set default value ''required''=>true, ''empty_data''=>null, ''multiple''=>false, ''expanded''=> true ))


No creo que deba usar la opción de data , porque esto hace más que solo establecer un valor predeterminado. También anula los datos que se pasan al formulario durante la creación. Entonces, básicamente, estás rompiendo soporte para esa función. - Lo cual puede no importar cuando le permite al usuario crear datos, pero sí importa cuando quiere (algún día) usar el formulario para actualizar datos.

Ver http://symfony.com/doc/current/reference/forms/types/choice.html#data

Creo que sería mejor pasar cualquier información predeterminada durante la creación del formulario. En el controlador.

Por ejemplo, puede pasar una clase y definir el valor predeterminado en su clase. (cuando se utiliza el Symfony/Bundle/FrameworkBundle/Controller/Controller predeterminado)

$form = $this->createForm(AnimalType::class, [ ''species'' => 174 // this id might be substituted by an entity ]);

O al usar objetos:

$dog = new Dog(); $dog->setSpecies(174); // this id might be substituted by an entity $form = $this->createForm(AnimalType::class, $dog);

Aún mejor cuando se usa una fábrica: (donde el perro probablemente se extiende desde el animal)

$form = $this->createForm(AnimalType::class, DogFactory::create());

Esto le permitirá separar la estructura del formulario y el contenido entre sí y hacer que su formulario sea reutilizable en más situaciones.

O bien, use la opción preferred_choices , pero esto tiene el efecto secundario de mover la opción predeterminada a la parte superior de su formulario.

Ver: http://symfony.com/doc/current/reference/forms/types/choice.html#preferred-choices

$builder->add( ''species'', ''entity'', [ ''class'' => ''BFPEduBundle:Item'', ''property'' => ''name'', ''query_builder'' => ..., ''preferred_choices'' => [174] // this id might be substituted by an entity ] );


No estoy seguro de lo que está haciendo mal aquí, cuando construyo un formulario usando clases de formulario, Symfony se encarga de seleccionar la opción correcta en la lista. Aquí hay un ejemplo de uno de mis formularios que funciona.

En el controlador para la acción de edición:

$entity = $em->getRepository(''FooBarBundle:CampaignEntity'')->find($id); if (!$entity) { throw $this->createNotFoundException(''Unable to find CampaignEntity entity.''); } $editForm = $this->createForm(new CampaignEntityType(), $entity); $deleteForm = $this->createDeleteForm($id); return $this->render(''FooBarBundle:CampaignEntity:edit.html.twig'', array( ''entity'' => $entity, ''edit_form'' => $editForm->createView(), ''delete_form'' => $deleteForm->createView(), ));

Clase de tipo de entidad de campaña (src: Foo / BarBundle / Form / CampaignEntityType.php):

namespace Foo/BarBundle/Form; use Symfony/Component/Form/AbstractType; use Symfony/Component/Form/FormBuilder; use Doctrine/ORM/EntityRepository; class CampaignEntityType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add(''store'', ''entity'', array(''class''=>''FooBarBundle:Store'', ''property''=>''name'', ''em''=>''my_non_default_em'',''required'' => true, ''query_builder'' => function(EntityRepository $er) {return $er->createQueryBuilder(''s'')->orderBy(''s.name'', ''ASC'');})) ->add(''reward''); } public function getName() { return ''foo_barbundle_campaignentitytype''; } }


Puede definir el valor predeterminado correcto en el modelo que desea editar con este formulario o puede especificar una opción empty_data para que su código se convierta en:

$form = $this ->createFormBuilder($breed) ->add( ''species'', ''entity'', array( ''class'' => ''BFPEduBundle:Item'', ''property'' => ''name'', ''empty_data'' => 123, ''query_builder'' => function(ItemRepository $er) { return $er ->createQueryBuilder(''i'') ->where("i.type = ''species''") ->orderBy(''i.name'', ''ASC'') ; } ) ) ->add(''breed'', ''text'', array(''required''=>true)) ->add(''size'', ''textarea'', array(''required'' => false)) ->getForm() ;


Puede definir el valor predeterminado del atributo ''datos''. Esto es parte del tipo abstracto "campo" ( http://symfony.com/doc/2.0/reference/forms/types/field.html )

$form = $this->createFormBuilder() ->add(''status'', ''choice'', array( ''choices'' => array( 0 => ''Published'', 1 => ''Draft'' ), ''data'' => 1 )) ->getForm();

En este ejemplo, ''Draft'' se establecerá como el valor seleccionado por defecto.


Puede usar "preferred_choices" y "push" el nombre que desea seleccionar en la parte superior de la lista. Entonces será seleccionado por defecto.

''preferred_choices'' => array(1), //1 is item number

entidad Tipo de campo


Si desea pasar una matriz de entidades de Doctrine, intente algo como esto (Symfony 3.0+):

protected $entities; protected $selectedEntities; public function __construct($entities = null, $selectedEntities = null) { $this->entities = $entities; $this->selectedEntities = $selectedEntities; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add(''entities'', ''entity'', [ ''class'' => ''MyBundle:MyEntity'', ''choices'' => $this->entities, ''property'' => ''id'', ''multiple'' => true, ''expanded'' => true, ''data'' => $this->selectedEntities, ]); }


Si usa Cristian''s solución Cristian''s , deberá EntityManager el EntityManager en su clase FormType. Aquí hay un ejemplo simplificado:

class EntityType extends AbstractType{ public function __construct($em) { $this->em = $em; } public function buildForm(FormBuilderInterface $builder, array $options){ $builder ->add(''MyEntity'', ''entity'', array( ''class'' => ''AcmeDemoBundle:Entity'', ''property'' => ''name'', ''query_builder'' => function(EntityRepository $er) { return $er->createQueryBuilder(''e'') ->orderBy(''e.name'', ''ASC''); }, ''data'' => $this->em->getReference("AcmeDemoBundle:Entity", 3) )); } }

Y tu controlador:

// ... $form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity); // ...

De Doctrine Docs :

El método EntityManager # getReference ($ entityName, $ identifier) ​​le permite obtener una referencia a una entidad para la cual se conoce el identificador, sin cargar esa entidad desde la base de datos. Esto es útil, por ejemplo, como una mejora del rendimiento, cuando desea establecer una asociación con una entidad para la que tiene el identificador.


la solución: para la entidad de tipo use la opción "datos" pero el valor es un objeto. es decir:

$em = $this->getDoctrine()->getEntityManager(); ->add(''sucursal'', ''entity'', array ( ''class'' => ''TestGeneralBundle:Sucursal'', ''property''=>''descripcion'', ''label'' => ''Sucursal'', ''required'' => false, ''data''=>$em->getReference("TestGeneralBundle:Sucursal",3) ))