2015-06-19 100 views
0

如何創造一個動態下拉使用symfony的2 我有這樣的事情列表,symfony的2動態下拉菜單

$builder->add('gender', 'choice', array(
     'choices' => array(1 => 'campus1', 2 => 'campus2'), 
     'required' => false, 
)); 

我不想硬編碼任何東西,我不希望它是上樹枝或前端,我想在控制器中有所作爲。 這裏是需要在選擇下拉被加載到下拉

<?php 

namespace Test\Bundle\TestBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Campus 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="..\Entity\CampusRepository") 
*/ 
class Campus 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="University", inversedBy="campus") 
* @ORM\JoinColumn(name="university_id", referencedColumnName="id") 
*/ 
private $university; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
* @Assert\NotBlank 
* @Assert\Length(
*     min=3, 
*     max=35, 
*     minMessage= "Name Field should contains at least 3 characters", 
*     maxMessage = "Name Field Cannot contain more than 35 characters" 
*    ) 
* @Assert\Regex(pattern="/[^a-z\s-]/i", match=false , message="Name can only contain letters") 
*/ 
private $name; 

/** 
* @var string 
* @ORM\Column(name="address", type="string", length=255) 
* @Assert\NotBlank() 
* @Assert\Length(
*     min = 10, 
*     max = 80, 
*     minMessage = "Address must be more specific", 
*     maxMessage = "80 characters limit exceeded" 
*    ) 
*/ 
private $address; 


/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set name 
* 
* @param string $name 
* @return Campus 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Set address 
* 
* @param string $address 
* @return Campus 
*/ 
public function setAddress($address) 
{ 
    $this->address = $address; 

    return $this; 
} 

/** 
* Get address 
* 
* @return string 
*/ 
public function getAddress() 
{ 
    return $this->address; 
} 

/** 
* Set university 
* 
* @param \Test\Bundle\TestBundle\Entity\University $university 
* @return Campus 
*/ 
public function setUniversity(\Test\Bundle\TestBundle\Entity\University $university = null) 
{ 
    $this->university = $university; 

    return $this; 
} 

/** 
* Get university 
* 
* @return \Test\Bundle\TestBundle\Entity\University 
*/ 
public function getUniversity() 
{ 
    return $this->university; 
} 

}

和形式提交我將使用從該實體的其他領域,所以我需要整個實體提交表單時的對象。

那麼我如何使用symfony2的功能填充數據庫中的數據呢?爲建立一個數組,並通過

+0

您可能還想結算這個http://symfony.com/doc/current/reference/forms/types/entity.html – Squeegy

+0

是的,我通讀了這篇文章,能否請您用通俗的語言向我解釋它意味着什麼,這第一週的php和symfony對我來說簡直是一個蠢蛋 –

+0

@noobDeDaa我剛剛添加了一個解釋如何使用實體字段類型的答案。 – redbirdo

回答

1

使用Entity表單字段類型,這是一個特殊的選擇字段類型,用於加載來自Doctrine實體的選項。例如:

$builder->add('campus', 'entity', array(
    'class' => 'TestBundleTestBundle:Campus', 
    'property' => 'name', 
    'query_builder' => function (EntityRepository $er) { 
     return $er->createQueryBuilder('c') 
      ->orderBy('c.name', 'ASC'); 
    }, 
)); 

當提交表單時,「校園」字段的表單數據將是校園類的一個實例。如果你的表單數據是一個實體而不是一個數組,那麼該實體需要有一個對應的「校園」字段,表示與校園實體的關係。

1

以及it's簡單它

$camps=$em->getRepository('TestTestBundle:Campus')->findAll(); 
$choices=array(); 
foreach ($camps as $campus) { 
    $choices[$campus->getId()] = $campus->getName(); 
} 
$builder->add('gender', 'choice', array(
     'choices' => $choices, 
     'required' => false, 
)); 

可以拿到實體然後通過ID找到它

+0

感謝它的工作,我也會檢查出另一種方式,如使用實體字段類型,並決定哪個更好 –

+1

本質上實體字段類型應該是一個很好的對於同一個過程而言,更好地使用實體表單字段類型 –