www vehiculos vehicle tag plate online motores license gorenew florida espanol dmv dhsmv check forms validation symfony doctrine2

forms - vehicle - vehiculos y motores de la florida



¿Cómo usar el cuadro de selección relacionado en otro cuadro de selección? (3)

En cuanto a lo que ya probaste, creo que debes volver a intentar tus primeras / segundas ideas:

Mi primera idea fue usar el tipo de entidad de formulario, pensando que el componente podría estar ligado de algún modo en otro campo. es decir. actualizar la lista de empleados en función del valor de la empresa seleccionada.

Puede completar el cuadro de selección de empleados con el tipo de entity . Todo lo que tienes que hacer es definir las buenas opciones:

class FooType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add(''employee'', ''entity'', array( ''class'' => ''Entity/Employee'', ''query_builder'' => function ($repository) use($options) { return $repository ->createQueryBuilder(''e'') ->where(''e.company = :company'') ->setParameter(''company'', $options[''companyId'']) ; }, )) ; } public function getDefaultOptions(array $options) { return array(''data_class'' => ''Entity/Foo'', ''companyId'' => null); } }

Luego pensé en pasar manualmente la empresa seleccionada como parámetro al generador de consultas de la segunda lista desplegable.

El ejemplo aquí filtra la lista de empleados según la opción del formulario companyId. Puede modificar este comportamiento filtrando directamente en la empresa presente en los datos del formulario.

public function buildForm(FormBuilder $builder, array $options) { $companyId = $builder->getData()->getCompanyId(); $builder ->add(''employee'', ''entity'', array( ''class'' => ''Entity/Employee'', ''query_builder'' => function ($repository) use ($companyId) { return $repository ->createQueryBuilder(''e'') ->where(''e.company = :company'') ->setParameter(''company'', $companyId) ; }, )) ; }

Aún debe implementar los getEmployee() y setEmployee() en su clase Entity/Foo .

Pero cuando se crea el formulario, los valores están vacíos. Los valores solo se establecen en bindRequest.

No. Los valores se establecen cuando crea su formulario usando form factory (tercer argumento) O cuando llama a $form->setData($foo); . Los datos se modifican cuando bind nuevas entradas al formulario.

Podría haber un problema con este enfoque: es posible que la identificación del empleado vinculada al formulario no esté disponible en la lista de opciones del formulario porque usted cambió la empresa (y por lo tanto los empleados).

¿Cómo usar cuadros de selección relacionados en Symfony?

Digamos que tengo una lista de selección que contiene compagnies y otra que contiene empleados de la compañía seleccionada. ¿Cómo los defino en Symfony? Ya he creado todo el código relacionado con Javascript pero al enviar mi formulario y tener errores en algunos campos, todos los campos de selección "sub" se restablecen a nulo.

¿Algunas ideas?
Gracias,

EDITAR: Como la pregunta parece ser malentendida, agregaré algunas precisiones:

Descripción:

  1. Tengo una empresa de la entidad que contiene una lista de empleados que utilizan una relación @OneToMany.
  2. Cuando selecciono una empresa en una lista de selección / lista desplegable, la segunda lista desplegable que contiene los empleados se actualiza a través de jQuery. Esa parte está hecha, funciona a la perfección
  3. Al enviar el formulario sin errores, la solución de formulario de entidad funciona bien.
  4. Al enviar el formulario que contiene errores, la segunda lista desplegable contiene todos los valores posibles. No están filtrados en la compañía seleccionada.

Soluciones probadas:

  • Mi primera idea fue usar el tipo de entidad de formulario , pensando que el componente podría estar ligado de algún modo en otro campo. es decir. actualizar la lista de empleados en función del valor de la empresa seleccionada.

No funciona, no hay forma de salir de la caja para hacer esto. Incluso soluciones no listas para usar ...

  • Luego pensé en pasar manualmente la empresa seleccionada como parámetro al generador de consultas de la segunda lista desplegable.

Pero cuando se crea el formulario, los valores están vacíos. Los valores solo se establecen en bindRequest .

  • Pensó en usar el tipo de elección. Delegar todas las funciones de filtro a la interfaz de usuario a través de Javascript. Es decir, cuando se carga la página, aparece una lista vacía y está poblada por Javascript en función de la compañía seleccionada.

Esto realmente funciona, pero creo que no hay otra palabra que la programación realmente fea aquí.

PD:

Se ha preguntado aquí, en la lista de correo de Symfony2, en Twitter y en el foro oficial de Symfony 2. Por supuesto, he buscado cada uno de ellos varias veces antes de publicar mis preguntas.


Puede crear una acción, que será return json array con los empleados de la empresa. Cuando la lista de compañías cambió, debe solicitar esta acción mediante ajax y crear una lista de selección de empleados.

Acción del controlador de formulario:

