第七章 表单视图

表单视图是odoo中最常见的视图类型之一, 我们在前面了解了它的XML定义, 本章我们将了解它在WC世界中的行为特性.

表单视图的结构

我们来看一个典型的FORM视图的结构:

FORM视图的初始化

FORM视图有两种模式: 只读(Readonly)编辑(Edit), 分别代表视图的只读和可编辑模式.通过控制栏的编辑按钮,可以对FORM视图的两种模式进行切换.

视图在初始化的过程中,对模式进行了初始化:


init: function (viewInfo, params) {
    var hasActionMenus = params.hasActionMenus;
    this._super.apply(this, arguments);

    var mode = params.mode || (params.currentId ? 'readonly' : 'edit');
    this.loadParams.type = 'record';

    // this is kind of strange, but the param object is modified by
    // AbstractView, so we only need to use its hasActionMenus value if it was
    // not already present in the beginning of this method
    if (hasActionMenus === undefined) {
        hasActionMenus = params.hasActionMenus;
    }
    this.controllerParams.hasActionMenus = hasActionMenus;
    this.controllerParams.disableAutofocus = params.disable_autofocus || this.arch.attrs.disable_autofocus;
    this.controllerParams.toolbarActions = viewInfo.toolbar;
    this.controllerParams.footerToButtons = params.footerToButtons;

    var defaultButtons = 'default_buttons' in params ? params.default_buttons : true;
    this.controllerParams.defaultButtons = defaultButtons;
    this.controllerParams.mode = mode;

    this.rendererParams.mode = mode;
    this.rendererParams.isFromFormViewDialog = params.isFromFormViewDialog;
    this.rendererParams.fieldIdsToNames = this.fieldsView.fieldIdsToNames;
}

首先, FORM视图的初始化是先调用了父类(抽象视图)的初始化方法, 抽象视图本身会进行一些参数的初始化过程, 然后FORM视图在此基础上又增加了下面的几个属性:

  • hasActionMenus: 标识FORM视图是否含有动作菜单
  • disableAutofocus: 是否取消自动聚焦
  • toolbarActions: 是否显示工具栏动作按钮
  • footerToButtons: 是否显示footer中的按钮
  • defaultButtons: 是否显示默认按钮
  • mode: 视图的模式

以上几个参数是Controller的配置参数,由视图在实例化Controller的时候传递.而下面三个则是传递给Renderder的参数.

ActiveActions

所谓ActiveActions是指视图中动作的总称, 常见的ActiveActions有一下几种:

  • create
  • edit
  • delete
  • depulicate

这几个动作分别对应视图中的创建和编辑, 更多按钮中的删除和复制.

如果想要控制视图中的创建和编辑按钮的显示,我们通常有以下几种方式来实现.

  1. 使用权限控制,将视图当前的对象权限设置为只读,便可以控制创建和编辑按钮的显示. 这种方式优点是简单快速,缺点是颗粒度太粗,并不能实现具体页面具体设置.

  2. 第二种方式就是使用FORM视图的中create和edit属性, 只需要在特定的页面设置:

     <form create="0" edit="0">
         ...
     </form>
    

    就可以实现对创建和编辑按钮的控制. 这种方式的有点是灵活,可以对不同的页面设置不同的权限. 缺点是只能静态控制而不能动态控制

  3. 第三种方式是通过动作来控制, 我们可以在窗口动作里的context上下文中传入create/edit来控制FORM表单的显示:

         <record model="ir.actions.act_window" id="act_window_demo">
             ...
             <field name="context">{'create':0}</field>
         </record>
    
  4. 使用动作中的flags属性来控制, 这种方式的适用场景是需要在按钮中返回一个动作, 利用该动作控制视图的显示:

     {
         "model":"ir.actions.act_window",
         ...
         "flags":{
             "form":{
                 "default_buttons":False
             }
         }
     }
    

    这种方式的缺点是, default_buttons的设置会同时隐藏掉创建和编辑按钮,并不能分开设置. 为了实现分开设置的目的,笔者为此专门开发了一个模块来实现此功能, 有需要的同学可以联系笔者进行购买.关于flags的更多内容,参加本部分第十七章.

results matching ""

    No results matching ""