Несколько форм одного типа - Symfony 2
Итак, у меня есть действие моего контроллера, похожее на это
$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, когда они отображаются в представлениях, их поля имеют одинаковое имя и идентификаторы (поля "name" двух форм имеют одинаковое имя и id, то же самое для полей "примечания" ), из-за чего Symfony не может правильно привязывать данные форм. Кто-нибудь знает какое-либо решение этого?
Ответы
Ответ 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);
теперь вы можете установить другой идентификатор для каждого экземпляра формы, которую вы создаете. Это должно привести к <input type="text" id="foobar_field_0" name="foobar[field]" required="required>
и т.д.
Ответ 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;
}
}
Затем вы можете создать столько, сколько хотите, без необходимости устанавливать имя каждый раз.
Ответ 3
РЕДАКТИРОВАТЬ: Не делайте этого! Вместо этого: fooobar.com/questions/479993/...
В 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" в качестве его имени (то же самое для имен полей и идентификаторов), второй - "my_custom_form_1",...
Ответ 4
создать одно динамическое имя:
const NAME = "your_name";
public function getName()
{
return self::NAME . '_' . uniqid();
}
ваше имя всегда одно