Comment ajouter un menu permettant d'accéder à une vue d'impression ?
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 un menu permettant d'afficher la vue imprimable d'un plat.
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
{
public function getMenu(\Anakeen\Core\Internal\SmartElement $document): BarMenu
{
$menu = parent::getMenu($document);
$printMenu = new ItemMenu("print", "print");
$printMenu->setUrl("#action/printMe");
$menu->appendElement($printMenu);
return $menu;
}
public function getJsReferences(\Anakeen\Core\Internal\SmartElement $document = null)
{
$js = parent::getJsReferences($document);
$js["printMe"] = "/plat/printme.js";
return $js;
}
}
De plus, on ajoute dans le fichier public/plat/printme.js
avec le contenu suivant :
window.ank.smartElement.globalController.registerFunction("printMe", (controller) => {
controller.addEventListener(
"actionClick",
{
name: "printMePlease",
},
function (event, smartElement, parameters) {
if (parameters.eventId === "printMe") {
//Detecte si quelqu'un clic sur le menu printMe
if (location.hash === "#printMe") {
//Si jamais l'url contient déjà printMe on lance la vue d'impression
window.print();
return;
}
//Sinon on prend l'url du SmartElement
window.open(smartElement.url + ".html#printMe", "_blank");
}
}
);
controller.addEventListener(
"ready",
{
name: "printMeNow",
},
function () {
//Si lorsque le SmartElement se charge on a le hash alors on lance la vue d'impression
if (location.hash === "#printMe") {
setTimeout(() => {
window.print();
}, 500);
}
}
);
});
Vous pouvez maintenant déployer vos modifications :
npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall
Et ensuite ?
Comment déclencher un code javascript lors de la sélection d’un menu spécifique ?