Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

在listview的web视图上增加一个按钮的问题



  • 我想在列表页面的web试图上增加一个全局按钮(“更多”按钮需要选中列表项才可以显示,这个不是我希望的),如下图所示:<br />[img]http://[attachimg=3][/img]<br />xml代码如下:<br />[code]<br /><templates><br />        <t t-extend="ListView.buttons"><br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <span class="oe_fade">or</span><br />                        <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                </t><br />        </t><br /></templates><br />[/code]<br />js代码如下:<br />[code]<br />    var MODELS_NOT_TO_HIDE = ['crm.lead'];<br />    instance.web.ListView.include({<br />        load_list: function (data) {<br />            var self = this;<br />            var add_button = false;<br />            var res_model = this.dataset.model;<br />            if (!this.$buttons) {<br />                add_button = true;<br />            }<br />            var ret = this._super.apply(this, arguments);<br />            if ($.inArray(res_model, MODELS_NOT_TO_HIDE) == -1) {<br />                this.$buttons.find('.oe_list_button_import_lead').remove();//隐藏按钮<br />            }<br />            if(add_button) {<br />                this.$buttons.on('click', '.oe_list_button_import_lead', function() {<br />                    self.do_action({<br />                          //pop window<br />                        });<br />                });<br />            }<br />            return ret<br />        },<br />    });<br />[/code]<br />这样可以获得如下图所示的效果:<br />[img]http://[attachimg=4][/img]<br />那个“或”字无法去掉,因此想在xml中直接使用t-if来判断,满足条件在增加button,否则就不要增加,理论上的代码如下:<br />[code]<br /><templates><br />        <t t-extend="ListView.buttons"><br />          <t t-if="widget.options.import_lead_enable !== false">  <!--这是条件判断--><br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <span class="oe_fade">or</span><br />                        <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                </t><br />            </t><br />        </t><br /></templates><br />[/code]<br />但是这种方法会直接报错,Error while extending template 'ListView.buttonsNo expression given, 不论我在js中如何定义import_lead_enable,甚至使用listview原有的参数。<br />如果改成如下代码,不会报错,但是t-if永远也不为true,哪怕我将listview原有的参数拿过来都不行。<br />[code]<br /><templates><br />    <t t-if="widget.options.import_lead_enable !== false">  <!--条件语句在最外面--><br />        <t t-extend="ListView.buttons">            <br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <span class="oe_fade">or</span><br />                        <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                </t><br />        </t><br />    </t><br /></templates><br />[/code]<br /><br />如果我想在xml中直接条件判断,到底应该如何做呢?<br />谢谢



  • 我想在列表页面的web试图上增加一个全局按钮(“更多”按钮需要选中列表项才可以显示,这个不是我希望的),如下图所示:<br />[img]http://[attachimg=3][/img]<br />xml代码如下:<br />[code]<br /><templates><br />        <t t-extend="ListView.buttons"><br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <span class="oe_fade">or</span><br />                        <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                </t><br />        </t><br /></templates><br />[/code]<br />js代码如下:<br />[code]<br />    var MODELS_NOT_TO_HIDE = ['crm.lead'];<br />    instance.web.ListView.include({<br />        load_list: function (data) {<br />            var self = this;<br />            var add_button = false;<br />            var res_model = this.dataset.model;<br />            if (!this.$buttons) {<br />                add_button = true;<br />            }<br />            var ret = this._super.apply(this, arguments);<br />            if ($.inArray(res_model, MODELS_NOT_TO_HIDE) == -1) {<br />                this.$buttons.find('.oe_list_button_import_lead').remove();//隐藏按钮<br />            }<br />            if(add_button) {<br />                this.$buttons.on('click', '.oe_list_button_import_lead', function() {<br />                    self.do_action({<br />                          //pop window<br />                        });<br />                });<br />            }<br />            return ret<br />        },<br />    });<br />[/code]<br />这样可以获得如下图所示的效果:<br />[img]http://[attachimg=4][/img]<br />那个“或”字无法去掉,因此想在xml中直接使用t-if来判断,满足条件在增加button,否则就不要增加,理论上的代码如下:<br />[code]<br /><templates><br />        <t t-extend="ListView.buttons"><br />          <t t-if="widget.options.import_lead_enable !== false">  <!--这是条件判断--><br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <span class="oe_fade">or</span><br />                        <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                </t><br />            </t><br />        </t><br /></templates><br />[/code]<br />但是这种方法会直接报错,Error while extending template 'ListView.buttonsNo expression given, 不论我在js中如何定义import_lead_enable,甚至使用listview原有的参数。<br />如果改成如下代码,不会报错,但是t-if永远也不为true,哪怕我将listview原有的参数拿过来都不行。<br />[code]<br /><templates><br />    <t t-if="widget.options.import_lead_enable !== false">  <!--条件语句在最外面--><br />        <t t-extend="ListView.buttons">            <br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <span class="oe_fade">or</span><br />                        <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                </t><br />        </t><br />    </t><br /></templates><br />[/code]<br /><br />如果我想在xml中直接条件判断,到底应该如何做呢?<br />谢谢



  • 这个 看来只有 buke 大神 能跟你讨论了.<br /><br />记得前段时间他 也研究过此处添加 button



  • [quote author=ccdos link=topic=14531.msg25042#msg25042 date=1383287195]<br />这个 看来只有 buke 大神 能跟你讨论了.<br /><br />记得前段时间他 也研究过此处添加 button<br />[/quote]<br />buke大神在何方?呼唤大神下凡。



  • 拿到里面来嘛~<br />[code]<br /><templates><br />        <t t-extend="ListView.buttons">            <br />                <t t-jquery="span.oe_alternative" t-operation="append"><br />                        <t t-if="widget.options.import_lead_enable !== false"><br />                                      <span class="oe_fade">or</span><br />                                      <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />                        </t><br />                </t><br />        </t><br />    </t><br /></templates><br />[/code]



  • 我自己写了一下测试了,找到解决方法了,load_list里面可以remove,那就说明或/按钮已经存在了,也就是说t-if已经执行过了,所以不行,我实验了下,修改到start方法中就可以了,<t t-jquery="span.oe_alternative" t-operation="append">这个你写错了,应该是after,还有,直接判断<t t-if="widget.options.import_lead_enable !== false">,就不需要在remove按钮了,t-if把或和按钮都包含进去就可以了。<br />js代码:<br />[code]openerp.add_button = function(instance) {<br />    var _t = instance.web._t,<br />        _lt = instance.web._lt;<br />    var QWeb = instance.web.qweb;<br /><br />    instance.add_button = {};<br /><br />    var MODELS_NOT_TO_HIDE = ['crm.lead'];<br />    instance.web.ListView.include({<br />        start: function() {<br />            this.options.my_btn = true;<br />            this.$el.addClass('oe_list');<br />            return this._super();<br />        },<br />    });<br />}[/code]<br />xml代码:<br />[code]    <t t-extend="ListView.buttons"><br />        <t t-jquery="span.oe_alternative" t-operation="after"><br />            <t t-if="widget.options.my_btn"><br />                <span class="oe_fade">or</span><br />                <a href="#" class="oe_bold oe_list_button_import_lead">Import Lead</a><br />            </t><br />        </t><br />    </t>[/code]



  • 还有一个问题就是,这样写全局不好吧,我想能不能在你需要添加页面,重载js文件,只修改本页面,不修改全局,请教。



  • 直接include listview就好了。<br />instance.web.ListView.include({<br />        load_list: function () {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            var b_length= self.__parentedParent.$el.find('.ok_bn').length;<br />            if(b_length ==0 && self.model=="res.partner"){ //通过获取this中的对象信息进行分析最终确定在那个地方加按钮。<br />                console.log(self.$buttons[0].firstChild.className!="oe_button ok_bn");<br />                console.log(+b_length<=0+"ok_bnok_bnok_bnok_bnok_bnok_bnok_bn");<br />                var button = $("服务");<br />                root=self.$el.parents();<br />                button.prependTo(root.find('.oe_list_buttons'));<br />                this.$buttons.on('click', '.ok_bn', function() {<br />                    self.do_action({<br />                        type: 'ir.actions.act_window',<br />                        res_model: "product.product",<br />                        res_id: 1,<br />                        views: [[false, 'form']],<br />                        target: 'current',<br />                        context:"", <br />                    }, {<br />                        on_reverse_breadcrumb: function () {<br />                            self.reload();<br />                        }<br />                    });<br />                });<br />            }  <br />        },<br />    });<br />但是不推荐这么做。不符合odoo的思想。有旭哥(http://odoo.nbzx.me) 找到一个一个好方法。<br />(推荐使用)<br /><br />        <record id="action_purchase_need" model="ir.actions.act_window"><br />            <field name="name">采购 </field><br />            <field name="res_model">purchase.need</field><br />            <field name="view_type">form</field><br />            <field name='view_mode'>tree_purchase_need</field><br />            <field name="view_id" ref="purchase_need_tree"/><br />        </record><br /><br /><br />    instance.web.views.add('tree_purchase_need', 'instance.web.dftg_ext.NeedListView');<br />    instance.web.dftg_ext.NeedListView = instance.web.ListView.extend({<br />        init: function() {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            this.on('list_view_loaded', this, function() {<br />                if(self.__parentedParent.$el.find('.oe_purchase_need').length == 0){<br />                    var button1 = $("<button type='button' class='oe_button oe_purchase_need'>刷新采购需求</button>")<br />                        .click(this.proxy('do_refresh_action'));<br />                    self.__parentedParent.$el.find('.oe_list_buttons').append(button1);<br />                }<br />            });<br />        },<br />        do_refresh_action: function () {<br />            var self = this;<br />            var action_manager = new instance.web.ActionManager(self);<br /><br />            return action_manager.do_action('dftg_ext.action_purchase_need_refresh_wizard', {<br />                        on_close: function () {<br />                            self.do_search(self.last_domain, self.last_context, self.last_group_by);<br />                        }<br />            });<br />        },<br />        //重载列表数据<br />        do_search: function(domain, context, group_by) {<br />            var self = this;<br />            this.last_domain = domain;<br />            this.last_context = context;<br />            this.last_group_by = group_by;<br />            this.old_search = _.bind(this._super, this);<br />            return self.old_search(new instance.web.CompoundDomain(self.last_domain), self.last_context, self.last_group_by);<br />        },<br />    });



  • [quote author=开阖-静静 link=topic=14531.msg31382#msg31382 date=1447298909]<br />直接include listview就好了。<br />instance.web.ListView.include({<br />        load_list: function () {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            var b_length= self.__parentedParent.$el.find('.ok_bn').length;<br />            if(b_length ==0 && self.model=="res.partner"){ //通过获取this中的对象信息进行分析最终确定在那个地方加按钮。<br />                console.log(self.$buttons[0].firstChild.className!="oe_button ok_bn");<br />                console.log(+b_length<=0+"ok_bnok_bnok_bnok_bnok_bnok_bnok_bn");<br />                var button = $("服务");<br />                root=self.$el.parents();<br />                button.prependTo(root.find('.oe_list_buttons'));<br />                this.$buttons.on('click', '.ok_bn', function() {<br />                    self.do_action({<br />                        type: 'ir.actions.act_window',<br />                        res_model: "product.product",<br />                        res_id: 1,<br />                        views: [[false, 'form']],<br />                        target: 'current',<br />                        context:"", <br />                    }, {<br />                        on_reverse_breadcrumb: function () {<br />                            self.reload();<br />                        }<br />                    });<br />                });<br />            }  <br />        },<br />    });<br />但是不推荐这么做。不符合odoo的思想。有旭哥(http://odoo.nbzx.me) 找到一个一个好方法。<br />(推荐使用)<br /><br />        <record id="action_purchase_need" model="ir.actions.act_window"><br />            <field name="name">采购 </field><br />            <field name="res_model">purchase.need</field><br />            <field name="view_type">form</field><br />            <field name='view_mode'>tree_purchase_need</field><br />            <field name="view_id" ref="purchase_need_tree"/><br />        </record><br /><br /><br />    instance.web.views.add('tree_purchase_need', 'instance.web.dftg_ext.NeedListView');<br />    instance.web.dftg_ext.NeedListView = instance.web.ListView.extend({<br />        init: function() {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            this.on('list_view_loaded', this, function() {<br />                if(self.__parentedParent.$el.find('.oe_purchase_need').length == 0){<br />                    var button1 = $("<button type='button' class='oe_button oe_purchase_need'>刷新采购需求</button>")<br />                        .click(this.proxy('do_refresh_action'));<br />                    self.__parentedParent.$el.find('.oe_list_buttons').append(button1);<br />                }<br />            });<br />        },<br />        do_refresh_action: function () {<br />            var self = this;<br />            var action_manager = new instance.web.ActionManager(self);<br /><br />            return action_manager.do_action('dftg_ext.action_purchase_need_refresh_wizard', {<br />                        on_close: function () {<br />                            self.do_search(self.last_domain, self.last_context, self.last_group_by);<br />                        }<br />            });<br />        },<br />        //重载列表数据<br />        do_search: function(domain, context, group_by) {<br />            var self = this;<br />            this.last_domain = domain;<br />            this.last_context = context;<br />            this.last_group_by = group_by;<br />            this.old_search = _.bind(this._super, this);<br />            return self.old_search(new instance.web.CompoundDomain(self.last_domain), self.last_context, self.last_group_by);<br />        },<br />    });<br />[/quote]<br />  ;) 静静 你是男是女?



  • 我也想静静



  • 静静的方法学习了。。



  • [quote author=开阖-静静 link=topic=14531.msg31382#msg31382 date=1447298909]<br />直接include listview就好了。<br />instance.web.ListView.include({<br />        load_list: function () {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            var b_length= self.__parentedParent.$el.find('.ok_bn').length;<br />            if(b_length ==0 && self.model=="res.partner"){ //通过获取this中的对象信息进行分析最终确定在那个地方加按钮。<br />                console.log(self.$buttons[0].firstChild.className!="oe_button ok_bn");<br />                console.log(+b_length<=0+"ok_bnok_bnok_bnok_bnok_bnok_bnok_bn");<br />                var button = $("服务");<br />                root=self.$el.parents();<br />                button.prependTo(root.find('.oe_list_buttons'));<br />                this.$buttons.on('click', '.ok_bn', function() {<br />                    self.do_action({<br />                        type: 'ir.actions.act_window',<br />                        res_model: "product.product",<br />                        res_id: 1,<br />                        views: [[false, 'form']],<br />                        target: 'current',<br />                        context:"", <br />                    }, {<br />                        on_reverse_breadcrumb: function () {<br />                            self.reload();<br />                        }<br />                    });<br />                });<br />            }  <br />        },<br />    });<br />但是不推荐这么做。不符合odoo的思想。有旭哥(http://odoo.nbzx.me) 找到一个一个好方法。<br />(推荐使用)<br /><br />        <record id="action_purchase_need" model="ir.actions.act_window"><br />            <field name="name">采购 </field><br />            <field name="res_model">purchase.need</field><br />            <field name="view_type">form</field><br />            <field name='view_mode'>tree_purchase_need</field><br />            <field name="view_id" ref="purchase_need_tree"/><br />        </record><br /><br /><br />    instance.web.views.add('tree_purchase_need', 'instance.web.dftg_ext.NeedListView');<br />    instance.web.dftg_ext.NeedListView = instance.web.ListView.extend({<br />        init: function() {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            this.on('list_view_loaded', this, function() {<br />                if(self.__parentedParent.$el.find('.oe_purchase_need').length == 0){<br />                    var button1 = $("<button type='button' class='oe_button oe_purchase_need'>刷新采购需求</button>")<br />                        .click(this.proxy('do_refresh_action'));<br />                    self.__parentedParent.$el.find('.oe_list_buttons').append(button1);<br />                }<br />            });<br />        },<br />        do_refresh_action: function () {<br />            var self = this;<br />            var action_manager = new instance.web.ActionManager(self);<br /><br />            return action_manager.do_action('dftg_ext.action_purchase_need_refresh_wizard', {<br />                        on_close: function () {<br />                            self.do_search(self.last_domain, self.last_context, self.last_group_by);<br />                        }<br />            });<br />        },<br />        //重载列表数据<br />        do_search: function(domain, context, group_by) {<br />            var self = this;<br />            this.last_domain = domain;<br />            this.last_context = context;<br />            this.last_group_by = group_by;<br />            this.old_search = _.bind(this._super, this);<br />            return self.old_search(new instance.web.CompoundDomain(self.last_domain), self.last_context, self.last_group_by);<br />        },<br />    });<br />[/quote]<br /><br /><br />因为我是对一个对象写多个不同的视图,我在图一中这样指定view_id,没有找到,所以我又在下面按图二的方式又指定了一下,按钮就不显示了,请问这个怎么解决???



  •     //修正odoo自定义view_mode不会取得view_id的问题<br />    instance.web.ViewManagerAction.include({<br />        init: function(parent, action) {<br />            var self = this;<br />            if (!action.views[0][0] && action.view_id){<br />                if (action.views[0][1] == action.view_mode){<br />                    action.views[0][0] = action.view_id[0]<br />                }<br />            }<br />            return this._super.apply(this, arguments);<br />        }<br />    });<br /><br /><br />试试这段代码,不知道好用不.



  • [quote author=Smile佳佳 link=topic=14531.msg32198#msg32198 date=1461296520]<br />[quote author=开阖-静静 link=topic=14531.msg31382#msg31382 date=1447298909]<br />直接include listview就好了。<br />instance.web.ListView.include({<br />        load_list: function () {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            var b_length= self.__parentedParent.$el.find('.ok_bn').length;<br />            if(b_length ==0 && self.model=="res.partner"){ //通过获取this中的对象信息进行分析最终确定在那个地方加按钮。<br />                console.log(self.$buttons[0].firstChild.className!="oe_button ok_bn");<br />                console.log(+b_length<=0+"ok_bnok_bnok_bnok_bnok_bnok_bnok_bn");<br />                var button = $("服务");<br />                root=self.$el.parents();<br />                button.prependTo(root.find('.oe_list_buttons'));<br />                this.$buttons.on('click', '.ok_bn', function() {<br />                    self.do_action({<br />                        type: 'ir.actions.act_window',<br />                        res_model: "product.product",<br />                        res_id: 1,<br />                        views: [[false, 'form']],<br />                        target: 'current',<br />                        context:"", <br />                    }, {<br />                        on_reverse_breadcrumb: function () {<br />                            self.reload();<br />                        }<br />                    });<br />                });<br />            }  <br />        },<br />    });<br />但是不推荐这么做。不符合odoo的思想。有旭哥(http://odoo.nbzx.me) 找到一个一个好方法。<br />(推荐使用)<br /><br />        <record id="action_purchase_need" model="ir.actions.act_window"><br />            <field name="name">采购 </field><br />            <field name="res_model">purchase.need</field><br />            <field name="view_type">form</field><br />            <field name='view_mode'>tree_purchase_need</field><br />            <field name="view_id" ref="purchase_need_tree"/><br />        </record><br /><br /><br />    instance.web.views.add('tree_purchase_need', 'instance.web.dftg_ext.NeedListView');<br />    instance.web.dftg_ext.NeedListView = instance.web.ListView.extend({<br />        init: function() {<br />            var self = this;<br />            this._super.apply(this, arguments);<br />            this.on('list_view_loaded', this, function() {<br />                if(self.__parentedParent.$el.find('.oe_purchase_need').length == 0){<br />                    var button1 = $("<button type='button' class='oe_button oe_purchase_need'>刷新采购需求</button>")<br />                        .click(this.proxy('do_refresh_action'));<br />                    self.__parentedParent.$el.find('.oe_list_buttons').append(button1);<br />                }<br />            });<br />        },<br />        do_refresh_action: function () {<br />            var self = this;<br />            var action_manager = new instance.web.ActionManager(self);<br /><br />            return action_manager.do_action('dftg_ext.action_purchase_need_refresh_wizard', {<br />                        on_close: function () {<br />                            self.do_search(self.last_domain, self.last_context, self.last_group_by);<br />                        }<br />            });<br />        },<br />        //重载列表数据<br />        do_search: function(domain, context, group_by) {<br />            var self = this;<br />            this.last_domain = domain;<br />            this.last_context = context;<br />            this.last_group_by = group_by;<br />            this.old_search = _.bind(this._super, this);<br />            return self.old_search(new instance.web.CompoundDomain(self.last_domain), self.last_context, self.last_group_by);<br />        },<br />    });<br />[/quote]<br /><br /><br />因为我是对一个对象写多个不同的视图,我在图一中这样指定view_id,没有找到,所以我又在下面按图二的方式又指定了一下,按钮就不显示了,请问这个怎么解决???<br />[/quote]<br />除了上楼静静的方法,还有一个方法,在action中添加<field name="context">{'tree_view_ref': '包名.视图id'}</field>


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待