按照教程,我能够很好地创建文件上传,并且根据zend教程,editAction几乎与Add操作相同。
如果我不在editAction中添加文件上传代码,它工作正常,但添加文件上传后,在exchangearray()中显示错误
无法将 \Model\CompanyReport 类型的对象用作 \module 中的数组 电子导出\src eport\Model\CompanyReport.php 第 20 行
这是模型文件
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。
我认为这不是文件上传代码的问题。您已将实体绑定到表单:
$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 作业”由表单本身完成。