У меня есть простая форма, которая включает в себя вход, который будет брать деньги, то есть float. Пока он может принимать только правильно сформированный десятичный знак, например, 12768.56
, Задача внедрить некоторую логику на стороне сервера (здесь нет javascript), которая бы перехватывала входное значение, например 12 768,56
замените его 12768.56
и пусть symfony / доктрина делает свою работу. Преобразование — только пример, и я получил то, что мне нужно, но вопрос в том, где я должен поставить функцию перехвата? Я думаю, это должно быть где-то в XxxForm.class.php. Но я не знаю, какой метод. doSave
? processData
? Я уверен, что для этого есть специальное место …
Вы должны поместить такую логику в специальный валидатор:
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()
работает с допустимыми значениями, но с неправильным вводом вы мало что можете сделать.
Я нашел исходный код 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);
+ }
Работает отлично.