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
相关产品推荐
相关产品推荐

