当不需要时,Zend_Form_Element_File 在验证时返回 false

发布于 2025-01-06 13:27:01 字数 18276 浏览 2 评论 0原文

我有一个 Zend Form,其中包含一个文件元素。

    $this->addElement('file', 'image', array(
        'label'         => 'Upload Image:',
        'destination'   => APPLICATION_PATH . '/tmp/',
        'validators'    => array(
            array('count', true, array(
                'min'   => 1,
                'max'   => 1,
                'messages'  => array(
                    Zend_Validate_File_Count::TOO_FEW =>
                        'You must upload an image file',
                    Zend_Validate_File_Count::TOO_MANY =>
                        'You can only upload one image file'))),
            array('extension', true, array(
                'extention' => 'jpg,png,gif',
                'messages'  => array(
                    Zend_Validate_File_Extension::NOT_FOUND =>
                        'The file has an invalid extention (jpg,png,gif only)',
                    Zend_Validate_File_Extension::FALSE_EXTENSION =>
                        'The file has an invalid extention (jpg,png,gif only)'))),
            array('imageSize', true, array(
                'minheight' => self::IMAGEHEIGHT,
                'minwidth'  => self::IMAGEWIDTH,
                'maxheight' => self::IMAGEHEIGHT,
                'maxwidth'  => self::IMAGEWIDTH,
                'messages'  => array(
                    Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG =>
                        'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                    Zend_Validate_File_ImageSize::HEIGHT_TOO_SMALL =>
                        'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                    Zend_Validate_File_ImageSize::WIDTH_TOO_BIG =>
                        'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                    Zend_Validate_File_ImageSize::WIDTH_TOO_SMALL =>
                        'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                    Zend_Validate_File_ImageSize::NOT_DETECTED =>
                        'The image dimensions cannot be detected',
                    Zend_Validate_File_ImageSize::NOT_READABLE =>
                        'The image dimensions cannot be read'))))
    ));

在后面的代码中该文件元素被设置为不需要。当我提交没有附加文件的表单时,表单验证返回 false,而且当我使用 getErrors() 方法查找表单错误时,也不会报告任何错误。如果我提交带有附件的表格,一切都会正常。

我已经用谷歌搜索这个有一段时间了,但找不到答案。我希望有人能够解释为什么会发生这种情况,我正在使用 ZF 1.11.11。

提前致谢。

Garry

编辑

以下是根据要求提供的更多代码示例。

这些是我用来验证表单的方法。我已标记了我用作验证错误的解决方法的代码。

public function formValid(Array $params)
{
    if (is_null($this->_form))
        throw new Zend_Exception('You must first initialize the form');

    $formValid = $this->_validateForm($this->_form, $params);

    // Workaround for bug in validating file elements
    if (!$formValid) {
        if (!$this->_form->getMessages()) {
            $formValid = true;
            $this->_validValues = $this->_form->getValidValues($params);
        }
    }

    if ($formValid) {
        if ($this->_form instanceof Admin_Form_AddDirectSite || 
            $this->_form instanceof Admin_Form_EditDirectSite) {
                if (isset($this->_validValues['replaceImage'])) {
                    return $this->_form->getElement('image')->receive();
                } else {
                    return true;
                }
            } elseif ($this->_form instanceof Admin_Form_PromoteDirectSite) {
                $today = new Zend_Date();
                $expires = new zend_date($this->_validValues['DirectSitesHighlighted']['toDate']);
                if ($expires->isEarlier($today)) {
                    $this->_form->getSubForm('DirectSitesHighlighted')
                                ->getElement('toDate')
                                ->addError('The date must be in the future');
                    return false;
                } else {
                    return true;
                }
            } else {
                return true;
            }
    } else {
        return false;
    }
}

protected function _validateForm(Zend_Form $form, Array $params)
{
    if ($form->isValid($params)) {
        $this->_validValues = $form->getValidValues($params);
        return true;
    } else {
        $this->_validValues = null;
        return false;
    }
}

这些是我用来初始化表单的函数,有两个表单类共享一个抽象类。

public function initAddForm() 
{
    $this->_form = new Admin_Form_AddDirectSite();
    return $this;
}

public function initEditForm() 
{
    $this->_form = new Admin_Form_EditDirectSite();
    return $this;
}

这是三个表单类。

