Customize Search view ใน Odoo

แชร์ความรู้ภาษา Python ไพทอน การเขียนโปรแกรมภาษาไพทอน

Moderator: mindphp, ผู้ดูแลกระดาน

Bundith
PHP Super Member
PHP Super Member
โพสต์: 298
ลงทะเบียนเมื่อ: 06/05/2025 9:23 am

Customize Search view ใน Odoo

โพสต์ที่ยังไม่ได้อ่าน โดย Bundith »

Search หนึ่งในฟีเจอร์สำคัญที่ช่วยให้ผู้ใช้งานสามารถเข้าถึงข้อมูลได้อย่างรวดเร็วและแม่นยำ คือ ระบบการค้นหา (Search) ภายในแต่ละโมดูล เช่น Sales, Inventory, CRM, Accounting และอื่นๆ Odoo จะมีระบบค้นหาพื้นฐานให้ใช้งานอยู่แล้ว แต่การ ปรับแต่ง Search ให้สามารถค้นหาได้หลายรูปแบบ จะช่วยเพิ่มประสิทธิภาพในการทำงาน โดยเฉพาะกับองค์กรที่มีข้อมูลจำนวนมากหรือมีความซับซ้อนในการจัดเก็บข้อมูลในบทความนี้ เราจะพาไปทำความเข้าใจเกี่ยวกับรูปแบบของการค้นหาใน Odoo วิธีการปรับแต่งให้ค้นหาได้หลายรูปแบบ พร้อมยกตัวอย่าง และให้คำแนะนำในการนำไปใช้งานจริง
Odoo search view.png
Odoo search view.png (339.1 KiB) Viewed 828 times
1. ประเภทของ Search ใน Odoo
Odoo มีระบบค้นหาหลักๆ อยู่ 3 รูปแบบ ได้แก่:
  • Basic Search: ค้นหาข้อความในฟิลด์ที่ตั้งค่า searchable เช่นชื่อสินค้า, รหัสลูกค้า, หมายเลขใบสั่ง เป็นต้น
  • Advanced Search (Filters & Group by): เลือกเงื่อนไขการค้นหาและจัดกลุ่มข้อมูล เช่น เลือกเฉพาะใบสั่งที่ “อยู่ในสถานะ Draft”
  • Custom Search Domains: การใช้ Domain Expressions เพื่อสร้างเงื่อนไขค้นหาแบบกำหนดเอง เช่น ['|', ('name', 'ilike', 'ABC'), ('phone', '=', '123456')]
2. ปรับแต่ง Search ใน Model ด้วย search_view
Odoo ใช้ search_view เป็นตัวควบคุมโครงสร้างของหน้า Search View ซึ่งสามารถปรับแต่งได้ผ่าน XML:

โค้ด: เลือกทั้งหมด

<record id="view_partner_search_custom" model="ir.ui.view">
  <field name="name">res.partner.search.custom</field>
  <field name="model">res.partner</field>
  <field name="inherit_id" ref="base.view_res_partner_filter"/>
  <field name="arch" type="xml">
    <xpath expr="//filter[@name='customer']" position="after">
      <filter name="vip" string="VIP Customers" domain="[('is_vip','=',True)]"/>
    </xpath>
    <xpath expr="//search" position="inside">
      <field name="phone"/>
      <field name="email"/>
    </xpath>
  </field>
</record>
ประโยชน์:
  • เพิ่ม Filter เฉพาะกลุ่มลูกค้า VIP
  • ค้นหาโดยใช้เบอร์โทรศัพท์หรืออีเมลได้โดยตรง
3. การเพิ่มฟิลด์ใหม่ให้สามารถค้นหาได้
โดยปกติ ฟิลด์ใน Odoo จะไม่สามารถค้นหาได้ทันที เว้นแต่มีการกำหนด searchable หรือ index ดังนั้นหากต้องการเพิ่มฟิลด์ใหม่ให้ค้นหาได้ ต้องแก้ไขใน Python Model:

โค้ด: เลือกทั้งหมด

class ResPartner(models.Model):
    _inherit = 'res.partner'

    is_vip = fields.Boolean(string="VIP")
    card_id = fields.Char(string="Card ID", index=True)
จากนั้นสามารถนำ card_id ไปใช้ใน Search View ได้ทันที

4. การใช้ Custom Search Function (Override name_search)
ในบางกรณี ผู้ใช้ต้องการให้สามารถค้นหาข้อมูลจากหลายฟิลด์พร้อมกัน เช่น ต้องการค้นหาลูกค้าจากชื่อ เบอร์โทร หรือรหัสบัตรประจำตัว
สามารถ override ฟังก์ชัน name_search ได้ดังนี้:

