MODX Revolution Minishop2:修改msOnBeforeAddToCart事件监听逻辑
关于修改msOnBeforeAddToCart事件逻辑的问题
我需要修改商品添加至购物车时的逻辑,已在mscarthandler.class.php中找到触发msOnBeforeAddToCart事件的代码:
$response = $this->ms2->invokeEvent('msOnBeforeAddToCart', [ 'product' => $product, 'count' => $count, 'options' => $options, 'cart' => $this, ]); if (!($response['success'])) { return $this->error($response['message']); }
当前逻辑是仓库库存为0时触发错误,我希望将商品额外字段记录的另一个仓库库存也纳入判断逻辑。
另外我在core/cache/context_setting/{mgr, web}/conext.cache.php中发现一段相关代码片段:
28 => array ( 'id' => '28', 'source' => '1', 'property_preprocess' => '0', 'name' => 'order', 'description' => '', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => 'switch($modx->event->name) { case \'msOnBeforeAddToCart\': if($product->get(\'in_stock\') <= 0) { $modx->event->output(\'Товар отсутствует на складе, заказ в данный момент недоступен\'); } break; }', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ),
但不清楚msOnBeforeAddToCart事件处理程序的具体定义位置,请问在哪里可以找到该事件的定义,以及如何修改它?
解答
1. 事件处理程序的实际位置
你找到的context.cache.php只是系统生成的缓存文件,不是代码的实际定义位置。这段逻辑属于MODX插件,可以通过两种方式找到:
- 后台管理界面查找:登录MODX后台,进入「系统 > 插件」页面,在列表中搜索名称为
order(对应代码里的'name' => 'order')的插件,或直接筛选关联了msOnBeforeAddToCart事件的插件,打开后就能看到缓存文件里的那段处理代码。 - 数据库直接查看:找到MODX的
modx_site_plugins表,查询name字段为order的记录,plugincode字段就是事件处理的核心代码。
2. 修改逻辑的操作步骤
找到对应插件后,修改msOnBeforeAddToCart分支的判断逻辑,把额外库存字段(假设字段名为other_stock,请替换为你的实际字段名)加入判断:
switch($modx->event->name) { case 'msOnBeforeAddToCart': // 获取两个仓库的库存值 $mainStock = $product->get('in_stock'); $otherStock = $product->get('other_stock'); // 仅当两个仓库库存都为0时,触发无法下单的提示 if($mainStock <= 0 && $otherStock <= 0) { $modx->event->output('商品所有仓库均无库存,暂时无法下单'); } break; }
修改完成后保存插件,再进入后台「系统 > 清除缓存」刷新系统缓存,新的判断逻辑就会生效。
注意事项
- 不要直接修改缓存文件,系统会自动刷新缓存,修改内容会丢失;
- 确认额外库存字段名与商品表中实际字段一致;
- 修改后必须清除缓存,确保新代码被加载执行。
内容的提问来源于stack exchange,提问作者конструктор
相关产品推荐
相关产品推荐

