zoukankan      html  css  js  c++  java
  • Odoo的ir.values

    我想

    如果我想添加一个批量确认订单功能怎么办?就是想做到这个效果:

    好吧,我们先来看看今天的主角

    特殊的ir.values

    ir.values这个模型有点特殊。它的特殊首先体现为它的菜单和界面有两个: 
    /Setting/Technical/Actions/Action Bindings 
    /Setting/Technical/Actions/User-defined Defaults

    两个用途

    既然有两个界面那么它的用途也应该是两个:1)储存用户自定义的默认值。2)动作的绑定。 

    注意:因为ir.values是历史遗留产物,这个模型可能会在以后的版本被替换或者更新,大家开发的时候注意不要显式依赖它。

    用户定义的默认值

    在Odoo 10.0里用户默认值的设置首先需要开启开发者模式,然后在开发者菜单里面选择Set Defaults,在弹出的窗口里面选择好默认值之后,系统就会保存好默认值——创建ir.values记录来保存。 

     

    通过打开上面介绍过的用户默认值菜单/Setting/Technical/Actions/User-defined Defaults,找到刚刚创建的记录。

    user-defined-defaults

    name:默认值对应的字段。

    model:默认值对应的模型名。

    condition:此默认值生效的条件。

    user:在此登陆用户登录的时候默认值生效,为空则对所有的用户都生效。 

    company:默认值生效的公司。

    Default value or action reference:默认值的值。如果是该值是数字或者字符串,你可以直接在这修改,但如果是many2one的在这里直接改是不会生效的。 

    动作绑定

    这个一般是开发人员才会用到……嗯,好吧,其实开发人员一般也不会用到:-P。 
    我们先描述下这个“动作绑定”是什么,就是我们在“打印”下拉菜单里点击打印报表动作,在“更多”下拉菜单里的动作(还有就是树状菜单的点击动作,这个在新版本里面基本上已经绝迹了)。 

    这时候开发人员可能会说:“你说的不就是我们在xml里面用的<report><act_window>标签吗?” 
    没错的上面的两种标签在Odoo里面叫shortcut,是一种便捷写法。我们更新模块的时候对这种包含了shortcut的xml代码会执行“一系列”的操作。

    <report 
        id="report_sale_order"
        string="Quotation / Order"
        model="sale.order" 
        report_type="qweb-pdf"
        file="sale.report_saleorder" 
        name="sale.report_saleorder" 
    />

    例如当我们用上面包含<report>标签添加销售报表的时候,系统会做这两个操作:

    1)创建一个ir.actions.report.xml 的记录,这个记录保存了所有关于这个报表的信息:例如打印格式,报表的名字等等。

    2)创建一个ir.values 的记录,这条记录让我们可以在系统的“打印”菜单下能出现“Quotation/Order”打印按钮。现在来看看这个销售订单报表对应的ir.values记录。 

    打开动作绑定的菜单/Setting/Technical/Actions/Action Bindings ,找到这条记录。

    action-bindings

    Name:动作绑定的名字。

    Model:动作绑定到的模型。

    Qualifier:动作绑定的生效形式,有以下可选值:

      client_print_multi:绑定动作到“打印”下拉菜单 
      client_action_multi:绑定动作到“更多/动作”下拉菜单 
      client_action_relate:绑定动作到表单的超链接(V7前),现在也是绑定动作到“更多/动作”下拉菜单。 
      tree_but_open:绑定动作到树形菜单(很少使用)。 
      Action Reference: 绑定的动作和id,动作和id是通过逗号分隔。如下代码,可以通过ref()来取得对应动作的数据库id

    <record model="ir.values" id="sale_order_line_make_invoice">
        <field name="model_id" ref="sale.model_sale_order_line" />
        <field name="name">Invoice Orders</field>
        <field name="key2">client_action_multi</field>
        <field name="value" eval="'ir.actions.act_window,' + str(ref('action_view_sale_advance_payment_inv'))" />
        <field name="key">action</field>
        <field name="model">sale.order</field>
    </record>

    为什么要显式使用ir.values

    我们上面说的“动作”(action)是包含了: 
    窗口动作 (ir.actions.act_window) 
    链接动作(ir.actions.act_url) 
    服务器动作 (ir.actions.server) 
    报表动作(ir.actions.report.xml) 
    服务端动作(ir.actions.client)

    这些动作都可以通过“ir.values”来添加到到“打印”,“更多/动作”的下拉菜单。

    回到最初

    又回到我们开始的场景,假设我们已经写了个服务器动来把订单批量确认的。那么我们怎么可以把这个服务器动作放到订单界面呢?

    方法一:直接用odoo的服务器动作右上角的“Add in ‘More’ menu”,其实这个按钮就是添加了一条“ir.values”的记录。

     方法二:通过代码实现,下面是完整的代码

    <?xml version="1.0" encoding="UTF-8"?>
    <openerp>
        <data>
        <record id="server_action_sale_order_confirm" model="ir.actions.server">
            <field name="name">Confirm Order</field>
            <field name="condition">True</field>
            <field name="type">ir.actions.server</field>
            <field name="model_id" ref="sale.model_sale_order"></field>
            <field name="state">code</field>
            <field name="code">model.browse(env.context.get('active_ids')).action_confirm()</field>
            <field name="sequence">5</field>
        </record>
        <record model="ir.values" id="sale_order_confirm_order">
            <field name="model_id" ref="sale.model_sale_order" />
            <field name="name">Confirm Orders</field>
            <field name="key2">client_action_multi</field>
            <field name="value" eval="'ir.actions.act_window,' + str(ref('server_action_sale_order_confirm'))" />
            <field name="key">action</field>
            <field name="model">sale.order</field>
        </record>
        </data>
    </openerp>
  • 相关阅读:
    <转>Npoi导入导出Excel操作<载>
    将DataTable导出为Excel C#
    错误 X “X1”不包含“XX2”的定义,并且找不到可接受类型为“X1”的第一个参数的扩展方法“XX2”(是否缺少 using 指令或程序集引用?)
    错误 1 未知的服务器标记“asp:ScriptManager”。
    分析器错误消息: 类型“test.test.testx”不明确: 它可能来自程序集“F: estProjectin est.test.DLL”或程序集“F: estProjectin estProject.DLL”。请在类型名称中显式指定程序集。
    There are no interfaces on which a capture can be done.
    基础知识系列☞GET和POST→及相关知识
    基础知识系列☞Abstract和Virtual→及相关知识
    同源策略
    26Mybatis_一级缓存及其测试
  • 原文地址:https://www.cnblogs.com/joshuajan/p/6258028.html
Copyright © 2011-2022 走看看