2014-08-27 36 views
0

Site form嵌入格式和选择列表

我有一个窗体,SiteType,与其他窗体,DomainType,embbed。但是,当我尝试在网站表单中显示域名字段(这是一个选项列表)时,它显示3次(每个列表包含数据库中的所有域)而不是一次。

这是我SiteType:

class SiteType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'text', array(
       'label' => 'Nom du site', 
       'required' => true 
      )) 
      ->add('nameBundle', 'text', array(
       'label' => 'Nom du bundle du site', 
       'required' => true 
      )) 
      ->add('numClient', 'integer', array(
       'label' => 'Numéro client du site', 
       'required' => true 
      )) 
      ->add('domains', 'collection', array(
       'type' => new DomainType(), 
      )); 
    } 
... 
} 

和我DomainType:

class DomainType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('domainName','entity', array(
       'class' => 'EliophotBackBundle:Domain', 
       'property' => 'domainName', 
       'label' => 'Nom du domaine' 
      )); 
    } 
... 
} 

和形式,我展示形式:

<form action="{{ path('site_create') }}" method="post"> 
    {{ form_row(form.name) }} 
    {{ form_row(form.nameBundle) }} 
    {{ form_row(form.numClient) }} 

    {% for domain in form.domains %} 
    {{ form_row(domain.domainName) }} 
    {% endfor %} 

    {{ form_rest(form) }} 

    <div class="btn-group"> 
    <button type="submit" class="btn btn-success">Ajouter</button> 
    </div> 
</form> 

我SiteController:

public function newSiteAction() 
    { 
     $site = new Site(); 

     $repository = $this->get('doctrine') 
      ->getRepository('TestBackBundle:Domain'); 

     $domains = $repository->findAll(); 

     foreach($domains as $domain) { 
      $domainObject = new Domain(); 
      $domainObject->setDomainName($domain->getDomainName()); 
      $site->getDomains()->add($domainObject); 
     } 

     $newForm = $this->createForm(new SiteType(), $site); 

     return $this->render('TestBackBundle:Site:new_site.html.twig', array(
      'site' => $site, 
      'form' => $newForm->createView(), 
     )); 
    } 

我想只显示一个选项列表中的所有域名...我该怎么做?

+0

我们需要看到的控制器。我的第一个猜测是,“Site”实体已经在DB中链接了3个“Domain”对象。 – 2014-08-27 15:50:23

+0

看起来,我编辑我的答案添加我的控制器:) – DOZ 2014-08-27 15:54:10

回答

1

我认为你可以解决这个像这样:

SiteType

$builder 
    ->add('name', 'text', array(
     'label' => 'Nom du site', 
     'required' => true 
    )) 
    ->add('nameBundle', 'text', array(
     'label' => 'Nom du bundle du site', 
     'required' => true 
    )) 
    ->add('numClient', 'integer', array(
     'label' => 'Numéro client du site', 
     'required' => true 
    )) 
    ->add('domains','entity', array(
     'class' => 'EliophotBackBundle:Domain', 
     'property' => 'domainName', 
     'label' => 'Nom du domaine', 
     'multiple' => true 
    )); 

在这种情况下,你就不会需要DomainType。至于控制器,你可以澄清这段代码:

$domains = $repository->findAll(); 

foreach($domains as $domain) { 
    $domainObject = new Domain(); 
    $domainObject->setDomainName($domain->getDomainName()); 
    $site->getDomains()->add($domainObject); 
} 

你为什么提取,然后重建所有域?是domainsSite实体不是TestBackBundle:Domain?如果他们在事实上,你可以只:

$domains = $repository->findAll(); 

$site->setDomains(new ArrayCollection($domains)); // don't forget sto `use` ArrayCollection 

希望这有助于有点...

+0

谢谢:)所以最后我不是在嵌入形式的情况下? – DOZ 2014-08-28 07:12:05

+0

是的,它似乎是这样。 ;)嵌入式表格通常很有用,当你想要“嵌入”多个字段,多次... – 2014-08-28 07:43:54

+0

啊好吧!谢谢你的解释:D – DOZ 2014-08-28 07:59:47