PrestaShop hookDisplayAdminProductsExtra模块表单提交方法未执行排查
问题分析与解决方案
你的问题核心在于hookDisplayAdminProductsExtra的执行时机和表单提交逻辑的不匹配:该钩子是在商品管理页面渲染阶段触发的,而表单提交后,AdminProducts控制器会优先处理自身的默认提交逻辑,之后才会渲染页面触发钩子,导致你的提交判断代码错过了处理时机;同时表单未传递id_product参数,即使触发逻辑也无法定位到目标商品。
下面提供两种可行的解决方案:
方案一:整合到原商品表单(推荐)
利用原商品页面的提交按钮,将自定义字段嵌入原生表单,通过专门的保存钩子处理数据。
1. 修改hookDisplayAdminProductsExtra钩子(仅负责渲染字段)
public function hookDisplayAdminProductsExtra() { // 获取当前商品ID及已存储的额外信息 $id_product = (int)Tools::getValue('id_product'); $extraInfo = Db::getInstance()->getValue( 'SELECT produto_extra FROM ' . _DB_PREFIX_ . 'product WHERE id_product = ' . (int)$id_product ); // 将数据传递给模板 $this->context->smarty->assign([ 'extra_info' => $extraInfo, 'id_product' => $id_product ]); return $this->display(__FILE__, "views/templates/hook/displayAdminExtra.tpl"); }
2. 修改TPL模板(嵌入原生表单)
去掉独立表单,直接将字段加入页面原生的product_form表单中:
<div class="panel"> <div class="panel-heading"> <i class="icon-cogs"></i> 额外信息 </div> <div class="panel-body"> <div class="form-group"> <label for="extra">Extra Info</label> <input type="text" name="extra" id="extra" class="form-control" value="{$extra_info|escape:'html':'UTF-8'}" /> </div> </div> </div>
3. 添加保存处理钩子
注册actionAdminProductsUpdate钩子,在商品保存时同步处理自定义字段:
public function hookActionAdminProductsUpdate($params) { // 监听原生商品保存按钮的提交事件 if (Tools::isSubmit('submitAddproduct') || Tools::isSubmit('submitAddproductAndStay')) { $id_product = (int)$params['id_product']; $extraInfo = Tools::getValue('extra'); if ($id_product > 0) { // 使用PrestaShop内置方法执行更新,更安全兼容 Db::getInstance()->update( 'product', ['produto_extra' => pSQL($extraInfo)], ['id_product' => (int)$id_product] ); } } }
方案二:使用独立表单提交(适合单独保存场景)
如果需要保留独立的保存按钮,需修正表单参数并调整逻辑执行时机:
1. 修改TPL表单(传递商品ID)
<form action="{$link->getAdminLink('AdminProducts')|escape:'html':'UTF-8'}&id_product={$id_product}" method="post"> <label for="extra">Extra Info</label> <input type="text" name="extra" class="form-control" value="{$extra_info|escape:'html':'UTF-8'}" /> <button type="submit" name="submitextra">Save</button> <input type="hidden" name="id_product" value="{$id_product}" /> </form>
2. 调整钩子内的提交逻辑
在页面渲染前优先处理提交请求,完成后重定向避免重复提交:
public function hookDisplayAdminProductsExtra() { // 优先处理提交请求 if (Tools::isSubmit("submitextra")) { $id_product = (int)Tools::getValue('id_product'); $extraInfo = Tools::getValue('extra'); if ($id_product > 0) { Db::getInstance()->update( 'product', ['produto_extra' => pSQL($extraInfo)], ['id_product' => (int)$id_product] ); // 提交后重定向回商品编辑页 Tools::redirectAdmin($this->context->link->getAdminLink('AdminProducts') . '&id_product=' . $id_product . '&updateproduct'); } } // 渲染模板(获取并传递已有数据) $id_product = (int)Tools::getValue('id_product'); $extraInfo = Db::getInstance()->getValue( 'SELECT produto_extra FROM ' . _DB_PREFIX_ . 'product WHERE id_product = ' . (int)$id_product ); $this->context->smarty->assign([ 'extra_info' => $extraInfo, 'id_product' => $id_product ]); return $this->display(__FILE__, "views/templates/hook/displayAdminExtra.tpl"); }
额外注意事项
- 避免直接拼接SQL语句,优先使用PrestaShop提供的
update/insert方法,防止SQL注入并兼容版本迭代。 - 确保模块已正确注册所有用到的钩子(如
actionAdminProductsUpdate)。
内容的提问来源于stack exchange,提问作者rafawastaken
相关产品推荐
相关产品推荐

