2012-02-14 5 views
1

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

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

ответ

1

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

/lib/validator/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 как первый.

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

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

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

Например:

public function doSave($con = null) { 

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

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

если это значение всегда будет храниться в нижнем, OP может также положить в его 'Employee.class. php' class: 'public function setName ($ name) $ this -> _ set ("name", $ name); ' – Flukey

+0

Да. Флюки прав. если вы всегда собираетесь их хранить таким образом, вам намного лучше переопределить метод сеттера. – richrosa

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