2013-02-16 3 views
1

У меня есть форма со значением по умолчанию: одинSymfony2 форма - как перезапись поле со значением по умолчанию

class GearType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('options') 
      ->add('model', 'choice', array('choices' => $this->getModelChoices(), 'data' => 2)); 
    } 

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

Я сделал это так:

/** 
* @Route("/car/gear") 
* @Template() 
*/ 
public function gearAction(Request $request) 
{ 
    $form = $this->createForm(new GearType()); 

    if ($request->isMethod('POST')) { 
     $form->bind($request); 
     if ($form->isValid()) { 
      return 'is valid'; 
     } 
    } else { 
     $get = $this->getRequest()->query->all(); 
     if (!empty($get)) { 
      $normalizer = new GetSetMethodNormalizer(); 
      $form->setData($normalizer->denormalize($get, new Gear())); # look here 
     } 
    } 

    return array('form' => $form->createView()); 
} 

, к сожалению, «опции» поле имеет значение по умолчанию всегда, вместо значения, переданного как параметр. Я попытался изменить строки # смотрите здесь в

 $gear = $normalizer->denormalize($get, new Gear()); 
     $form = $this->createForm(new GearType(), $gear); 

, но безрезультатно.

Похоже, что решение передает дополнительный параметр в объект GearType. Мне не нравится это решение. Кто-нибудь знает лучший способ?

ответ

0

Добавьте этот фрагмент и modifiy между [] в соответствующих случаях

 $form->bind($request); 
     if ([ passed parameters from querystring ]){    //// New Code 
      $form->getData()->setOptions([ processed parameter ]); //// New Code 
     }               //// New Code 
     if ($form->isValid()) { 
      return 'is valid'; 
     } 
+0

К сожалению нет - это вызывает Фатальная ошибка: Вызов неопределенной метод Symfony \ Component \ Form \ Form :: setOptions () – mrok

+0

Мои извинения, я забыл вызов getData() в $ form. отредактировано выше. – Lighthart

+0

$ form-> getData() возвращает null или мою сущность (когда я связываю запрос и выключаю CSRF) - они все еще не имеют метода setOptions – mrok

0

Причина в поле options всегда иметь значение по умолчанию может быть фактический запрос. Вместо денормализации и настроек данных непосредственно, изменить else фрагмент на:

} else { 
    $form = $this->createForm(new GearType(), new Gear(), array(
     'validation_groups' => array('not-validating') 
    )); 
    $form->bind($request); 
} 

Форма будет проверками только против валидаций, связанных с not-validating группы, которая будет избежать показа общих required оповещения, если форма строится форма GET.

Документы о 'Validations-групп': http://symfony.com/doc/current/book/forms.html#validation-groups

Вопрос аналогичен: Entity form field and validation in Symfony2?

Смежные вопросы