关注tutorial,我能够很好地创建文件上传,并且根据教程,editAction与添加操作几乎相同。
如果我不在editAction中添加文件上传代码,它可以正常工作,但添加文件上传后,在exchangearray()中显示错误
不能在第20行的\ module \ report \ src \ report \ Model \ CompanyReport.php中使用\ Model \ CompanyReport类型的对象作为数组
这是模型文件
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 :(得分: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 job'由表单本身完成。