同一类型的多种形式 - Symfony的2(Multiple forms of same type

2019-06-24 09:11发布

所以,我有我的控制器操作与此类似

$task1 = new Task();
$form1 = $this->createForm(new MyForm(), $task1);

$task2 = new Task();
$form2 = $this->createForm(new MyForm(), $task2);

让我们说,我的MyForm的有两个字段

//...
$builder->add('name', 'text');
$builder->add('note', 'text');
//...

这似乎是因为这两种形式是相同的键入MyForm,在视图渲染时,他们的领域有相同的名称和ID(两种形式的“名称”字段共享相同的名称和标识;同样的,小写注意”字段),因为其中的Symfony可能不结合形式正确的数据。 没有人知道任何解决这个?

Answer 1:

// your form type
class myType extends AbstractType
{
   private $name = 'default_name';
   ...
   //builder and so on
   ...
   public function getName(){
       return $this->name;
   }

   public function setName($name){
       $this->name = $name;
   }

   // or alternativ you can set it via constructor (warning this is only a guess)

  public function __constructor($formname)
  {
      $this->name = $formname;
      parent::__construct();
  }

}

// you controller

$entity  = new Entity();
$request = $this->getRequest();

$formType = new myType(); 
$formType->setName('foobar');
// or new myType('foobar'); if you set it in the constructor

$form    = $this->createForm($formtype, $entity);

现在你应该能够设置不同的ID为您箱..这应该导致形式的每个实例<input type="text" id="foobar_field_0" name="foobar[field]" required="required>和等等。



Answer 2:

我会用一个静态创建名

// your form type

    class myType extends AbstractType
    {
        private static $count = 0;
        private $suffix;
        public function __construct() {
            $this->suffix = self::$count++;
        }
        ...
        public function getName() {
            return 'your_form_'.$this->suffix;
        }
    }

然后,你可以创建你想要的,而不必每次设置的名称。



Answer 3:

编辑:不要这样! 看到这个代替: http://stackoverflow.com/a/36557060/6268862

在Symfony的3.0:

class MyCustomFormType extends AbstractType
{
    private $formCount;

    public function __construct()
    {
        $this->formCount = 0;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        ++$this->formCount;
        // Build your form...
    }

    public function getBlockPrefix()
    {
        return parent::getBlockPrefix().'_'.$this->formCount;
    }
}

现在网页上的表格的第一个实例将有“my_custom_form_0”正如它的名字(同为字段的名称和ID),第二个‘my_custom_form_1’,...



Answer 4:

创建一个动态的名字:

const NAME = "your_name";

public function getName()
{
    return self::NAME . '_' . uniqid();
}

你的名字永远是单



文章来源: Multiple forms of same type - Symfony 2