修改Odoo中现有的xpath表达式

时间:2018-09-28 03:12:57

标签: xpath replace odoo

我必须在我的自定义模块中修改Odoo模块的xpath。在下面的V11的website_sale模块的以下代码中考虑(为简单起见,我减少了代码):

<template id="recommended_products" inherit_id="website_sale.product" customize_show="True" name="Alternative Products">
    <xpath expr="//div[@id='product_full_description']" position="after">
        <div class="container mt32" t-if="product.alternative_product_ids">
            <h3>Alternative Products:</h3>                                        
        </div>
    </xpath>
</template>

例如,我要替换

1)position =“ after”到position =“ before”

OR

2)expr =“ // div [@ id ='product_full_description']”到expr =“ // div [@ id ='product_small_description']”

我该怎么做?

2 个答案:

答案 0 :(得分:0)

尝试这样

<template id="recommended_products" inherit_id="website_sale.product" customize_show="True" name="Alternative Products">
    <!-- this will replace the existing place of the div -->
    <xpath expr="//div[@id='product_full_description']" position="replace">
    </xpath>
    <!-- this will be the new place of the div. Instead of after you use before -->
     <xpath expr="//div[@id='product_full_description']" position="before">
        <div class="container mt32" t-if="product.alternative_product_ids">
            <h3>Alternative Products:</h3>                                        
        </div>
    </xpath>
</template>

答案 1 :(得分:0)

在这里,我将解释一个非常罕见的(未记录)且有用的Odoo XML视图继承,以便能够在不覆盖记录视图数据的情况下替换整个视图。

例如,如果您要覆盖(不好的做法)视图website_sale.product的内容,则可以执行此操作(使用与另一条记录相同的记录xml ID)

<!-- Not Recommended for almost every case -->
<template id="website_sale.product" name="Product">
    ...
    <!-- Reorganize the original view as needed -->
    ...
</template>

这会丢失原始代码带来的不便,并且当卸载引入更改的模块时,由于更改将保留在原始记录视图中并导致某些错误,因此可能会失败。

建议的方式(罕见且未记录)正在使用这种继承:

<template id="recommended_products_ext" inherit_id="website_sale.recommended_products">
    <xpath expr="." position="replace">
        <t name="Alternative Products" t-name="website_sale.recommended_products">
            ...
            <!-- Reorganize the original view as needed -->
            ...
        </t>
    </xpath>
</template>

此格式允许引入按扩展名覆盖的原始视图,而无需手动修改继承视图的原始代码。实际上,格式:<t name"" t-name=""></t>是Odoo在数据库中存储qweb模板的方式,我从中受益匪浅,它使我可以引入整个视图覆盖,同时又可以很好地处理同一个视图的其他继承。

请记住,这是一个可能需要模块依赖提供帮助的工具,并且在其他视图继承可以轮流使用之前,允许视图优先级尽快采取行动以注入更改。

我发现这个问题是分享此解决方案的好地方。但是请随时评估是否适合您的情况

*更新* 要点示例:

https://gist.github.com/aek/d8a3588e1f8c63f96be242f4d6d75b09