12

だから私はこれに似た私のコントローラーアクションを持っています

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

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

そして、私のMyFormに2つのフィールドがあるとしましょう

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

2つのフォームは同じタイプのMyFormであるため、ビューでレンダリングすると、それらのフィールドは同じ名前とIDを持ちます(2つのフォームの「name」フィールドは同じ名前とIDを共有します。同じことが「」にも当てはまります。注'フィールド)、そのため、Symfonyはフォームのデータを正しくバインドしない可能性があります。誰かがこれに対する解決策を知っていますか?

4

4 に答える 4

19
// 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>のようになります。

于 2012-05-12T11:24:09.750 に答える
10

静的を使用して名前を作成します

// 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;
        }
    }

その後、毎回名前を設定することなく、必要なだけ作成できます。

于 2013-09-11T03:53:15.330 に答える
6

編集:そうしないでください!代わりにこれを参照してください: 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 と同じ)、2 番目のインスタンスは「my_custom_form_1」、...

于 2016-05-09T11:53:03.037 に答える
0

単一の動的な名前を作成します:

const NAME = "your_name";

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

あなたの名前はいつも独身です

于 2015-10-13T10:25:25.503 に答える