Odoo JavaScript隐藏Form表单的创建、编辑按钮

odoo.define('invisible_form_button', function (require) {
    "use strict";
    const FormController = require('web.FormController');
    FormController.include({
        updateButtons: function () {
            this._super.apply(this, arguments)
            var self = this;
            var attrs = this.renderer.arch.attrs;
            var arrs = ['edit', 'create']
            _.each(arrs, function (arr) {
                var value = attrs['invisible_' + arr];
                if (value) {
                    var result = self._evalExpression(value)
                    if (!result) {
                        self.$buttons.find('.o_form_button_' + arr).show()
                    } else {
                        self.$buttons.find('.o_form_button_' + arr).hide()
                    }
                }
            })
        },
        /*下面的函数取自Odoo12一个隐藏form的插件方法, 暂时没研究(可到OCA自行查找)*/
        _evalExpression: function (value) {
            var tokens = py.tokenize(value);
            var tree = py.parse(tokens);
            // 去除context后的数据
            var evalContent = this.renderer.state.evalContext
            // tree(name, expression, value) evaluate
            var evaluate_result = py.evaluate(tree, evalContent)
            // 返回是否满足写的条件
            return py.PY_isTrue(evaluate_result);
        }
    })
})
Odoo中设计复杂表单时,通常需要结合多个视图元素、字段类型、以及与业务逻辑相关的动作。OdooForm视图提供了丰富的配置选项,可以实现复杂的用户界面和交互体验。以下是一些实现复杂表单设计的技术和最佳实践。 ### 使用分组和标签组织表单结构 通过合理使用`<group>`和`<label>`标签,可以将表单划分为多个逻辑区域,提升可读性和用户体验。例如: ```xml <group> <group string="Personal Information"> <field name="name"/> <field name="email"/> </group> <group string="Professional Details"> <field name="job_title"/> <field name="department_id"/> </group> </group> ``` 这种结构可以将表单内容按类别划分,便于用户理解和填写。 ### 动态字段控制与条件显示 利用`attrs`属性可以实现字段的动态显示和禁用状态控制。例如,根据某个字段的值来决定另一个字段是否可见: ```xml <field name="is_company" /> <field name="company_type" attrs="{'invisible': [('is_company', '=', False)]}" /> ``` 这种方式可以避免表单过于臃肿,提升用户操作的流畅性。 ### 嵌套表单与One2many字段 对于需要处理多个子记录的场景,使用`One2many`字段结合`<tree>`或`<form>`嵌套视图是非常有效的。例如: ```xml <field name="line_ids"> <tree editable="bottom"> <field name="product_id"/> <field name="quantity"/> <field name="price"/> </tree> </field> ``` 这种设计允许用户在一个表单中动态添加、编辑多个子项,适用于订单、报价等场景。 ### 按钮与自定义动作 在表单中添加自定义按钮并绑定Python方法,可以实现复杂的业务逻辑。例如: ```xml <button name="action_calculate" string="Calculate" type="object" class="btn-primary"/> ``` 对应的Python方法可以在模型中定义: ```python def action_calculate(self): for record in self: # 执行计算逻辑 record.total = sum(line.quantity * line.price for line in record.line_ids) ``` 这种机制可以用于触发数据验证、计算、状态变更等操作。 ### 使用JavaScript扩展前端行为 对于需要更复杂交互的表单,可以通过自定义JavaScript组件来扩展表单行为。OdooWeb框架允许开发者继承或扩展默认的表单视图控制器。例如: ```javascript odoo.define('my_module.FormController', function (require) { "use strict"; var FormController = require('web.FormController'); FormController.include({ events: _.extend({}, FormController.prototype.events, { 'click .my_custom_button': '_onCustomButtonClick', }), _onCustomButtonClick: function () { // 自定义按钮点击逻辑 alert('Custom button clicked!'); }, }); }); ``` 这种方式适用于需要与用户进行复杂交互的场景,如实时数据加载、动态字段更新等。 ### 多标签页设计 通过`<notebook>`标签可以将表单内容组织成多个标签页,适用于信息量较大的表单: ```xml <notebook> <page string="General"> <field name="name"/> <field name="description"/> </page> <page string="Attachments"> <field name="attachment_ids" widget="many2many_binary"/> </page> </notebook> ``` 这种设计可以有效减少表单的视觉复杂度,提升用户体验。 ### 表单布局优化 合理使用`<div>`、`<span>`等HTML标签可以进一步优化表单的布局。例如: ```xml <div class="oe_title"> <h1> <field name="name" placeholder="Enter a name"/> </h1> </div> ``` 这种设计可以用于突出显示表单标题或关键字段。 ### 总结 在Odoo中设计复杂表单时,应综合运用`<group>`、`<notebook>`、`attrs`、`One2many`字段、自定义按钮JavaScript扩展等技术,以实现结构清晰、交互流畅的用户界面。同时,合理组织表单内容和逻辑,确保用户体验和数据录入的准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值