1

Symfony 2フレームワークを使用してWebアプリケーションを構築しています.Doctrine 2のドキュメントで説明されているように、単一のテーブル継承を使用してOrderCloseNotificationおよびOrde​​rDelayNotificationによってサブクラス化されたNotificationクラスがあり、わずかに異なる目的を果たします(クラス名から推測できます)。

フォーム送信を異なる方法で検証する必要があるため、それぞれにカスタムタイプとコントローラーを作成する必要があります。検証が必要な通知のタイプであるため、OrderDelayNotification を使用します。これが私のセットアップです:

スーパークラス:

# src/MyNamespace/MyBundle/Entity/Noticication.php
namespace MyNamespace\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

class Notification
{
    # common attributes, getters and setters
}

サブクラス:

# src/MyNamespace/MyBundle/Entity/OrderDelayNotification.php
namespace MyNamespace\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

class OrderDelayNotification extends Notification
{
    private $message;
    # getters and setters
}

サブクラス コントローラー:

namespace MyNamespace\MyBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

use MyNamespace\MyBundle\Entity\OrderDelayNotification;
use MyNamespace\MyBundle\Form\Type\OrderDelayNotificationType;


class OrderDelayNotificationController extends Controller
{    
    public function createAction() {

    $entity  = new OrderDelayNotification();
        $request = $this->getRequest();
        $form    = $this->createForm(new OrderDelayNotificationType(), $entity);
        $form->bindRequest($request);

        if ($form->isValid()) {
             //$em = $this->getDoctrine()->getEntityManager();
             //$em->persist($entity);
             //$em->flush();

        } else {

        }   

        // I'm rendering javascript that gets eval'ed on the client-side. At the moment, the js file is only displaying the errors for validation purposes  
        if ($request->isXmlHttpRequest()) {
            return $this->render('LfmCorporateDashboardBundle:Notification:new.js.twig', array('form' => $form->createView()));
        } else {
        return $this->redirect($this->generateUrl('orders_list'));
        }
    }
}

カスタム フォーム タイプ

# src/MyNamespace/MyBundle/Form/Type/OrderDelayNotificationType.php
class OrderDelayNotificationType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {

        $builder->add('message')
                ->add('will_finish_at', 'date')
                ->add('order', 'order_selector'); //*1

    return $builder;
    }

    public function getName()
    {
        return 'orderDelayNotification';
     }
}

*1 : order_selector これは、Order を主キーにマップする Data Transformer と組み合わせたカスタム タイプで、通知が特定の注文セットのテーブル ビューで作成されるようにします。

最後に、validation.yml があります (すべての構成に YAML を使用します)。

# src/MyNamespace/MyBundle/Resources/config.validation.yml
MyNamespace\MyBundle\Entity\OrderDelayNotification:
    properties:
        message:
            - NotBlank: ~

ここで何が起こるか: AJAX を介して OrderDelayNotification を作成しようとすると (html 要求を試していない)、メッセージが空白であっても注文は常に有効と見なされます。また、最小の長さを課そうとしましたが、運がありませんでした。symfony のドキュメントを読んだところ、バリデーションはデフォルトで有効になっていると書かれていました。また、validation.yml の属性名を無効なものに変更しようとしましたが、Symfony はそれについて不平を言います。これは、ファイルがロードされていることを意味しますが、検証は行われていません。

誰かがこれについての指針を持っていますか?

編集: ajax 呼び出しは次のように行われます。

$('form[data-remote="true"]').submit(function(event){
    $.ajax({
        type:       $(this).attr('method'),
        url:            $(this).attr('action'),
        data:       $(this).serialize(),
        success:    function(response) {
            eval(response)
        }
    });
    event.preventDefault();
});

どちらが得られますか:

# src/MyNamespace/MyBundle/Resources/views/Notification/new.js.twig
alert("{{ form_errors(form) }}");

そして、Symfony のバリデーター サービス (Symfony のドキュメントによると、AbstractType サブクラスによって間接的に呼び出される) によってエラーがスローされていないことを確認できました。

4

1 に答える 1

0

問題が何であるかを発見しました。フォームは実際には有効ではありませんでしたが、エラーは表示されませんでした。各フォーム フィールドに次のオプションを含める必要がありました。

$builder->add('message', null, array('error_bubbling' => true))

エラーが正しく表示されるようになりました。

于 2012-05-09T16:35:58.230 に答える