3

Zend Frameworkを使用してフォームを作成し、ユーザーの人口統計をキャプチャしています。2つのテキストフィールドの数字の検証に苦労しています。

次のように../application/forms/UserDemographics.phpでフォームを作成します。

class Application_Form_UserDemographics extends Zend_Form
    {
        public function init()
        {
            $this->form = new Zend_Form;            
            $dbAdapter = Zend_Registry::get("db");  

                        ...

                        $this->fax_number = new Zend_Form_Element_Text('fax_number');
            $this->fax_number->setLabel('Fax Number')
                ->addFilter('Int')
                ->addFilter('StripTags')
                ->addValidator('Digits');   

                        $this->mobile_number = new Zend_Form_Element_Text('mobile_number');
            $this->mobile_number->setLabel('Mobile Number')
                ->addFilter('Int')
                ->addFilter('StripTags')
                ->addValidator('Digits');

                        ...

                }
         }

私のデータベースは現在、fax_numberフィールドとmobile_numberフィールドに関して次のように構成されているため、数字が受け入れられるかどうかをテストできます。

+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
...
| fax_number      | varchar(32) | NO   |     | NULL    |              
| mobile_number   | int(15)     | YES  |     | NULL    |              
...

zendフォームのいずれかのフィールドに数字以外のものを入力すると、両方の要素に数字のバリデーターが追加されていても、エラーメッセージは表示されません。

携帯電話番号のテキストフィールドに入力されたテキストは、データベースでは0(ゼロ)に置き換えられます。

mysql> select fax_number, mobile_number from user_demographics;
+--------------------+---------------+
| fax_number         | mobile_number |
+--------------------+---------------+
| var char no digits |             0 |
+--------------------+---------------+

少なくとも、mobile_numberフィールドには、テキストフィールドに入力できるのは数字のみであるというエラーメッセージが表示されるはずです。

そして、なぜDigitsバリデーターが認識されていないように見えるのですか?

これは基本的に、Digitsバリデーターがほとんど無視されていることを示しています。フォームがレンダリングされるとき、テキストフィールドには0(ゼロ)が含まれますが、テキストフィールドにテキストを入力してもエラーメッセージは表示されません。データベースでintに設定されているmobile_numberフィールドでも同様です。

お知らせ下さい?

4

1 に答える 1

7

これは、フィルターがバリデーターの前に処理されるためです。

したがって、コードは次のようになります。

  1. 入力を取ります
  2. それをintに変換します。変換できないテキストが含まれている場合は0になります。
  3. タグを剥がします
  4. 入力に数字のみが含まれているかどうかを確認します。これは、int-filterのために常に当てはまります。

したがって、これを回避するには、int-filterを削除するだけです。

class Application_Form_UserDemographics extends Zend_Form
{
    public function init()
    {
        $this->form = new Zend_Form;            
        $dbAdapter = Zend_Registry::get("db");  

                    ...

                    $this->fax_number = new Zend_Form_Element_Text('fax_number');
        $this->fax_number->setLabel('Fax Number')
            ->addFilter('StripTags')
            ->addValidator('Digits');   

                    $this->mobile_number = new Zend_Form_Element_Text('mobile_number');
        $this->mobile_number->setLabel('Mobile Number')
            ->addFilter('StripTags')
            ->addValidator('Digits');

                    ...

            }
     }
于 2012-06-07T14:23:29.133 に答える