2015-05-05 4 views
0

У меня есть сущность, которая имеет поле end_date, которое является датой. В моей форме symfony у меня есть незакрепленное поле, в котором вы можете выбрать количество дней, например, 3 дня, 5 дней, 7 дней.Манипулировать данные формы перед сохраняющейся сущностью - Symfony 2.6

Что мне нужно сделать, это манипулировать количеством дней, предоставляемых формой (которые я не хочу входить в db), и выполнять вычисления, когда конец _date будет относиться к количеству дней и затем сохранить значение end_date.

У каких проблем возникают проблемы с обработкой данных между созданием формы и сохранением сущностей в db.

Вот моя функциональность для формы, как он стоит:

public function saveNewListing($request, $controller){ 
     $listing = new Listing(); 
     $product = new Product(); 
     $listing->setProduct($product); 
     $product->setUser($controller->getUser()); 
     $form = $controller->createForm(new SellType(), $auction)->handleRequest($request); 

     if($form->isValid()) { 
      $em = $controller->getDoctrine()->getManager(); 
      $em->persist($listing); 
      $em->persist($product); 
      $em->flush(); 
      return true; 
     } 
     return $form; 
    } 

Так связывание между ними данные формы и сущности и проверка, если форма является действительным или нет, где я должен манипулировать данными? мне нужно связать новый end_date с формой? или просто привязать его к сущности?

Благодаря

ответ

3
if($form->isValid()) { 
      $em = $controller->getDoctrine()->getManager(); 

      $days = $request->get("form")["days"] 
      //* calc end date here $endDate as \DateTime */ 
      $listing->setEndDate($endDate); 

      $em->persist($listing); 
      $em->persist($product); 
      $em->flush(); 
      return true; 
} 
+0

Спасибо за ответ, плохо дайте это –

3

Хотя @ ответ Evgeniy является технически правильным, я хочу, чтобы расширить его немного.

Когда вы создаете форму в Symfony, а затем вызываете метод handleRequest, форма будет заполнена всеми представленными полями. Если вы хотите, чтобы манипулировать данные формы у вас есть два возможных варианта:

  1. ли какие-либо необходимые изменения в Controller в блоке if($form->isValid()){} кода.
  2. Создайте события формы и обработайте данные до/после того, как они были заполнены. (Form events, Dynamic form modifications)

Оба варианта одинаково правильны. Что вы выберете, зависит от вашего случая использования:

  1. Если вы собираетесь использовать этот FormType в одном конкретном месте, вы можете легко пойти с определением вашей логики внутри Controller.
  2. Если, однако, ваш FormType будет включен в другие места и должен поддерживать ту же функциональность, вы должны пойти с записью слушателей/подписчиков. Это устранит необходимость написания кода внутри Controller и даст вам окончательный Entity, готовый к сохранению в базе данных без каких-либо дополнительных изменений (как это уже было сделано в создаваемом вами прослушивателе событий).
+1

Спасибо за ответ. Я понимаю, что вы имеете в виду, хотя код im писать не нужно повторно использовать в другом месте, но спасибо за отзыв, я не знал о событиях, прежде чем я уверен, что их можно использовать в другом месте :) –

+0

tftd, я согласен с вами о возможных как 2. но из того, что я видел в данном примере, похоже, будет «переоценка» для такого случая.Но AOP (на самом деле это слушатели) - это действительно крутой подход, который позволит лучше организовать код –

+0

@EvgeniyKuzmin, это зависит от вашего варианта использования. События формы обычно используются в более сложных сценариях, где у вас много бизнес-логики, и вы не можете просто копировать/вставлять ее, когда вам нужно снова использовать тот же тип формы. Но если вы делаете очень простую форму, это определенно является излишеством :) – tftd

1

Я рекомендую вам сделать это в обратном вызове на prePersist. Это хорошая практика. См. Там больше об этом http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks

+0

Это также допустимый вариант, но следует отметить, что он не будет работать в тех случаях, когда поле формы не сопоставляется с свойством entity. – tftd

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

  • Нет связанных вопросов^_^