Kita sudah punya "otak" (Model) dan "wajah" (View) untuk backend Odoo. Tapi bagaimana jika kita mau membuat sesuatu untuk "dunia luar"? Seperti halaman web publik, portal pelanggan, atau API untuk aplikasi mobile? Di sinilah Controller unjuk gigi!

Controller adalah "penjaga gerbang" di Odoo yang menangani request dari internet (HTTP) dan memberikan response. Ini adalah cara Odoo mengelola sisi "web"-nya.

File-file controller biasanya ditaruh di direktori controllers/.

📜 Konsep Dasar Controller

👋 Contoh Controller Sederhana: Halaman "Hello World"

Mari buat halaman web yang menyapa dunia!

  1. Buat file controllers/main.py:

    # -*- coding: utf-8 -*-
    from odoo import http
    from odoo.http import request
    
    class HelloWorldController(http.Controller):
    
        @http.route('/hello', auth='public', website=True)
        def say_hello(self, **kwargs):
            # Mengembalikan HTML sederhana sebagai response
            return "<h1>Hello, World! 👋</h1>"
    
    

    Jangan Lupa! Impor file ini di controllers/init.py.

  2. Restart server Odoo Anda.

  3. Akses URL: Buka browser dan kunjungi http://localhost:8069/hello. Anda akan disambut oleh halaman baru Anda!

🧐 Bedah @http.route()

@http.route(url, auth, type, website, ...)

📄 Menggunakan Template QWeb

Menulis HTML di Python itu merepotkan. Odoo punya solusinya: QWeb, sebuah template engine untuk merender HTML secara dinamis.

  1. Buat Template QWeb di views/templates.xml:

    <odoo>
        <template id="hello_world_template">
            <t t-call="website.layout">
                <div id="wrap" class="container">
                    <h1>Hello, <t t-esc="person_name"/>! 🎉</h1>
                    <p>Selamat datang di halaman kustom pertama Anda.</p>
                </div>
            </t>
        </template>
    </odoo>
    
    
  2. Daftarkan file template itu di __manifest__.py.

  3. Update Controller untuk menggunakan template:

    @http.route('/hello-qweb', auth='public', website=True)
    def say_hello_qweb(self, **kwargs):
        context = {'person_name': 'Odoo Developer'}
        # 'nama_modul.hello_world_template' adalah ID template
        return request.render('nama_modul.hello_world_template', context)
    
    

    Sekarang, akses http://localhost:8069/hello-qweb untuk melihat hasilnya!

🤖 Membuat Endpoint JSON (API)

Controller juga cara standar untuk membuat API.

class BookApiController(http.Controller):

    @http.route('/api/books', auth='public', type='json', methods=['GET'])
    def get_books(self):
        books = request.env['library.book'].search_read(
            [], # Filter kosong = ambil semua
            ['id', 'name', 'author'], # Ambil field ini saja
            limit=10
        )
        return books