class Admin_Form_AddDirectSite extends Admin_Form_DirectSites_Abstract
{
    public function init()
    {
        parent::init();

        $this->setAction('/admin/direct-sites/add');

        $this->setDecorators(array(
            array('ViewScript', array('viewScript' => 'forms/addDirectSites.phtml'))
        ));

        $this->getElement('image')->setRequired(true);

        $this->addElement('hidden', 'replaceImage', array(
            'required'      => true,
            'label'         => 'Replace Image:',
            'value'         => 1,
            'filters'       => array('Int'),
        ));
    }
}

class Admin_Form_EditDirectSite extends Admin_Form_DirectSites_Abstract
{
    public function init()
    {
        parent::init();

        $this->setAction('/admin/direct-sites/edit');

        $this->setDecorators(array(
            array('ViewScript', array('viewScript' => 'forms/editDirectSites.phtml'))
        ));

        $this->getElement('image')->setRequired(false);

        $this->addElement('checkbox', 'replaceImage', array(
            'required'      => false,
            'label'         => 'Replace Image:',
            'checked'       => false,
            'attribs'       => array(
                'title'         => 'Click to replace the image file'
            ),
            'filters'       => array('Int'),
            'validators'    => array(
                array('Int', true, array(
                    'messages'  => array(
                        Zend_Validate_Int::NOT_INT =>
                            'You must check to replace the image file'))))
        ));

        $this->addElement('hidden', 'directSiteId', array(
            'required'  => false,
            'vslue'     => null
        ));
    }
}

abstract class Admin_Form_DirectSites_Abstract extends Freedom_Zend_Form
{
    /**
     * Domain prefix http://www.
     * @var integer
     */
    const HTTPWWW = 1;

    /**
     * Domain prefix http://
     * @var integer
     */
    const HTTP = 2;

    /**
     * The image width in pixels
     * @var integer
     */
    const IMAGEWIDTH = 100;

    /**
     * The image height in pixels
     * @var integer
     */
    const IMAGEHEIGHT = 100;

    /**
     * Initialize the form
     * @see Zend_Form::init()
     */
    public function init()
    {
        $domainPrefix = array(
            self::HTTPWWW   => 'http://www.',
            self::HTTP      => 'http;//'
        );

        $genres = Model_Doctrine_GenresTable::getInstance()->getAllKeyPairs();

        $artworkMediums = Model_Doctrine_ArtworkMediumsTable::getInstance()->getAllKeyPairs();

        $this->setName('directSitesForm') // setup registration form
             ->setAttrib('id', 'directSitesForm')
             ->setMethod('post')
             ->setAttrib('class', 'directSitesForm')
             ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);

        $this->addElementPrefixPath('Freedom_Zend', 'Freedom/Zend'); // add element prefix path
        $this->addPrefixPath('Freedom_Zend_Form', 'Freedom/Zend/Form'); // add form prefix path

        $directSitesDescription = new Zend_Form_SubForm();
        $directSitesTitle = new Zend_Form_SubForm();

        $this->addElement('text', 'domainName', array(
            'required'  => true,
            'label'     => 'Domain Name:',
            'attribs'   => array(
                'title'     => 'Please enter the url of the site',
                'size'      => 20,
                'maxlength' => 255
            ),
            'filters'       => array('StringTrim', 'StripTags', 'StripNewlines'),
            'validators'    => array(
                array('NotEmpty', true, array(
                        'messages' => array(
                            Zend_Validate_NotEmpty::IS_EMPTY =>
                                "You must specify the domain name"))),
                array('StringLength', true, array(
                        'min'   => 5,
                        'max' => 255,
                        'messages'  => array(
                            Zend_Validate_StringLength::INVALID =>
                                'Your URL must be between 5 and 255 characters in length',
                            Zend_Validate_StringLength::TOO_LONG =>
                                'Your URL must not contain more than 255 characters',
                            Zend_Validate_StringLength::TOO_SHORT =>
                                'Your URL must contain more than 5 characters'))))
        ));

        $this->addElement('radio', 'websitePrefix', array(
            'required'  => true,
            'label'     => 'Domain Prefix:',
            'attribs'   => array(
                'title'     => 'Please select the URL prefix for the domain name'
            ),
            'multiOptions'  => $domainPrefix,
            'value'     => self::HTTPWWW,
            'filters' => array('int'),
            'validators' => array(
                array('NotEmpty', true, array(
                    'messages' => array(
                        Zend_Validate_NotEmpty::IS_EMPTY =>
                            "You must select your agency's website URL",
                        Zend_Validate_NotEmpty::INVALID =>
                            "You must select your agency's website URL"))),
                array('InArray', true, array(
                    'haystack'  => array_keys($domainPrefix),
                    'messages' => array(
                        Zend_Validate_InArray::NOT_IN_ARRAY =>
                            "You must select your agency's website URL"))))
        ));

