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

Odoo12与Drupal集成调用报表时触发NameError错误求助

解决Drupal调用Odoo12报表时的NameError: Method not available report问题

从你提供的错误栈和代码来看,问题的核心很明确:你的Drupal应用通过XML-RPC调用Odoo时,找错了服务端点和方法名,导致Odoo返回"Method not available report"错误。下面一步步帮你解决:

错误原因分析

Odoo12的XML-RPC服务分为不同的专用端点,比如model(处理数据模型增删改查)、report(专门处理报表生成)等。你的错误栈显示,请求被路由到了Odoo的model服务,但model服务里根本没有名为report的方法——报表生成必须走专门的report服务端点。

具体修复步骤

1. 修正Odoo XML-RPC报表调用的服务端点和方法名

Odoo12中通过XML-RPC生成PDF报表的正确方式是调用report服务的render方法,而不是在model服务里找不存在的report方法。

假设你的Jsg\Odoo\Odoo类中的getReport方法是封装了XML-RPC调用,你需要修改它的实现,确保连接到Odoo的/xmlrpc/2/report端点,并调用render方法:

public function getReport($reportExternalId, array $recordIds, $format = 'qweb-pdf') {
    // 连接到Odoo的report服务专用端点
    $xmlRpcClient = new \Zend\XmlRpc\Client($this->odooUrl . '/xmlrpc/2/report');
    
    // 复用你已有的HTTP客户端配置(比如认证、超时等)
    if ($this->httpClient) {
        $xmlRpcClient->setHttpClient($this->httpClient);
    }
    
    // 调用render方法,参数顺序:数据库名、用户ID、密码、报表外部ID、记录ID数组、格式
    return $xmlRpcClient->call(
        'render',
        [
            $this->dbName,
            $this->userId,
            $this->password,
            $reportExternalId,
            $recordIds,
            $format
        ]
    );
}

2. 修正Drupal表单中的调用参数

你的代码里传递的是单个记录ID$id_don,但Odoo的render方法要求传入记录ID数组。修改submitForm中的调用:

public function submitForm(array &$form, FormStateInterface $form_state) {
    global $id_don;
    global $client;
    
    $id_don = (int) $form_state->getValues()['id_don'];
    // 传递记录ID数组,而不是单个ID
    $report_data = $client->getReport('crm_solthis.report_recufiscal', [$id_don], 'qweb-pdf');
    
    // 注意:先设置所有HTTP头,再输出PDF内容(echo后无法再修改头信息)
    header('Content-Type: application/pdf');
    header("Content-Disposition: attachment; filename=RecuFiscal.pdf");
    echo $report_data;
    exit(); // 用exit替代die,更符合PHP编码规范
}

3. 检查Odoo端的必要配置

除了代码修改,还要确认Odoo侧的几个关键点:

  • 报表crm_solthis.report_recufiscal的外部ID是否正确,且该报表已在Odoo中激活
  • 用于XML-RPC调用的Odoo用户,是否拥有该报表的访问权限(以及对应记录的查看权限)
  • $id_don对应的Odoo记录是否存在,且属于报表关联的模型(比如crm.alima.don)

额外注意事项

你原来的代码中,在echo $report_data之后还设置了Content-Type: text/css和下载头,这会触发PHP警告——因为输出内容后无法再修改HTTP头,所以一定要把所有header设置放在echo之前。

内容的提问来源于stack exchange,提问作者ndeyashu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:42:57