Как изменить Zend Db_RecordExists валидатор, где предложение? - PullRequest
1 голос
/ 02 марта 2012

Я хочу добавить проверку для нескольких значений в предложении where.Db_RecordExists просто проверить для одного поля.Я читал, что вы можете расширить Zend validate абстрактный класс, и у вас может быть свой собственный валидатор.могу ли я привести один маленький пример по этому поводу, пожалуйста.

Спасибо ...

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Что вы пытаетесь сделать именно? Мне даже не нужен специальный валидатор.

Если вы внимательно прочитаете исходный код Zend_Validate_Db_Abstract, вы заметите этот phpDoc над конструктором:

Предоставляет базовую конфигурацию для использования с валидаторами Zend_Validate_Db. Установка $ exclude позволяет исключить одну запись из соответствия. Исключением может быть либо строка, содержащая предложение where, либо массив с ключами field и value определить предложение where, добавленное в sql. При желании может быть предоставлен адаптер базы данных, чтобы избежать использования зарегистрированного адаптера по умолчанию.

Поддерживаются следующие функциональные клавиши:

  1. 'table' => Таблица базы данных для проверки по
  2. 'схема' => Ключи схемы
  3. 'field' => Поле для проверки на совпадение
  4. 'exclude' => Необязательная пара операторов where или field / value для исключения из запроса
  5. 'adapter' => Дополнительный адаптер базы данных для использования

Это означает, что если вы хотите проверить, существует ли запись, используя более чем одно значение, вы можете сделать это просто в , передав предложение where в валидатор вместо поля / значения пары:

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

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

Это в основном проверит, существует ли запись в таблице users , и исключит строки, в которых id пользователя! = 110 или email@example.com. Естественно, я рекомендую вам использовать методы Zend_Db , такие как quoteIdentifier(), для генерации полностью экранированного выражения запроса.

Конечно, вы можете добавить столько полей, сколько хотите.

Более подробную информацию о Db_NoRecordExists можно найти в документации .

1 голос
/ 02 марта 2012

Все, что вам обычно нужно сделать, это переопределить метод 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 и его должно быть довольно легко изменить, чтобы проверить по двум полям, новозможно, придется переопределить 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;
    }
}
...