我有一个表单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 :(得分: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
希望这有点帮助...