2012-02-14 2 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(), 
)); 

組み合わせたバリデータは値があなたが価値を持つようにしたいので、もし、それらの谷に流れますか流入を注文します2番目の検証でフィルタリングされ、最初のものとしてMyProjectStringLowerCaseを設定します。

は、このアプローチと(例えばにdoSave()など)を使用して後処理の間に2つの違いがある:

  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

はい。 Flukeyが正しいです。あなたが常にそのようにそれらを格納しようとするなら、あなたはsetterメソッドをオーバーライドする方がずっと良いです。 – richrosa

関連する問題