C’est quoi un template ?¶
Un template est la réponse que retourne NTeABot à la suite d’une requête utilisateur. Pour chaque intent (action) d’un field, il faut créer un fichier de template correspondant à la langue de la requête et de même nom pour le matcher.
Note
Le nom attribué à un template (la valeur de la clé action) doit être identique à celui de l’action
Dans notre cas, notre field cooltravelfield
traite de deux langues, donc notre dossier templates
aura deux sous-dossiers (en
, fr
) dans lequel il faudra construire des fichiers YAML
de template pour traiter chaque langue.
templates
fr
cooltravel_template.yaml
en
cooltravel_template.yaml
Un template est aussi un fichier YAML
avec la structure suivante:
# cooltravelfield/templates/fr/cooltravel_template.yaml
---
action: BookTrain
params:
startedPlace:
required: true
template: "Quel est votre point de départ ?"
form: text
from: input
targetPlace:
required: true
template: "Quelle est votre destination d'arrivée ?"
form: text
from: input
travelAgencyName:
required: true
template: "Dans quelle agence de voyage souhaites-tu faire ce voyage ?"
form: text
from: input
cooltravelHtml:
required: true
template: ""
form: html
from: action
language: en
responses:
found:
- ["D'accord, je regarde ça pour toi!", "{cooltravelHtml}"]
- ["Bonne idée, je jette un coup d'oeil!", "{cooltravelHtml}"]
- ["Ok, je cherche des trains disponibles...", "Super, j'ai trouvé ces trains", "{cooltravelHtml}"]
nofound:
- ["OK je regarde cela pour toi"]
- ["Désolé, je n'ai pas trouvé de réservation disponible pour ta recherche."]
---
action: BookBus
params:
startedPlace:
required: true
template: "Quel est votre ville de départ ?"
form: text
from: input
targetPlace:
required: true
template: "Quelle est votre destination d'arrivée ?"
form: text
from: input
travelAgencyName:
required: true
template: "Dans quelle agence de voyage souhaites-tu faire ce voyage ?"
form: text
from: input
cooltravelHtml:
required: true
template: ""
form: html
from: action
language: en
responses:
found:
- ["D'accord, je regarde les bus de {startedPlace} à {targetPlace}", "{cooltravelHtml}"]
- ["Bonne idée, je jette un coup d'oeil!", "{cooltravelHtml}"]
- ["Ok, je regarde si je trouve des bus disponibles...", "Super, j'ai trouvé ces bus!", "{cooltravelHtml}"]
nofound:
- ["OK je regarde cela pour toi..."]
- ["Désolé, je n'ai pas trouvé de réservation disponible pour ta recherche."]
Warning
Dans ce fichier cooltravel_template.yaml
nous avons deux templates BookTrain
et BookBus
séparés par trois tirets de six ---
. A chaque fois que vous souhaitez ajouter un nouveau template dans un fichier, penser à ces trois tirets.
Les constituants d’un template¶
action
donne le nom de l’action défini dans l’intent: iciBookBus
etBookTrain
params
défini les paramètres utilisateurs capturés de l’intent et éventuellement les paramètres injectés par le traitement de l’action.language
défini la langue utilisée pour rédiger lesreponses
du template. Cette langue correspond au nom du dossier parent.responses
permet de lister les réponses possibles de NTeABot. Une réponse de NTeABot contient différents types de format selon qu’une réponse est retournée par l’actionfound
ou pasnofound
. Ces blocs peuvent contenir plusieurs sous-réponses qui se séquencent intéractivement dans un tableau:["Bonne idée, je jette un coup d'oeil!", "{cooltravelHtml}"]
. Il existe deux types de réponses:- Les réponses de type text sont des chaines de caractères simples:
"Bonne idée, je jette un coup d'oeil!"
. Ces réponses de type text peuvent contenir des paramètres de formeform: text
venant de l’actionfrom: action
ou de l’inputfrom: input
. - Les réponses de type html sont les réponses injectées par le fichier Python de l’action:
"{cooltravelHtml}"
(cooltravelHtml est le nom de la variable qui sera retourné par le fichier request Python ).
- Les réponses de type text sont des chaines de caractères simples:
Les paramètres d’un template¶
Les paramètres du template ont les caractéristiques suivantes:
- Ils viennent soit des utilisateurs
from: input
(extraits de la requête utilisateur), soit des actionsfrom: action
(injecté par le fichier Python). Pour le cas defrom: action
, le nom du paramètre doit être identique au nom de la variable injectée par le fichier Python. - Ils sont de type textuels
form: text
(chaine de caractères) et de type HTMLform: html
. - Ils sont facultatifs
required: false
ou obligatoirerequired: true
. - S’ils sont obligatoires
required: true
, ils doivent admettre un template supplémentairetemplate: "Quel est votre ville de départ ?"
. NTeABot oblige alors l’utilisateur à renseigner ce paramètre avant d’exécution l’action proprement dite. Le message envoyé à l’utilisateur sera la valeurtemplate
du paramètre.
Les éléments suivants illustrent les cas possibles de définition d’un paramètre:
startedPlace:
required: true
template: "Quel est votre ville de départ ?"
form: text
from: input
cooltravelHtml:
required: true
template: ""
form: html
from: action
cooltravelTime:
required: true
template: ""
form: text
from: action
cooltravelDate:
required: false
template: ""
form: text
from: input
Construire un template HTML¶
Nos templates sont construits sous la base du moteur de template Python Jinja. Il serait bien pour vous d’y jeter un coup d’oeil avant de continuer cette section.
Si vous avez déclaré "{cooltravelHtml}"
dans une des réponses du template ["Bonne idée, je jette un coup d'oeil!", "{cooltravelHtml}"]
, ça veut dire que la requête de votre fichier Python où est traitée votre action BookBus
doit renvoyer une variable cooltravelHtml
contenant la structure HTML voulue.
Vous devez donc créer dans votre dossier templates
un fichier HTML portant le même nom de cette variable cooltravelHtml.html
. Le contenu de cooltravelHtml.html
sera par exemple:
{# Template for card resume for NTeABot : #}
<div class="blb-slideshow" style="width:245px; margin:auto">
<ul class="xxx" style="width:{{cooltravelHtml|length * 245}}px">
{% for item in cooltravelHtml -%}
<li style="width:245px">
<div>
<div class="blb-dico-titre">
<h2><i class="em em-closed_book"></i> {{item['travel_name']}}</h2>
<span class="blb-dico-small">{{ item['travel_description']}}</span>
</div>
<div class="blb-dico-text">{{item['travel_hour']}}</div>
<div class="blb-dico-auteur">{{item['travel_price']}}</div>
<div>
</li>
{%- endfor %}
</ul>
</div>
<a class="blb-nav-slideshow-left"><img width="25" src="https://apis.ntealan.net/nteabot/static/img/left.png"></a>
<a class="blb-nav-slideshow-right"><img width="25" src="https://apis.ntealan.net/nteabot/static/img/right.png"></a>
Ce fichier utilise le template de navigation par défaut (slide show) de NTeABot:
<div class="blb-slideshow" style="width:245px; margin:auto">
{# ici le contenu html de l'action de votre field #}
</div>
<a class="blb-nav-slideshow-left"><img width="25" src="https://apis.ntealan.net/nteabot/static/img/left.png"></a>
<a class="blb-nav-slideshow-right"><img width="25" src="https://apis.ntealan.net/nteabot/static/img/right.png"></a>
Vous pouvez si vous le souhaitez, créer vos propres templates HTML en veuillant juste à placer les styles css (sans aucunes librairies externes comme boostrap
) directement dans les balises HTML. Les liens ou images insérés dans les balises doivent être absolus.
<div class="blb-slideshow" style="width:245px; margin:auto">
<div style="padding:5px; font-size: 12px">
<span style="color: gray; float:left"> </span>
<p>
<div style="background-image: url(https://mysite.org/static/imag.png)">
...
<div>
</p>
</div>
</div>
Les templates par défaut de NTeABot¶
Si vous le souhaitez, vous pouvez utiliser les templates par défaut de NTeABot. Nous avons actuellement 8 :
Templates | Paramètres | Exemples |
---|---|---|
ntb_array_dico | - short_name - description - publication - author | |
ntb_array_html | - article | |
ntb_array_image | - logo - url - title - content | |
ntb_list_text | - text - value | |
ntb_array_video | ||
ntb_login | ||
ntb_resume | ||
ntb_video |
Pour les utiliser, il vous suffira de le déclarer dans vos templates et de construires le fichier request de manière à macher les paramètres du templates aux sorties de la requête. cf. la section request.