В Odoo кнопки внутри форм легко добавлять с помощью представлений XML-форм. Однако для добавления новой кнопки в область контроллера форм, где отображаются кнопки создания, редактирования и импорта, требуется расширение веб-клиента Odoo.
В Odoo это достигается путем расширения FormController с помощью JavaScript и QWeb. Теперь давайте посмотрим, как расширить FormController в Odoo 19.
Здесь я собираюсь добавить кнопку рядом с кнопкой "Создать" в представлении формы продукта.
Это стандартный вид формы на странице продукта.

Создайте файл templates в каталоге static/src/xml
Первым шагом является наследование web.FormView.Buttons, в котором определены кнопки просмотра формы. Здесь мы создаем кнопку с именем Create Order и добавляем для нее обработчик щелчка.
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="button_on_form_view.FormView.Buttons" t-inherit="web.FormView">
<xpath expr="//t[@t-set-slot='layout-buttons']" position="inside">
<button type="button" class="btn btn-primary"
t-on-click="OnFormClickOrder">
<span>Create Order</span>
</button>
</xpath>
</t>
</templates>
После этого следующим шагом будет создание файла JavaScript.
Создайте JS-файл в статическом каталоге/src/js.
/** @odoo-module */
import { FormController } from "@web/views/form/form_controller";
import { useService } from "@web/core/utils/hooks";
import { registry } from '@web/core/registry';
import { formView } from '@web/views/form/form_view';
export class ProductFormController extends FormController {
setup() {
super.setup();
this.actionService = useService("action");
}
OnFormClickOrder() {
this.actionService.doAction({
type: 'ir.actions.act_window',
res_model: 'sale.order',
name:'Sale Order',
view_mode: 'form',
view_type: 'form',
views: [[false, 'form']],
target: 'new',
res_id: false,
});
}
}
ProductFormController.template = "button_on_form_view.FormView.Buttons";
export const CustomProductFormController = {
...formView,
Controller: ProductFormController,
};
registry.category("views").add("button_in_form", CustomProductFormController);
Здесь ProductFormController расширяет стандартный FormController Odoo.В setup() он загружает службу действий, которая позволяет открывать формы и мастера. Метод OnFormClickOrder() вызывается при нажатии пользовательской кнопки. Это открывает новую форму заказа на продажу во всплывающем окне.
Строка ProductFormController.template = "button_on_form_view.FormView.Buttons";
связывает ваш JS-контроллер с вашим QWeb-шаблоном, содержащим новую кнопку.
Наконец, контроллер зарегистрирован как новый вид формы под названием "button_in_form", поэтому вы можете использовать его в формате XML.
Создайте файл view в каталоге view.
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">product.template.view.form.inherit.button.on.tree.view</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//form" position="attributes">
<attribute name="js_class">button_in_form</attribute>
</xpath>
</field>
</record>
</data>
</odoo>
Этот XML-файл наследует представление формы продукта и добавляет к нему пользовательский контроллер JavaScript.
Для этого вставляется:
<attribute name="js_class">button_in_form</attribute>
Вот вид формы товара после добавления новой кнопки.

Таким образом, мы можем расширить контроллер форм в Odoo и добавить пользовательские кнопки в соответствии с нашими функциональными потребностями. Создав пользовательский контроллер JavaScript, связав его с шаблоном QWeb и прикрепив его к нужному виду формы с помощью XML.