2012-05-09 2 views
1

Doctrine 2 설명서에 설명 된대로 약간의 역할을하는 OrderCloseNotification 및 OrderDelayNotification을 사용하여 하위 클래스 인 Notification 클래스가있는 Symfony 2 프레임 워크를 사용하여 웹 응용 프로그램을 빌드하고 있습니다. 다른 목적 (당신이 클래스 이름으로 짐작할 수 있듯이).STI (단일 테이블 상속)를 사용하는 Symfony2 폼 유효성 검사

양식 제출의 유효성을 검사하여 사용자 정의 유형을 작성하는 방법과 그 각각에 대한 컨트롤러를 검증해야합니다. 유효성 검사가 필요한 알림 유형이므로 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 내가 주문을 기본 키로 매핑하는 데이터 변압기와 함께 주문 유형입니다. 그러면 해당 알림 집합의 테이블보기에 알림이 생성됩니다. 는 I가 AJAX를 통해 OrderDelayNotification을 만들려고 할 때 (HTML 요청을 시도하지 않은) : 마지막으로

, 나는

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

는 여기에서 발생하는 것은 (내가 모든 구성을 위해 YAML을 사용)를 validation.yml이 메시지가 비어 있어도 주문은 항상 유효한 것으로 간주됩니다. 나는 또한 최소 길이를 부과하려고 노력했지만 운이 없었다. 나는 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의 설명서에 따른 나의 AbstractType 서브 클래스)

답변

0

문제가 무엇인지 알아 냈습니다. 양식은 실제로 유효하지 않았지만 오류는 표시되지 않았습니다.

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

오류가 올바르게 표시 : 나는 양식 필드의 각각에 대해 다음 옵션을 포함했다.