Я строю проверки пользовательских ограничений в 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 администратора
Вот что я получил, если я придаю такое же нарушение ограничения к различным областям. Мы видим, что он отлично работает в поле «дата», но для поля «dureeP» сообщение отображается вверху
Привет! Благодарим Вас за разъяснения. У меня действительно есть поле под названием «dureeP» и другое поле с именем «дата». Я прикрепляю Assert в поле «дата», сообщение об ошибке отображается рядом с ним, но если я присоединяю Assert в поле «dureeP», сообщение об ошибке отображается вверху. Я не понимаю, почему он работает с некоторыми моими полями, а не с тем, который я хочу:/ – Lucien
Не могли бы вы вставить больше кода, пожалуйста? (поля «дата» и «dureeP» + полная логика ограничений были бы хороши) – Terenoth
Я поставил вам более подробную информацию, скажите, может ли это помочь немного больше! – Lucien