Zend Form Validator Callback: Как исключить имя пользователя? - PullRequest
0 голосов
/ 28 февраля 2012

Я написал одну функцию в классе User Mapper userExist($username), которая return true, если такого же имени пользователя нет в моей таблице базы данных. Теперь я хочу использовать эту функцию в классе Add_User_Form, который расширяет Zend_Form.

Я хочу использовать:

$username = $this->createElement('text','username');
$username->setLabel('Username:')
         ->addValidator('Callback', true, array('callback'=>userExist???));

Могу ли я использовать функцию класса userExist($username) в качестве функции обратного вызова? Пожалуйста, дайте мне знать, если я делаю что-то не так с моей реализацией. Я просто хочу показать сообщения об ошибках, если пользователь уже зарегистрирован, и запретить отправку формы.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Вместо использования средства проверки обратного вызова, вы можете использовать стандартный средство проверки :

$element->addValidator('Db_NoRecordExists', true, array('users', 'username'))

Db_NoRecordExists позволяет проверить, существует ли запись в определенной таблице вашей базы данных.

Если пользователь хочет отредактировать свой профиль, вы можете проверить, существует ли запись кроме себя . Затем вы должны использовать тот же валидатор, как указано ниже:

$where = array('users', 'username', array('field' => 'username', 'value' => $username));
$element->addValidator('Db_NoRecordExists', true, $where)

В этом примере users - это имя вашей таблицы базы данных. username - это имя вашего столбца и $username имя пользователя, которое вы хотите исключить.

1 голос
/ 17 декабря 2014

Немного поздно, но это может быть возможным ответом на ваш вопрос.

Пример элемента даты:

Я создал элемент даты с пользовательским средством проверки обратного вызова, которое вызывает метод в той же формеclass.

// Date picker from
$datePickerFrom = new Zend_Form_Element_Text('date_picker_from_date');
$datePickerFrom->setRequired(true)
    ->setDecorators($this->elementDecorators)
    ->setLabel('Valid From')
    ->addFilter('StripTags')
    ->addFilter('StringTrim')
    ->setValue(date("d/m/Y",strtotime(Zend_Date::now())))
    ->addValidator('Callback',true, array('callback' => array($this, 'dateCheck'));
$datePickerFrom->getValidator('Callback')->setMessage("'%value%' Cannot be in the past.");
$this->addElement($datePickerFrom);

Если у вас есть собственный класс с пользовательскими валидаторами, вы можете сделать это:

$myValidatorClass = new \SomeValidaotrClass();
->addValidator('Callback',true, array('callback' => array($myValidatorClass, 'dateCheck'));

В том же классе формы я создал собственный метод валидации:

public function dateCheck($value, $elements, $option)
{
    $now = new DateTime();
    $fromDate = new DateTime(str_replace('/', '-', $elements['date_picker_from_date']));        

    if ($fromDate < $now) {
        $this->getElement('date_picker_from_date')->getValidator('Callback')->setMessage("'%value%' Cannot be in the past.");
        return false;
    } else (SomethingElse) {
           $this->getElement('date_picker_from_date')->getValidator('Callback')->setMessage("Some other message.");
    }

    return true;
}

Или, если вы используете свой собственный класс:

class SomeValidaotrClass
{
    public function dateCheck($value, $elements, $option)
    {
        // Validation code...
    }
}

Если методы не public, Callback не найдет их.

...