Comment ajouter un menu permettant d’accéder à une url spécifique?

Prérequis

Afin de pouvoir suivre ce guide, il faut préalablement savoir Comment associer une classe de rendu à une smart structure.

Objectif

On souhaite ajouter une image aux Smart Elements PLAT et permettre de la visualiser à travers un menu.

Tout d’abord créons un nouveau champ de type image dans nos plats :

src/vendor/Cogip/Restauratec/SmartStructures/Plat/100-PlatStructure.xml :














 












<?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="PLAT" label="Plat">
        <smart:extends ref="CONSOMMABLE"/> <!-- La smart structure PLAT hérite de la smart structure CONSOMMABLE -->
        <smart:icon file="plat.png"/>
        <smart:class>Cogip\Restauratec\SmartStructures\Plat\PlatBehavior</smart:class>
        <smart:fields reset="true">
            <!-- extended="true" indique que l’on récupère ici la frame du parent (Consommable) à laquelle on ajoute d’autres Smart Fields -->
            <smart:field-set name="consommable_frame" extended="true">
                <smart:field-enum name="plat_type" label="Type de plat" relation="Plat_Type" access="Read" />
                <smart:field-date name="plat_validity_date" label="Disponible jusqu’au" access="Read" />
                <smart:field-text name="plat_abstract" label="Résumé" access="ReadWrite" />
                <smart:field-date name="plat_creation_date" label="Date de création du plat" access="ReadWrite" />
                <smart:field-image name="plat_image" label="Image du plat" access="ReadWrite"/>
            </smart:field-set>
        </smart:fields>
        <smart:hooks />
        <smart:defaults>
            <smart:default field="plat_abstract">Entrez un résumé...</smart:default>
            <smart:default field="plat_creation_date">
                <smart:field-callable function="::getCreationDate"/>
            </smart:default>
        </smart:defaults>
    </smart:structure-configuration>
</smart:config>

Comment créer un menu ?

Surchargeons la méthode getMenu de la classe de rendu de consultation des plats PlatViewRender pour définir un menu d’un Smart Element Plat.

Recommandations

Si vous n’êtes pas familier avec la fonction getMenu, il est recommandé de lire la documentation associée disponible ici

On utilise la fonction setURL pour définir l’URL d’un menu et la fonction setTarget pour indiquer la cible d’un menu.

Recommandations

Si vous n’êtes pas familier avec la fonction setURL, il est recommandé de lire la documentation associée disponible ici

Si vous n’êtes pas familier avec la fonction setTarget, il est recommandé de lire la documentation associée disponible ici

<?php

namespace Cogip\Restauratec\SmartStructures\Plat\Render;

use Anakeen\Core\Internal\SmartElement;
use Anakeen\Ui\BarMenu;
use Anakeen\Ui\ItemMenu;
use Anakeen\Ui\MenuTargetOptions;
use Cogip\Restauratec\SmartStructures\Consommable\Render\ConsommableViewRender;
use SmartStructure\Fields\Plat as PlatFields;

class PlatViewRender extends ConsommableViewRender
{

    /**
     * @param SmartElement $document
     * @return BarMenu
     * @throws \Anakeen\Core\DocManager\Exception
     * @throws \Anakeen\Exception
     * @throws \Anakeen\Database\Exception
     * @throws \Anakeen\Search\Exception
     */
    public function getMenu(SmartElement $document): BarMenu
    {
        $menu = parent::getMenu($document);
        $imagePlat= $document ->getFileLink(PlatFields::plat_image);
        if(!empty($imagePlat)){
            $itemImage = new ItemMenu("platImage");
            $url = sprintf("%s?inline=true&inline=yes",
                $imagePlat
            );
            $itemImage->setUrl($url);

            $option = new MenuTargetOptions();
            $option->windowHeight = 400;
            $option->windowWidth = 700;
            $itemImage->setTarget("_dialog", $option);
            $itemImage->setTextLabel("Afficher l’image");
            $menu->appendElement($itemImage);
        }
        return $menu;
    }

}

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

Vous pouvez maintenant déployer vos modifications :

npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall

Et voir le résultat sur un Plat en consultation :

http://localhost:8080/api/v2/smart-elements/{INITID_PLAT}/views/!defaultConsultation.html

AddMenu

Et ensuite ?

Comment déclencher un code javascript lors de la sélection d’un menu spécifique ?