Cet article explique comment créer ses propres contrôleurs sur Odoo pour afficher une page web personnalisée.
Odoo est un outil riche en fonctionnalités et en possibilités: avec Odoo on peut tout faire et c'est pourquoi aujourd'hui je vais vous montrer comment créer un controlleur pour avoir de nouvelles pages dynamiques. Grâce aux controlleurs vous pouvez utilisez Odoo comme un framework et y ajouter de nouvelles fonctionnalités.
Nous allons coder une fonctionnalité vraiment basique qui va permettre de créer un partenaire à partir d'une autre page web qui sera servie par un controlleur.
Premièrement, il faut créer un module normal que vous allez appeler new_module. Ce module dépends du module website et sera organisé comme suit:
new_module/
controllers/
__init__.py
main.py
views/
res_partner.xml
__manifest__.py
Deuxième point: créez votre controlleur dans le fichier main.py
from odoo.http import request, route
class ResPartnerPage(http.Controller):
""" Controlleur pour créer le partenaire """
@route(['/new/partner'], type='http', auth="user", website=True)
def new_partner(self, **kwargs):
values = {'page_name': 'Nouveau Partenaire'}
if bool(kwargs):
http.request.env['res.partner'].sudo().create({
'name': kwargs.get('name'),
'email': kwargs.get('email'),
'phone': kwargs.get('phone'),
'company_type': kwargs.get('company_type'),
})
return request.render("new_module.page_create_partner", values)
Explications
1- J'importe les objets nécessaires: request pour traiter les requêtes HTTP, route pour définir l'URL
2- Définition de la classe ResPartnerPage qui est une sous classe de http.Controller
3- Définition de la route @route(['/new/partner'], type='http', auth="user", website=True). Dans la liste on définit l'URL de la page; type='http' permet de définir qu'il sagit d'une requête HTTP; auth="user" impose que l'utilisateur soit connecté avant d'accéder à la page, website=True défini qu'il s'agit d'une nouvelle page web.
4- On définit la fonction qui prend en paramètre kwargs. kwargs est un dictionnaire qui récupère les données entrées en formulaire
5- values est un dictionnaire qui prend en compte les données qu'on aimerait ajouter sur la page web
6- On vérifie que le formulaire a été soumis avec les données puis on enregistre ces données en BD sur le modèle res.partner. On utilise la fonction sudo() pour forcer l'enregistrement au cas où l'utilisateur n'aurait pas accès au modèle
7- la dernière ligne permet d'afficher la page via le template page_create_partner du module new_module
Troisième point: Créer le template page_create_partner dans le fichier res_partner.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="page_create_partner" name="New Partner Page">
<t t-call="website.layout">
<div class="oe_structure">
<div class="container">
<center><h3><t-esc='page_name'/></h3></center>
<div id="wrap">
<div class="col-md-3"><div/>
<div class="col-md-6">
<form action="/new/partner" method="post">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="form-group">
<label for="email-input">Email:</label>
<input type="email" class="form-control" name="email" id="email-input" />
</div>
<div class="form-group">
<label for="name-input">Nom:</label>
<input type="text" class="form-control" name="name" id="name-input" />
</div>
<div class="form-group">
<label for="phone-input">Téléphone:</label>
<input type="tel" class="form-control" name="phone" id="phone-input" />
</div>
<div class="form-group">
<label for="company-type-input">Téléphone:</label>
<select class="form-control" name="company_type" id="company-type-input">
<option value="">Sélectionnez un type</option>
<option value="person">Individus</option>
<option value="company">Entreprise</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Créer</button>
</form>
</div>
<div class="col-md-3"><div/>
</div>
</div>
</div>
</t>
</template>
</data>
</odoo>
Explications
1- <center><h3><t-esc='page_name'/></h3></center> permet de définir le nom de la page issue de values précédemment définie dans le controlleur
2- <form action="/new/partner" method="post"> défini le formulaire qui sera soumis via la méthode post
3- <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/> ajoute une protection pour éviter les attaques de type CSRF
4- on définit nos inputs et on soumet le formulaire via le bouton
Quatrième point
N'oubliez pas d'inclure le fichier .xml dans le manifest, installez votre module et allez à l'adresse /new/partner pour créer votre nouveau partenaire.