我无法让fileprg
插件处理集合中的文件。我正在尝试使用 上传多个文件FormCollections
,但$form->getData()
没有与我的收藏或文件相关的密钥。
我用simple(以相同的形式)测试了表单和fileprg,file input
它可以上传/重命名,它位于$form->getData()
.
我错过了什么?这些收藏品有什么特别的地方可以让它发挥作用吗?
我无法让fileprg
插件处理集合中的文件。我正在尝试使用 上传多个文件FormCollections
,但$form->getData()
没有与我的收藏或文件相关的密钥。
我用simple(以相同的形式)测试了表单和fileprg,file input
它可以上传/重命名,它位于$form->getData()
.
我错过了什么?这些收藏品有什么特别的地方可以让它发挥作用吗?
在文件\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