Symfony2 - значения по умолчанию в прототипе Form Collection - PullRequest
8 голосов
/ 21 сентября 2011

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

Например:

Я создал AbstractType для своей формы, которая содержит вложенную коллекцию строк Person (соответствующий код показан ниже):

public function buildForm(FormBuilder $builder, array $options)
{
    ...
    $builder->add('people', 'collection', array(
            'type'         => new PersonType(),
            'allow_add'    => true,
            'allow_delete' => true,
            'prototype'    => true,
        ));
    ...
}

Класс PersonType содержит следующий код:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('name', 'text');
    $builder->add('date_of_birth', 'date');
    $builder->add('age', 'number');

    // This would be great if I could do this but I can't:
    //$builder->add('date_of_birth', 'date', array('empty_value' => new \DateTime(...))); // some default value defined here
}

Лучшее, что я смог сделать до сих пор, показано ниже в файле представления (показанный код используется для визуализации прототипа коллекции):

...
<tr>
    <td> {{ form_widget(person.name) }} </td>

    {# THIS DOES NOT WORK (I just get the default selected date) #}
    <td> {{ form_widget(person.date_of_birth, {'value': person.date_of_birth.get('value')|default({'year':2010, 'month':10, 'day':15})} }} </td>

    {# THIS WORKS (the field contains '0' instead of being empty) #}
    <td> {{ form_widget(person.age, {'value': person.age.get('value')|default(0)} }} </td>
</tr>
...
  • Itтолько кажется, что работает с простыми типами, такими как текст и число.Это не работает с типом даты.
  • Это в любом случае не похоже на правильный подход.Я должен иметь возможность определить значение по умолчанию / пустое значение либо в базовой модели (например, protected $age = 10; внутри класса модели), либо в классе определения формы (AbstractType) (например, массив ('empty_value' => new DateTime ())), но ни один из них в настоящее время невозможен.

Итак, в общем, мой вопрос:

Как определить значения по умолчанию для класса модели, который будет автоматически установлен на клиенте, когдадобавление новых элементов в форму «коллекция» (вместо того, чтобы просто получать пробелы).

Кто-нибудь знает хороший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

В конструкторе сущности, для которой используется форма, вы просто устанавливаете дату с помощью объекта \ DateTime, например:

class MyEntity {
    private $myDate;

    public function __construct() {
        $this->myDate = new \DateTime('today'); 
    }
}

Вы также можете использовать \ DateTime ('now')) или \ DateTime («завтра»), как описано в обсуждении ниже

http://groups.google.com/group/symfony2/browse_thread/thread/18a5b20aca485dc4/e9947d0f06d6519d

Редактировать : На самом деле эта информация содержится в документации по symfony2:1011 *

http://symfony.com/doc/2.0/book/forms.html#building-the-form

0 голосов
/ 09 февраля 2015

При Symfony> 2.0 это невозможно.

Symfony 2.0 получил значения для прототипа из базового объекта, поэтому установка их в конструкторе также изменила значения в прототипе. Однако это поведение было изменено в Symfony 2.1, который удалил эту функциональность, лишив нас возможности установки значений по умолчанию для прототипа:

Я думаю, что установка значения по умолчанию для прототипа тогда действительно невозможна сейчас. --webmozart, сотрудник Symfony (https://github.com/symfony/symfony/issues/5087)

Существует активная ошибка в активной разработке, которая должна добавить поддержку опции data_prototype. Используя эту опцию, можно будет предоставить данные для предварительного заполнения прототипа. Однако, вероятно, он выйдет не раньше, чем с Symfony 2.7.

0 голосов
/ 04 октября 2011

может быть

$builder->setData(array('date_of_birth', new \DateTime(...)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...