0

fileinput의 이상한 동작에 어려움을 겪고 있습니다.InputFilter "setRequired"가 html5 다중에 작동하지 않습니다

namespace Frontend\Form; 

use NW\Form\Form; 
use Zend\InputFilter; 
use Zend\Form\Element; 
use Zend\ServiceManager\ServiceManager; 

use Zend\ServiceManager\ServiceManagerAwareInterface; 

class EnrollStructure extends Form implements ServiceManagerAwareInterface 
{ 
protected $sm; 

public function __construct($name=null) { 

    parent::__construct("frmEnrollStructure"); 
    $this->setAttribute("action", "/registrazione_struttura/submit") 
     ->setAttribute('method', 'post') 
     ->setAttribute("id", "iscrizione_struttura") 
     ->setAttribute("class", "form fullpage"); 
    $this->addInputFilter(); 
} 

public function init() 
{ 
    $structureFs = $this->sm->get('Structure\Form\Fieldsets\Structure'); 
    $structureFs->setUseAsBaseFieldset(true); 

    $structureFs->remove("id") 
     ->remove("creationTime") 
     ->remove("latLon"); 

    $file = new Element\File("images"); 
    $file->setAttribute('multiple', true); 

    $this->add($structureFs)->add($file); 

    $this->add(array(
     'name' => 'submit', 
     'attributes' => array(
      'type' => 'submit', 
      'value' => 'Iscriviti', 
      'id' => 'sbmtEnrollStructure', 
      'class' => 'submit_btn' 
     ), 
    )); 

    $this->setValidationGroup(
     array(
     'structure' => 
      array(
       'companyname', 
       'vatNumber', 
       'addressStreet', 
       'addressZip', 
       'addressCity', 
       'addressRegion', 
       'fax', 
       'publicPhone', 
       'publicEmail', 
       'website', 
       'status', 
       'ownerNotes', 
       'category', 
       'subcategory', 
       "facilities", 
       "agreeOnPolicy", 
       "agreeOnPrivacy", 
       "subscribeNewsletter", 
       "contact" => array("name", "surname", "email", "role", "phone"), 
      ), 
      "images" 
    )); 

} 

/** 
* Set service manager 
* 
* @param ServiceManager $serviceManager 
*/ 
public function setServiceManager(ServiceManager $serviceManager) 
{ 
    $this->sm = $serviceManager; 
} 

public function addInputFilter() 
{ 
    $inputFilter = new InputFilter\InputFilter(); 
    // File Input 
    $fileInput = new InputFilter\FileInput('images'); 
    $fileInput->setRequired(true); 

    $fileInput->getValidatorChain() 
     ->attachByName('filesize',  array('max' => "2MB")) 
     ->attachByName('filemimetype', array('mimeType' => 'image/png,image/x-png,image/jpg,image/jpeg')) 
     ->attachByName('fileimagesize', array('maxWidth' => 2048, 'maxHeight' => 2048)); 

    $inputFilter->add($fileInput); 

    $this->setInputFilter($inputFilter); 
} 



} 

기본적으로, 나는 주로 내가 사용자에게 요청하는 대부분의 데이터가 들어있는 필드 셋, 플러스 파일 입력 필드를 사용 이 내 양식이다.

이것은 FIELDSET 구조입니다 : (가장 중요한 부분을 ..)

use Zend\Form\Element; 
use Zend\Form\Fieldset; 
use Zend\InputFilter\InputFilterProviderInterface; 

use Zend\ServiceManager\ServiceManager; 
use Zend\ServiceManager\ServiceManagerAwareInterface; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use Zend\Validator\Identical; 
use Zend\Validator\NotEmpty; 
use Zend\Validator\Regex; 
use Zend\Validator\StringLength; 


class Structure extends Fieldset implements InputFilterProviderInterface, ServiceManagerAwareInterface 
{ 
protected $sm; 

public function __construct() 
{ 
    parent::__construct('structure'); 
} 

public function init() 
{ 
    $this->setHydrator(new DoctrineHydrator($this->_entityManager(),'Structure\Entity\Structure')); 
    $this->setObject($this->sm->getServiceLocator()->get("Structure_Structure")); 
    $id = new Element\Hidden("id"); 

    $name = new Element\Text("companyname"); 
    $name->setLabel("Ragione Sociale"); 

     ........... 
} 

public function getInputFilterSpecification() 
{ 
    return array 
    (
     "id" => array(
      "required" => false, 
     ), 
     "companyname" => array(
      "required" => true, 
      "validators" => array(
       array('name' => "NotEmpty", 'options' => array("messages" => array(NotEmpty::IS_EMPTY => "Inserire la ragione sociale"))) 
      ), 
     ), 
     ..... 
} 

}

이 내 컨트롤러 :

public function submitAction() 
{ 
    try { 
     $this->layout("layout/json"); 

     $form = $this->getForm('Frontend\Form\EnrollStructure'); 
     //$form->addInputFilter(); 
     $structure = $this->getServiceLocator()->get("Structure_Structure"); 

     $viewModel = new ViewModel(); 
     $request = $this->getRequest(); 

     if ($request->isPost()) 
     { 
      $post = array_merge_recursive 
      (
       $request->getPost()->toArray(), 
       $request->getFiles()->toArray() 
      ); 

      $form->setData($post); 

      if ($form->isValid()) 
      { 
       $structure = $form->getObject(); 
       $contact = $structure->getContact(); 
       $this->getServiceLocator()->get('Structure_ContactService')->save($contact); 
       $files = $request->getFiles()->toArray(); 

       if(isset($files['images'])) 
       { 
        $count = 3; 
        foreach($files['images'] as $pos => $file) 
        { 
         $fpath = $this->getServiceLocator()->get('RdnUpload\Container')->upload($file); 
         if(!empty($fpath)) 
         { 
          if(--$count ==0) break; 
          $asset = $this->getServiceLocator()->get("Application_AssetService")->fromDisk($fpath, $file['name']); 
          $this->getServiceLocator()->get("Application_AssetService")->save($asset); 
          $structure->addImage($asset); 
         } 
        } 
       } 

       $this->getServiceLocator()->get('Structure_StructureService')->save($structure); 
       $retCode = RetCode::success(array("iscrizione_struttura!" => array("form_submit_successfull")), true); 
      } 
      else 
      { 

       $messages = $form->getMessages(); 
       if(empty($messages)) 
        $retCode = RetCode::error(array("iscrizione_struttura" => array("need_at_least_one_file" => "missing file")), true); 
       else 
        $retCode = RetCode::error(array("iscrizione_struttura" => $messages), true); 
      } 


      $viewModel->setVariable("retcode", $retCode); 
      return $viewModel; 
     } 
    } catch(Exception $e) 
    { 
     throw $e; 
    } 
} 

이상한 것은입니다 난에서 제거하는 경우 필드 "이미지"는 "다중"속성이 유효합니다. 양식을 검증하지 않으면이 메시지가 나타납니다.

[images] => Array 
    (
     [fileUploadFileErrorFileNotFound] => File was not found 
    ) 

동안, 나는 속성 배수를 설정하고이 내 컨트롤러에서이 "나쁜"코드 :

에 대한 이유입니다 (사용자 내가 오류를 얻을 파일을 업로드하지 않지만, 폼이 무효화됩니다 경우
 $messages = $form->getMessages(); 
       if(empty($messages)) 
        $retCode = RetCode::error(array("iscrizione_struttura" => array("need_at_least_one_file" => "missing file")), true); 
       else 
        $retCode = RetCode::error(array("iscrizione_struttura" => $messages), true); 

답변