Я создаю простой список корзин магазинов с пользователями и продуктами, которые ему назначены. Моя форма для новой корзины выглядит так:
public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('cartName', 'text', array('label' =>'Nazwa koszyka:')) ->add('user', new UserForm(), array('data_class' => 'Zadanie\Bundle\Entity\User', 'label' => false)) ->add('products','entity', array('label' => 'Wybierz produkty:', 'class' =>'Zadanie\Bundle\Entity\Product' , 'multiple' => true, 'required' => true)) ->add('Zapisz', 'submit'); }
и все отлично, за исключением того, что я могу отправить форму даже без выбора какого-либо продукта.
На данный момент я просто добавил «обязательный» jquery, но мне это не нравится. Может ли кто-нибудь объяснить мне, почему он работает неправильно? :П
EDIT: Вот код от контроллера:
/** * @Route("/cart/edit/{id}",name="_edit_cart") * @Template() */ public function editAction($id, Request $request) { $cart = $this->getDoctrine()->getRepository('ZadanieBundle:Cart')->find($id); if($cart == null) { throw $this->createNotFoundException('Nie znaleziono rekordu'); } $form = $this->createForm(new CartForm(), $cart); $form->handleRequest($request); if($form->isValid()) { $em = $this->getDoctrine()->getManager(); $data = $form->getData(); $em->persist($data); $em->flush(); $this->get('session')->getFlashBag()->set('message', 'Koszyk zaktualizowano.'); return $this->redirect($this->generateUrl('_main_carts')); } return array('form' => $form->createView()); }
ВТОРОЙ РЕДАКТИРОВАНИЕ:
я нашел РЕШЕНИЕ , (не знаю, лучший, но работает :)), поэтому, если кто-нибудь сталкивается с тем, что:
Вам необходимо создать файл проверки (например, validation.yml ) в разделе «YourBundle / Resources / config», в котором вы должны указать информацию о свойствах. В моем случае это было:
Zadanie\Bundle\Entity\Cart: properties: cartname: - NotBlank: ~ user: - NotBlank: ~ constraints: - Callback: methods: - [Zadanie\Bundle\Form\MyValidator, isUserValid]
и затем я создал MyValidator:
namespace Zadanie\Bundle\Form; use Symfony\Component\Validator\ExecutionContextInterface; use Zadanie\Bundle\Entity\Cart; class MyValidator { public static function isUserValid(Cart $cart, ExecutionContextInterface $context) { if(!$cart->getUser()->getName()) $context->addViolationAt('name', 'Proszę podać imię.', array(), null); if(!$cart->getUser()->getSurname()) $context->addViolationAt('surname', 'Proszę podać nazwisko.', array(), null); if(count($cart->getProducts()) == 0) $context->addViolationAt('products', 'Proszę wybrać produkt.', array(), null); } }
@Mati, в отношении вашего первого вопроса о том, как работает нужный параметр, этот параметр устанавливает только требуемый атрибут в HTML5, поэтому он не делает ничего серверного. Из документации
Начиная с HTML5, многие браузеры могут принудительно применять определенные ограничения проверки на стороне клиента. Наиболее распространенная проверка активируется путем рендеринга требуемого атрибута в полях, которые требуются. Для браузеров, поддерживающих HTML5, это приведет к отображению собственного браузера, если пользователь попытается отправить форму с этим полем пустым.
Что касается вашего решения, это, безусловно, будет работать, хотя вы можете захотеть полагаться на встроенные валидаторы . Я уверен, что ограничение количества товаров может использовать встроенное ограничение коллекции Count .