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

Drupal Commerce订单总价无法保存:保存后调试返回空值

问题分析与解决方案

在Drupal Commerce中,订单的total_price是自动计算字段,默认会根据订单商品、税费、运费等重新计算,直接手动设置后保存会被覆盖,同时保存后需要重新加载订单才能获取最新数据,这是你遇到问题的核心原因。

核心问题点

  1. 错误使用了单价覆盖字段:代码中overridden_unit_price是用于覆盖商品单价的,和订单总价无关,应该用overridden_total_price来标记总价需要手动覆盖。
  2. 保存后未重新加载订单:内存中的订单对象不会自动同步数据库数据,必须重新加载才能看到保存后的正确值。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:23:11