        $directSitesTitle->addElement('text', 'title', array(
            'required'  => true,
            'label'     => 'Title:',
            'attribs'   => array(
                'title'     => 'Please enter the name of the site',
                'size'      => 20,
                'maxlength' => 255
            ),
            'filters'       => array('StringTrim', 'StripTags', 'StripNewlines'),
            'validators'    => array(
                array('NotEmpty', true, array(
                        'messages' => array(
                            Zend_Validate_NotEmpty::IS_EMPTY =>
                                "You must specify the sites title"))),
                array('StringLength', true, array(
                        'min'   => 5,
                        'max' => 100,
                        'messages'  => array(
                            Zend_Validate_StringLength::INVALID =>
                                'Your title must be between 5 and 100 characters in length',
                            Zend_Validate_StringLength::TOO_LONG =>
                                'Your title must not contain more than 100 characters',
                            Zend_Validate_StringLength::TOO_SHORT =>
                                'Your title must contain more than 5 characters'))))
        ));

        $directSitesDescription->addElement('text', 'description', array(
            'required'  => true,
            'label'     => 'Description:',
            'attribs'   => array(
                'title'     => 'Please enter the description of the site',
                'size'      => 50,
                'maxlength' => 100
            ),
            'filters'       => array('StringTrim', 'StripTags', 'StripNewlines'),
            'validators'    => array(
                array('NotEmpty', true, array(
                        'messages' => array(
                            Zend_Validate_NotEmpty::IS_EMPTY =>
                                "You must specify the sites description"))),
                array('StringLength', true, array(
                        'min'   => 5,
                        'max' => 100,
                        'messages'  => array(
                            Zend_Validate_StringLength::INVALID =>
                                'Your sites description must be between 5 and 100 characters in length',
                            Zend_Validate_StringLength::TOO_LONG =>
                                'Your sites description must not contain more than 100 characters',
                            Zend_Validate_StringLength::TOO_SHORT =>
                                'Your sites description must contain more than 5 characters'))))
        ));

        $this->addElement('file', 'image', array(
            'label'         => 'Upload Image:',
            'destination'   => APPLICATION_PATH . '/tmp/',
            'validators'    => array(
                array('count', true, array(
                    'min'   => 0,
                    'max'   => 1,
                    'messages'  => array(
                        Zend_Validate_File_Count::TOO_FEW =>
                            'You must upload an image file',
                        Zend_Validate_File_Count::TOO_MANY =>
                            'You can only upload one image file'))),
                array('extension', true, array(
                    'extention' => 'jpg,png,gif',
                    'messages'  => array(
                        Zend_Validate_File_Extension::NOT_FOUND =>
                            'The file has an invalid extention (jpg,png,gif only)',
                        Zend_Validate_File_Extension::FALSE_EXTENSION =>
                            'The file has an invalid extention (jpg,png,gif only)'))),
                array('imageSize', true, array(
                    'minheight' => self::IMAGEHEIGHT,
                    'minwidth'  => self::IMAGEWIDTH,
                    'maxheight' => self::IMAGEHEIGHT,
                    'maxwidth'  => self::IMAGEWIDTH,
                    'messages'  => array(
                        Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG =>
                            'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                        Zend_Validate_File_ImageSize::HEIGHT_TOO_SMALL =>
                            'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                        Zend_Validate_File_ImageSize::WIDTH_TOO_BIG =>
                            'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                        Zend_Validate_File_ImageSize::WIDTH_TOO_SMALL =>
                            'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                        Zend_Validate_File_ImageSize::NOT_DETECTED =>
                            'The image dimensions cannot be detected',
                        Zend_Validate_File_ImageSize::NOT_READABLE =>
                            'The image dimensions cannot be read'))))
        ));

        $this->addElement('multiCheckbox', 'Genres', array(
            'required'  => false,
            'label'     => 'Genres:',
            'attribs'   => array(
                'title'     => 'Please select the sites genres'
            ),
            'multiOptions'  => $genres,
            'filters' => array('int'),
            'validators' => array(
                array('NotEmpty', true, array(
                    'messages' => array(
                        Zend_Validate_NotEmpty::IS_EMPTY =>
                            "You must select the sites genres",
                        Zend_Validate_NotEmpty::INVALID =>
                            "You must select the sites genres"))),
                array('InArray', true, array(
                    'haystack'  => array_keys($genres),
                    'messages' => array(
                        Zend_Validate_InArray::NOT_IN_ARRAY =>
                            "You must select the sites genres"))))
        ));

