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/.
@http.route() untuk memetakan sebuah URL (misal: /shop) ke sebuah metode Python. Saat ada yang akses URL itu, metodenya dieksekusi.Mari buat halaman web yang menyapa dunia!
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.
Restart server Odoo Anda.
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, ...)
route: URL yang ingin Anda "tangkap".auth: Siapa yang boleh akses?
public: Siapa saja boleh.user: Harus login.none: Tidak ada cek (biasa untuk API).website=True: Otomatis pasang header & footer website Odoo ke halaman Anda. Keren!type: Tipe request.
http: Untuk halaman web biasa (mengembalikan HTML).json: Untuk API (input & output otomatis diubah ke format JSON).
Menulis HTML di Python itu merepotkan. Odoo punya solusinya: QWeb, sebuah template engine untuk merender HTML secara dinamis.
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>
Daftarkan file template itu di __manifest__.py.
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!
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