obuchmann / odoo-jsonrpc
PHP Odoo Json-RPC 连接器,为 Laravel 集成做准备
v1.5.0
2024-02-12 15:16 UTC
Requires
- php: ^8.0
- guzzlehttp/guzzle: ^7.2
Requires (Dev)
- phpunit/phpunit: ^9.5
README
通过 json-rpc api 连接到 Odoo。如果你在一个 Laravel 项目中,这个包会注册一个提供者。但这个包并不需要 Laravel。
安装
你可以通过 composer 安装这个包
composer require obuchmann/odoo-jsonrpc
如果你在一个 Laravel 项目中,服务提供者会自动注册自己。
你可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Obuchmann\OdooJsonRpc\OdooServiceProvider" --tag="config"
用法
基本用法
use Obuchmann\OdooJsonRpc\Odoo; use Obuchmann\OdooJsonRpc\Odoo\Request\Arguments\Domain; $this->host = 'https://:8069'; $this->username = 'admin'; $this->password = 'password'; $this->database = 'odoo'; // Connect to Odoo $odoo = new Odoo(new Odoo\Config($database, $host, $username, $password)); $odoo->connect(); // Check Access rights (bool) $check = $odoo->checkAccessRights('res.partner', 'read'); // Check Access rights in model syntax $check = $odoo->model('res.partner') ->can('read'); // Use Domain for Search $isCompanyDomain = (new Domain())->where('is_company', '=', true); $companyIds = $odoo->search('res.partner', $isCompanyDomain); // read ids $companies = $odoo->read('res.partner', $companyIds); // search_read with model Syntax $companies = $odoo->model('res.partner') ->where('is_company', '=', true) ->get(); // search_read with single item $company = $odoo->model('res.partner') ->where('is_company', '=', true) ->where('name', '=', 'My Company') ->first(); // create with model syntax $partner = $odoo->model('res.partner') ->create([ 'name' => 'My Company', 'is_company' => true ]); // update with model syntax $partner = $odoo->model('res.partner') ->where('name', '=', 'My Company') ->update([ 'name' => 'My New Company' ]); // direct update by id $myCompanyId = 1; $partner = $odoo->updateById('res.partner', $myCompanyId, [ 'name' => 'My New Company' ]); // delete by id $odoo->deleteById('res.partner', $myCompanyId);
Laravel 用法
class Controller{ public function index(\Obuchmann\OdooJsonRpc\Odoo $odoo){ // Find Model by Id $product = $odoo->find('product.template', 1); // Update Model by ID $this->odoo->updateById('product.product', $product->id, [ 'name' => $name, ]); // Create returning ID $id = $this->odoo ->create('res.partner', [ 'name' => 'Bobby Brown' ]); // Search for Models with or $partners = $this->odoo->model('res.partner') ->where('name', '=', 'Bobby Brown') ->orWhere('name', '=', 'Gregor Green') ->limit(5) ->orderBy('id', 'desc') ->get(); // Update by Query $updateResponse = $this->odoo ->model('res.partner') ->where('name', '=', 'Bobby Brown') ->update([ 'name' => 'Dagobert Duck' ]); } }
Laravel 模型
Laravel 模型使用属性实现
#[Model('res.partner')] class Partner extends OdooModel { #[Field] public string $name; #[Field('email')] public ?string $email; } class Controller{ public function index(){ // Find Model by Id $partner = Partner::find(1); // Search Model $partner = Partner::query() ->where('name', '=', 'Azure Interior') ->first(); // Update Model $partner->name = "Dagobert Duck"; $partner->save(); // Create returning ID $partner = new Partner(); $partner->name = 'Tester'; $partner->save(); } }
转换
你可以为你的模型定义一个转换。如果你想要将 Odoo 字段转换为特定类型,这很有用。有一些预定义的转换用于日期和日期时间字段。
转换是全局的,可以在 Odoo 类中注册。
// The basic datetime cast \Obuchmann\OdooJsonRpc\Odoo::registerCast(new Odoo\Casts\DateTimeCast()); // a datetime cast that respects the timezone \Obuchmann\OdooJsonRpc\Odoo::registerCast(new Odoo\Casts\DateTimeCast('Europe/Berlin')); // you can write custom casts by extending the Obuchmann\OdooJsonRpc\Odoo\Casts\Cast class // example DateTimeCast class DateTimeCast extends Cast { public function getType(): string { return \DateTime::class; } public function cast($raw) { if($raw){ try { return new \DateTime($raw); } catch (\Exception) {} // If no valid Date return null } return null; } public function uncast($value) { if($value instanceof \DateTime){ return $value->format('Y-m-d H:i:s'); } } }
更多示例请查看测试目录。
测试
composer test