        $this->addElement('multiCheckbox', 'ArtworkMediums', array(
            'required'  => false,
            'label'     => 'Artwork Mediums:',
            'attribs'   => array(
                'title'     => 'Please select the sites artwork mediums'
            ),
            'multiOptions'  => $artworkMediums,
            'filters' => array('int'),
            'validators' => array(
                array('NotEmpty', true, array(
                    'messages' => array(
                        Zend_Validate_NotEmpty::IS_EMPTY =>
                            "You must select the sites artwork mediums",
                        Zend_Validate_NotEmpty::INVALID =>
                            "You must select the sites artwork mediums"))),
                array('InArray', true, array(
                    'haystack'  => array_keys($artworkMediums),
                    'messages' => array(
                        Zend_Validate_InArray::NOT_IN_ARRAY =>
                            "You must select the sites artwork mediums"))))
        ));

        $this->addElement('submit', 'save', array(
            'label' => 'Save',
            'attribs'   => array(
                'title' => 'Save')
        ));

        $this->addSubForm($directSitesDescription, 'DirectSitesDescription')
             ->addSubForm($directSitesTitle, 'DirectSitesTitle');
    }
}

I have a Zend Form containing one file element amongst others.

    $this->addElement('file', 'image', array(
        'label'         => 'Upload Image:',
        'destination'   => APPLICATION_PATH . '/tmp/',
        'validators'    => array(
            array('count', true, array(
                'min'   => 1,
                'max'   => 1,
                'messages'  => array(
                    Zend_Validate_File_Count::TOO_FEW =>
                        'You must upload an image file',
                    Zend_Validate_File_Count::TOO_MANY =>
                        'You can only upload one image file'))),
            array('extension', true, array(
                'extention' => 'jpg,png,gif',
                'messages'  => array(
                    Zend_Validate_File_Extension::NOT_FOUND =>
                        'The file has an invalid extention (jpg,png,gif only)',
                    Zend_Validate_File_Extension::FALSE_EXTENSION =>
                        'The file has an invalid extention (jpg,png,gif only)'))),
            array('imageSize', true, array(
                'minheight' => self::IMAGEHEIGHT,
                'minwidth'  => self::IMAGEWIDTH,
                'maxheight' => self::IMAGEHEIGHT,
                'maxwidth'  => self::IMAGEWIDTH,
                'messages'  => array(
                    Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG =>
                        'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                    Zend_Validate_File_ImageSize::HEIGHT_TOO_SMALL =>
                        'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                    Zend_Validate_File_ImageSize::WIDTH_TOO_BIG =>
                        'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                    Zend_Validate_File_ImageSize::WIDTH_TOO_SMALL =>
                        'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                    Zend_Validate_File_ImageSize::NOT_DETECTED =>
                        'The image dimensions cannot be detected',
                    Zend_Validate_File_ImageSize::NOT_READABLE =>
                        'The image dimensions cannot be read'))))
    ));

This file element is set to not required in a later piece of code. When I submit the form without a file attached the form validtion returns false, also when I look for the form errors with the getErrors() method no errors are reported. If I submit the form with an attachment everything works fine.

I have been googleing this for sometime but cannot find an answer. I hope that someone can shed some light as to why this is happening, I'm using ZF 1.11.11.

Thanks in advance.

Garry

EDIT

Here are some more code samples as requested.

These are the methods I use to validate the forms. I have marked the code I use as a workaround for the validation bug.

public function formValid(Array $params)
{
    if (is_null($this->_form))
        throw new Zend_Exception('You must first initialize the form');

    $formValid = $this->_validateForm($this->_form, $params);

    // Workaround for bug in validating file elements
    if (!$formValid) {
        if (!$this->_form->getMessages()) {
            $formValid = true;
            $this->_validValues = $this->_form->getValidValues($params);
        }
    }

    if ($formValid) {
        if ($this->_form instanceof Admin_Form_AddDirectSite || 
            $this->_form instanceof Admin_Form_EditDirectSite) {
                if (isset($this->_validValues['replaceImage'])) {
                    return $this->_form->getElement('image')->receive();
                } else {
                    return true;
                }
            } elseif ($this->_form instanceof Admin_Form_PromoteDirectSite) {
                $today = new Zend_Date();
                $expires = new zend_date($this->_validValues['DirectSitesHighlighted']['toDate']);
                if ($expires->isEarlier($today)) {
                    $this->_form->getSubForm('DirectSitesHighlighted')
                                ->getElement('toDate')
                                ->addError('The date must be in the future');
                    return false;
                } else {
                    return true;
                }
            } else {
                return true;
            }
    } else {
        return false;
    }
}

