1

where句に複数の値のチェックを追加したい。Db_RecordExists は、1 つのフィールドをチェックするだけです。zend validate 抽象クラスを拡張でき、独自のバリデーターを持つことができると読みました。これについて、ちょっとした例を教えてください。

ありがとうございました...

4

2 に答える 2

4

あなたは正確に何をしようとしていますか?私にとっては、カスタムバリデーターも必要ありません。

ソースコードを注意深く読むZend_Validate_Db_Abstractと、コンストラクターの上にあるこのphpDocに気付くでしょう。

Zend_Validate_Dbバリデーターで使用するための基本構成を提供します。$excludeを設定すると、単一のレコードを照合から除外できます。Excludeは、where句を含む文字列、またはSQLに追加されたwhere句を定義するキーをfield含む配列のいずれかです。value登録されたデフォルトアダプタの使用を回避するために、データベースアダプタがオプションで提供される場合があります。

次のオプションキーがサポートされています。

  1. 'table'=>検証するデータベーステーブル
  2. 'schema'=>スキーマキー
  3. 'field'=>一致をチェックするフィールド
  4. 'exclude'=>クエリから除外するオプションのwhere句またはフィールド/値のペア
  5. 'adapter'=>使用するオプションのデータベースアダプタ

つまり、複数の値を使用してレコードが存在するかどうかを確認する場合は、フィールドと値のペアではなく、where句をバリデーターに渡すだけで確認できます。

$where = 'user_id != 110 AND email != "email@example.com"';
$where = array('users', 'email', $where);

$element->addValidator('db_NoRecordExists', true, $where)

これは基本的に、ユーザーテーブルに レコードが存在するかどうかをチェックし、ユーザーID!=110またはemail@example.comの行を除外します。当然、完全にエスケープされたクエリ式を生成するためなど、Zend_Dbメソッドを使用することをお勧めします。quoteIdentifier()

もちろん、必要な数のフィールドを追加できます。

詳細についてDb_NoRecordExistsは、ドキュメントを参照してください。

于 2012-03-02T08:14:13.217 に答える
1

通常は、isValid() メソッドをオーバーライドしてカスタム バリデータを作成するだけです。カスタム バリデータ
の例を次に示します。

<?php

class My_Validator_Usphone extends Zend_Validate_Abstract {
    const PHONE = 'phone';

    protected $_messageTemplates = array(
        self::PHONE => "'%value%' is not a valid U.S. phone number.
            Phone number must be entered in (xxx)xxx-xxxx or xxx-xxx-xxxx format."
    );

    public function isValid($value) {
        $this->_setValue($value);

        $isValid = TRUE;
        $pattern = ('/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/');
        if (!preg_match($pattern, $value)) {
            $this->_error(self::PHONE);
            $isValid = FALSE;
        }
        return $isValid;
    }

}

Db_RecordExists は非常にシンプルですが、拡張されておりZend_Validate_Db_Abstract、2 つのフィールドに対して検証するように変更するのは非常に簡単なはずですが、オーバーライドisValid()getSelect()たり_query()、複数の値を受け入れたりする必要がある場合があります。

class Zend_Validate_Db_RecordExists extends Zend_Validate_Db_Abstract
{
    public function isValid($value)
    {
        $valid = true;
        $this->_setValue($value);

        $result = $this->_query($value);
        if (!$result) {
            $valid = false;
            $this->_error(self::ERROR_NO_RECORD_FOUND);
        }

        return $valid;
    }
}
于 2012-03-02T07:55:53.267 に答える