2012-05-09 2 views
1

Я создаю веб-приложение с использованием инфраструктуры Symfony 2, в которой у меня есть класс Notification, подклассифицированный OrderCloseNotification и OrderDelayNotification, используя одностраничное наследование, как описано в документации Doctrine 2, разные цели (как вы можете догадаться по имени класса).Проверка формы Symfony2 с помощью STI (однонаправленное наследование таблицы)

Мне нужно проверить форму представления по-разному, что привело меня к созданию пользовательского типа и контроллеров для каждого из них. Я буду использовать 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 это настраиваемый тип, который я вместе с Data Transformer, который сопоставляет заказ в его первичный ключ, так что уведомление создается в виде таблицы заданного набора заказов.

Наконец, у меня есть validation.yml (я использую YAML для каждой конфигурации)

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

Что здесь происходит: когда я пытаюсь создать OrderDelayNotification через AJAX (не пробовал запрос HTML) порядок всегда считается действительным, даже если сообщение пустое. Я также пытался наложить минимальную длину, но без везения. Я прочитал документацию Symfony, и они говорят, что проверка включена по умолчанию. Также попытался изменить имя атрибута на validation.yml на недопустимый, и Symfony жалуется на это, что означает, что файл загружен, и тем не менее проверка не выполняется.

У кого-нибудь есть указатели на это?

EDIT: вызов 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, в соответствии с документацией Symfony)

ответ

0

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

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

Ошибки теперь отображаются корректно.

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