欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈关于Odoo12二次开发针对原有视图修改优化解决方案

程序员文章站 2022-05-04 11:28:30
...

浅谈关于Odoo12二次开发针对原有视图修改优化解决方案

序言:由于之前使用的版本为Odoo8,在使用中发现原有的视图不满足我们的需求,这时,通常的做法是对原有视图进行继承修改,根据‘字段’或者‘xpath’进行定位然后进行修改视图,以满足我们的需求。

但是到了Odoo12版本中,’xpath‘仅能通过‘name’属性值定位,这就导致了继承修改的不便。在此情境下,便需要找到一套更加便捷改动最小的方案。于是针对此情境,提出并实践了一套可行的方案:即完全舍弃原有视图,根据模型自己定制化开发自己需要的视图,然后通过修改或者action绑定视图的方式进行对原有视图的替换。

要实践这一方案,需要解决一些技术上问题,如:

  • action如何继承修改;
  • action如何绑定不同的视图模式;
  • Many2one字段链接到form界面如何定位;

下面以库存模块产品模型为示例,演示一整套方案的执行流程。

1. 定义个性化视图(view)

根据需求定义所需要的页面样式,这里以form为例,同样适用于tree,kanban

	<!--产品明细form-->
    <record id="dy_product_product_form_view" model="ir.ui.view">
        <field name="name">dy_product_product_form_view</field>
        <field name="model">product.product</field>
        <field name="arch" type="xml">
            <form create="0" delete="0" copy="0">
                <sheet>
                    <field name="id" invisible="1"/>
                    <field name="image_medium" widget="image" class="oe_avatar"/>
                    <div class="oe_title">
                        <label class="oe_edit_only" for="name" string="Product Name"/>
                        <h3>
                            <field name="name" placeholder="e.g. Odoo Enterprise Subscription"/>
                        </h3>
                        <label class="oe_edit_only" for="default_code" string="Product Code"/>
                        <h3>
                            <field name="default_code"/>
                        </h3>
                    </div>
                    <group>
                        <group>
                            <field name="type"/>
                            <field name="uom_id"/>
                            <field name="uom_po_id"/>
                        </group>
                        <group>
                            <field name="specification"/>
                            <field name="active"/>
                        </group>
                    </group>
                    <notebook>
                        <page string="Purchase">
                            ...
            </form>
        </field>
    </record>

2. 定义动作绑定视图(action)

定义action绑定自定义的视图

	<!--产品明细action-->
    <record id="action_dy_product_product" model="ir.actions.act_window">
        <field name="name">Product Detail</field>
        <field name="res_model">product.product</field>
        <field name="type">ir.actions.act_window</field>
        <field name="view_type">form</field>
        <field name="view_mode">kanban,tree,form</field>
        <field name="view_ids"
               eval="[(5, 0, 0),
                      (0, 0, {'view_mode': 'tree', 'view_id': ref('dy_product_product_tree_view')}),
                      (0, 0, {'view_mode': 'form', 'view_id': ref('dy_product_product_form_view')}),
                      (0, 0, {'view_mode': 'kanban', 'view_id': ref('dy_product_product_kanban_view')})]"/>
        <field name="domain">[]</field>
        <field name="help" type="html">
            <p class="o_view_nocontent_smiling_face">
                Create a new record...
            </p>
        </field>
    </record>

Warning!
view_ids属性中可以指定action在触发时不同模式对应的视图。
同样的也可以继承原有action然后修改,视情况而定。

3. 定义菜单挂载视图(menu)

定义action绑定自定义的视图

	<!--产品明细菜单-->
    <menuitem id="menu_dy_product_product" name="Product Detail" sequence="60"
              parent="stock.menu_stock_inventory_control"
              action="action_dy_product_product"/>

Warning!
之所以定义一个新的视图是由于新创建的方便操作,而在业务人员配置菜单时配置自定义菜单即可。

4. Many2one字段点击时需要指定个性化视图

Many2one字段查看信息时,指定我们个性化自定视图

	<group>
	    <field name="product_id"
	        domain="[('landed_cost_ok', '=', True)]"
	        context="{'default_landed_cost_ok': True, 'form_view_ref':'dy_stock.dy_product_product_form_view'}"/>
	    <field name="price_unit"/>
	</group>

Warning!
context中form_view_ref属性可以指定当点击跳转form时指定form,即可实现查看自定义页面。

通过以上的操作,就可以实现我们依赖原有模型自定义满足需求的视图而不对原有视图进行修改,达到所需的目的。

相关标签: view