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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:05:24