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

由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

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

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

odoo10 js实现全局搜索某个模型



  • 借鉴gooderp的搜索的JS代码和XML代码如下:
    问题:
    1、show_query_board这个函数中的是使用 new Model('product.template').call()
    实际是想查询字段code=XXX值的model并跳转到查询到的form视图上,现在都是跳转到的视图都是新建的视图且是编辑状态的,怎么跳转到通过name_search查询到的code的有具体信息的form视图?
    2、'values': _.map(results, function(result) {}渲染视图的 时候,这个方法_.map()什么意思,是python中map()函数的翻版使用吗?都有哪些这种函数,官方文档中没有找到?
    3、查询的数据返回json数据的时候,key是不是就是在xml中引用的?xml代码如下。看应用是不是有问题。

    或者有都介绍下这个使用的都行。

    JS代码:

    odoo.define('web_stock_query', function(require) {
        var Client = require('web.WebClient');
        var Model = require('web.DataModel');
        var Core = require('web.core');
    //    var modell = new instance.web.Model("product.template");
        
        Client.include({
            show_application: function() {
                this._super.apply(this, arguments);
                this.show_stock_query();
                this.$board = false;
            },
    
            show_stock_query: function() {
                var self = this,
                    $query = $('<ul class="nav navbar-nav navbar-right nav-stock-query"><li><input type="text" placeholder="查询"/><a class="query"></a><a class="destroy"></a><div class="stock-query-search-list"/></li></ul>'),
                    $input = $query.find('input'),
                    $destroy = $query.find('.destroy');
    
                $input.on('focus', function(event) {
                    $input.addClass('editable');
                    if ($input.val() !== '' && self.$board) self.$board.fadeIn('fast');
                }).on('blur', function(event) {
                    if ($input.val() === '') {
                        $input.removeClass('editable');
                    }
                    self.hide_query_board();
                }).on('input', function(event) {
                    if ($input.val() === '') {
                        $destroy.fadeOut('fast');
                        self.hide_query_board();
                    } else {
                        $destroy.fadeIn('fast');
                        self.show_query_board($input);
                    }
                }).on('keydown', function(event) {
                    switch (event.which) {
                        case $.ui.keyCode.ENTER:
                            self.select_query();
                            break;
                        case $.ui.keyCode.DOWN:
                            self.query_board_move('down');
                            event.preventDefault();
                            break;
                        case $.ui.keyCode.UP:
                            self.query_board_move('up');
                            event.preventDefault();
                            break;
                    }
                });
    
                $query.on('mousedown', '.stock-query-search-list li:not(.search-list-more)', function(event) {
    //                alert('mousedown====')
                    self.select_query($(this));
                }).on('mousedown', '.search-list-more', function(event) {
    //                alert('mousedown')
                    self.open_report_stock_balance();
                }).on('hover', '.stock-query-search-list li', function(event) {
                    self.query_board_move($(this));
                }).on('click', '.destroy', function(event) {
                    $input.val('');
                    $input.focus();
                    $destroy.fadeOut('fast');
                });
    
                $('.oe_systray').before($query);
            },
    
            show_query_board: function($input) {
                var self = this;
                new Model('product.template').call('name_search', {name: $input.val()} ).then(function(results) {
                var self = this;
                if (results.length <= 0) return self.hide_query_board();
    
                self.$board = $(Core.qweb.render('web_stock_query.search_list', {'values': _.map(results, function(result) {
                    return {id: result[0], default_code: result[1]};
                })}));
    
                self.$board.attr('top', $input.height() + 2 + 'px');
                $input.parent().find('.stock-query-search-list').html(self.$board);
            });
            },
    
            hide_query_board: function() {
                if (this.$board) this.$board.fadeOut('fast');
            },
    
            query_board_move: function(direction) {
    //            alert('query board move');
                if (this.$board) {
                    var current_move = this.$board.find('li.select'),
                        next_move = false;
    
                    if (_.contains(['up', 'down'], direction)) {
                        next_move = direction === 'down'? current_move.next(): current_move.prev();
                        if (next_move && next_move.is('li')) {
                            var offset_y = next_move.offset().top - (direction === 'down'? this.$board.height(): 40);
                            this.$board.scrollTop(this.$board.scrollTop() + offset_y);
                        }
                    } else if (direction.jquery) {
                        next_move = direction;
                    }
    
                    if (next_move && next_move.is('li')) {
                        next_move.addClass('select').siblings('.select').removeClass('select');
                    }
                }
            },
    
            open_report_stock_balance: function() {
    //            alert('===open report stock balance==');
                this.action_manager.do_action({
                    type: 'ir.actions.act_window',
                    res_model: 'product.template',
                    views: [[381, 'form'], [false, 'list']],
    //                limit:80000,
                    target: 'current',
                    name: 'Parts',
                });
            },
    
            select_query: function($target) {
    //            alert('----select query----');
                var self = this;
                if (self.$board) {
                    $target = $target || self.$board.find('li.select');
                    if ($target.hasClass('search-list-more')) {
                        return self.open_report_stock_balance();
                    }
    
                    self.action_manager.do_action({
                        type: 'ir.actions.act_window',
                        res_model: 'product.template',
                        views: [[381, 'form'], [false, 'list']],
    //                    domain: [['default_code', '=', $target.data('default_code')]],
                        target: 'current',
    //                    name: 'Parts',
                        name: '搜索:' + $target.text().trim(),
                    });
                }
            }
        });
    });
    
    

    XML代码:

    <?xml version='1.0' encoding='UTF-8'?>
    <templates id='template' xml:space='preserve'>
    <t t-name='web_stock_query.search_list'>
        <ul >
            <li t-foreach='values' t-as='product_number' t-attf-class='{{ default_code and "select" or ""}}' t-att-data-id='id' >
                <t t-esc='default_code' />
            </li>
    
            <li class='search-list-more'>查询</li>
    
        </ul>
    </t>
    </templates>
    

Log in to reply