扩展视图

来自Odoo大V社-odoo中文开发手册
312403292讨论 | 贡献2018年4月17日 (二) 11:46的版本

跳转至: 导航搜索

在odoo界面中,表单,列表和搜索视图是使用arch XML结构定义的。 如果要通过继承扩展原有视图,我们需要用一种方法来修改这个XML。 这需要通过两步来实现,1、定位到视图XML中某个界面元素的位置;2、然后在这个位置插入增补定义的视图。通过这两步就可以达到扩展视图的目的。

继承视图正可以实现这个功能。一个继承视图声明如下:

   <record id="view_form_todo_task_inherited" model="ir.ui.view">
       <field name="name">Todo Task form - User extension</field>
       <field name="model">todo.task</field>
       <field name="inherit_id" ref="todo_app.view_form_todo_task"/>
       <field name="arch" type="xml">
       </field>
   </record> 

inherit_id字段使用特定属性ref引用一个外部标识符来指定要被扩展的视图。 外部标识符将在第4章“数据序列化和模块数据”中更详细地讨论。

对于XML,在其中定位元素的最好方法是使用XPath表达式。 比如,以上一章中定义的表单视图为例,其中一个XPath表达式是// field [@name] ='is_done',这个表达式就是用于定位<field name =“is_done”>元素的。 这个表达式查找name属性等于is_done的任意field元素。 有关XPath的详细信息,请访问https://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support。

如果XPath表达式匹配到多个元素,只有第一个元素会被修改。 因此,表达式应该使用独特的属性以使其指定尽可能具体。 使用name属性是确保我们找到扩展点的确切xml元素的最简单方法。 因此,在我们的视图XML元素上定义name属性是很重要的。

扩展点定位后,您可以修改它或在其附近添加XML元素。 下面是一个写在arch中的实现在is_done字段之前添加date_deadline字段的具体例子:

   <xpath expr="//field[@name]='is_done'" position="before">
       <field name="date_deadline" />
   </xpath> 

幸运的是,Odoo为此提供了快捷符号,因此大多数时候我们可以完全避免XPath语法。 代替前面的XPath元素,我们仅使用要定位的元素的特定属性及定位类型相关信息就可以了。前面的XPath,我们可以写成:

   <field name="is_done" position="before">
      <field name="date_deadline" />
   </field> 

请注意,如果字段在同一视图中多次出现,则应始终使用XPath语法。 这是因为在字段第一次出现的时候Odoo将停止查找,而这可能会将您的更改应用在错误的字段上。

通常,我们是在现有字段旁边添加新字段,因此<field>标记经常用作定位器。 但是也可以使用任何其他标签:如<sheet>,<group>,
等。 name属性通常是匹配元素的最佳选择,但有时,我们可能需要使用其他东西:例如CSS类元素。 Odoo将找到具有指定的所有属性的第一个元素。

注意 在版本9.0之前,string属性(用于显示标签文本)也可以用作扩展定位器。 从9.0开始,这种做法不再允许了。 这个限制与对这些字符串进行操作的语言翻译机制有关。

与定位器元素一起使用的position属性是可选的,并且可以具有以下值:

after:将内容添加到父元素之中,匹配的节点之后。
before:添加内容在匹配节点之前。
inside(默认值):匹配节点内的追加内容。
replace:替换匹配的节点。如果使用空内容,它将删除该匹配的元素。从Odoo 10开始,它还允许用其他标记包装一个元素,通过在内容中使用$0来表示被替换的元素。
attributes:修改匹配元素的XML属性。在元素内容使用<attribute name =“attr-name”>实现给属性name设置新属性值attr-name。

例如,在Task表单中,我们有active字段,但它可见不是那么有用。 我们可以将它对用户隐藏。 这可以通过设置invisible属性来完成:

   <field name="active" position="attributes">
       <attribute name="invisible">1</attribute>
   </field>

设置invisible属性来隐藏元素是使用定位器元素replace属性删除节点的一个很好的替代方法。 应该避免删除节点,因为它可能破环那些利用删除的节点作为选择器添加其他元素的依赖模块。

上一节:修改模型的方法
下一节:扩展表单视图