文件上传的编辑操作

问题描述 投票:0回答:1

按照教程,我能够很好地创建文件上传,并且根据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。

php zend-framework2
1个回答
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 作业”由表单本身完成。

© www.soinside.com 2019 - 2024. All rights reserved.