2016-01-31 2 views
0

У меня есть приложение для учета в Symfony 2.7.x.Как выполнить комплексную проверку формы в Symfony2?

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

Сделка IE-:

Получателя: Exxon

Сумма: $ 100,00

Категории:


Название: Закуски

Сумма: $ 45,00


Название: Бензин

Сумма: $ 55,00

Каждая категория представляет собой отдельный объект в базе данных.

Так что если пользователь изменил Бензин до 65,00 долларов США, форма должна быть неаудирована.

Я исследовал проверку формы Symfony 2, но все, что я нахожу, вращается вокруг аннотаций Constraint о одиночных свойствах объекта, а не нескольких объектов.

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

ответ

0

В вашем случае, да, все примитивы validators не работают. Вам нужно написать custom callback. Из симфони документации CallBack:

Ответный

Целью Callback ограничения является создание полностью настраиваемых правил проверки и назначить любые ошибки проверки в конкретных областях на вашем объекте. Если вы используете проверку с помощью форм, это означает, что вы можете сделать эти пользовательские ошибки рядом с определенным полем, а не просто вверху вашей формы.

Таким образом, в вашем случае это будет следующим образом:

class Transaction 
{ 
    //... 
    private $amount; 
    //... 

    /** 
    * @Assert\Callback 
    */ 
    public function validate(ExecutionContextInterface $context) 
    { 
     // ... 
     //Get your total category price here. 
     $totalCategoryPrice = ...; 
     if($this->amount<$totalCategoryPrice) 
     { 
      $context->buildViolation('Total amount can not be greater than the total amount of each category.') 
      ->atPath('amount') 
      ->addViolation(); 
     } 

    } 
} 
1

Вы также можете использовать ограничение Expression проверки, чтобы сэкономить несколько строк кода.Это может быть как легко проверить, как:

YML:

AppBundle\Entity\Transaction: 
constraints: 
    - Expression: 
     expression: "this.getAmount() >= this.getCategorySum()" 
     message: "Amount should be greater then or equal to the sum of amounts." 

Или с аннотациями:

/** 
* @Assert\Expression(
*  "this.getAmount() >= this.getCategorySum()", 
*  message="Amount should be greater then or equal to the sum of amounts." 
*) 
*/ 
class Transaction{ 
    ... 
    public function getCategorySum(){ 
    ... 

Если метод getCategorySum() объекта сделки возвратит сумму сумм категории.

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