Как получить значение элемента формы внутри метода Zend_Form :: isValid ()? - PullRequest
2 голосов
/ 05 января 2012

Я ищу лучший способ получения значений элементов формы внутри метода isValid ().

У меня было что-то вроде этого isValid ():

public function isValid($data) {

    $start = (int)($data['start_hour'] . $data['start_minute']);
    $end   = (int)($data['end_hour'] . $data['end_minute']);

    if ($start >= $end) {
        $this->getElement('start_hour')->addError('Start time should be less than end time');
        return false;
    }

    return parent::isValid($data);
}

, но проблема в том, что когдамоя структура данных меняется, я должен изменить валидацию тоже.Например, теперь значения start_hour , start_minute и т. Д. Становятся элементами многомерного массива, и мне нужно проверить правильность редактирования, например

public function isValid($data) {

    $start = (int)($data['send']['start_hour'] . $data['send']['start_minute']);
    $end   = (int)($data['send']['end_hour'] . $data['send']['end_minute']);

    .......
}

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

public function isValid($data) {

    $start = (int)($this->getElement('start_hour')->getValue() . $this->getElement('start_minute')->getValue());
    $end   = (int)($this->getElement('end_hour')->getValue() . $this->getElement('end_minute')->getValue());

    .......
}

но $ this-> getElement ('start_hour') -> getValue () внутри метода проверки верните пустое значение.

Возможно ли получить значение элемента таким способом?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Попробуйте с $ this-> getValue ('start_hour');

1 голос
/ 06 января 2012

Если этот код используется в методе isValid() формы, то убедитесь, что вы можете сделать это так, как вы описали.Просто для isValid() обычно нужны некоторые передаваемые данные - например, $form->isValid($_POST) - и вы просто игнорируете их (предполагая, что родительский элемент - Zend_Form, у которого есть пустой метод isValid(); промежуточные предки могут потенциально проверятьпереданные данные).Я бы посчитал, что это может привести к путанице.

Альтернативой может быть создание пользовательского валидатора , присоединение его к одному элементов формы (скажем, start_hour элементов).Подпись для валидатора isValid() может использовать необязательный параметр $context - isValid($value, $context = null).Когда вы вызываете $form->isValid($data), он передаст этот $data как $context в валидатор элемента.Затем вы можете использовать эту переменную $context для проверки других значений (start_min, end_hour, end_min и т. Д.).

1 голос
/ 05 января 2012

Попробуйте позвонить

$form->populate($data)

Перед вызовом isValid таким образом данные будут в вашей форме. Тогда $this->getValue('start_hour'); должно работать изнутри isValid().

Итак, чтобы быть уверенным: Где-то в вашем коде (вероятно, контроллере) есть что-то вроде:

    $this->view->form = new MyForm();
$this->populate($data); //add this
if($this->view->form->isValid($data)){
//do stuff
}
...