簡體   English   中英

Symfony2多項選擇未通過驗證

[英]Symfony2 multiple choice is not validating

我正在創建一個購物車的簡單列表,其中分配了用戶和產品。 我的新購物車表格如下:

 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的“ required”,但我不喜歡這樣。 有人可以向我解釋為什么它無法正常工作嗎? :P

編輯:這是來自控制器的代碼:

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

第二編輯:

我找到了一個解決方案 ,(不知道是否是最好的,但是可以用:)),所以如果有人遇到這種情況:

您必須在YourBundle / Resources / config下創建驗證文件(例如, validation.yml ),您必須在其中放置有關屬性的信息。 就我而言:

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的瀏覽器,如果用戶嘗試提交該字段為空白的表單,這將導致顯示本機瀏覽器消息。

關於您的解決方案,盡管您可能要考慮依賴於內置的驗證器 ,但這肯定會起作用。 我相當確定產品計數約束可以使用內置的計數集合約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM