Zend Framework: есть ли способ получить доступ к имени элемента из пользовательского валидатора?

Я пишу собственный валидатор, который будет проверять несколько других значений элементов формы. В своей форме я вызываю свой собственный валидатор следующим образом:

$textFieldOne = new Zend_Form_Element_Text('textFieldOne');
$textFieldOne->setAllowEmpty(false)
             ->addValidator('OnlyOneHasValue', false, array(array('textFieldTwo', 'textFieldThree')));

Мой валидатор проверит, что только одно из этих трех полей (textFieldOne, textFieldTwo, textFieldThree) имеет значение. Я хочу, чтобы будущий разработчик случайно не пропустил одно и то же поле дважды.

$textFieldOne->addValidator('OnlyOneHasValue', false, array(array('textFieldOne', 'textFieldTwo', 'textFieldThree')));

Пока мой валидатор работает отлично, за исключением случаев, когда я передаю то же имя поля, что и поле, в котором установлен валиатор.

В моем валидаторе вы можете видеть, что я проверяю, что значение (элемента с установленным валидатором). Я также проверяю значения других полей, которые были переданы валидатору.

public function isValid($value, $context = null) {

    $this->_setValue($value);
    $this->_context = $context;

    if ($this->valueIsNotEmpty()) {
        if ($this->numberOfFieldsWithAValue() == 0) {
            return true;
        }
        $this->_error(self::MULTIPLE_VALUES);
        return false;
    }

    if ($this->numberOfFieldsWithAValue() == 0) {
        $this->_error(self::ALL_EMPTY);
        return false;
    }

    if ($this->numberOfFieldsWithAValue() == 1) {
        return true;
    }

    if ($this->numberOfFieldsWithAValue() > 1) {
        $this->_error(self::MULTIPLE_VALUES);
        return false;
    }
}

private function valueIsNotEmpty() {
    return Zend_Validate::is($this->_value, 'NotEmpty');
}

private function numberOfFieldsWithAValue() {

    $fieldsWithValue = 0;

    foreach ($this->_fieldsToMatch as $fieldName) {

        if (isset($this->_context[$fieldName]) && Zend_Validate::is($this->_context[$fieldName], 'NotEmpty')) {
            $fieldsWithValue++;
        }
    }
    return $fieldsWithValue;
}

Мое решение - либо ...

  • A. Пусть разработчик выяснит, что есть определенный способ сделать это.
  • B. Игнорировать $value, заставляя вас передавать все элементы (что не сильно отличается от первого варианта).
  • или C. (если возможно) Найдите имя элемента, который вызвал мой валидатор в первую очередь, и проигнорируйте его из списка $fieldsWithValue.

Я не думаю, что есть способ применить валидатор к форме, не прикрепляя его к элементу, но было бы даже лучше, если бы это был вариант.

Как я могу решить эту проблему?


person Andrew    schedule 24.12.2008    source источник


Ответы (1)


Обычно я бы не советовал делать такие вещи, но в этом случае я считаю, что статический член в вашем классе действительно может обеспечить хорошее решение этой проблемы.

С помощью статического члена вы можете установить для него значение при первом вызове isValid и проверять его в последующих вызовах, тем самым предоставляя вам механизм для этого.

Вы можете настроить это для использования некоторого массива в параметрах конфигурации, чтобы вы могли пространство имен и позволить нескольким экземплярам валидатора успешно существовать рядом друг с другом для разных наборов.

Единственная проблема, которую вам действительно нужно решить, - это где вы хотите отображать ошибку, так как да, сама форма не принимает валидаторов. если вы хотите, чтобы все дубликаты после первого отображали ошибку, это не такая уж большая проблема.

person Bittarman    schedule 27.07.2009