[英]Symfony 2 add dynamic form; values from database
我想創建一個谷歌類別匹配(數據庫的第一字段類別,谷歌類別的第二字段是用戶自動完成字段)形式,其中我有一個實體CategoriesConfig:
private $id;
/**
* @var string
*
* @ORM\Column(name="category_site", type="string", length=100)
*/
private $categorySite;
/**
* @var string
*
* @ORM\Column(name="category_google", type="string", length=100)
*/
private $categoryGoogle;
在我的控制器中,我嘗試了
/**
* @Route("/adminDashboard/categoriesMatching", name="googleShopping_categories")
* @Security("has_role('ROLE_SUPER_ADMIN')")
*/
public function categoriesMatchingAction(Request $request)
{
// create a task and give it some dummy data for this example
$idSite = $this->get('session')->get('_defaultWebSite')->getId();
$categories = $this->getDoctrine()->getRepository('DataSiteBundle:SiteCategory')->findBy(array('IdSite' => $idSite));;
$categories_config = new CategoriesConfig();
//var_dump($categories);exit;
$form = $this->createForm(new CategoriesConfigType($categories), $categories_config);
return $this->render('GoogleShoppingBundle:Default:categoriesMatching.html.twig', array(
'form' => $form->createView()
));
}
和我的表單類型:CategoriesConfigType:
class CategoriesConfigType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
private $site_categories;
public function __construct ($site_categories) {
$this->site_categories = $site_categories;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
foreach($this->site_categories as $k => $categorie){
$builder
->add('categorySite')
->add('categoryGoogle');
}
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Sp\GoogleShoppingBundle\Entity\CategoriesConfig'
));
}
}
我想擁有與行字段一樣多的類別行(網站itecategorie和google categorie)
結果是這樣的:
先感謝您!
$this->categories
上的循環無效,因為每次添加的元素都具有相同的名稱( categorySite
和categoryGoogle
),因此FormBuilder每次都替換表單字段,而不是添加另一個字段。
但是,如果您希望表單處理CategoryConfigs的集合,則需要采用其他方法。
1)創建一個CategoriesConfigType
(與您一樣),但是誰只負責一個CategoriesConfig實體
class CategoriesConfigType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('categorySite')
->add('categoryGoogle');
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Sp\GoogleShoppingBundle\Entity\CategoriesConfig'
));
}
}
2)然后使用CollectionType字段將您的表單作為CategoryConfigTypes的整個集合進行處理:
class YourCollectionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('categoriesConfigs', CollectionType::class, array(
'entry_type' => CategoriesConfigType::class,
'entry_options' => array('required' => false)
);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.