getdata on File输入只返回文件名,而不是返回详细信息数组

时间:2016-08-08 11:16:23

标签: zend-framework2 zend-form2 zend-file

我有一个表单,其中包含一个带有文件上传字段的字段集。当我在var_dump$form->getData()时,我会看到文件字段的数据数组:

array (size=13)
  'logo' => 
    array (size=5)
      'name' => string 'my-image.gif' (length=12)
      'type' => string 'image/gif' (length=9)
      'tmp_name' => string 'C:\xampp\htdocs\images\my-image.gif' (length=35)
      'error' => int 0
      'size' => int 391
  //... other fields here

当我调用getData时,如何让元素只返回名称?

e.g。

array (size=13)
  'logo' => string 'my-image.gif' (length=12)
  //... other fields here

我正在使用该表单进行其他操作并已覆盖getData,因此我希望将答案保留在字段集中。

1 个答案:

答案 0 :(得分:1)

您可以覆盖表单中的getData()方法。

public function getData()
{
    $data = parent::getData();
    $logo = $data['logo'];
    $data['logo'] = $logo['name'];
    return $data;
}

添加所有必要的预防措施,以确保阵列中存在密钥。

字段集的补充

使用文件集,您可以使用过滤器来更改返回文件结构:

namespace your\namespace;

use Zend\Filter;

class FilterFileName extends Filter\AbstractFilter
{
public function filter($value)
{
        if (! is_scalar($value) && ! is_array($value)) {
            return $value;
        }
        if (is_array($value)) {
            if (! isset($value['name'])) {
                return $value;
            }
            $return = $value['name'];
        } else {
            $return = $value;
        }
        return $return;
    }
}

您的fieldset类必须实现InputFilterProviderInterface

use your\namespace\FilterFileName;

class YourFieldset extends ZendFiedset implements InputFilterProviderInterface
{
    public function __construct()
    {
        // your code ... like :
        parent::__construct('logo');

        $file_element = new Element\File('my-element-file');
        $file_element->setLabel('Chooze')
            ->setAttribute('id', 'my-element-file')
            ->setOption('error_attributes', [
               'class' => 'form-error'
        ]);
        $this->add($file_element);            
    }
    public function getInputFilterSpecification()
    {
        return [
            'element-file' => [
                'name' => 'my-element-file',
                'filters' => [
                    ['name' => FilterFileName::class]
                ]
            ]
        ];
    }
}

您可以链接多个过滤器,例如以前重命名文件。