Блог

Как добавить новую кнопку рядом с "Создать" в Odoo 19

post-title

В 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.