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

PrestaShop 1.7.6多语言分类字段更新失效问题求助

PrestaShop分类附加字段英文语言更新无效问题排查

自定义模块用于处理分类附加字段,默认语言的数据获取与更新功能正常,但英文(id_lang=2)的字段更新无效。hookCategoryAddition方法中前两行默认语言更新正常,后两行英文语言更新无效果,以下是具体排查和修复方案:


1. 核心问题:SQL更新语句语法错误

看hookCategoryAddition中的后两行更新代码:

Db::getInstance()->update('category_lang', array('top_h1_desc' => pSQL(Tools::getValue('top_h1_desc_en'))), 'id_category = ' . $params['category']->id.' id_lang = 2');
Db::getInstance()->update('category_lang', array('top_p_desc' => pSQL(Tools::getValue('top_p_desc_en'))), 'id_category = ' . $params['category']->id.' id_lang = 2');

这里的WHERE条件部分缺少逻辑运算符AND,导致SQL语法错误,数据库无法识别条件,自然不会执行更新。同时未对整数参数做强转,存在SQL注入风险。

修复后的代码:

public function hookCategoryAddition($params)
{
    // 默认语言更新
    Db::getInstance()->update(
        'category_lang',
        array('top_h1_desc' => pSQL(Tools::getValue('top_h1_desc'))),
        'id_category = '.(int)$params['category']->id.' AND id_lang = '.(int)$this->context->language->id
    );
    Db::getInstance()->update(
        'category_lang',
        array('top_p_desc' => pSQL(Tools::getValue('top_p_desc'))),
        'id_category = '.(int)$params['category']->id.' AND id_lang = '.(int)$this->context->language->id
    );
    
    // 英文语言更新
    Db::getInstance()->update(
        'category_lang',
        array('top_h1_desc' => pSQL(Tools::getValue('top_h1_desc_en'))),
        'id_category = '.(int)$params['category']->id.' AND id_lang = 2'
    );
    Db::getInstance()->update(
        'category_lang',
        array('top_p_desc' => pSQL(Tools::getValue('top_p_desc_en'))),
        'id_category = '.(int)$params['category']->id.' AND id_lang = 2'
    );
}

2. 潜在问题:ALTER TABLE方法逻辑错误

注释掉的alterTable方法中,两个ALTER语句被覆盖,只会执行最后一条:

if($method == 'add')
    $sql = 'ALTER TABLE ' . _DB_PREFIX_ . 'category_lang ADD `top_h1_desc` VARCHAR (512) NOT NULL';
    $sql = 'ALTER TABLE ' . _DB_PREFIX_ . 'category_lang ADD `top_p_desc` TEXT NOT NULL';

因为没有用大括号包裹if块,第二个$sql赋值会覆盖第一个,导致只有top_p_desc字段被添加,top_h1_desc不会被创建(新安装模块时会出问题)。

修复后的代码:

public function alterTable($method = 'add')
{
    $sqls = [];
    if($method == 'add') {
        $sqls[] = 'ALTER TABLE ' . _DB_PREFIX_ . 'category_lang ADD `top_h1_desc` VARCHAR(512) NOT NULL';
        $sqls[] = 'ALTER TABLE ' . _DB_PREFIX_ . 'category_lang ADD `top_p_desc` TEXT NOT NULL';
    } else {
        $sqls[] = 'ALTER TABLE ' . _DB_PREFIX_ . 'category_lang DROP COLUMN `top_h1_desc`';
        $sqls[] = 'ALTER TABLE ' . _DB_PREFIX_ . 'category_lang DROP COLUMN `top_p_desc`';
    }

    foreach ($sqls as $sql) {
        if(!Db::getInstance()->Execute($sql))
            return false;
    }
    return true;
}

3. 优化:数据查询方法指定语言ID

当前top_h1_desc和top_p_desc方法未指定语言ID,会返回category_lang表中该分类的第一条记录,可能不是当前默认语言的数据。应该加上当前语言的条件:

public function top_h1_desc($id_category)
{
    return Db::getInstance()->getValue('SELECT top_h1_desc FROM '._DB_PREFIX_.'category_lang WHERE id_category = '.(int)$id_category.' AND id_lang = '.(int)$this->context->language->id);
}

public function top_p_desc($id_category)
{
    return Db::getInstance()->getValue('SELECT top_p_desc FROM '._DB_PREFIX_.'category_lang WHERE id_category = '.(int)$id_category.' AND id_lang = '.(int)$this->context->language->id);
}

可选优化:使用PrestaShop安全条件传递方式

可以用数组传递WHERE条件,避免手动拼接SQL的错误:

// 英文语言更新示例
Db::getInstance()->update(
    'category_lang',
    array('top_h1_desc' => pSQL(Tools::getValue('top_h1_desc_en'))),
    array(
        'id_category' => (int)$params['category']->id,
        'id_lang' => 2
    )
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:03