Фильтрация ввода данных в классе форм Symfony - PullRequest
1 голос
/ 14 февраля 2012

Я бы хотел отфильтровать некоторые поля в моей форме с помощью функции strtolower(). К сожалению, я не могу найти ни одного примера для этого.

Как мне написать такой фильтр, который будет вводить строчные буквы, проверять базу данных, если элемент существует, а затем решать, добавлять запись или нет?

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

1) новый валидатор нового проекта (здесь мы будем использовать его как фильтр значений):

/ Библиотека / валидатор / MyProjectStringLowerCase.class.php

<?php

class MyProjectStringLowerCase extends sfValidatorBase
{
  /**
  * @see sfValidatorBase
  */
  protected function doClean($value)
  {
     return strtolower($value);
  }
}

2) привязать его к полю:

$this->setWidget('my_field_name', new sfWidgetFormInputText());
$this->validatorSchema['my_field_name'] = new MyProjectStringLowerCase();

Если у вас уже есть какой-то валидатор в этом поле, вы можете объединить их в комбинированные валидаторы следующим образом:

$this->validatorSchema['my_field_name'] = new sfValidatorAnd(array(
    $this->validatorSchema['my_field_name'], // the original field validator
    new MyProjectStringLowerCase(),
));

Объединенный порядок валидаторов влияет на то, как значение будет проходить через них, поэтому, если вы хотите фильтровать значение во второй валидации, установите MyProjectStringLowerCase в качестве первой.

Существует два различия между этим подходом и использованием постобработки (например, doSave ()):

  1. значение здесь будет фильтроваться после каждой отправки (и будет отображаться фильтруется при отображении ошибок формы)
  2. Вы можете использовать его очень легко и просто в других областях или формах в ваш проект
1 голос
/ 14 февраля 2012

В вашей форме вы можете переопределить метод doSave () для выполнения любых необходимых ручных вмешательств, которые не выполняются методами проверки формы.

Например:

public function doSave($con = null) {

  $employee = $this->getObject();
  $values = $this->getValues();

  // do your filter
  $this->values['name'] = strtolower($values['name']); 
  parent::doSave($con);
  }
...