ThinkPHP调用odoo8.0Web服务

<?php
 
namespace Home\Controller;

use Think\Controller;
use Org\Ripcord\Ripcord;//https://code.google.com/p/ripcord/

class ApiController extends Controller {
    public $url;
    public $db;
    public $username;
    public $password;
    public $models;
    public $common;
    function __construct() {
        self::_initialize ();
    }
    function _initialize() {
        // $url = 'https://demo.odoo.com';
        // $db = 'test';
        // $username = "admin";
        // $password = "admin";
        
        // 从官方获取一个测试账号与数据库
        $info = Ripcord::client ( 'https://demo.odoo.com/start' )->start ();
        list ( $this->url, $this->db, $this->username, $this->password ) = array (
                $info ['host'],
                $info ['database'],
                $info ['user'],
                $info ['password'] 
        );
        
        $this->common = Ripcord::client ( "$this->url/xmlrpc/2/common" );
        
        // Logging in
        $uid = $this->common->authenticate ( $this->db, $this->username, $this->password, array () );
        
        define ( UID, $uid );
        
        $this->models = Ripcord::client ( "$this->url/xmlrpc/2/object" );
    }
    
    /**
     * 获取版本
     */
    public function version() {
        $data = $common->version ();
        dump ( $common );
        dump ( $data );
    }
    /**
     * 检测权限
     */
    public function check_access_rights() {
        // 检测对象是否有权限
        $data = self::execute_kw ( 'res.partner', 'check_access_rights', array (
                'read' 
        ), array (
                'raise_exception' => false 
        ) );
        
        dump ( $data );
    }
    public function search() {
        // List records
        $data = self::execute_kw ( 'res.partner', 'search', array (
                array (
                        array (
                                'is_company',
                                '=',
                                true 
                        ),
                        array (
                                'customer',
                                '=',
                                true 
                        ) 
                ) 
        ) );
        dump ( $data );
    }
    public function search_page() {
        // Pagination
        $data = self::execute_kw ( 'res.partner', 'search', array (
                array (
                        array (
                                'is_company',
                                '=',
                                true 
                        ),
                        array (
                                'customer',
                                '=',
                                true 
                        ) 
                ) 
        ), array (
                'offset' => 10,
                'limit' => 5 
        ) );
        dump ( $data );
    }
    public function search_count() {
        // Count records
        $data = self::execute_kw ( 'res.partner', 'search_count', array (
                array (
                        array (
                                'is_company',
                                '=',
                                true 
                        ),
                        array (
                                'customer',
                                '=',
                                true 
                        ) 
                ) 
        ) );
        dump ( $data );
    }
    public function read_records() {
        // Read records
        $ids = self::execute_kw ( 'res.partner', 'search', array (
                array (
                        array (
                                'is_company',
                                '=',
                                true 
                        ),
                        array (
                                'customer',
                                '=',
                                true 
                        ) 
                ) 
        ), array (
                'limit' => 1 
        ) );
        $records = self::execute_kw ( 'res.partner', 'read', array (
                $ids 
        ) );
        // count the number of fields fetched by default
        $data = count ( $records [0] );
        
        dump ( $data );
    }
    public function read_field() {
        // 只显示需要的字段
        $data = self::execute_kw ( 'res.partner', 'read', array (
                $ids 
        ), array (
                'fields' => array (
                        'name',
                        'country_id',
                        'comment' 
                ) 
        ) );
        dump ( $data );
    }
    public function record_attr() {
        // Listing record fields
        $data = self::execute_kw ( 'res.partner', 'fields_get', array (), array (
                'attributes' => array (
                        'string',
                        'help',
                        'type' 
                ) 
        ) );
        dump ( $data );
    }
    public function search_read() {
        
        // Search and read
        $data = self::execute_kw ( 'res.partner', 'search_read', array (
                array (
                        array (
                                'is_company',
                                '=',
                                true 
                        ),
                        array (
                                'customer',
                                '=',
                                true 
                        ) 
                ) 
        ), array (
                'fields' => array (
                        'name',
                        'country_id',
                        'comment' 
                ),
                'limit' => 5 
        ) );
        dump ( $data );
    }
    public function create() {
        // Create records
        $id = self::execute_kw ( 'res.partner', 'create', array (
                array (
                        'name' => "New Partner" 
                ) 
        ) );
        dump ( $id );
    }
    /**
     * 更新记录
     * 
     * @param unknown $id           
     */
    public function update($id) {
        // Update records
        self::execute_kw ( 'res.partner', 'write', array (
                array (
                        $id 
                ),
                array (
                        'name' => "Newer partner" 
                ) 
        ) );
    }
    public function name_get($id) {
        // get record name after having changed it
        $data = self::execute_kw ( 'res.partner', 'name_get', array (
                array (
                        $id 
                ) 
        ) );
        
        dump ( $data );
    }
    public function delete($id) {
        // Delete records
        self::execute_kw ( 'res.partner', 'unlink', array (
                array (
                        $id 
                ) 
        ) );
        // check if the deleted record is still in the database
        $data = self::execute_kw ( 'res.partner', 'search', array (
                array (
                        array (
                                'id',
                                '=',
                                $id 
                        ) 
                ) 
        ) );
        
        dump ( $data );
    }
    /**
     * Available reports can be listed by searching the ir.actions.report.xml model, fields of interest being
     * model
     * the model on which the report applies, can be used to look for available reports on a specific model
     * name
     * human-readable report name
     * report_name
     * the technical name of the report, used to print it
     * Reports can be printed over RPC with the following information:
     * the name of the report (report_name)
     * the ids of the records to include in the report
     */
    public function report() {
        header ( "Pragma: public" ); // required
        header ( "Expires: 0" );
        header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
        header ( "Cache-Control: private", false ); // required for certain browsers
        header ( "Content-Type: application/pdf" );
        // header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
        header ( "Content-Transfer-Encoding: binary" );
        // header("Content-Length: ".$fsize);
        // Report printing
        $invoice_ids = self::execute_kw ( 'account.invoice', 'search', array (
                array (
                        array (
                                'type',
                                '=',
                                'out_invoice' 
                        ),
                        array (
                                'state',
                                '=',
                                'open' 
                        ) 
                ) 
        ) );
        $report = ripcord::client ( "$this->url/xmlrpc/2/report" );
        $result = $report->render_report ( $this->db, UID, $this->password, 'account.report_invoice', $invoice_ids );
        $report_data = base64_decode ( $result ['result'] );
        
        echo $report_data;
    }
    
