Php Sonata/AdminBundle:已选选项

Php Sonata/AdminBundle:已选选项,php,symfony,sonata-admin,symfony3.x,Php,Symfony,Sonata Admin,Symfony3.x,我是新来的交响乐和奏鸣曲。我想知道当实体具有来自其他实体的字段时,如何标记所选的选项。例如:我有两个实体:商店和城市。商店实体有一个名为id\u city的字段 我的问题是在呈现编辑表单商店时,因为总是选择选项中的第一个id\u city 这是我在AdminStoresclass中呈现配置表单的代码片段: protected function configureFormFields(FormMapper $formMapper) { $formMapper ->tab

我是新来的交响乐和奏鸣曲。我想知道当实体具有来自其他实体的字段时,如何标记所选的
选项。例如:我有两个实体:商店和城市。商店实体有一个名为
id\u city
的字段

我的问题是在呈现编辑表单商店时,因为总是选择选项中的第一个
id\u city

这是我在
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',
        ));
} 
->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()
在这段代码中,我正在恢复
AdminStores
类中的所有城市:

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',
        ));
} 
->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()
我想知道“如果
this->id\u city==entity->id\u city
那么,选项被选中”的逻辑

提前谢谢

我编辑这个评论是因为我认为我解决了它

在我的
AdminController
名为
ShopsAdmin
中,我创建了一个名为
getAllMunicipios
的方法,该方法返回一个带有
名称和
id的数组:

$allCities = array(
  'Tokyo' => 1
  'Madrid => 2
  );
方法如下:

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;
}
现在,我的
AdminStores::configureFormFields
方法如下:

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

这是一个好方法吗?我认为返回all的方法必须放在实体中,而不是int控制器中,但我不知道如何静态地调用商店实体中的setCity(\AppBundle\entity\City$City)。并将正确的城市实体作为第一个也是唯一的参数。在呈现表单之前执行此操作,只需在商店实体中调用setCity(\AppBundle\Entity\City$City)。并将正确的城市实体作为第一个也是唯一的参数。在呈现表单之前请执行此操作

谢谢您的帮助。我认为我在做一些不正确的事情。我已经创建了你建议给我的方法,在渲染表单之前,我给了它城市参数,但没有工作。。。如果我将该字段更改为textField,则id city将正确恢复,但当我将输入更改为select字段时,将显示所有城市,但始终显示第一个,而不是正确的id。请更新您的问题并向我们显示城市和商店实体。感谢您的帮助。我认为我在做一些不正确的事情。我已经创建了你建议给我的方法,在渲染表单之前,我给了它城市参数,但没有工作。。。如果我将该字段更改为textField,则会正确恢复id city,但当我将输入更改为select字段时,会显示所有城市,但始终显示第一个,而不是正确的id。请更新您的问题,并向我们显示城市和商店实体。