Comment créer et associer une aide à la saisie à un Smart Field

Prérequis

Afin de pouvoir suivre ce guide, il faut préalablement avoir

Comment procéder ?

Un plat peut être ajouté à des menus uniquement s’il est à l’état À la carte.

Lors de la confection d’un menu, les plats étant dans un autre état ne doivent donc pas être proposés.

Recommandation

Si vous n’êtes pas familier avec les Aide à la saisie (Autocomplete) et leur fonctionnement, il est fortement recommandé de lire la documentation associée disponible ici et plus particulièrement celle concernant l’aide à la saisie à plusieurs sorties nommées.

De plus, je vous conseille de vous renseigner sur :

Vous l’aurez deviné, la SmartStructure concernée ici est celle du Menu. Deux fichiers sont ici concernés :

  • Le fichier de configuration de la Smart Structure : src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/100-MenuStructure.xml
  • Le fichier gestion de l’aide à la saisie associé à la Smart Structure : src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/MenuAutocompletion/MenuAutocompletetion.php

Astuce

Pensez à générer les stubs. Cela a pour but d’extraire les constantes des différents fichiers de configuration .xml des SmartStructures que vous possédez. Cela apportera ici une complétion sur les Smart Fields, paramètres de Smart Structure, étapes et transitions des cycles de vie, aussi bien dans le PHP que dans le JavaScript. Pour cela :

npx @anakeen/anakeen-cli generateStubs
  • Il faut dans un premier temps créer la méthode permettant d’obtenir des suggestions en rapport avec le champs concerné. Cela se gère dans le fichier MenuAutocompletetion.php :
<?php

namespace Cogip\Restauratec\SmartStructures\Menu\MenuAutocompletion;

use Anakeen\SmartAutocompleteRequest;
use Anakeen\SmartAutocompleteResponse;
use Anakeen\Search\SearchElements;
use Anakeen\Search\Filters\State\Equals;
use Anakeen\Search\Filters\TitleContains;
use Anakeen\Core\Utils\Strings;
use Anakeen\Core\ContextManager;

class MenuAutocompletion
{
  /**
   * @param SmartAutocompleteRequest $request
   * @param SmartAutocompleteResponse $response
   * @param array $args
   * @return SmartAutocompleteResponse
   * @throws \Anakeen\Search\Exception
   */
  public static function getSuggestionsFromElementId(
    SmartAutocompleteRequest $request,
    SmartAutocompleteResponse $response,
    array $args
  ): SmartAutocompleteResponse {
    $userInput = $request->getFilterValue();
    $search = new SearchElements("PLAT");
    // Ajoute un filtre indiquant au champ de ne récupérer que les plats `À la carte`
    $search->addFilter(new Equals("state", "plat_e2"));
    // Si l’utilisateur a saisie un terme dans le champ, ajoute un filtre recherchant un titre de plat contenant cette saisie
    if ($userInput !== "") {
      $search->addFilter(new TitleContains($userInput, TitleContains::NOCASE));
    }
    // Limite le nombre de résultat de la liste déroulante d’aide à la saisie
    $search->setSlice(ContextManager::getParameterValue("Core", "CORE_AUTOCOMPLETE_SLICE", 100));
    $results = $search->search()->getResults();
    foreach ($results as $result) {
      $title = $result->getTitle();
      // Cette méthode ajoute des éléments à la liste d’aide à la saisie proposée à l’utilisateur
      $response->appendEntry(
        // Tout d’abord la valeur affichée dans la liste déroulante
        Strings::xmlEncode($title),
        // Associe à l’attribut "name" de la balise "<smart:field-return>" ...
        // value : l’id du Smart Element selectionné
        // displayValue : la valeur d’affichage/titre de ce Smart Element
        ["platName" => ["value" => $result->initid, "displayValue" => $title]]
      );
    }
    return $response;
  }
}
  • Ensuite, dans le fichier de configuration de la SmartStructure concernée src/vendor/<vendorName>/<moduleName>/SmartStructures/Menu/100-MenuStructure.xml, la balise <smart:autocompletion> est à ajouter et compléter :




























 
 
 
 
 
 
 
 
 
 
 




<?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="MENU" label="Menu">
        <smart:icon file="menu.png"/>
        <smart:class>Cogip\Restauratec\SmartStructures\Menu\MenuBehavior</smart:class>
        <smart:fields>
            <smart:field-set name="menu_frame" type="frame" access="ReadWrite" label="Informations relatives au menu">
                <smart:field-text name="menu_title" needed="true" is-title="true" access="ReadWrite" label="Libellé"/>
                <smart:field-htmltext name="menu_description" access="ReadWrite" label="Description"/>
                <smart:field-set name="menu_composition" type="array" access="ReadWrite" label="Composition du menu">
                    <smart:field-docid access="ReadWrite" name="menu_plat" label="Plat" relation="PLAT"/>
                    <smart:field-docid access="ReadWrite" name="menu_boisson" label="Boisson" relation="BOISSON"/>
                </smart:field-set>
                <smart:field-double name="menu_discount" access="ReadWrite" label="Remise applicable (%)"/>
                <smart:field-money name="menu_price" access="Read" label="Prix (€)"/>
            </smart:field-set>
        </smart:fields>
        <smart:hooks>
            <!-- attribut event : Évênement déclenchant l’appel de la méthode -->
            <!-- attribut field : Champ où sera stocker la valeur retourné par la méthode -->
            <smart:field-hook event="onPreRefresh" field="menu_price">
                <smart:field-callable function="::calculateTotalPrice"/>
            </smart:field-hook>
            <smart:field-hook type="constraint" event="onPreStore" field="menu_discount">
                <smart:field-callable function="Cogip\Restauratec\SmartStructures\Menu\Utils\Menu::checkDiscountValue"/>
                <smart:field-argument type="field">menu_discount</smart:field-argument>
            </smart:field-hook>
        </smart:hooks>
        <smart:autocompletion>
            <!-- Champ concerné par l’aide à la saisie -->
            <smart:field-autocomplete field="menu_plat">
                <!-- Fonction à appeler retournant un tableau de valeurs -->
                <smart:field-callable function="Cogip\Restauratec\SmartStructures\Menu\MenuAutocompletion\MenuAutocompletion::getSuggestionsFromElementId"/>
                <!-- Champ(s) complété(s) par l’aide à la saisie -->
                <smart:field-returns>
                    <smart:field-return name="platName" field="menu_plat"/>
                </smart:field-returns>
            </smart:field-autocomplete>
        </smart:autocompletion>
        <smart:defaults/>
    </smart:structure-configuration>
</smart:config>

Voici quelques plats passés À la carte pour vérifier si l’aide à la saisie mise en place sur notre champ est bien fonctionnelle :

Liste des plats "À la carte"

Voici la liste déroulante présente lors du clique sur le champs de sélection de plat dans la composition d’un menu :

Liste des plats proposés "À la carte"

Et voici le contenu de la liste déroulante variant en fonction de la saisie utilisateur :

Liste des plats qui match la saisie utilisateur

Et ensuite ?

Comment paramétrer le cycle de vie - Gérer le comportement du modèle