protected function _validateForm(Zend_Form $form, Array $params)
{
    if ($form->isValid($params)) {
        $this->_validValues = $form->getValidValues($params);
        return true;
    } else {
        $this->_validValues = null;
        return false;
    }
}

These are the functions I use to initialize the forms, there are two form classes sharing one abstract class.

public function initAddForm() 
{
    $this->_form = new Admin_Form_AddDirectSite();
    return $this;
}

public function initEditForm() 
{
    $this->_form = new Admin_Form_EditDirectSite();
    return $this;
}

And these are the three form classes.

class Admin_Form_AddDirectSite extends Admin_Form_DirectSites_Abstract
{
    public function init()
    {
        parent::init();

        $this->setAction('/admin/direct-sites/add');

        $this->setDecorators(array(
            array('ViewScript', array('viewScript' => 'forms/addDirectSites.phtml'))
        ));

        $this->getElement('image')->setRequired(true);

        $this->addElement('hidden', 'replaceImage', array(
            'required'      => true,
            'label'         => 'Replace Image:',
            'value'         => 1,
            'filters'       => array('Int'),
        ));
    }
}

class Admin_Form_EditDirectSite extends Admin_Form_DirectSites_Abstract
{
    public function init()
    {
        parent::init();

        $this->setAction('/admin/direct-sites/edit');

        $this->setDecorators(array(
            array('ViewScript', array('viewScript' => 'forms/editDirectSites.phtml'))
        ));

        $this->getElement('image')->setRequired(false);

        $this->addElement('checkbox', 'replaceImage', array(
            'required'      => false,
            'label'         => 'Replace Image:',
            'checked'       => false,
            'attribs'       => array(
                'title'         => 'Click to replace the image file'
            ),
            'filters'       => array('Int'),
            'validators'    => array(
                array('Int', true, array(
                    'messages'  => array(
                        Zend_Validate_Int::NOT_INT =>
                            'You must check to replace the image file'))))
        ));

        $this->addElement('hidden', 'directSiteId', array(
            'required'  => false,
            'vslue'     => null
        ));
    }
}

abstract class Admin_Form_DirectSites_Abstract extends Freedom_Zend_Form
{
    /**
     * Domain prefix http://www.
     * @var integer
     */
    const HTTPWWW = 1;

    /**
     * Domain prefix http://
     * @var integer
     */
    const HTTP = 2;

    /**
     * The image width in pixels
     * @var integer
     */
    const IMAGEWIDTH = 100;

    /**
     * The image height in pixels
     * @var integer
     */
    const IMAGEHEIGHT = 100;

    /**
     * Initialize the form
     * @see Zend_Form::init()
     */
    public function init()
    {
        $domainPrefix = array(
            self::HTTPWWW   => 'http://www.',
            self::HTTP      => 'http;//'
        );

        $genres = Model_Doctrine_GenresTable::getInstance()->getAllKeyPairs();

        $artworkMediums = Model_Doctrine_ArtworkMediumsTable::getInstance()->getAllKeyPairs();

        $this->setName('directSitesForm') // setup registration form
             ->setAttrib('id', 'directSitesForm')
             ->setMethod('post')
             ->setAttrib('class', 'directSitesForm')
             ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);

        $this->addElementPrefixPath('Freedom_Zend', 'Freedom/Zend'); // add element prefix path
        $this->addPrefixPath('Freedom_Zend_Form', 'Freedom/Zend/Form'); // add form prefix path

        $directSitesDescription = new Zend_Form_SubForm();
        $directSitesTitle = new Zend_Form_SubForm();

