OpenCart2.x控制器数据提交及模板传参等技术问题咨询
嘿,我来帮你搞定这些OpenCart 2.x的开发问题,都是后台开发里很常见的场景,咱们一个个拆解:
先给你一个最基础的前后端配合示例,帮你理解数据怎么从模板传到控制器:
1. 前端模板(比如mproduct_form.tpl)的表单写法
不用JS的话,直接用原生HTML表单就行,关键是要指定正确的action路由和method="post",还要带上OpenCart后台必需的token:
<form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data"> <!-- 隐藏域带上token,防止CSRF攻击 --> <input type="hidden" name="token" value="<?php echo $token; ?>"> <!-- 示例输入框:产品名称 --> <div class="form-group"> <label for="product_name">产品名称</label> <input type="text" name="product_name" id="product_name" value="<?php echo isset($product_name) ? $product_name : ''; ?>" class="form-control"> </div> <!-- 示例输入框:产品价格 --> <div class="form-group"> <label for="product_price">产品价格</label> <input type="text" name="product_price" id="product_price" value="<?php echo isset($product_price) ? $product_price : ''; ?>" class="form-control"> </div> <!-- 提交按钮 --> <button type="submit" class="btn btn-primary">保存</button> </form>
这里的$action是控制器传递过来的路由地址,比如新增页面的$action指向保存方法,编辑页面还要带上待编辑的产品ID。
2. 控制器里接收数据的方法
在admin/controller/catalog/mproduct.php里,新增一个处理保存的方法:
public function save() { // 首先验证权限和token,防止非法请求 if (!$this->user->hasPermission('modify', 'catalog/mproduct')) { $this->response->redirect($this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')); } // 接收POST过来的数据 $product_name = $this->request->post['product_name']; $product_price = $this->request->post['product_price']; $product_id = isset($this->request->get['productid']) ? $this->request->get['productid'] : 0; // 加载对应的模型(需要先创建模型文件) $this->load->model('catalog/mproduct'); // 准备入库的数据数组 $data = array( 'name' => $product_name, 'price' => $product_price, // 其他字段根据你的数据库表结构添加 ); // 判断是新增还是编辑操作 if ($product_id) { // 编辑:更新数据库 $this->model_catalog_mproduct->updateMproduct($product_id, $data); } else { // 新增:插入数据库 $this->model_catalog_mproduct->addMproduct($data); } // 保存后跳转到列表页并提示成功 $this->session->data['success'] = '产品保存成功!'; $this->response->redirect($this->url->link('catalog/mproduct', 'token=' . $this->session->data['token'], 'SSL')); }
刚才的示例已经包含核心逻辑,再梳理下完整步骤:
- 新增控制器方法:上面的
save方法就是新增的,同时要确保在add和edit方法里给模板传递$action变量:
public function add() { $this->load->language('catalog/mproduct'); $this->document->setTitle($this->language->get('heading_title')); // 传递保存路由到模板 $data['action'] = $this->url->link('catalog/mproduct/save', 'token=' . $this->session->data['token'], 'SSL'); // 加载模板并输出 $this->response->setOutput($this->load->view('catalog/mproduct_form.tpl', $data)); } public function edit() { $this->load->language('catalog/mproduct'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('catalog/mproduct'); $product_id = $this->request->get['productid']; $product_info = $this->model_catalog_mproduct->getMproduct($product_id); // 编辑页面的路由要带上产品ID $data['action'] = $this->url->link('catalog/mproduct/save', 'token=' . $this->session->data['token'] . '&productid=' . $product_id, 'SSL'); // 传递产品数据用于回显 $data['product_name'] = $product_info['name']; $data['product_price'] = $product_info['price']; $this->response->setOutput($this->load->view('catalog/mproduct_form.tpl', $data)); }
- 完善模型层:在
admin/model/catalog/mproduct.php里新增数据库操作方法:
public function addMproduct($data) { $this->db->query("INSERT INTO " . DB_PREFIX . "mproduct SET name = '" . $this->db->escape($data['name']) . "', price = '" . (float)$data['price'] . "', date_added = NOW()"); return $this->db->getLastId(); } public function updateMproduct($product_id, $data) { $this->db->query("UPDATE " . DB_PREFIX . "mproduct SET name = '" . $this->db->escape($data['name']) . "', price = '" . (float)$data['price'] . "', date_modified = NOW() WHERE product_id = '" . (int)$product_id . "'"); } public function getMproduct($product_id) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "mproduct WHERE product_id = '" . (int)$product_id . "'"); return $query->row; }
注意要根据你自己的数据库表结构调整字段和表名。
这样点击保存按钮时,表单会直接通过原生POST请求提交到控制器的save方法,完全不需要JS/JQuery。
$("form[id*='...")代码的解释 1. 编辑URL的含义
你看到的编辑URL:http://www.example.com/admin/index.php?route=catalog/mproduct/edit&token=N3bmdZW8C&productid=67
route=catalog/mproduct/edit:指定要调用的控制器方法,也就是ControllerCatalogMproduct里的edit方法;token=N3bmdZW8C:OpenCart后台的安全验证令牌,防止CSRF攻击,每个登录用户的token唯一;productid=67:待编辑的产品ID,控制器通过$this->request->get['productid']获取这个值,然后从数据库加载对应产品数据。
2. $("form[id*='...")代码的含义
这是jQuery选择器的写法,比如完整写法可能是$("form[id*='mproduct_form']"),意思是:
$():jQuery的核心选择器函数,用来选中DOM元素;form[id*='xxx']:选中所有<form>标签中,id属性包含xxx字符串的元素。
比如你的表单在新增时id="mproduct_form",编辑时id="mproduct_form_67",这个选择器都能选中它。通常这个代码是用来给表单绑定AJAX提交、前端验证等JS操作的,但你如果不用JS/JQuery,完全不需要这段代码,原生表单提交就足够了。
内容的提问来源于stack exchange,提问作者Korosh Man1989

