odoo菜单定义和修改学习总结
环境
odoo-14.0.post20221212.tar
定义菜单
方式1:
代码语言:javascript复制<?xml version="1.0"?>
<odoo>
<menuitem id="root_menu_id" name="TopMenu" web_icon="estate,static/img/icon.png">
<menuitem id="second_level_menu" name="SecondLevelMenu">
<menuitem id="third_level_menu1" action="third_level_menu1_action" sequence ="10"/>
<menuitem id="third_level_menu2" action="third_level_menu2_action" sequence ="20"/>
</menuitem>
</menuitem>
</odoo>
说明:
id
菜单外部ID
name
如果不指定name
,则:
- 如果为菜单设置了
action
,则获取action
record定义中name
字段的值作为菜单name
属性的值 - 如果未设置菜单
action
,则获取菜单外部ID为值作为菜单name
属性的值
action
打开菜单时需要执行的action
的外部ID
web_icon
指定菜单图标,格式:模块名称,图标路径
,形如estate,static/img/icon.png
意为estate
模块下的static/img/icon.png
图标。其中图标路径,一般是相对于模块根目录的相对路径
sequence
设置菜单展示顺序。该属性值越大,越靠右、靠下方展示。也就是说,菜单从左往右,从上到下,对应sequence
属性值从小到大。
<menuitem>
元素也可以放在<data>
元素中,形如
<?xml version="1.0"?>
<odoo>
<data>
<menuitem id="root_menu_id" name="TopMenu" web_icon="estate,static/img/icon.png">
...
</menuitem>
</data>
</odoo>
groups
逗号分隔的res.groups
模型的外部ID序列,形如groups="group_account_user,group_account_manager,group_account_invoice"
,表示菜单只能被group_account_user,group_account_manager,group_account_invoice 三个用户组访问。用于指定可以访问菜单的用户组。如果外部ID以-
为前缀,则从菜单组中移除该ID代表的组,注意,如果指定用户组不是在当前模块中定义的,需要指定所在模块名称,形如estate.group_estate_property_root_menu
。
示例:
代码语言:javascript复制<?xml version="1.0"?>
<odoo>
<data>
<menuitem id="root_menu_id" name="TopMenu" web_icon="estate,static/img/icon.png" groups="group_estate_property_root_menu">
...
</menuitem>
</data>
</odoo>
方式2:通过parent
来设置菜单层级
<?xml version="1.0"?>
<odoo>
<menuitem id="root_menu_id" name="TopMenu" web_icon="estate,static/img/icon.png"/>
<menuitem id="second_level_menu" name="SecondLevelMenu" parent="root_menu_id"/>
<menuitem id="third_level_menu1" action="third_level_menu1_action" sequence ="10" parent="second_level_menu"/>
<menuitem id="third_level_menu2" action="third_level_menu2_action" sequence ="20" parent="second_level_menu"/>
</odoo>
说明:
parent
指定父级菜单外部ID,如果上级菜单不在当前模块中,则需要指定上级菜单所在模块,形如parent="moduleName.parent_menu_id"
修改菜单
本节要介绍的是一种特殊的修改方式,并不是直接修改原有菜单定义。这种修改方式之所以特殊,是因为它不修改原有菜单的定义,而是通过重新定义菜单来修改,可以简单的类比为“继承”,具体做法如下:
定义一个新的菜单<menuitem>
,将其id
属性值设置为原有菜单所在模块名称及其id
属性值的组合,形如:moduleName.source_menu_id
(参见下述示例),如果新的菜单和原有菜单在同一个模块,可以省略moduleName.
。
修改相关菜单属性值为目标值(如果需要的话)
示例:重新定义purchase.menu_purchase_root
菜单名称
<menuitem id="purchase.menu_purchase_root" name="omsPurchase"/>
以新定义的菜单为父级菜单,添加子菜单(如果需要的话),添加方式可以参考上文所述,需要注意的是,不管采用哪种方式,原有菜单的子菜单依然存在,并显示为新定义菜单的子菜单
隐藏原有菜单的子菜单(如果需要的话)
定义一个<record>
,将其id
设置为要隐藏的子菜单所在模块名称及id
属性值的组合,形如:moduleName.source_menu_id
,如果新的菜单和原有菜单在同一个模块,可以省略moduleName.
。
将其model
设置为"ir.ui.menu"
添加子元素 <field name="active" eval="False"></field>
,其中eval=False
则表示隐藏,eval=True
表示显示
<?xml version="1.0"?>
<odoo>
...
<record id="purchase.sub_menu_purchase" model="ir.ui.menu">
<field name="active" eval="False"></field>
</record>
</odoo>
参考连接
https://www.odoo.com/documentation/14.0/zh_CN/developer/reference/addons/data.html#shortcuts