Search, Filter, Group By trong Odoo

  Aug 26, 2021      2m      0   
 

Tut 14: Search, Filter & Group By

Search, Filter, Group By trong Odoo

Odoo Tut 14: Search, Filter & Group

Trước khi xem bài viết này, bạn vui lòng hoàn thành hướng dẫn ở Tut 13: Thêm button cho list/tree view trong Odoo.

Bài viết này sẽ hướng dẫn bạn:

  • Thêm mới cách tìm kiếm trên một trường dữ liệu (Custom Search in Odoo)
  • Thêm mới bộ lọc dữ liệu trong Odoo (Custom Filter in Odoo)
  • Thêm mới nhóm dữ liệu theo cột trong Odoo (Custom Group By in Odoo)

Code mẫu hoàn chỉnh việc customize search, filter, group trong Odoo bạn có thể tải về ở cuối bài viết

Môi trường lập trình:

  • Ubuntu
  • Python 3
  • Odoo 13 (released 2019)

Tham khảo cách tạo dựng môi trường Odoo 13 với Docker Compose: https://github.com/minhng92/odoo-13-docker-compose

Thanh điều khiển tìm kiếm, lọc và nhóm trong giao diện danh sách

Giao diện mặc định list view trong Odoo sẽ có sẵn các thành phần:

  • Thanh tìm kiếm dữ liệu nằm trong search view
  • Lọc dữ liệu và nhóm dữ liệu nằm trong control panel (right)

odoo control panel

Bài viết hôm nay Minh sẽ customize các thành phần tìm kiếm (search), lọc dữ liệu (filter) và nhóm theo dữ liệu (group by) trong Odoo.

Customize search theo field

Mặc định thanh tìm kiếm sẽ chỉ cho phép tìm kiếm theo tên (tương ứng trường name) cho một model mới - tức custom model. Do đó, để việc thêm lựa chọn tìm kiếm trên những trường dữ liệu khác ta phải code thêm.

odoo search view on fields

Trong file view XML ta chèn thêm một đoạn code để mô tả / khai báo các lựa chọn tìm kiếm bổ sung. Vị trí chèn đoạn code cho search field như hình bên dưới.

odoo khai báo search field

mypet/views/my_pet_views.xml

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data>
        <!-- ... -->
        <!-- các đoạn code phía trên giữa nguyên như cũ -->
        
        <record id="my_pet_search_view" model="ir.ui.view">
            <field name="name">my_pet_search_view</field>
            <field name="model">my.pet</field>
            <field eval="10" name="priority"/>
            <field name="arch" type="xml">
                <search string="My Pet Search">
                    <field name="name" string="Pet Name"/>
                    <field name="nickname" string="Nick Name"/>
                    <field name="owner_id"/>
                </search>
            </field>
        </record>

        <record id="action_my_pet" model="ir.actions.act_window">
            <!-- ... -->
            <!-- các đoạn code phía trên giữa nguyên và khai báo "search_view_id" của action trỏ đến "my_pet_search_view" -->
            <field name="search_view_id" ref="my_pet_search_view"/>
        </record>
        <!-- ... -->
    </data>
</odoo>

Trong thẻ search ta khai báo lần lượt các field có thể được tìm kiếm như: name, nicknameowner_id.

Cập nhật module mypet, quay lại list view, refresh trang và thử tìm kiếm để xem kết quả.

Customize filter trong Odoo

Filter trong Odoo cho phép lọc dữ liệu theo điều kiện định sẵn. Việc bổ sung các lựa chọn filter làm tăng trải nghiệm người dùng thay vì phải tạo bộ lọc thủ công ở nút Add Custom Filter.

odoo filters

mypet/views/my_pet_views.xml

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data>
        <!-- ... -->
        <!-- các đoạn code phía trên giữa nguyên như cũ -->
        
        <record id="my_pet_search_view" model="ir.ui.view">
            <field name="name">my_pet_search_view</field>
            <field name="model">my.pet</field>
            <field eval="10" name="priority"/>
            <field name="arch" type="xml">
                <search string="My Pet Search">
                    <field name="name" string="Pet Name"/>
                    <field name="nickname" string="Nick Name"/>
                    <field name="owner_id"/>
                    <!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
                    <!-- khai báo các filter trong Odoo như bên dưới: -->
                    <!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
                    <group expand='0' string='Filters'>
                        <filter name='weight_filter' string="Low Weight (&lt; 5kg)" domain="[('weight', '&lt;', 5)]"/>
                        <separator/>
                        <filter name="male_filter" string="Male" domain="[('gender', '=',  'male')]"/>
                        <filter name="female_filter" string="Female" domain="[('gender', '=',  'female')]"/>
                    </group>
                </search>
            </field>
        </record>

        <!-- các đoạn code phía dưới giữa nguyên như cũ -->
        <!-- ... -->        
    </data>
</odoo>

Theo code trên, ta đặc tả các thẻ filter để lọc dữ liệu theo điều kiện định sẵn, cũng như đặt tên cho bộ lọc (thuộc tính string) sẽ hiển thị trên giao diện.

Cập nhật module mypet, quay lại list view, refresh trang và click vào Filters để xem các bộ lọc mới được thêm vào.

Customize group by trong Odoo

Nhóm dữ liệu (Group By) trong Odoo cho phép nhóm dữ liệu theo cột và ta cũng có thể Group By nhiều lần liên tiếp.

odoo group by

Để thêm các Group định sẵn, ta khai báo như sau:

mypet/views/my_pet_views.xml

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data>
        <!-- ... -->
        <!-- các đoạn code phía trên giữa nguyên như cũ -->
        
        <record id="my_pet_search_view" model="ir.ui.view">
            <field name="name">my_pet_search_view</field>
            <field name="model">my.pet</field>
            <field eval="10" name="priority"/>
            <field name="arch" type="xml">
                <search string="My Pet Search">
                    <field name="name" string="Pet Name"/>
                    <field name="nickname" string="Nick Name"/>
                    <field name="owner_id"/>
                    <group expand='0' string='Filters'>
                        <filter name='weight_filter' string="Low Weight (&lt; 5kg)" domain="[('weight', '&lt;', 5)]"/>
                        <separator/>
                        <filter name="male_filter" string="Male" domain="[('gender', '=',  'male')]"/>
                        <filter name="female_filter" string="Female" domain="[('gender', '=',  'female')]"/>
                    </group>
                    <!-- ++++++++++++++++++++++++++++++++++++++++++++++ -->
                    <!-- khai báo các Group By trong Odoo như bên dưới: -->
                    <!-- ++++++++++++++++++++++++++++++++++++++++++++++ -->
                    <group expand='0' string='Group by...'>
                        <filter string='Gender' name="gender_group" context="{'group_by': 'gender'}"/>
                        <filter string='Owner' name="owner_group" context="{'group_by': 'owner_id'}"/>
                    </group>
                </search>
            </field>
        </record>

        <!-- các đoạn code phía dưới giữa nguyên như cũ -->
        <!-- ... -->        
    </data>
</odoo>

Cập nhật module mypet, quay lại list view, refresh trang và click vào Group By để xem các lựa chọn mới được thêm vào.

Code Download

Code mẫu hoàn chỉnh Tut 14: mypet_210826.zip


Cài đặt Odoo:

Danh sách bài viết series Odoo:

Tham gia ngay group trên Facebook để cùng thảo luận với đồng bọn nhé:

Khám phá Odoo


Khám phá xử lý ảnh - GVGroup




-->