/** * @Route("/job", name="_demo_job") * @Template() */ public function jobAction() { $form = $this->createForm(new JobType()); $request = $this->getRequest(); if ($request->getMethod() == ''POST'') { $form->bindRequest($request); $data = $form->getData(); // some operations with form data } return array( ''form'' => $form->createView(), ); }

Conroller, que devuelve empleados por compañía en json:

/** * Finds all employees by company * * @Route("/{id}/show", name="employees_by_category") */ public function listByCompanyAction($id) { $request = $this->getRequest(); if ($request->isXmlHttpRequest() && $request->getMethod() == ''POST'') { $em = $this->getDoctrine()->getEntityManager(); $company = $em->getRepository(''AcmeDemoBundle:Company'')->find($id); // create array for json response $empoloyees = array(); foreach ($company->getEmployees() as $employee) { $empoloyees[] = array($employee->getId(), $employee->getName()); } $response = new Response(json_encode($empoloyees)); $response->headers->set(''Content-Type'', ''application/json''); return $response; } return new Response(); }

Plantilla de formulario:

<script type="text/javascript"> $(document).ready(function() { $(''#form_company'').change(function() { var companyId = $(this).val(); $.post(''{{ route }}/'' + companyId + ''/show'', function(data) { // last selected employee var selectedVal = $(''option:selected'', ''#form_employee'').attr(''value''); $(''#form_employee option'').remove(); for (i in data) { // create option with employee var option = $(''<option></option>''). attr(''value'', data[i][0]). text(data[i][1]); // set selected employee if (data[i][0] == selectedVal) { option.attr(''selected'', ''selected''); } // append to employee to employees select $(''#form_employee'').append(option); } }, ''json''); }) // request employees by company $(''#form_company'').change(); }) </script>

<form action="{{ path(''_demo_job'') }}" method="post" {{ form_enctype(form) }}> {{ form_widget(form) }} <input type="submit" /> </form>

Para un ejemplo más detallado, debe describir su problema con más detalle.


Yo tuve el mismo problema. Debe usar eventos de formulario. Mi ejemplo de código con país, región, relaciones de la ciudad.

namespace Orfos/UserBundle/Form/Type; ///import form events namespace use Symfony/Component/EventDispatcher/EventSubscriberInterface; use Symfony/Component/Form/FormEvents; use Symfony/Component/Form/Event/DataEvent; class RegistrationFormType extends BaseType { private $request; public function __construct($class, $request, $doctrine) { parent::__construct($class); $this->request = $request; $this->doctrine = $doctrine; } public function buildForm(FormBuilder $builder, array $options) { parent::buildForm($builder, $options); //other fields $locale = $this->request->getLocale(); $builder->add(''country'', ''entity'', array( ''class'' => ''Orfos/CoreBundle/Entity/Country'', ''property'' => $locale . ''name'', ''label'' => ''register.country.label'', ''query_builder'' => function(EntityRepository $er) { return $er->createQueryBuilder(''c'') ->select(''c'', ''t'') ->join(''c.translations'', ''t''); }, )); $factory = $builder->getFormFactory(); $refreshRegion = function ($form, $country) use ($factory, $locale) { $form->add($factory->createNamed(''entity'', ''region'', null, array( ''class'' => ''Orfos/CoreBundle/Entity/Region'', ''property'' => $locale . ''name'', ''label'' => ''register.region.label'', ''query_builder'' => function (EntityRepository $repository) use ($country) { $qb = $repository->createQueryBuilder(''region'') ->select(''region'', ''translation'') ->innerJoin(''region.country'', ''country'') ->join(''region.translations'', ''translation''); if ($country instanceof Country) { $qb = $qb->where(''region.country = :country'') ->setParameter(''country'', $country); } elseif (is_numeric($country)) { $qb = $qb->where(''country.id = :country_id'') ->setParameter(''country_id'', $country); } else { $qb = $qb->where(''country.id = 1''); } return $qb; } ))); }; $factory = $builder->getFormFactory(); $refreshCity = function($form, $region) use ($factory, $locale) { $form->add($factory->createNamed(''entity'', ''city'', null, array( ''class'' => ''Orfos/CoreBundle/Entity/City'', ''property'' => $locale . ''name'', ''label'' => ''register.city.label'', ''query_builder'' => function (EntityRepository $repository) use ($region) { $qb = $repository->createQueryBuilder(''city'') ->select(''city'', ''translation'') ->innerJoin(''city.region'', ''region'') ->innerJoin(''city.translations'', ''translation''); if ($region instanceof Region) { $qb = $qb->where(''city.region = :region'') ->setParameter(''region'', $region); } elseif (is_numeric($region)) { $qb = $qb->where(''region.id = :region_id'') ->setParameter(''region_id'', $region); } else { $qb = $qb->where(''region.id = 1''); } return $qb; } ))); }; $builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshRegion, $refreshCity) { $form = $event->getForm(); $data = $event->getData(); if ($data == null){ $refreshRegion($form, null); $refreshCity($form, null); } if ($data instanceof Country) { $refreshRegion($form, $data->getCountry()->getRegions()); $refreshCity($form, $data->getRegion()->getCities()); } }); $builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($refreshRegion, $refreshCity) { $form = $event->getForm(); $data = $event->getData(); if (array_key_exists(''country'', $data)) { $refreshRegion($form, $data[''country'']); } if (array_key_exists(''region'', $data)) { $refreshCity($form, $data[''region'']); } }); } }