getdata при вводе файла возвращает только имя файла, а не массив деталей

У меня есть форма, в которой есть fieldset с полем загрузки файла. Когда я делаю 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?

например

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

Я использую форму для других вещей и уже переопределил getData поэтому хотелось бы, чтобы ответ находился в наборе полей.

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]
                ]
            ]
        ];
    }
}

Вы можете объединить несколько фильтров, например, чтобы переименовать файл раньше.

Другие вопросы по тегам