Форма представления доктрины symfony1 — куда вводить логику

У меня есть простая форма, которая включает в себя вход, который будет брать деньги, то есть float. Пока он может принимать только правильно сформированный десятичный знак, например, 12768.56, Задача внедрить некоторую логику на стороне сервера (здесь нет javascript), которая бы перехватывала входное значение, например 12 768,56замените его 12768.56 и пусть symfony / доктрина делает свою работу. Преобразование — только пример, и я получил то, что мне нужно, но вопрос в том, где я должен поставить функцию перехвата? Я думаю, это должно быть где-то в XxxForm.class.php. Но я не знаю, какой метод. doSave? processData? Я уверен, что для этого есть специальное место …

1

Решение

Вы должны поместить такую ​​логику в специальный валидатор:

class myValidatorMoney extends sfValidatorNumber {

protected function doClean($value) {
$clean = $this->processNumber($value); // your logic in this function
if($clean === false) { // if not possible to process
throw new sfValidatorError($this, 'invalid', array('value' => $value));
}
return parent::doClean($clean);
}
}

Таким образом, он работает лучше с формами Symfony, updateXXXColumn() работает с допустимыми значениями, но с неправильным вводом вы мало что можете сделать.

2

Другие решения

Я нашел исходный код sfFormDoctrine учебный класс: http://trac.symfony-project.org/browser/branches/1.4/lib/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php. Там есть фрагмент:

153   /**
154    * Processes cleaned up values with user defined methods.
155    *
156    * To process a value before it is used by the updateObject() method,
157    * you need to define an updateXXXColumn() method where XXX is the PHP name
158    * of the column.
159    *
160    * The method must return the processed value or false to remove the value
161    * from the array of cleaned up values.
162    *
163    * @see sfFormObject
164    */
165   public function processValues($values)

что говорит, что нужно реализовать updateXXXColumn() метод в классе доктрины. И так я и сделал:

// lib/form/doctrine/XxxForm.class.php
+  protected function updateAmountColumn($value)
+  {
+    return Tools::processMoneyStrToFloat($value);
+  }

Работает отлично.

0

По вопросам рекламы [email protected]