2016-05-25 3 views
0

Я строю проверки пользовательских ограничений в Symfony 2, который называет Учение:Пользовательские проверки ограничений иногда отображать ближнее поле иногда не Symfony2

if($prevu != 0) { 
     $total = $prevu + $consomme; 
     if($total > $charge) { 
      $this->context->buildViolation($constraint->message1) 
       ->setParameter('%string%', $prevu) 
       ->atPath('intervention.dureeP') 
       ->addViolation(); 
     } 
     dump($this);  
    }elseif($realise != 0) { 
     $total = $realise + $consomme; 
     if($total > $charge) { 
      $this->context->buildViolation($constraint->message2) 
       ->setParameter('%string%', $realise) 
       ->atPath('dureeR') 
       ->addViolation(); 
     } 
    } 

Моя проблема заключается в том, что ошибки не будет отображаться рядом с полем, но на верх формы.

Звоню пользовательский валидатор с аннотацией, как это:

/** 
* @var string 
* 
* @ORM\Column(name="duree_p", type="decimal", precision=3, scale=2, nullable=true) 
* @MyAssert\ExceedCharge 
*/ 
private $dureeP; 

Самое странное в том, что форма некоторые поля, отображается сообщение об ошибке рядом с ним, но и для других он отображает сообщение об ошибке в верхней части.

Я видел это сообщение в StackOverflow: Custom constraint validation error doesn't display next to field in Symfony2, но это мне не помогло.

Я пробовал вариант «atPath()» без каких-либо успехов.

То, что я не понимаю, что это работает для некоторых полей, а не для того, что я хочу ...

Кто-нибудь есть какие-либо подсказки?

EDIT:.

Я также заметил, что, когда появляется сообщение нарушения, поле связанно с сообщением нарушения не имеет какой-либо класса «имеет ошибки» и так нет»

EDIT 2:

Вот мое ограничение логика:

class ExceedChargeValidator extends ConstraintValidator 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 
     dump($value); //DEBUG 
     dump($this->context); //DEBUG 

     //get id to perform search 
     $id = $this->context->getObject()->getCast()->getId(); 


     $consomme = $this->em->getRepository('AppBundle:Intervention')->getConsomme($id); 

     $charge = $this->context->getObject()->getCast()->getCharge(); 

     $prevu = $this->context->getObject()->getDureeP(); 
     $realise = $this->context->getObject()->getDureeR(); 

     dump($prevu); //DEBUG 
     dump($realise); //DEBUG 

     if($value != 0) { 
      $total = $value + $consomme; 
      if($total > $charge) { 
      $this->context->buildViolation($constraint->message1) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 
      dump($this->context->getPropertyPath()); 
     } 
     dump($this); //DEBUG  
    } 

     dump($consomme);//DEBUG 
     dump($charge); //DEBUG 
    } 
} 

А вот некоторые из fiels моего лица:

/** 
* @var \DateTime 
* 
* @ORM\Column(name="date", type="date") 
*/ 
private $date; 

/** 
* @var string 
* 
* @ORM\Column(name="duree_p", type="decimal", precision=3, scale=2, nullable=true) 
* @MyAssert\ExceedCharge 
*/ 
private $dureeP; 

/** 
* @var string 
* 
* @ORM\Column(name="duree_r", type="decimal", precision=3, scale=2, nullable=true) 
* @Assert\GreaterThan(
*  value = 0 
*) 
*/ 
private $dureeR; 

формы генерируется пачкой Easy администратора

Here is what I got if I attach the same constraint violation to different fields. We can see that it works fine on my "date" field but for the "dureeP" field the message is displayed at the top

Вот что я получил, если я придаю такое же нарушение ограничения к различным областям. Мы видим, что он отлично работает в поле «дата», но для поля «dureeP» сообщение отображается вверху

ответ

0

atPath Ваш atPath выглядит бесполезным здесь, так как ваше ограничение является приложением PropertyConstraint, применяемым к строке, и Строка не имеет детей.

Однако, когда свойство Constraint вызывает нарушение, нарушение привязывается к полю с именем свойства (если существует). Поэтому, если ваша форма имеет поле dureeP, ошибка будет привязана к ней, иначе она будет в корне формы.

+0

Привет! Благодарим Вас за разъяснения. У меня действительно есть поле под названием «dureeP» и другое поле с именем «дата». Я прикрепляю Assert в поле «дата», сообщение об ошибке отображается рядом с ним, но если я присоединяю Assert в поле «dureeP», сообщение об ошибке отображается вверху. Я не понимаю, почему он работает с некоторыми моими полями, а не с тем, который я хочу:/ – Lucien

+0

Не могли бы вы вставить больше кода, пожалуйста? (поля «дата» и «dureeP» + полная логика ограничений были бы хороши) – Terenoth

+0

Я поставил вам более подробную информацию, скажите, может ли это помочь немного больше! – Lucien

0

Хорошо, поэтому я нашел проблему!

Проблема была в имени моего столбца, включая символ «_» (подчеркивание).

я заменил

@ORM\Column(name="duree_p", type="decimal", precision=3, scale=2) 

По

@ORM\Column(name="prevu", type="decimal", precision=3, scale=2) 

И решить эту проблему. Так что не подчеркивайте имя, и мы закончили!

Как я его нашел? Создав тест-мануал (основной) валидатор и связав его с некоторыми полями другого моего объекта. Я видел, что он работал над всеми полями, поэтому я сравнил разницу между двумя объектами, и это было единственное различие.

Вот валидатор использовать для устранения неполадок:

class TestValidator extends ConstraintValidator 
{ 

    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 

     dump($value); 

     if(!preg_match('/^[0-9]+$/', $value, $matches)) { 
      $this->context->buildViolation($constraint->message) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 
     } 

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