ZF2 fileprg包含集合中的文件

时间:2013-05-13 12:18:17

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

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

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

我错过了什么?为了让它发挥作用,有什么特别的事情要做吗?

1 个答案:

答案 0 :(得分:0)

在文件\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