1
votes

I'm new in Symfony and Sonata/AdminBundle. I would like to know how to mark selected an option when the entity has a field from other entity. For example: I have two entities: Shop and City. The Shop entity has a field called id_city.

My problem is when I'm rendering the edit form Shop because always the first id_city in the option is selected.

This is the piece of code where I'm rendering the configuration form in AdminStores class:

protected function configureFormFields(FormMapper $formMapper)
{

    $formMapper
      ->tab('Tiendas')
      ->with('Content', array('class' => 'col-md-9'))
        ->add('nombreTienda', 'text')
        ->add('cifTienda', 'text')
        ->add('direccionTienda', 'text')
        ->add('personaContacto', 'text', array('required' => false,'empty_data' => ''))
        ->add('cp', 'text', array('label' => 'Código Postal', 'required' => false, 'empty_data' => '00000'))
        ->add('urlTienda', 'text', array('required' => false, 'empty_data' => ''))
        ->add('emailTienda', 'text')
        ->add('telefonoTienda', 'text')
        ->add('login', 'text')
        ->add('pass', 'password', array('required' => false))
        ->add('idMunicipio', 'entity', array(
          'class' => 'AppBundle:Municipios',
          'choice_label' => 'municipio',
          'query_builder' => function (EntityRepository $er) {
              $lista = $er->createQueryBuilder('ss')
                  ->orderBy('ss.municipio', 'ASC');
          },
          'data' => $this->subject->getIdMunicipio()
        )) // end array idMunicipio y add()
        ->add('idProvincia', EntityType::class, array(
          'class' => 'AppBundle:Provincias',
          'label' => 'Provincia',
          'choice_label' => 'provincia',
          'choice_value' => 'getId',
          'by_reference' => true,
        ))
        ->add('descripcionTienda', 'textarea')
      ->end()
      ->end()
      ->tab('Multimedia')
      ->with('Content', array('class' => 'col-md-3'))
        ->add('fotoTienda', 'file', array(
          'label' => 'Imagenes (puedes subir hasta 6 imágenes)',
          'attr' =>array('class' => 'form-control', 'multiple' => 'multiple', 'accept' => 'image/*'),
          'data_class' => null,
          'required' => false,
          'empty_data' => 'noDisponible',
        ));
} 

In this piece of code, I'm recovering all cities in AdminStores class:

->add('idMunicipio', 'entity', array(
          'class' => 'AppBundle:Municipios',
          'choice_label' => 'municipio',
          'query_builder' => function (EntityRepository $er) {
              $lista = $er->createQueryBuilder('ss')
                  ->orderBy('ss.municipio', 'ASC');
          },
          'data' => $this->subject->getIdMunicipio()
        )) // end array idMunicipio y add()

I would like to know, please, the logic for " if this->id_city == entity->id_city then, option is selected".

Thanks in advance

I edit this comment because I think that I solved it.

In my AdminController called ShopsAdmin I have created a method called getAllMunicipios which return an array with their name and id:

$allCities = array(
  'Tokyo' => 1
  'Madrid => 2
  );

This is the method:

protected function getAllMunicipios()
{
    $municipios = $this->getConfigurationPool()
      ->getContainer()
      ->get('doctrine')
      ->getRepository('AppBundle:Municipios')
      ->findBy([], ['municipio' => 'ASC']);

    $todosmunicipios = array();
    foreach ($municipios as $municipio) {
        $todosmunicipios[(string)$municipio->getMunicipio()] = (int)$municipio->getId();
    }
    return $todosmunicipios;
}

Now my AdminStores::configureFormFields method like that this:

->add('idMunicipio', 'choice', array(
          'choices' => $this->getAllMunicipios(),
          'required' => false,
          'by_reference' => false,
          'data' => $this->subject->getIdMunicipio()
        ))

It is a good way to do it? I think that the method that return all, must be placed into the entity and not int the controller but I dont know how do it static

1

1 Answers

0
votes

just call setCity(\AppBundle\Entity\City $city) in your Shop entity. and give the right city entity as the first and only parameter. Do this before you render the form