直接链接到视图中的笔记本页面

时间:2017-12-21 11:16:15

标签: odoo-10 odoo

我有一个扩展当前项目视图的视图,我们在其中添加多个选项卡(笔记本页面)以显示项目其他部分的信息。

其中一个页面是概述页面,总结了其他选项卡下的内容,我想将每个部分的标题直接链接到每个显示的页面。我目前通过使用每个选项卡的索引并在选项卡中的链接上调用bootstrap的.tab('show')方法来解决这个问题:

$(".overview-link").click(function (e) {
    e.preventDefault();
    var sel = '.nav-tabs a:eq(' + $(this).data('tab-index') + ')';
    $(sel).tab('show');
});

这是有效的,因为我已将data-tab-index="<int>"附加到我的窗口小部件代码中的每个标头链接,但它很脆弱 - 如果有人稍后添加标签,则当前索引将被破坏。之前我依靠每个标签上的锚点,但也破坏了(如果插入了新的笔记本页面,也可能会破坏)。

直接触发Web客户端重定向/表单链接有效,但我想在视图中显示特定页面:

this.do_action({
    type: 'ir.actions.act_window',
    res_model: 'my.model.name',
    res_id: 'my.object.id',
    view_mode: 'form',
    view_type: 'form',
    views: [[false, 'form']],
    target: 'current'
});

有没有办法通过do_action方法或类似的方法将Web客户端直接链接/重定向到特定的笔记本页面选项卡?

3 个答案:

答案 0 :(得分:1)

如果我理解你想要从JavaScript(jQuery)FormWidget中选择选项卡,考虑到如果任何人安装另一个添加另一个选项卡的模块,则id可能会改变

解决方案0

您可以在xml表单视图中的page中添加一个类。您可以使用此类名选择的元素的id来调用右锚并选择正确的选项卡项。这应该在页面完全加载时发生:

<page class="nb_page_to_select">
$('a[href=#' + $('.nb_page_to_select').attr('id') + ']').click()

注意:正如您所说的以下段落我假设您知道在哪里运行此指令。我建议的解决方案与索引无关。

  

这是有效的,因为我已经为每个人附加了data-tab-index="<int>"   我的小部件代码中的标题链接,但它很脆弱 - 如果有人添加了   标签后,当前指数将被打破。早些时候我依靠   锚定在每个标签上,但也破坏了(并且可能会破坏   如果还插入了新的笔记本页面。

解决方案1 ​​

加载页面后,您可以像这样获取选项卡列表DOM对象:

var tablist = $('ul[role="tablist"]')

然后您可以单击特定选项卡,按锚点内的文本进行选择。所以你不依赖于标签索引:

tablist.find('a:contains("Other Information")').click()

我认为如果你有两个带有相同文字的标签没有任何意义,那么这应该足够了。

解决方案2

即使您想要更具体,也可以在笔记本中添加一个类,以确保您使用的笔记本正确

<notebook class="nt_to_change">

现在您可以使用其中一个表达式来选择选项卡列表

var tablist = $('div.nt_to_change ul.nav-tabs[role="tablist"]')

// or

var tablist = $('div.nt_to_change ul[role="tablist"]')

解决方案3

如果contains选择器不能说服你,因为它应该相等,你也可以这样做来比较和过滤

tablist.find('a').filter(function() {
    return $.trim($(this).text()) === "Other Information";
}).click();

其中"Other Information"是笔记本页面的字符串

答案 1 :(得分:0)

我没有尝试过我给你的解决方案,但如果它不起作用,至少可能会让你想出一些想法。

有一个名为autofocus的XML元素的参数(对于按钮和字段为default_focus,取值为1或0)。如果您将autofocus="autofocus"添加到XML页面中,则在打开视图时将显示此页面。

所以,你可以尝试通过JavaScript添加这个,当用户点击相应的链接时 - 老实说,我现在不知道如何实现这一点。但您可以为XML中的每个链接添加独特的context参数,例如context="{'page_to_display': 'page x'}"。当您单击链接时,我希望这些上下文键将到达您的JS方法。

如果没有,您还可以修改fields_view_get方法(在此我写了如何执行此操作:Odoo - Hide button for specific user),以检查您是否获得了已添加到链接的上下文并添加{ {1}}相应页面的参数。

答案 2 :(得分:0)

正如你所说:

  

这是有效的,因为我已经将data-tab-index =“”附加到每个标题   在我的小部件代码中链接,但它很脆弱 - 如果有人添加了一个标签   之后,目前的指数将被打破。

我认为您的应用程序允许实时多用户交互,因此您必须在代码中的某处集成更新部件功能。

如果某些内容发生了变化,此函数将触发并清除数据以重建索引,以避免当前索引被破坏。​​