2

クライアントIDと一意のクライアントハッシュがあります。これらのデータを登録すると、正常に動作します。明確にするために、私はハッシュを生成しません。

その一意のハッシュがすでに存在するかどうかを検証するために使用するコード:

protected function _getValidator($field)
{
    return array(
        'Db_NoRecordExists',
        true,
        array(
            'table' => 'anunciantes',
            'field' => $field,
            'messages' => array(
                'recordFound' => ucfirst($field) . ' "%value%" is registered'
            )
        )
    );
}

しかし、そのクライアントを編集する必要がある場合は、そのハッシュがすでに存在するかどうか、およびそのハッシュがそのクライアントに属しているかどうかを検証したいと思います。

どうすればいいですか?私はすでにdbバリデーターの' exclude 'オプションを使用してidの値を取得しようとしました$this->getValue('id')が、その呼び出しはを返しますnull

4

2 に答える 2

0

ハッシュが既に存在し、特定のユーザーに属しているかどうかを検証するには、カスタムの除外条件で次のバリデーターを使用できます。ハッシュは、データベースからのハッシュを含む非表示のテキスト フィールドであると想定しています。

protected function _getEditValidator($field, $userId, $db = null)
{
    if ($db == null) $db = Zend_Db_Table::getDefaultAdapter();

    array(
        'Db_RecordExists',
        true,
        array(
            'table' => 'anunciantes',
            'field' => $field,
            'exclude' => $db->quoteInto('user_id = ?', $userId)
        )
    );
}

これにより、要素に含まれるハッシュが に属するデータベースのハッシュと一致することが確認されますuser_id。除外オプションをオーバーライドして、ハッシュ値が特定のユーザー ID に設定されているものと一致する必要があるようにします。

クエリは大まかに次のようになります。

SELECT `users`.`db_hash_col` FROM `users` WHERE (`db_hash_col` = :value) AND (user_id = 1234) LIMIT 1

ユーザーを編集するときとユーザーを作成するときは、いくつかのロジックを使用してバリデーターを交換する必要があります。次のように設定できます。

if ($editing) {
    $this->getElement('hash')
         ->setValidators(
             array($this->_getEditValidator('db_hash_col',
                                            $this->getElement('id')->getValue());
}

また、あなたの質問では、$this->getValue('id');の使用について言及しました。私はこれが実際にあるべきだと信じています$this->getElement('id')->getValue()

それが役立つことを願っています。

于 2011-12-28T19:46:03.137 に答える