Symfony 2 добавить динамическую форму; значения из базы данных

Я хотел бы создать форму соответствия категорий Google (первое поле категорий из базы данных, а второе поле — поле автозаполнения пользователей из категорий Google), в котором у меня есть сущность 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 category)

Результат таков:

введите описание изображения здесь

Заранее спасибо!

1

Решение

Ваш цикл включен $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)
);
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]