# Aide à la saisie avec des entrées
# Spécification de l'aide à la saisie
L'aide à la saisie peut recevoir des arguments en entrée qui servent à conditionner le retour. Les arguments en entrée
sont spécifiés dans les balises config/structure-configuration/autocompletion/field-autocomplete/field-argument
.
Le type d'argument indiqué dans l'attribut type
peut être :
field
: indique que la valeur de l'argument est la valeur du champ correspondant dans le formulairestring
: indique que la valeur est la valeur indiquée dans la balise.property
: indique que la valeur est la valeur de la propriété du Smart Elementindex
: Dans le cas où le Smart Field est dans un tableau, cela donne la rangée dans le tableau (0 étant la première rangée).this
: Retourne l'objet PHP "SmartElement" courant.
Les propriétés supportées pour les aides à la saisies sont :
Propriétés | Définition |
---|---|
id | Identifiant numérique (vide si formulaire de création) |
initid | Identifiant numérique initial (vide si formulaire de création) |
fromid | Identifiant de la structure |
title | Titre du Smart Element |
viewId | Identifiant de la vue du formulaire |
La méthode reçoit les arguments d'entrée dans le troisième paramètre de la fonction. Ce paramètre est un tableau de valeurs.
L'argument peut être nommé (avec l'attribut name
), dans ce cas le tableau d'arguments reçu est indexé avec ce nom.
Sinon il est indexé avec des numéros tel un tableau standard.
L'exemple suivant montre que les valeurs du champ my_country
dépendent du champ my_continent
et que le champ
my_location
dépend des deux champs my_country
et my_continent
.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
<smart:structure-configuration name="MYLOCATION" label="Location">
<smart:fields>
<smart:field-set name="my_fr_ident" type="frame" access="ReadWrite" label="Identification">
<smart:field-text name="my_title" is-title="true" access="ReadWrite" label="Title"/>
<smart:field-enum name="my_continent" access="ReadWrite" label="Continent" relation="continentSet"/>
<smart:field-text name="my_country" access="ReadWrite" label="Country"/>
<smart:field-text name="my_location" access="ReadWrite" label="City"/>
</smart:field-set>
</smart:fields>
<smart:autocompletion>
<smart:field-autocomplete field="my_country">
<smart:field-callable function="Anakeen\SmartStructures\Mydestination\NoteGeoCompletion::getCountries"/>
<smart:field-argument type="field">my_continent</smart:field-argument>
<smart:field-returns>
<smart:field-return field="my_country"/>
<smart:field-return field="my_continent"/>
</smart:field-returns>
</smart:field-autocomplete>
<smart:field-autocomplete field="my_location">
<smart:field-callable function="Anakeen\SmartStructures\Mydestination\NoteGeoCompletion::getCities"/>
<smart:field-argument type="field" name="continentFilter">my_continent</smart:field-argument>
<smart:field-argument type="field" name="countryFilter">my_country</smart:field-argument>
<smart:field-returns>
<smart:field-return name="cityName" field="my_location"/>
<smart:field-return name="countryName" field="my_country"/>
<smart:field-return name="continentName" field="my_continent"/>
</smart:field-returns>
</smart:field-autocomplete>
</smart:autocompletion>
</smart:structure-configuration>
<smart:enumerates>
<smart:enum-configuration name="continentSet">
<smart:enum name="europa" label="Europa"/>
<smart:enum name="asia" label="Asia"/>
<smart:enum name="africa" label="Africa"/>
<smart:enum name="america" label="America"/>
<smart:enum name="oceania" label="Oceania"/>
</smart:enum-configuration>
</smart:enumerates>
</smart:config>
# Traitement de l'aide à la saisie
Fichier "vendor/Anakeen/SmartStructures/Mydestination/NoteGeoCompletion.php" :
Ce fichier contient les 2 méthodes getCountries()
(sans argument nommé) et getCities()
avec arguments nommés
<?php
namespace Anakeen\SmartStructures\Mydestination;
use Anakeen\Core\Utils\Strings;
use Anakeen\SmartAutocompleteRequest;
use Anakeen\SmartAutocompleteResponse;
class NoteGeoCompletion
{
// quelque données pour l'exemple
protected static function getData(): array
{
return [
"europa" => [
"france" => ["paris", "toulouse"],
"italia" => ["roma", "venice"]
],
"america" => [
"argentina" => ["Buenos Aires", "Córdoba", "Rosario"]
]
];
}
public static function getCountries(
SmartAutocompleteRequest $request,
SmartAutocompleteResponse $response,
array $args
): SmartAutocompleteResponse {
// Ici la spécification ne nomme pas les entrées,
// les index des entrées sont alors des numéros d'un tableau standard
$continentFilter = $args[0];
$filter = $request->getFilterValue();
$cities = self::getData();
foreach ($cities as $continent => $countries) {
if (!$continentFilter || $continent === $continentFilter) {
foreach ($countries as $country => $cities) {
if (!$filter || stripos($country, $filter) !== false) {
// Encode $city : Label entry is an HTML fragment
$response->appendEntry(Strings::xmlEncode($country . " / " . $continent), [$country, $continent]);
}
}
}
}
return $response;
}
public static function getCities(
SmartAutocompleteRequest $request,
SmartAutocompleteResponse $response,
array $args
): SmartAutocompleteResponse {
$filter = $request->getFilterValue();
$cities = self::getData();
foreach ($cities as $continent => $countries) {
// Ici la spécification nomme les entrées avec un index "continentFilter"
if (!$args["continentFilter"] || $continent === $args["continentFilter"]) {
foreach ($countries as $country => $cities) {
// Ici la spécification nomme les entrées avec un index "countryFilter"
if (!$args["countryFilter"] || $country === $args["countryFilter"]) {
foreach ($cities as $city) {
if (!$filter || stripos($city, $filter) !== false) {
// Encode $city : Label entry is an HTML fragment
$response->appendEntry(Strings::xmlEncode($city . '/' . $country . " / " . $continent), [
"cityName" => $city,
"countryName" => $country,
"continentName" => $continent
]);
}
}
}
}
}
}
return $response;
}
}