наследование¶
POS имеет два типа классов: модели, виджеты. Расширение этих классов немного отличается.
Примечание
Не у всех классов есть простой способ заставить их наследовать. Некоторые трюки доступны здесь <https://odoo-development.readthedocs.io/en/latest/dev/pos/gui.html>`__
модель¶
Классы моделей работают только с данными и не работают с пользовательским интерфейсом напрямую.
Чтобы расширить класс такого типа, вам нужно использовать метод `` extend``. Создает копию класса с переопределенным методом. Обычно вам нужно переопределить исходный класс обновленным. Также, чтобы вызвать оригинальный метод, поместите оригинальный класс в переменную.
Вот пример <https://github.com/it-projects-llc/pos-addons/blob/fb8b072/pos_debt_notebook/static/src/js/pos.js#L23-L33>`__:
odoo.define('pos_debt_notebook.pos', function (require) {
"use strict";
var models = require('point_of_sale.models');
// save original class
var _super_posmodel = models.PosModel.prototype;
// override original class with extended one
models.PosModel = models.PosModel.extend({
initialize: function (session, attributes) {
var self = this;
// some new code in this method
models.load_fields('product.product',['credit_product']);
// call original method via "apply"
_super_posmodel.initialize.apply(this, arguments);
},
})
Виджет¶
Классы виджетов работают с пользовательским интерфейсом.
Расширение виджета намного проще, чем расширение модели: просто используйте `` include`` и `` _super``.
Вот пример <https://github.com/it-projects-llc/pos-addons/blob/fb8b072/pos_debt_notebook/static/src/js/pos.js#L379-L385>`__:
odoo.define('pos_debt_notebook.pos', function (require) {
"use strict";
var screens = require('point_of_sale.screens');
// "include" updates original method
screens.PaymentScreenWidget.include({
init: function(parent, options) {
// call super in a easy way
this._super(parent, options);
// add some new code
this.pos.on('updateDebtHistory', function(partner_ids){
this.update_debt_history(partner_ids);
}, this);
},
})
})