PrestaShop模块:点击保存设置后实时更新VAT字段值
PrestaShop模块VAT字段无法实时显示的修复方案
问题根源分析
- 提交触发条件不匹配:
getContent()中监听的提交按钮是submitButton,但postProcess()里判断的是SubmitmoduloResumenIva,导致提交后实际未执行VAT计算与更新逻辑。 - 配置键名拼写错误:
renderForm()中读取日期配置时,键名缺少下划线($this->name . 'my_date_desde'应为$this->name . '_my_date_desde'),导致无法正确读取已保存的日期配置。 - 未同步当前请求的VAT值:计算完成的VAT值仅写入配置表,但当前页面渲染时优先读取
Tools::getValue('iva'),未设置该值则显示旧配置。 - 配置缓存未清除:PrestaShop会缓存配置值,更新后未清除缓存会导致页面读取旧数据。
修复步骤及代码修改
1. 修正postProcess()的提交判断逻辑
将postProcess()中的触发条件改为与getContent()一致的submitButton,同时添加实时值注入和缓存清除:
protected function postProcess() { // 修改触发条件为submitButton,匹配前端提交按钮 if (Tools::isSubmit('submitButton')) { if (Tools::getValue('my_date_desde')) { Configuration::updateValue($this->name . '_my_date_desde', Tools::getValue('my_date_desde')); } if (Tools::getValue('my_date_hasta')) { Configuration::updateValue($this->name . '_my_date_hasta', Tools::getValue('my_date_hasta')); } $fechaDesde = Configuration::get($this->name . '_my_date_desde', null) . " 00:00:00"; $fechaHasta = Configuration::get($this->name . '_my_date_hasta', null) . " 00:00:00"; $db = \Db::getInstance(); // 替换为参数绑定写法,避免SQL注入风险 $sql = "SELECT * FROM " . _DB_PREFIX_ . "orders WHERE date_add BETWEEN :fechaDesde AND :fechaHasta"; $result = $db->executeS($sql, array( ':fechaDesde' => $fechaDesde, ':fechaHasta' => $fechaHasta )); $ivaAcumulado = 0; foreach ($result as $row) { $ivaAcumulado += $row["total_paid_tax_incl"] - $row["total_paid_tax_excl"]; } Configuration::updateValue($this->name . '_iva', $ivaAcumulado); // 将计算后的VAT值注入当前请求,确保页面实时显示 Tools::setValue('iva', $ivaAcumulado); // 清除配置缓存,避免读取旧值 Configuration::clearCache(); } }
2. 修正renderForm()中的日期配置键名
修复日期配置读取时的下划线缺失问题,确保正确回显已保存的日期:
protected function renderForm() { $values = array(); $this->fields_form = array(); $this->context->controller->addJqueryUI('ui.datepicker'); $defaultDate = date('Y-m-d'); // 修正配置键名,添加下划线 if (!Configuration::get($this->name . '_my_date_desde')) { $values['my_date_desde'] = Tools::getValue('my_date_desde', $defaultDate); } else { $values['my_date_desde'] = Tools::getValue('my_date_desde', Configuration::get($this->name . '_my_date_desde')); } // 同样修正结束日期的键名 if (!Configuration::get($this->name . '_my_date_hasta')) { $values['my_date_hasta'] = Tools::getValue('my_date_hasta', $defaultDate); } else { $values['my_date_hasta'] = Tools::getValue('my_date_hasta', Configuration::get($this->name . '_my_date_hasta')); } $values['iva'] = Tools::getValue('iva', Configuration::get($this->name . '_iva')); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int) Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $helper->identifier = $this->identifier; $helper->submit_action = 'Submit' . $this->name; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) . '&configure=' . $this->name . '&tab_module=' . $this->tab . '&module_name=' . $this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $values, 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id, ); return $helper->generateForm(array($this->getConfigForm())); }
修复原理说明
- 修正提交触发条件后,点击“保存设置”能正确执行VAT计算与更新逻辑。
- 注入
Tools::setValue('iva', $ivaAcumulado)后,页面渲染时会直接读取最新计算的VAT值,无需等待配置缓存同步。 - 清除配置缓存确保后续读取的是最新保存的配置数据。
- 修正配置键名后,日期选择器能正确回显已保存的日期值。
内容的提问来源于stack exchange,提问作者raposo
相关产品推荐
相关产品推荐

