You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter 4删除文件后如何停留在file_display页面而非返回表单页

问题描述

在CodeIgniter 4项目中,我通过check方法处理Job No表单验证,验证通过后直接返回file_display视图展示对应Job的文件列表。但点击列表中的remove按钮执行remove方法删除文件后,用redirect()->back()或current_url()会跳回需要重新输入Job No的表单页,我需要实现删除后停留在file_display页面。

相关代码如下:

check方法代码

public function check()
{   
    $data = [
                'pageTitle' => 'Documents Check',
                'action' => 'check',
                'validation' => NULL,
    ];
    
    if($this->request->getMethod() == 'post'){

        $validation = $this->validate([
            'jobNo' => [
                        'rules' => 'required|numeric|exact_length[6]|is_not_unique[docs.Job_no]',
                        'errors' => [
                               'required' => 'Job No. required.',
                               'exact_length' => 'Job No. should be exactly 6 digits.',
                               'numeric' => 'Job No. should be numbers only.',
                               'is_not_unique' => 'No files available for entered Job No.',
                           ]    
                      ],
        ]);
        if($validation){
            $jobNo = $this->request->getVar('jobNo',FILTER_SANITIZE_STRING);
            $data['docs'] = $this->docsModel->getDocsByJob($jobNo);
            return view('documents/files_display',$data);
        }
        else{
            $data['validation'] = $this->validator; 
        }  
        
    }

   return view('documents/files_view',$data);
}

file_display视图结构

idJob NoDocumentaction
123233invoice.pdfremove
223233deliver.pdfremove

remove方法代码

public function remove($id){        
    if($this->docsModel->delete($id);){ // 注意这里多了个多余的分号
            return redirect()->back()->with('success','file removed from the Job record');
        }
} 
问题根因

当前check方法验证通过后是直接返回视图,不是重定向,导致浏览器地址栏仍停留在check的URL。删除文件后用redirect()->back(),浏览器会回到表单提交前的页面(也就是输入Job No的表单页),而非文件展示页面。

解决方案

1. 新增独立的文件展示方法

在控制器里加一个专门的file_display方法,负责接收Job No并渲染文件列表:

public function file_display($jobNo)
{
    // 可选:二次验证Job No合法性,防止非法访问
    if (!preg_match('/^\d{6}$/', $jobNo) || !$this->docsModel->jobExists($jobNo)) {
        return redirect()->to('check')->with('error', '无效的Job编号');
    }

    $data = [
        'pageTitle' => '文件列表',
        'docs' => $this->docsModel->getDocsByJob($jobNo),
        'jobNo' => $jobNo // 把Job No传到视图,后续可用
    ];
    return view('documents/files_display', $data);
}

需要在docsModel里新增验证Job是否存在的方法:

public function jobExists($jobNo)
{
    return $this->where('Job_no', $jobNo)->countAllResults() > 0;
}

2. 修改check方法,验证通过后重定向到file_display

把原check方法里验证通过后的逻辑改成重定向:

if($validation){
    $jobNo = $this->request->getVar('jobNo',FILTER_SANITIZE_STRING);
    // 重定向到专门的文件展示页面,带Job No参数
    return redirect()->to("file_display/{$jobNo}");
}

3. 修改remove方法,删除后重定向回对应Job的文件展示页

删除文件前先获取该文件对应的Job No,再重定向到对应页面:

public function remove($id){        
    // 先获取当前文件的Job No
    $doc = $this->docsModel->find($id);
    if (!$doc) {
        return redirect()->back()->with('error', '文件不存在');
    }
    
    // 修正原代码多余的分号
    if($this->docsModel->delete($id)){
        // 重定向到该Job的文件展示页面
        return redirect()->to("file_display/{$doc['Job_no']}")->with('success','文件已从Job记录中移除');
    } else {
        return redirect()->back()->with('error','删除文件失败');
    }
}

4. 调整file_display视图的remove按钮

确保按钮链接正确传递文件ID:

<td><a href="<?= site_url('controller/remove/' . $doc['id']) ?>" onclick="return confirm('确定要删除该文件吗?')">remove</a></td>

做完这些修改后,删除文件就会直接回到对应Job的文件展示页面,不会跳回表单页了。

内容的提问来源于stack exchange,提问作者Krishna Panthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:15:41