【问题标题】:Invalid type given. String expected - Zend Framework 2给定的类型无效。字符串预期 - Zend 框架 2
【发布时间】:2012-10-29 12:02:18
【问题描述】:

我正在研究 Zend Framework 2,尤其是 Zend Forms。我在

中声明了一个选择下拉框

表格:

$selectElement = new Element\Select('selectElement');
    $selectElement->setAttribute('title', 'Select a Value')
            ->setAttribute('id', 'id');

    $data = array(
        array(
           //Fetching the values from database
            ),
    );

   $selectElement->setAttribute('multiple', 'multiple')      
        ->setValueOptions($data);

   $this->add($selectElement);

输入过滤器:

$inputFilter->add($factory->createInput(array(
                'name'     => 'selectElement',
                'required' => false,
                'filters'  => array(
                    array(
                        'name' => 'Int'
                        ),
                    ),
           )));

我使用 Zend Debug 以这种方式获取 selectElement Dropbox 中的值:

$dataSelectElements = $this->getRequest()->getPost('selectElement');
 \Zend\Debug\Debug::dump($dataSelectElements);

调试结果:

array(4) {
  [0] => string(2) "20"
  [1] => string(2) "22"
  [2] => string(2) "23"
  [3] => string(2) "75"
}

基本上我从 selectElement 表单中获取 id 以将其存储在数据库中。现在我收到通知和 zend 表单错误:

通知错误:

Notice: Array to string conversion in ..\zendframework\zendframework\library\Zend\Filter\Int.php on line 29

还有一个表单无效错误:

array(1) {
  [0] => array(1) {
    ["selectElement "] => array(1) {
      ["explodeInvalid"] => string(35) "Invalid type given. String expected"
    }
  }
}

有没有办法解决这个问题。任何帮助将不胜感激。

【问题讨论】:

    标签: zend-form zend-framework2


    【解决方案1】:

    Int 过滤器将尝试从您的数据数组中生成一个整数,但这是行不通的。

    之前我使用过回调过滤器,它可以用来循环遍历数据并检查每个值是否为 Int。

    例如:

    'filters' => array(
        array(
            'name' => 'Callback',
            'options' => array(
                'callback' => function($values) {
                    return array_filter($values, function($value) {
                        return ((int)$value == $value);
                    });
                }
            )
        ),
    ),
    

    【讨论】:

    • 感谢您的帖子,它在一定程度上有所帮助,但现在我收到 ["notInArray"] 错误。这是我在上面提到的相同代码中遇到的错误,唯一的区别是在我的 inputFilter 中,我删除了 Int 过滤器并将其替换为 Callback 过滤器。这是错误array(1) { [0] => array(1) { ["selectElement "] => array(1) { [0] => array(1) { ["notInArray"] => string(39) "The input was not found in the haystack" } } } }。知道如何克服这个
    • 在没有应用过滤器的情况下代码是否可以工作?如果是这样,在表单验证发生后简单地过滤值可能是值得的。否则,似乎是 Checkbox/Radio 元素应用 InArray 验证器来测试输入的真假。该错误消息表明 InArray 验证器未获取正确的数据。抱歉,我无法提供更多帮助。
    【解决方案2】:

    我做的有点不同,像这样

    表格

    class Companyform extends Form
    
        {
            public function __construct()
            {
                // we want to ignore the name passed
                parent::__construct('company');
    
                $this->setAttribute ('method', 'post');
                $this->setAttribute ('class', 'form-horizontal');
        $this->add ( array (
                    'name' => 'parentID',
                    'type' => 'Zend\Form\Element\Select',        
                    'attributes' => array(
                        'id' => 'parentID',
                        'type' => 'select',
                        'placeholder' => "Parent Company",
                    ),
                    'options' => array(
                        'label' => 'Parent Company'
                    )
                ));
    
                $this->add(array(
                    'name' => 'btnsubmit',
                    'attributes' => array(
                        'id' => 'btnsubmit',
                        'type' => 'submit',
                        'value' => 'Add',   
                        'class' => 'btn btn-primary'
                    ),
                ));
    
            }
    
        }
    

    控制器

    public function addAction() 
    {        
        $request = $this->getRequest();
    
        $companyList = $this->_getCompanyList();         
    
        $form = new Companyform();                  
    
        $form->get('parentID')->setAttribute('options',$companyList);
    
    
        if ($request->isPost()) 
        {
            $company = new Company();   
                $form->setInputFilter($company->getInputFilter());            
    
                $form->setData($request->getPost());
    
                if ($form->isvalid()) 
                {                 
                }
    
        }
    }
    
    public function _getCompanyList()
    {
         $companies = $this->Em()->getEntityManager()->getRepository('XXXX\Entity\Company')->findBy(array('isDeleted'=>'0'));
         $companyIDList = array();
         $companyIDList[0] = "No Parent";
         foreach ($companies as $company) 
         {        
           $companyIDList[$company->id] = $company->companyName;
         }         
         return $companyIDList;        
    }
    

    实体类

     protected $inputFilter;
    
        public function setInputFilter(InputFilterInterface $inputFilter)
        {
            throw new \Exception("Not used");
        }
    
        public function getInputFilter()
        {
            if (!$this->inputFilter) {
                $inputFilter = new InputFilter();
    
                $factory = new InputFactory();
    
                $inputFilter->add($factory->createInput(array(
                    'name' => 'companyName',
                    'required' => true,
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min' => 2,
                                'max' => 255,
                            ),
                        ),
                    ),
                )));
    
                $this->inputFilter = $inputFilter;
            }
    
            return $this->inputFilter;
        }
    

    您可能需要在实体中添加以下库

    use Zend\InputFilter\InputFilter;
    use Zend\InputFilter\Factory as InputFactory;
    use Zend\InputFilter\InputFilterAwareInterface;
    use Zend\InputFilter\InputFilterInterface;
    

    【讨论】:

      【解决方案3】:

      在 ZendFramework 2 中,当您从表单文件创建(添加)元素时,检查属性:inarrayvalidator is true

              $this->add(array(
                 'name' => 'select_name',
                 'type' => 'select',
                 'id' => 'select_name',
                 'options' => array(
                       'label' => 'Select Name',
                  ),
                  'attributes' => array(
                       'id' => 'select_id',
                        'inarrayvalidator' => true,
                   ),
              )); 
      

      我希望,这行得通...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 2019-01-30
        • 2017-07-25
        • 2017-04-11
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        相关资源
        最近更新 更多