โค้ด: เลือกทั้งหมด

def name_search(self, name, args=None, operator='ilike', limit=100):
    args = args or []
    if name:
        args += ['|', '|',
                 ('name', operator, name),
                 ('phone', operator, name),
                 ('card_id', operator, name)]
    return self.search(args, limit=limit).name_get()
ประโยชน์:
  • ผู้ใช้สามารถกรอกอะไรก็ได้ (ชื่อ/เบอร์/รหัส) แล้วค้นหาเจอเลยในช่องเดียว
  • เพิ่มความสะดวกในการใช้งานระบบสำหรับทีมขายหรือแอดมิน
5. การเพิ่ม Autocomplete และ Suggestion
สำหรับช่อง Many2one หรือ Selection field สามารถเพิ่ม Suggestion ขณะพิมพ์เพื่อช่วยให้ผู้ใช้เลือกข้อมูลได้ง่ายขึ้น โดยใช้ name_get() และ name_search() ที่ปรับแต่งให้แสดงผลลัพธ์ตามที่ต้องการ เช่น:

โค้ด: เลือกทั้งหมด

def name_get(self):
    result = []
    for rec in self:
        name = f"{rec.name} [{rec.card_id}]" if rec.card_id else rec.name
        result.append((rec.id, name))
    return result
6. การค้นหาแบบ Full-Text Search (PostgreSQL)
สำหรับระบบที่ต้องการค้นหาข้อมูลขนาดใหญ่หรือข้อความยาว เช่น รายละเอียดสินค้า หรือโน้ตคำอธิบาย สามารถใช้ PostgreSQL Full-Text Search โดยใช้โมดูลเสริม หรือปรับแต่ง SQL Query

เช่น ใช้คำสั่ง unaccent + to_tsvector สำหรับรองรับภาษาต่างๆ เช่น ไทย อังกฤษ:

โค้ด: เลือกทั้งหมด

SELECT * FROM product_template
WHERE to_tsvector('simple', unaccent(name)) @@ plainto_tsquery('simple', 'printer')
7. ตัวอย่างการใช้งานในธุรกิจจริง

กรณีศึกษา 1: ร้านค้าปลีก
ร้านค้าต้องการค้นหาสินค้าจากชื่อ รหัสบาร์โค้ด หรือหมวดหมู่
- ใช้ name_search รวมหลายฟิลด์
- ปรับ Search View เพิ่ม Filter หมวดหมู่

กรณีศึกษา 2: ธุรกิจบริการลูกค้า
เจ้าหน้าที่ call center ต้องค้นหาลูกค้าจากชื่อ เบอร์โทร หรือรหัสบัตร
- ปรับ name_get และ name_search ให้รองรับหลายรูปแบบ
- เพิ่ม index บนฟิลด์สำคัญ เช่น phone, card_id เพื่อเพิ่มความเร็ว

กรณีศึกษา 3: บริษัทที่มีข้อมูลจำนวนมาก
ฝ่ายบัญชีต้องการค้นหาใบแจ้งหนี้ที่มีหมายเหตุเฉพาะ
- ใช้ Full-text search สำหรับค้นหาในฟิลด์ note
- กำหนด filter เฉพาะบน field note

สรุป
การปรับแต่งระบบค้นหา (Search) ใน Odoo เป็นอีกหนึ่งแนวทางสำคัญที่ช่วยเพิ่มประสิทธิภาพในการใช้งานระบบ ERP โดยเฉพาะในองค์กรที่มีข้อมูลหลากหลายหรือมีความซับซ้อน การใช้ฟีเจอร์อย่าง search_view, การปรับแต่ง name_search, และการใช้ Full-text Search ช่วยให้ผู้ใช้สามารถค้นหาข้อมูลได้หลายรูปแบบ ตรงจุด และรวดเร็ว, นอกจากจะช่วยลดเวลาในการทำงานแล้ว ยังส่งผลให้การบริการลูกค้า การบริหารจัดการภายใน และการวิเคราะห์ข้อมูลมีประสิทธิภาพมากยิ่งขึ้น ทั้งนี้ ควรเลือกวิธีปรับแต่งให้เหมาะกับลักษณะข้อมูลและความต้องการของผู้ใช้งานในแต่ละองค์กร เพื่อให้ได้ผลลัพธ์สูงสุดจากระบบค้นหาของ Odoo

อ้างอิง
https://www.cybrosys.com/blog/how-to-create-name-search-function-in-odoo-17
https://www.cybrosys.com/blog/configure-search-view-and-filters-and-group-by-in-odoo-15
https://www.cybrosys.com/blog/how-to-add-filters-to-existing-search-view-in-odoo
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 2