如何验证Zend_Form_Element_File或Zend_Form_Element_Text不为空。

时间:2012-07-05 01:23:44

标签: php forms zend-framework validation zend-form

在我的表单中,我希望用户选择一个文件或输入它的URL。两种选择之一。

我知道如何为两个Zend_Form_Element_Text元素中的任何一个编写验证器,但由于Zend_Form_Element_File中的数据不在$ _POST中但在$ _FILES中我不知道从哪里开始 - 我无法从Zend_Form_Element_File获取数据在我的自定义验证器的isValid($ value,$ context = null)方法的$ context中。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我能想到的一种可能的方法是,如果文件已作为附加上下文上传到表单的验证方法,则传递信息:

表     

$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)) {
}   

验证

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;

    }
}