Как установить значение по умолчанию для поля формы в Symfony2? - PullRequest
131 голосов
/ 27 октября 2011

Есть ли простой способ установить значение по умолчанию для текстового поля формы?

Ответы [ 22 ]

6 голосов
/ 27 марта 2018

Не использовать:

'data' => 'Default value'

Читать здесь: https://symfony.com/doc/current/reference/forms/types/form.html#data

"Параметр данных всегда переопределяет значение, полученное из доменаданные (объект) при рендеринге. Это означает, что значение объекта также переопределяется, когда форма редактирует уже сохраненный объект, что приводит к потере его постоянного значения при отправке формы. "


Используйте следующее:

Допустим, в этом примере у вас есть Entity Foo, и есть поле «active» (в этом примере это CheckBoxType, но процесс идентичен любому другому типу), которыйпо умолчанию вы хотите быть проверенным

В вашем классе FooFormType добавьте:

...
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
...
public function buildForm( FormBuilderInterface $builder, array $options )
{
    ...

    $builder->add('active', CheckboxType::class, array(
        'label' => 'Active',
    ));

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event){                 
            $foo = $event->getData();
            // Set Active to true (checked) if form is "create new" ($foo->active = null)
            if(is_null($foo->getActive())) $foo->setActive(true);
        }
   );
}
public function configureOptions( OptionsResolver $resolver )
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle:Foo',
    ));
}
4 голосов
/ 01 июля 2015

Если вы используете FormBuilder в Symfony 2.7 для создания формы, вы также можете передать начальные данные методу createFormBuilder контроллера

$values = array(
    'name' => "Bob"
);

$formBuilder = $this->createFormBuilder($values);
$formBuilder->add('name', 'text');
4 голосов
/ 15 декабря 2013

Мое решение:

$defaultvalue = $options['data']->getMyField();
$builder->add('myField', 'number', array(
            'data' => !empty($defaultvalue) ? $options['data']->getMyField() : 0
        )) ;
4 голосов
/ 01 августа 2013

Просто, чтобы я понял проблему.

Вы хотите настроить способ построения формы на основе данных в вашей сущности.Если объект создается, используйте какое-либо значение по умолчанию.Если сущность существует, используйте значение базы данных.

Лично я думаю, что решение @ MolecularMans - это путь.Я бы на самом деле установил значения по умолчанию в конструкторе или в свойстве свойства.Но вам, похоже, не нравится такой подход.

Вместо этого вы можете следовать этому: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

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

Похоже, много работы.Лучше просто передать объект в форму с уже установленными значениями по умолчанию.

3 голосов
/ 07 июля 2014

Существует очень простой способ, вы можете установить значения по умолчанию, как здесь:

$defaults = array('sortby' => $sortby,'category' => $category,'page' => 1);

$form = $this->formfactory->createBuilder('form', $defaults)
->add('sortby','choice')
->add('category','choice')
->add('page','hidden')
->getForm();
3 голосов
/ 14 марта 2014

Часто для значений по умолчанию в init я использую приборы.Конечно, этот способ не самый простой, но очень удобный.

Пример:

class LoadSurgeonPlanData implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $surgeonPlan = new SurgeonPlan();

        $surgeonPlan->setName('Free trial');
        $surgeonPlan->setPrice(0);
        $surgeonPlan->setDelayWorkHours(0);
        $surgeonPlan->setSlug('free');

        $manager->persist($surgeonPlan);
        $manager->flush();        
    }   
}

Тем не менее, поле типа Symfony имеет опцию data .

Пример

$builder->add('token', 'hidden', array(
    'data' => 'abcdef',
));
2 голосов
/ 07 июля 2017

Если вы установите «данные» в форме создания, это значение не будет изменено при редактировании вашей сущности.

Мое решение:

public function buildForm(FormBuilderInterface $builder, array $options) {
    // In my example, data is an associated array
    $data = $builder->getData();

    $builder->add('myfield', 'text', array(
     'label' => 'Field',
     'data' => array_key_exits('myfield', $data) ? $data['myfield'] : 'Default value',
    ));
}

Пока.

1 голос
/ 11 мая 2017

Как спросил Брайан:

empty_data, по-видимому, устанавливает поле в 1 только тогда, когда оно отправлено без значения.Как насчет того, когда вы хотите, чтобы в форме по умолчанию отображалось 1 на входе, когда значение отсутствует?

вы можете установить значение по умолчанию с помощью empty_value

$builder->add('myField', 'number', ['empty_value' => 'Default value'])
1 голос
/ 08 октября 2014

Я обычно просто устанавливаю значение по умолчанию для определенного поля в моей сущности:

/**
 * @var int
 * @ORM\Column(type="integer", nullable=true)
 */
protected $development_time = 0;

Это будет работать для новых записей или только для обновления существующих.

1 голос
/ 01 августа 2013

Значения по умолчанию устанавливаются путем настройки соответствующего объекта. Перед тем, как связать сущность с формой, установите ее поле цвета в «# 0000FF»:

// controller action
$project = new Project();
$project->setColor('#0000FF');
$form = $this->createForm(new ProjectType(), $project);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...