# 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 formulaire
  • string: 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 Element
  • index : 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;
  }
}