2

ユーザーと商品が割り当てられたショップカートの簡単なリストを作成しています。新しいカートのフォームは次のようになります。

 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

編集: コントローラーからのコードは次のとおりです。

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

2番目の編集:

私は解決策を見つけました(最善かどうかはわかりませんが、機能します:))したがって、誰かがそれに遭遇した場合:

検証ファイル (たとえば、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);
 }
}
4

1 に答える 1

0

@Mati、必要なオプションがどのように機能するかについての最初の質問に関して、このオプションは HTML5 で必要な属性のみを設定するため、サーバー側では何もしません。ドキュメントから

HTML5 の時点で、多くのブラウザーは、クライアント側で特定の検証制約をネイティブに適用できます。最も一般的な検証は、必須フィールドに必須属性をレンダリングすることによって有効化されます。HTML5 をサポートするブラウザーの場合、ユーザーがそのフィールドを空白にしてフォームを送信しようとすると、ネイティブ ブラウザー メッセージが表示されます。

あなたのソリューションに関しては、組み込みのバリデーターに頼ることを検討したいかもしれませんが、それは確かに機能します。製品数の制約が組み込みのCount Collection制約を使用できると確信しています。

于 2013-12-29T23:04:13.640 に答える