Drupal Commerce订单总价无法保存:保存后调试返回空值
问题分析与解决方案
在Drupal Commerce中,订单的total_price是自动计算字段,默认会根据订单商品、税费、运费等重新计算,直接手动设置后保存会被覆盖,同时保存后需要重新加载订单才能获取最新数据,这是你遇到问题的核心原因。
核心问题点
- 错误使用了单价覆盖字段:代码中
overridden_unit_price是用于覆盖商品单价的,和订单总价无关,应该用overridden_total_price来标记总价需要手动覆盖。 - 保存后未重新加载订单:内存中的订单对象不会自动同步数据库数据,必须重新加载才能看到保存后的正确值。
修正后的代码
protected function createOrder($order_data) { $user = user_load_by_mail($order_data['Email']); if (!$user) { $user = User::create([ 'name' => $order_data['Customer'], 'mail' => $order_data['Email'], 'status' => 1, ]); $user->save(); } // 获取货币代码与金额 $splitAmount = $this->getCurrencyCode($order_data['Total']); // 创建订单,注意使用总价覆盖字段 $order = Order::create([ 'type' => 'default', 'state' => $order_data['Status'], 'uid' => $user->id(), 'order_number' => $order_data['ID'], 'mail' => $user->getEmail(), 'placed' => strtotime($order_data['Date']), 'overridden_total_price' => TRUE, // 替换原有的overridden_unit_price ]); // 设置总价并标记为手动覆盖 $amount = new Price($splitAmount['value'], $splitAmount['currency_code']); $order->set('total_price', $amount); // 也可以用更直观的专用方法:$order->setTotalPrice($amount); // 保存前调试 dd($order->get('total_price')->getValue()); $order->save(); // 必须重新加载订单,才能获取数据库中保存的最新数据 $order = Order::load($order->id()); // 保存后调试 dd($order->get('total_price')->getValue()); }
额外检查项
- 确认
getCurrencyCode返回的value是正确的数值格式(比如LBP的最小单位是否正确,1107000对应11070.00 LBP是否符合你的业务逻辑)。 - 检查订单类型(
default)的配置,确认total_price字段允许手动覆盖(通常默认是允许的,但如果有自定义配置需要验证)。
内容的提问来源于stack exchange,提问作者Anton971
相关产品推荐
相关产品推荐