    /**
     * While we previously used fields_get() to query a model’s and have been using an arbitrary model from the start, Odoo stores most model metadata inside a few meta-models which allow both querying the system and altering models and fields (with some limitations) on the fly over XML-RPC.
     * ir.model
     *
     * Provides informations about Odoo models themselves via its various fields
     * name
     * a human-readable description of the model
     * model
     * the name of each model in the system
     * state
     * whether the model was generated in Python code (base) or by creating an ir.model record (manual)
     * field_id
     * list of the model’s fields through a One2many to ir.model.fields
     * view_ids
     * One2many to the Views defined for the model
     * access_ids
     * One2many relation to the Access Control set on the model
     * ir.model can be used to
     * query the system for installed models (as a precondition to operations on the model or to explore the system’s content)
     * get information about a specific model (generally by listing the fields associated with it)
     * create new models dynamically over RPC
     * Warning
     * “custom” model names must start with x_
     * the state must be provided and manual, otherwise the model will not be loaded
     * it is not possible to add new methods to a custom model, only fields
     */
    public function inspection() {
        // Inspection and introspection
        self::execute_kw ( 'ir.model', 'create', array (
                array (
                        'name' => "Custom Model",
                        'model' => 'x_custom_model',
                        'state' => 'manual' 
                ) 
        ) );
        $data = self::execute_kw ( 'x_custom_model', 'fields_get', array (), array (
                'attributes' => array (
                        'string',
                        'help',
                        'type' 
                ) 
        ) );
        dump ( $data );
    }
    /**
     * ir.model.fields
     *
     * Provides informations about the fields of Odoo models and allows adding custom fields without using Python code
     * model_id
     * Many2one to ir.model to which the field belongs
     * name
     * the field’s technical name (used in read or write)
     * field_description
     * the field’s user-readable label (e.g. string in fields_get)
     * ttype
     * the type of field to create
     * state
     * whether the field was created via Python code (base) or via ir.model.fields (manual)
     * required, readonly, translate
     * enables the corresponding flag on the field
     * groups
     * field-level access control, a Many2many to res.groups
     * selection, size, on_delete, relation, relation_field, domain
     * type-specific properties and customizations, see the fields documentation for details
     * Like custom models, only new fields created with state="manual" are activated as actual fields on the model.
     * computed fields can not be added via ir.model.fields, some field meta-information (defaults, onchange) can not be set either
     */
    public function custom_model() {
        //
        $id = self::execute_kw ( 'ir.model', 'create', array (
                array (
                        'name' => "Custom Model",
                        'model' => 'x_custom',
                        'state' => 'manual' 
                ) 
        ) );
        self::execute_kw ( 'ir.model.fields', 'create', array (
                array (
                        'model_id' => $id,
                        'name' => 'x_name',
                        'ttype' => 'char',
                        'state' => 'manual',
                        'required' => true 
                ) 
        ) );
        $record_id = self::execute_kw ( 'x_custom', 'create', array (
                array (
                        'x_name' => "test record" 
                ) 
        ) );
        $data = self::execute_kw ( 'x_custom', 'read', array (
                array (
                        $record_id 
                ) 
        ) );
        dump ( $data );
    }
    /**
     * Workflows can be moved along by sending them signals.
     * Instead of using the top-level execute_kw,
     * signals are sent using exec_workflow.Signals are sent to a specific record,
     * and possibly trigger a transition on the workflow instance associated with the record.
     */
    public function workflow() {
        // Workflow manipulations
        $client = self::execute_kw ( 'res.partner', 'search_read', array (
                array (
                        array (
                                'customer',
                                '=',
                                true 
                        ) 
                ) 
        ), array (
                'limit' => 1,
                'fields' => array (
                        'property_account_receivable',
                        'property_payment_term',
                        'property_account_position' 
                ) 
        ) )[0];
        $invoice_id = self::execute_kw ( 'account.invoice', 'create', array (
                array (
                        'partner_id' => $client ['id'],
                        'account_id' => $client ['property_account_receivable'] [0],
                        'invoice_line' => array (
                                array (
                                        0,
                                        false,
                                        array (
                                                'name' => "AAA" 
                                        ) 
                                ) 
                        ) 
                ) 
        ) );
        
        $this->models->exec_workflow ( $this->db, $this->uid, $this->password, 'account.invoice', 'invoice_open', $invoice_id );
    }
    public function index() {
        dump ( $this );
    }
    public function execute_kw($objName, $cmd, $args) {
        $data = $this->models->execute_kw ( $this->db, UID, $this->password, $objName, $cmd, $args );
        return $data;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容