2013-05-13 1 views
2

Я не могу получить плагин fileprg для работы с файлами в коллекции. Я пытаюсь загрузить несколько файлов с помощью FormCollections, но в $form->getData() нет ключа, связанного с моей коллекцией или файлами.ZF2 fileprg с файлами в коллекции

Я проверил форму и файлprg с простым file input (в том же виде), и он работал загружен/переименован, и это было в $form->getData().

что мне не хватает? есть ли что-нибудь особенное, что нужно сделать с коллекциями, чтобы заставить его работать?

ответ

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