        $this->addElement('text', 'domainName', array(
            'required'  => true,
            'label'     => 'Domain Name:',
            'attribs'   => array(
                'title'     => 'Please enter the url of the site',
                'size'      => 20,
                'maxlength' => 255
            ),
            'filters'       => array('StringTrim', 'StripTags', 'StripNewlines'),
            'validators'    => array(
                array('NotEmpty', true, array(
                        'messages' => array(
                            Zend_Validate_NotEmpty::IS_EMPTY =>
                                "You must specify the domain name"))),
                array('StringLength', true, array(
                        'min'   => 5,
                        'max' => 255,
                        'messages'  => array(
                            Zend_Validate_StringLength::INVALID =>
                                'Your URL must be between 5 and 255 characters in length',
                            Zend_Validate_StringLength::TOO_LONG =>
                                'Your URL must not contain more than 255 characters',
                            Zend_Validate_StringLength::TOO_SHORT =>
                                'Your URL must contain more than 5 characters'))))
        ));

        $this->addElement('radio', 'websitePrefix', array(
            'required'  => true,
            'label'     => 'Domain Prefix:',
            'attribs'   => array(
                'title'     => 'Please select the URL prefix for the domain name'
            ),
            'multiOptions'  => $domainPrefix,
            'value'     => self::HTTPWWW,
            'filters' => array('int'),
            'validators' => array(
                array('NotEmpty', true, array(
                    'messages' => array(
                        Zend_Validate_NotEmpty::IS_EMPTY =>
                            "You must select your agency's website URL",
                        Zend_Validate_NotEmpty::INVALID =>
                            "You must select your agency's website URL"))),
                array('InArray', true, array(
                    'haystack'  => array_keys($domainPrefix),
                    'messages' => array(
                        Zend_Validate_InArray::NOT_IN_ARRAY =>
                            "You must select your agency's website URL"))))
        ));

        $directSitesTitle->addElement('text', 'title', array(
            'required'  => true,
            'label'     => 'Title:',
            'attribs'   => array(
                'title'     => 'Please enter the name of the site',
                'size'      => 20,
                'maxlength' => 255
            ),
            'filters'       => array('StringTrim', 'StripTags', 'StripNewlines'),
            'validators'    => array(
                array('NotEmpty', true, array(
                        'messages' => array(
                            Zend_Validate_NotEmpty::IS_EMPTY =>
                                "You must specify the sites title"))),
                array('StringLength', true, array(
                        'min'   => 5,
                        'max' => 100,
                        'messages'  => array(
                            Zend_Validate_StringLength::INVALID =>
                                'Your title must be between 5 and 100 characters in length',
                            Zend_Validate_StringLength::TOO_LONG =>
                                'Your title must not contain more than 100 characters',
                            Zend_Validate_StringLength::TOO_SHORT =>
                                'Your title must contain more than 5 characters'))))
        ));

        $directSitesDescription->addElement('text', 'description', array(
            'required'  => true,
            'label'     => 'Description:',
            'attribs'   => array(
                'title'     => 'Please enter the description of the site',
                'size'      => 50,
                'maxlength' => 100
            ),
            'filters'       => array('StringTrim', 'StripTags', 'StripNewlines'),
            'validators'    => array(
                array('NotEmpty', true, array(
                        'messages' => array(
                            Zend_Validate_NotEmpty::IS_EMPTY =>
                                "You must specify the sites description"))),
                array('StringLength', true, array(
                        'min'   => 5,
                        'max' => 100,
                        'messages'  => array(
                            Zend_Validate_StringLength::INVALID =>
                                'Your sites description must be between 5 and 100 characters in length',
                            Zend_Validate_StringLength::TOO_LONG =>
                                'Your sites description must not contain more than 100 characters',
                            Zend_Validate_StringLength::TOO_SHORT =>
                                'Your sites description must contain more than 5 characters'))))
        ));

        $this->addElement('file', 'image', array(
            'label'         => 'Upload Image:',
            'destination'   => APPLICATION_PATH . '/tmp/',
            'validators'    => array(
                array('count', true, array(
                    'min'   => 0,
                    'max'   => 1,
                    'messages'  => array(
                        Zend_Validate_File_Count::TOO_FEW =>
                            'You must upload an image file',
                        Zend_Validate_File_Count::TOO_MANY =>
                            'You can only upload one image file'))),
                array('extension', true, array(
                    'extention' => 'jpg,png,gif',
                    'messages'  => array(
                        Zend_Validate_File_Extension::NOT_FOUND =>
                            'The file has an invalid extention (jpg,png,gif only)',
                        Zend_Validate_File_Extension::FALSE_EXTENSION =>
                            'The file has an invalid extention (jpg,png,gif only)'))),
                array('imageSize', true, array(
                    'minheight' => self::IMAGEHEIGHT,
                    'minwidth'  => self::IMAGEWIDTH,
                    'maxheight' => self::IMAGEHEIGHT,
                    'maxwidth'  => self::IMAGEWIDTH,
                    'messages'  => array(
                        Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG =>
                            'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                        Zend_Validate_File_ImageSize::HEIGHT_TOO_SMALL =>
                            'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall',
                        Zend_Validate_File_ImageSize::WIDTH_TOO_BIG =>
                            'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                        Zend_Validate_File_ImageSize::WIDTH_TOO_SMALL =>
                            'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide',
                        Zend_Validate_File_ImageSize::NOT_DETECTED =>
                            'The image dimensions cannot be detected',
                        Zend_Validate_File_ImageSize::NOT_READABLE =>
                            'The image dimensions cannot be read'))))
        ));

