### 动作和菜单
操作和菜单是数据库中的常规记录,通常通过数据文件声明。行动可以用三种方式触发:
1. 通过点击菜单项(链接到特定的行动)
2. 通过点击按钮(如果这些连接到行动)
3. 作为对象的上下文行为
因为菜单是有点复杂的声明有一个 `<menuitem>` 声明的快捷方式 `ir.ui.menu` 并将其连接到相应的动作更容易。
~~~ xml
<record model="ir.actions.act_window" id="action_list_ideas">
<field name="name">Ideas</field>
<field name="res_model">idea.idea</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_ideas" parent="menu_root" name="Ideas" sequence="10"
action="action_list_ideas"/>
~~~
Danger
必须声明其相应的菜单中的XML文件。
按顺序执行数据文件,在菜单可以创建之前,该操作的 `id` 必须在数据库中出现。
练习
定义新的菜单项
定义新的菜单项来访问课程和会议的 openacademy 菜单项下。用户应该能够
* 显示所有课程列表
* 创建/修改课程
1. 创建 `openacademy/views/openacademy.xml` 一个动作和菜单触发的动作
2. 将它添加到 `data` 列表中 `openacademy/__openerp__.py`
*openacademy/__openerp__.py*
~~~ python
'data': [
# 'security/ir.model.access.csv',
'templates.xml',
'views/openacademy.xml',
],
# only loaded in demonstration mode
'demo': [
~~~
*openacademy/views/openacademy.xml*
~~~ xml
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- window action -->
<!--
以下标记为一个操作定义 "window action",
这是一个行动打开一个视图或一组视图
-->
<record model="ir.actions.act_window" id="course_list_action">
<field name="name">Courses</field>
<field name="res_model">openacademy.course</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create the first course
</p>
</field>
</record>
<!-- 顶级菜单:没有父 -->
<menuitem id="main_openacademy_menu" name="Open Academy"/>
<!-- 在左侧菜单中的第一级是必要的
在使用动作=属性 -->
<menuitem id="openacademy_menu" name="Open Academy"
parent="main_openacademy_menu"/>
<!-- 他应该出现以下菜单项 *after*
其父 openacademy_menu 和 *after* 它的行动 course_list_action -->
<menuitem id="courses_menu" name="Courses" parent="openacademy_menu"
action="course_list_action"/>
<!-- 全部 id 位置:
action="openacademy.course_list_action"
它是不需要的,当它是相同的模块 -->
</data>
</openerp>
~~~