2016-02-23 3 views
1

У меня есть форма, которая работала, пока я не добавил два раскрывающихся меню. С тех пор, по представлению формы я получаю ошибку: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' 
             )), 
         ), 
       ), 

     ); 
    } 
} 

Я думаю, что мне нужно отключить inarray_validator, добавив disable_inarray_validator' => true, но я не обязательно, где добавить это.

ответ

0

Из-за версию 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); 
0

Предлагаю вам передать пустую строку как уникальное значениеOption. В вашем javascript вы промойте теги <option> выбора, чтобы избавиться от этой пустой опции. Кроме того, вам придется отключить валидатор по умолчанию Выберите элемент, добавив:

$projectWorkflowDropDown->setOptions(array('disable_inarray_validator' => true)); 

Или

$projectWorkflowDropDown->setDisableInArrayValidator(true); 

Если вы не добавить эту опцию, когда форма будет представлена, Zend Form скажет вам, что стоимость отправки не находится в стоге сена при условии, что форма была построена. Это процесс безопасности, который во многих случаях очень полезен, просто не в вашем.

+0

После попытки второго варианта я получаю 'Призыва к неопределенным метод Ze \ Form \ Элемент \ Select :: setDisableInArrayValidator() '. Я пропустил что-то, что нужно включить? –

+0

Какова ваша версия Zend? Это странно, http://framework.zend.com/apidoc/2.4/classes/Zend.Form.Element.Select.html#method_setDisableInArrayValidator говорит, что этот метод является общедоступным. Вы попробовали вариант вместо этого? – JesusTheHun

+0

Я использую Zend версии 2.1.0. И я попробовал другой вариант, но я получаю ту же ошибку haystack –