2015-07-27 4 views
1

Я хотел бы создать форму, которая позволяет пользователю подписаться/отказаться от подписки на различные темы, хранящиеся в базе данных. В принципе, все доступные темы сохраняются и должны выводиться с помощью флажка, чтобы пользователь мог добавлять/удалять эту тему из своего профиля. Я сделал это с помощью ванильного PHP, но новичок в Symfony2. Вот что я до сих пор.Symfony 2 Создание динамических форм

Я думаю, что я создал форму правильно, но я не совсем уверен, как написать контроллер здесь. Это всего лишь небольшой тест, чтобы увидеть, как это сделать, и в этом случае col, который содержит темы, называется параметрами. Любая помощь будет оценена по достоинству. Заранее спасибо!

Короче говоря, мне нужно перечислить все vals в опциях col как список флажков.

FormCheck.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

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

    /** 
    * @var string 
    * 
    * @ORM\Column(name="options", type="string", length=255) 
    */ 
    private $options; 


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

    /** 
    * Set options 
    * 
    * @param string $options 
    * @return FormCheck 
    */ 
    public function setOptions($options) 
    { 
     $this->options = $options; 

     return $this; 
    } 

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

FormCheckType.php

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class FormCheckType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('item', 'entity', array(
      'class' => 'AppBundle:FormCheck', 
      'property' => 'options', 
      'expanded' => true, 
      'multiple' => true, 
     )); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\FormCheck' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_formcheck'; 
    } 
} 

FormCheckController.php

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

class FormCheckController extends Controller 
{ 
    /** 
    * @Route("/form") 
    * @Template() 
    */ 
    public function formAction() 
    { 
     return $this->render('default/formCheck.html.twig'); 
    } 

} 

ответ

2

Во-первых , вы должны внимательно прочитать the documentation, почти все покрыто там, где вам нужно.

Вам будет лучше иметь сущность пользователя и объект темы для хранения ваших тем и присоединиться к ним со многими отношениями.

Таким образом вы можете добавлять/удалять темы & Ваша форма будет обновлена, и у вас не будет дублированной информации в строке параметров у каждого пользователя.

E.g. (Я не синтаксис проверил это на всех, может быть опечаток, но это общая суть того, что я хотел бы сделать в вашей ситуации)

Пользователь

/** 
* @var string 
* 
* @ORM\ManyToMany(targetEntity="YourNamespace\YourBundle\Entity\Topic", mappedBy="users") 
*/ 
protected $topics; 

Тема

/** 
* @ORM\ManyToMany(targetEntity="YourNamespace\YourBundle\Entity\User", inversedBy="topics") 
* @ORM\JoinTable(name="user_topic", 
*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="topic_id", referencedColumnName="id")} 
*  ) 
*/ 
protected $users; 

Форма

class UserTopicType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('topics', 'entity', array(
      'class' => 'AppBundle:Topic', 
      'property' => 'topics', 
      'expanded' => true, 
      'multiple' => true, 
     )); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\User' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_usertopic'; 
    } 
} 

контроллер

class FormCheckController extends Controller 
{ 
    /** 
    * @Route("/form") 
    * @Template() 
    */ 
    public function formAction(Request $request) 
    { 
     $user = // however you get your user here 

     $form = $this->createForm(new UserTopicType(), $user); 
     $formView = $form->createView(); 

     $form->handleRequest($request); // request 

     if ($form->isValid()) { 

      // persist, flush your user here and redirect to your form 
      // or whatever you want to do 
     } 

     $parameters = array(
      'form' => $formView, 
     ); 

    return $this->render('default/formCheck.html.twig', $parameters); 
    } 
} 
+0

Спасибо! Я попробую это. – chrisjnas

Смежные вопросы