Zend Framework: есть ли способ получить доступ к имени элемента из пользовательского валидатора? - PullRequest
0 голосов
/ 24 декабря 2008

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

$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.

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

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

1 Ответ

1 голос
/ 27 июля 2009

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

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

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

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

...