2013-08-11 2 views
2

Используя Symfony2 на некоторое время, я столкнулся с проблемой в моей текущей разработке: мне нужно отредактировать данные, отправленные по форме до, которая проверяется. Вот ситуация:Манипулировать форму между представлением и валидацией

  • Моя форма содержит два важных поля: «имя» и «домен».
  • «domain» относится к сущности, которая имеет свойство «domain_name».

Теперь представьте себе «имя» установлено значение «МойВебСайт» (используя форму), и что домен установлен в «mydomain.com» (поле объекта выбора доменов в базе данных):

  • форма [имя]: «МойВебСайт»
  • форма [домен]: Объект (domain_name => «mydomain.com»)

То, что я хочу добиться того, чтобы изменить значение «имя» в соответствии с выбранным доменом. Я хочу, чтобы добавить "domain_name" на "имя", для того, чтобы получить:

  • форму [имя]: "mywebsite.mydomain.com"
  • форма [домен]: Объект (domain_name => «MYDOMAIN союз ")

Я нашел 2 решения, но они, кажется, не соответствуют ситуации:

  • трансформаторы данных. Кажется, что нужно работать только с одним полем, однако, чтобы редактировать «имя», мне нужно получить доступ к объекту «домен» из формы, недоступной в классе Data Transformer. Я могу найти способ применить преобразователь данных на всей форме (но я не нашел способ сделать это ...)
  • Формы события. Это отредактирует поле «имя» до отправки, но я хочу, чтобы мои изменения произошли после (таким образом, пользователь не может их изменить).

Есть ли решение, которое я пропустил?

ответ

1

Вы можете изменить представленные данные в form.PRE_BIND. Это событие происходит, тогда вы вызываете $form->bind($request) в контроллер. Как добавить event subscriber в форму. Имейте в виду, что вам приходится иметь дело с голыми данными, которые не конвертируются в объекты и т. Д.

Применение Data Transformer для всей формы очень просто - просто не указывайте поле. Например

$builder 
    ->add('name', 'text') 
    ->add('domain', 'entity') 
    ->addModelTransformer($transformer); 

против

// add a normal text field, but add your transformer to it 
$builder->add(
    $builder->create('name', 'text') 
     ->addModelTransformer($transformer) 
); 
+0

Попробую с помощью события PRE_BIND. Не могли бы вы рассказать мне больше об использовании трансформатора на всей форме? Я не вижу, как я могу получить доступ к своим данным формы в методе transform(). Что передается методу в этом случае? –

+0

Здесь вы можете прочитать информацию об трансформаторах данных http://symfony.com/doc/current/cookbook/form/data_transformers.html. 'transform' метод конвертирует Data Object в то, что вы прошли в html. метод reverseTransform сделает это \t наоборот. –

+0

Я стараюсь изо всех сил с трансформаторами, но они не то, что мне действительно нужно в этом конкретном случае. Что касается событий формы, PRE_BIND теперь устарел, а PRE/POST_SUBMIT либо происходит слишком рано/поздно. Несмотря на то, что эти варианты являются решениями, я решил пойти на заказ Constraint, применяемый к моей конечной сущности, из которой валидатор переходит к изменению, и запускает проверки целостности. Спасибо за вашу помощь, решил это :) –

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