        $this->addElement('multiCheckbox', 'Genres', array(
            'required'  => false,
            'label'     => 'Genres:',
            'attribs'   => array(
                'title'     => 'Please select the sites genres'
            ),
            'multiOptions'  => $genres,
            'filters' => array('int'),
            'validators' => array(
                array('NotEmpty', true, array(
                    'messages' => array(
                        Zend_Validate_NotEmpty::IS_EMPTY =>
                            "You must select the sites genres",
                        Zend_Validate_NotEmpty::INVALID =>
                            "You must select the sites genres"))),
                array('InArray', true, array(
                    'haystack'  => array_keys($genres),
                    'messages' => array(
                        Zend_Validate_InArray::NOT_IN_ARRAY =>
                            "You must select the sites genres"))))
        ));

        $this->addElement('multiCheckbox', 'ArtworkMediums', array(
            'required'  => false,
            'label'     => 'Artwork Mediums:',
            'attribs'   => array(
                'title'     => 'Please select the sites artwork mediums'
            ),
            'multiOptions'  => $artworkMediums,
            'filters' => array('int'),
            'validators' => array(
                array('NotEmpty', true, array(
                    'messages' => array(
                        Zend_Validate_NotEmpty::IS_EMPTY =>
                            "You must select the sites artwork mediums",
                        Zend_Validate_NotEmpty::INVALID =>
                            "You must select the sites artwork mediums"))),
                array('InArray', true, array(
                    'haystack'  => array_keys($artworkMediums),
                    'messages' => array(
                        Zend_Validate_InArray::NOT_IN_ARRAY =>
                            "You must select the sites artwork mediums"))))
        ));

        $this->addElement('submit', 'save', array(
            'label' => 'Save',
            'attribs'   => array(
                'title' => 'Save')
        ));

