2013-11-06 5 views
2

Я создаю простой список тележках с пользователями и продуктами, назначенными ему. Моя форма для новой корзины выглядит следующим образом:Symfony2 множественный выбор не подтвержден

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, но мне это не нравится. Может ли кто-нибудь объяснить мне, почему он работает неправильно? : P

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()); 
} 

ВТОРОЙ EDIT:

я нашел РЕШЕНИЕ, (не знаю, если лучше, но работает :)), поэтому, если кто-нибудь сталкивается с этим:

Вы должны создать свой файл подтверждения (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); 
} 
} 
+1

Укажите код (вероятно, с вашего контроллера), который показывает, где вы реализуете эту форму/обрабатываете отправку формы. Это поможет нам помочь вам. –

+0

Кроме того, покажите нам свое лицо вашей корзины покупок ... –

ответ

0

@Mati, относительно вашего первого вопроса о том, как работает требуемый вариант, эта опция только устанавливает необходимый атрибут в HTML5 так не делает ничего серверной стороны. Из documentation

По состоянию на HTML5, многие браузеры могут изначально применять определенные проверки ограничения на стороне клиента. Наиболее распространенная проверка - , активированная рендерингом требуемого атрибута в полях, которые необходимы . Для браузеров, поддерживающих HTML5, это приведет к отображению исходного сообщения , если пользователь попытается отправить форму с этим полем пустым.

Что касается вашего решения, это, безусловно, будет работать, хотя вы можете подумать о том, чтобы полагаться на встроенный validators. Я уверен, что ограничение количества товаров может использовать встроенное ограничение Count Collection.

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