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
相关产品推荐
相关产品推荐

