嵌入表单和选择列表

时间:2014-08-27 15:39:34

标签: php forms symfony twig embedding

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(),
        ));
    }

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

1 个答案:

答案 0 :(得分: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);
}

为什么要获取然后重建所有域名?来自domains实体Site不属于 TestBackBundle:Domain吗?如果它们实际上是,你可以:

$domains = $repository->findAll();

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

希望这有点帮助...