2013-04-08 41 views
0

tutorial之后,我们就可以很好地创建文件上传了。根据zend教程,editAction与Add操作几乎相同。文件上传的编辑操作

如果我不添加文件上传代码editAction它工作正常,但添加文件上传后,显示exchangearray)错误(

不能使用类型的对象\型号\ CompanyReport比如\模块\报告阵列\第20行

这里的src \报告\型号\ CompanyReport.php是模型文件

public function exchangeArray($data) 
{ 
    <-this is line number 20->$this->id  = (isset($data['id'])) ? $data['id'] : null; 
    $this->title = (isset($data['title'])) ? $data['title'] : null; 
    $this->company = (isset($data['company'])) ? $data['company'] : null; 
    $this->sector = (isset($data['sector'])) ? $data['sector'] : null; 
    $this->report_date = (isset($data['report_date'])) ? $data['report_date'] : null; 
    $this->report_file = (isset($data['report_file'])) ? $data['report_file'] : null; 

} 

以下是editAction代码

public function editAction(){ 
    $id = (int) $this->params()->fromRoute('id', 0); 
    if (!$id) { 
     return $this->redirect()->toRoute('companyreport', array(
      'action' => 'add' 
     )); 
    } 

    // Get the Album with the specified id. An exception is thrown 
    // if it cannot be found, in which case go to the index page. 
    try { 
     $companyreport = $this->getCompanyReportTable()->getCompanyReport($id); 
    } 
    catch (\Exception $ex) { 
     return $this->redirect()->toRoute('companyreport', array(
      'action' => 'index' 
     )); 
    } 

    $form = new CompanyReportForm(); 
    $form->bind($companyreport); 
    $form->get('submit')->setAttribute('value', 'Edit'); 

    $request = $this->getRequest(); 
    if ($request->isPost()) { 

     $companyreport = new CompanyReport(); 
     $form->setInputFilter($companyreport->getInputFilter()); 

     $nonFile = $request->getPost()->toArray(); 
     $File = $this->params()->fromFiles('report_file'); 

     $data = array_merge_recursive(
        $this->getRequest()->getPost()->toArray(),   
        $this->getRequest()->getFiles()->toArray() 
       ); 
     $form->setData($data); 

     if ($form->isValid()) { 

      $size = new Size(array('min'=>500000)); //minimum bytes filesize 

      $adapter = new \Zend\File\Transfer\Adapter\Http(); 
      //validator can be more than one... 
      $adapter->setValidators(array($size), $File['name']); 

      if (!$adapter->isValid()){ 
       $dataError = $adapter->getMessages(); 
       $error = array(); 
       foreach($dataError as $key=>$row) 
       { 
        $error[] = $row; 
       } //set formElementErrors 
       $form->setMessages(array('report_file'=>$error)); 
      } else { 

       $adapter->setDestination(dirname(__DIR__).'/company_reports'); 
       if ($adapter->receive($File['name'])) { 
        $companyreport->exchangeArray($form->getData()); 
        $this->getCompanyReportTable()->saveCompanyReport($companyreport); 

       // Redirect to list of albums 
       return $this->redirect()->toRoute('companyreport'); 
       } 
      } 
     } 
    } 

    return array(
     'id' => $id, 
     'form' => $form, 
    ); 
} 

请建议editAction进行文件上传。

回答

0

我认为这不是文件上传代码的问题。你已经绑定的实体形式:

$form->bind($companyreport); 

当执行$form->setData($data),形式与实体结合的发布数据。这意味着$form->getData()将返回填充了所有数据的实体。这就是错误所说的,它返回一个实体(CompanyReport),而不是数组。

$form->getData()Zend\Form\Form\getData())执行的代码是:

//IF YOU BIND, $this->object WILL BE THE ENTITY, SO IT'LL RETURN IT  
    if (($flag !== FormInterface::VALUES_AS_ARRAY) && is_object($this->object)) { 
     return $this->object; 
    } 

    //OTHERWISE IT'LL RETURN AN ARRAY WITH POSTED DATA 
    $filter = $this->getInputFilter(); 

    if ($flag === FormInterface::VALUES_RAW) { 
     return $filter->getRawValues(); 
    } 

    return $filter->getValues(); 

如果你想用你的exchangeArray功能,你可以通过它的合并阵列$data。但是没有必要,当你将表单绑定到实体时,'exchangeArray作业'是由表单本身完成的。