【问题标题】:ZF2 fileprg with files in collectionZF2 fileprg 与集合中的文件
【发布时间】:2013-05-13 12:18:17
【问题描述】:

我无法让fileprg 插件处理集合中的文件。 我正在尝试使用FormCollections 上传多个文件,但在$form->getData() 中没有与我的收藏或文件相关的密钥。

我用简单的file input(以相同的形式)测试了表单和fileprg,它可以上传/重命名,它位于$form->getData()

我错过了什么?这些集合有什么特别的事情可以让它发挥作用吗?

【问题讨论】:

    标签: forms file-upload zend-framework2 post-redirect-get


    【解决方案1】:

    在文件\Zend\Mvc\Controller\Plugin\FilePostRedirectGet 中,您要查看的两个函数是getNonEmptyUploadData(提供回调函数)和traverseInputs(这是一个美化的foreach,它检查每个输入过滤器然后运行它并通过上述回调的值)。

    要让这个插件在集合上工作,您需要扩展类并更改上述功能:

    /**
     * Traverse the InputFilter and run a callback against each Input and associated value
     *
     * @param  InputFilterInterface $inputFilter
     * @param  array                $values
     * @param  callable             $callback
     * @return array|null
     */
    protected function traverseInputs(InputFilterInterface $inputFilter, $values, $callback)
    {
        $returnValues = null;
        foreach ($values as $name => $value) {
            if (!$inputFilter->has($name)) {
                continue;
            }
    
            $input = $inputFilter->get($name);
             if ($input instanceof InputFilterInterface && is_array($value)) {
    
                if ($input instanceof CollectionInputFilter) {
                    $retVal = null;
                    foreach ($value as $k => $val) {
                        $retVal2 = $this->traverseInputs($input->getInputFilter(), $val, $callback);
                        if ($retVal2)
                            $retVal[$k] = $retVal2;
                    }
                } else
                    $retVal = $this->traverseInputs($input, $value, $callback);
    
                if (null !== $retVal) {
                    $returnValues[$name] = $retVal;
                }
                continue;
            }
    
            $retVal = $callback($input, $value);
            if (null !== $retVal) {
                $returnValues[$name] = $retVal;
            }
        }
        return $returnValues;
    }
    
    /**
     * Traverse the InputFilter and only return the data of FileInputs that have an upload
     *
     * @param  InputFilterInterface $inputFilter
     * @param  array                $data
     * @return array
     */
    protected function getNonEmptyUploadData(InputFilterInterface $inputFilter, $data)
    {
        return $this->traverseInputs(
            $inputFilter,
            $data,
            function ($input, $value) {
                $messages = $input->getMessages();
                if (is_array($value) && $input instanceof FileInput && empty($messages)) {
                    $rawValue = $value;
                    if (
                        (isset($rawValue['error']) && $rawValue['error'] !== UPLOAD_ERR_NO_FILE)
                        || (isset($rawValue[0]['error']) && $rawValue[0]['error'] !== UPLOAD_ERR_NO_FILE)
                    ) {
                        return $value;
                    }
                }
                return;
            }
        );
    }
    

    这里有一个差异,显示了哪些行被更改:https://github.com/rafam31/zf2/commit/c481e7404faf93beb4c67a6a4b7490fec15d279b

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多