        $this->addSubForm($directSitesDescription, 'DirectSitesDescription')
             ->addSubForm($directSitesTitle, 'DirectSitesTitle');
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

橘寄 2025-01-13 13:27:01

我所看到的是您的 'count' 验证器看起来有点奇怪,看起来您始终需要至少 1 个文件。至于为什么没有错误信息,我不知道。
可以尝试设置 'min' => 0

array('count', true, array(
                'min'   => 1,
                'max'   => 1,
                'messages'  => array(
                    Zend_Validate_File_Count::TOO_FEW =>
                        'You must upload an image file',
                    Zend_Validate_File_Count::TOO_MANY =>
                        'You can only upload one image file'))),

下面是 Zend_Validate_File_Count 构造函数的 API,请在 ZF 1.11 API 查看整个 API

__construct(integer|array|\Zend_Config $options ) : void 设置验证器选项

Min 限制文件数,与 max=null 一起使用时为最大值
文件计数它还接受带有键“min”和“max”的数组如果
$options 是一个整数,它将用作最大文件数 As Array
接受以下键: 'min':最小文件数 'max':最大
filecount 参数名称 类型 描述
$options integer|array|\Zend_Config 适配器选项

All I can see is that your 'count' validator looks a little wonky, it looks like you are requiring a minimum of 1 file at all times. As to why there is no error message, I have no idea.
Might try setting 'min' => 0

array('count', true, array(
                'min'   => 1,
                'max'   => 1,
                'messages'  => array(
                    Zend_Validate_File_Count::TOO_FEW =>
                        'You must upload an image file',
                    Zend_Validate_File_Count::TOO_MANY =>
                        'You can only upload one image file'))),

Below is the API for Zend_Validate_File_Count constructor, see whole API at ZF 1.11 API

__construct( integer|array|\Zend_Config $options ) : void Sets validator options

Min limits the file count, when used with max=null it is the maximum
file count It also accepts an array with the keys 'min' and 'max' If
$options is a integer, it will be used as maximum file count As Array
is accepts the following keys: 'min': Minimum filecount 'max': Maximum
filecount Parameters Name Type Description
$options integer|array|\Zend_Config Options for the adapter

伴梦长久 2025-01-13 13:27:01

仔细检查以确保其

enctype='multipart/form-data'

包含在 html 表单元素中。我花了两个小时解决同样的问题。原来那是我的问题。

Double check to make sure that

enctype='multipart/form-data'

is included in the html form element. I spent two hours with the same issue. Turns out that was my problem.

允世 2025-01-13 13:27:01

RockyFord 是正确的,您应该将 Count 验证器的 min 值设置为 0。

即使某个元素不是必需的,当该值不为空时,其验证器仍然会被处理。文件元素与计数验证器的工作方式略有不同。如果您指定的 min 大于 0,则仍需要上传那么多文件。

尝试使用以下代码来关闭所需的标志。此外,我们将设置计数验证器以要求至少 0 个文件。

$form->getElement('image')
     ->setRequired(false)
     ->getValidator('count')
     ->setMin(0);

我测试了这个并且它有效。如果我没有将最小值设置为 0,表单将无法验证,但是,我会看到一条错误消息:您必须上传图像文件。也许您的装饰器没有在 File 元素上显示错误?

RockyFord is correct, you should set the min value of the Count validator to 0.

Even if an element is not required, its validators are still processed when the value is not empty. File elements work a little different with the count validator. If you specify a min greater than 0, it will still require that many files to be uploaded.

Try the following code where you turn off the required flag. In addition, we will set the Count validator to require at least 0 files.

$form->getElement('image')
     ->setRequired(false)
     ->getValidator('count')
     ->setMin(0);

I tested this and it worked. If I didn't set the min to 0, the form would fail validation, however, I would see an error message reading You must upload an image file. Perhaps your decorators are not showing the error on File elements?

去了角落 2025-01-13 13:27:01

采埃孚1.11
一个更简单的解决方案是在提交表单时删除该元素:

    $upload = new Zend_File_Transfer();
    $files  = $upload->getFileInfo();   

        if(empty($files))
        {
          $form->removeElement('image_name');
        }
        else
        {
          $form->image_name->receive();
        }

       if($form->isValid($_POST))
       {
         $formData = $form->getValues();
       }

ZF 1.11
A much simpler solution is to remove the element upon submitting the form:

    $upload = new Zend_File_Transfer();
    $files  = $upload->getFileInfo();   

        if(empty($files))
        {
          $form->removeElement('image_name');
        }
        else
        {
          $form->image_name->receive();
        }

       if($form->isValid($_POST))
       {
         $formData = $form->getValues();
       }
执着的年纪 2025-01-13 13:27:01

重写从 Zend_Form 派生的类中的 isValid 方法。

/**
 * Class Custom_Form
 */
class Custom_Form extends Zend_Form
{
    // [...]

    /**
     * Validate the form
     *
     * @param  array $data
     * @throws Zend_Form_Exception
     * @return bool
     */
    public function isValid($data)
    {
        /** @var Zend_Form_Element_File $file */
        $file = $this->getElement('file');

        /**
         * Remember the validators we set before
         */
        $validators = $file->getValidators();

        /**
         * Remove validators if field is empty
         */
        if (empty($_FILES['file']['name'])) {
            $file->removeValidator('Extension');
        }

        /**
         * Run validation
         */
        $isValid = parent::isValid($data);

        /**
         * Set back the original validators after validation
         */
        $file->setValidators($validators);

        return $isValid;
    }

    // [...]
}

Override the method isValid inside the class deriving from Zend_Form.

/**
 * Class Custom_Form
 */
class Custom_Form extends Zend_Form
{
    // [...]

    /**
     * Validate the form
     *
     * @param  array $data
     * @throws Zend_Form_Exception
     * @return bool
     */
    public function isValid($data)
    {
        /** @var Zend_Form_Element_File $file */
        $file = $this->getElement('file');

        /**
         * Remember the validators we set before
         */
        $validators = $file->getValidators();

        /**
         * Remove validators if field is empty
         */
        if (empty($_FILES['file']['name'])) {
            $file->removeValidator('Extension');
        }

        /**
         * Run validation
         */
        $isValid = parent::isValid($data);

        /**
         * Set back the original validators after validation
         */
        $file->setValidators($validators);

        return $isValid;
    }

    // [...]
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文