В моей форме я хочу, чтобы пользователь выбирал файл или вводил его URL. Один из двух вариантов.
Я знаю, как написать валидатор для одного из двух элементов Zend_Form_Element_Text, но поскольку данные из Zend_Form_Element_File не находятся в $ _POST, а в $ _FILES, я не знаю, с чего начать – я не могу получить данные из Zend_Form_Element_File, чтобы быть в $ context в isValid ($ value, $ context = null) метод для моего настраиваемого валидатора.
Есть идеи?
Возможным подходом, который я могу представить, является передача информации, если файл был добавлен в качестве дополнительного контекста для метода проверки формы:
форма
$file = new Zend_Form_Element_File('file'); $text = new Zend_Form_Element_Text('text'); $text->setAllowEmpty(false); $text->addValidator(new TextOrFileValidator()); $this->addElement($file); $this->addElement($text);
контроллер
$request = $this->getRequest(); // provide additional context from the form's file upload status $context = array_merge( $this->getRequest()->getPost(), array("isUploaded" => $form->file->isUploaded()) ); if ($request->isPost() && $form->isValid($context)) { }
Validator
class TextOrFileValidator extends Zend_Validate_Abstract { const ERROR = 'error'; protected $_messageTemplates = array( self::ERROR => "You either have to upload a file or enter a text", ); function isValid( $value, $context = null ) { $hasText = !empty($context['text']); $hasFile = $context['isUploaded']; if (($hasText && !$hasFile) || (!$hasText && $hasFile) ) { return true; } $this->_error(self::ERROR); return false; } }