在 Zend 表单上禁用 Inarray Validator

Disable Inarray Validator on Zend Form

在添加两个下拉菜单之前,我的表单一直有效。从那时起,在提交表格时我收到错误:

haystack option is mandatory

这是我的 ProjectForm.php

<?php

namespace Project\Form;
use Zend\Form\Form;
use Zend\Form\Element\Text;
use Zend\Form\Fieldset;
use Zend\Form\Element\Select;
use Zend\Form\Element\Checkbox;
use Zend\Form\Element\Date;
use Zend\Config\Factory;
use Zend\Form\Element\Button;
use Zend\Form\Element\Textarea;
use Zend\Validator\Callback;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Form\Element\File;

class ProjectForm extends Form implements InputFilterProviderInterface {

    const KEY_PROJECT_NAME = "project_name";
    const KEY_PROJECT_DUE_DTTM = "project_due_dttm";
    const KEY_PROJECT_DESCRIPTION = "project_description";
    const KEY_PROJECT_CONFIG = "project_config";
    const KEY_PROJECT_TYPES = "project_types"; 
    const KEY_PROJECT_WORKFLOW_CONFIG = "project_workflow_config";
    const KEY_PROJECT_WORKFLOW_TYPES = "project_workflow_types";
    const KEY_PROJECT_FILE = "project_file";
    const KEY_SAVE_BTN = "project_save_btn";
    const KEY_CANCEL_BTN = "project_cancel_btn";


    public function __construct($name = null, $options = array()) {
        parent::__construct($name);

        $this->setAttribute('method', 'post');
        $this->setAttribute('class', 'form-horizontal');

        $name = new Text(self::KEY_PROJECT_NAME);
        $name->setAttribute("id", self::KEY_PROJECT_NAME);
        $name->setLabel("Name");

        $duedttm = new Text(self::KEY_PROJECT_DUE_DTTM);
        $duedttm->setAttribute("id", self::KEY_PROJECT_DUE_DTTM);
        $duedttm->setLabel("Due Date");

        $description = new Textarea(self::KEY_PROJECT_DESCRIPTION);
        $description->setAttribute("id", self::KEY_PROJECT_DESCRIPTION);
        $description->setLabel("Description");

        $config = new Textarea(self::KEY_PROJECT_CONFIG);
        $config->setAttribute("id", self::KEY_PROJECT_CONFIG);
        $config->setLabel("Configuration");

        $projectTypeDropDown = new Select(self::KEY_PROJECT_TYPES); 
        $projectTypeDropDown->setLabel('Project Type:'); 
        $projectTypeDropDown->setValueOptions($options["project"]); 

        $wfConfig = new Textarea(self::KEY_PROJECT_WORKFLOW_CONFIG);
        $wfConfig->setAttribute("id", self::KEY_PROJECT_WORKFLOW_CONFIG);
        $wfConfig->setLabel("Workflow Configuration");

        $projectWorkflowDropDown = new Select(self::KEY_PROJECT_WORKFLOW_TYPES);
        $projectWorkflowDropDown->setLabel('Workflow Type:');
        $projectWorkflowDropDown->setValueOptions(array());

        $file = new File(self::KEY_PROJECT_FILE);
        $file->setAttribute("id", self::KEY_PROJECT_FILE);
        $file->setAttribute("multiple", true);
        $file->setLabel("File");

        $save = new Button(self::KEY_SAVE_BTN);
        $save->setAttributes(array("id", self::KEY_SAVE_BTN));
        $save->setLabel("Save");
        $save->setValue("Save");

        $cancel = new Button(self::KEY_CANCEL_BTN);
        $cancel->setAttributes(array("id", self::KEY_CANCEL_BTN));
        $cancel->setLabel("Cancel");

        $this->add($name);
        $this->add($duedttm);
        $this->add($description);
        $this->add($config);
        $this->add($projectTypeDropDown); 
        $this->add($wfConfig);
        $this->add($projectWorkflowDropDown); 
        $this->add($file);
        $this->add($save);
        $this->add($cancel);
    }

    public function isValidJSON($value, $options) {
        try {
            JSON::decode($value);
            return true;
        } catch (JSONException $e) {
            return false;
        }
    }

    public function isValidDateTime($value, $options) {
        if (false === date_create($value)) {
            return false;
        }
        return true;
    }

    /**
     * (non-PHPdoc)
     * @see \Zend\InputFilter\InputFilterProviderInterface::getInputFilterSpecification()
     */
    public function getInputFilterSpecification() {
        return array(
                ProjectForm::KEY_PROJECT_CONFIG => array(
                        'required' => true,
                        'filters' => array(
                                array(
                                        'name' => 'Zend\Filter\StringTrim'
                                ),
                        ),
                        'validators' => array(
                                new Callback(
                                        array(
                                                $this,
                                                'isValidJSON'
                                        )),
                        ),
                ),
                ProjectForm::KEY_PROJECT_WORKFLOW_CONFIG => array(
                        'required' => false,
                        'filters' => array(
                                array(
                                        'name' => 'Zend\Filter\StringTrim'
                                ),
                        ),
                        'validators' => array(
                                new Callback(
                                        array(
                                                $this,
                                                'isValidJSON'
                                        )),
                        ),
                ),
                ProjectForm::KEY_PROJECT_DUE_DTTM => array(
                        'required' => false,
                        'filters' => array(
                                array(
                                        'name' => 'Zend\Filter\StringTrim'
                                ),
                        ),
                        'validators' => array(
                                new Callback(
                                        array(
                                                $this,
                                                'isValidDateTime'
                                        )),
                        ),
                ),

        );
    }
}

我想我需要通过添加 disable_inarray_validator' => true 来禁用 inarray_validator,但我不确定在哪里添加它。

我建议您传递一个空字符串作为唯一值选项。在您的 javascript 中,您刷新 select 的 <option> 标签以摆脱这个空选项。 此外,您还必须通过添加 :

来禁用 Select 元素的默认验证器
$projectWorkflowDropDown->setOptions(array('disable_inarray_validator' => true));

或者

$projectWorkflowDropDown->setDisableInArrayValidator(true);

如果你不添加这个选项,当提交表单时,Zend Form 会告诉你发送的值不在构建表单时提供的 haystack 中。这是一个安全过程,在很多情况下都非常有用,只是在您的情况下不是。

由于我使用的 Zend 版本,我必须在验证表单之前将其添加到控制器:

// Make certain to merge the files info!
$post = array_merge_recursive($request->getPost()->toArray(), $request->getFiles()->toArray());

//Deals with validation of dynamic form 
$projectType = $projectTypes[$post["project_types"]]; 
$form->get('project_workflow_types')->setValueOptions($workflowTypes[$projectType]); 


// set the form instance's data
$form->setData($post);