Kirby Opener est un bouton de champ de panneau Kirby CMS qui vous permet d'utiliser des espaces réservés pour créer des URL dynamiques qui sont appelées avec et sans réponse ajax ou démarrer des téléchargements.
REMARQUE : ce n'est pas un plugin gratuit. Pour l'utiliser sur un serveur de production, vous devez acheter une licence. Pour plus de détails sur le modèle de licence de Kirby Opener, faites défiler jusqu'à la section Licence de ce document.
ouvrez n'importe quelle URL depuis le panneau
ajouter des données personnalisées dans l'URL à l'aide d'espaces réservés
appeler facilement des fonctions d'itinéraires ou de modèles de page
afficher des messages d'état de réponse JSON personnalisés sur l'étiquette du bouton
déclencher le téléchargement de fichiers
déclencher la copie du presse-papiers de l'URL
déclencher l'actualisation de la page en cas de succès
déclencher la boîte de dialogue de confirmation du navigateur
espaces réservés facilement extensibles
analyse configurée de la réponse json
Kirby 2.3+
kirby plugin:install bnomei/kirby-opener
$ git submodule add https://github.com/bnomei/kirby-opener.git site/plugins/kirby-opener
Téléchargez le contenu de ce référentiel sous forme de fichier ZIP.
Renommez le dossier extrait en kirby-opener
et copiez-le dans le répertoire site/plugins/
de votre projet Kirby.
Démarrez le panneau Kirby et créez une nouvelle page avec l' openerexample
de modèle fourni par ce plugin. Le plugin est également livré avec quelques exemples de champs pour vous aider à démarrer. Vous pouvez trouver leurs définitions de champs globales dans le dossier kirby-opener/blueprints/fields
.
Pour utiliser le plugin au maximum, vous devrez définir vos propres URL à l'aide d'espaces réservés et peut-être même créer les contrôleurs et/ou modèles pour répondre avec le JSON.
example1: openeropenuser example2: openeropenexternal example3: openeropenpagefield example4: openerpopup example5: openerdownload example6: openersuccess example7: openererror example8: openercontroller
Ajoutez cette définition de champ à n'importe quel plan et ouvrez la page dans le panneau.
exemple2expliqué : tapez : openercommand : 'https://www.google.com/?q={field.title}/open:yes'text : 'Rechercher un titre dans Google'
Le {field.title}
est appelé un espace réservé . Il sera remplacé par quelque chose lié au contexte sur la page du panneau. Dans ce cas, avec le champ title
de l'objet $page
actuel.
Ajoutez cette définition de champ à un plan. Cela créera un nouveau bouton opener
dans le panneau avec l'étiquette Download fileXY
. En attendant la réponse, le ...
sera affiché. Une fois que la page appelée répond avec JSON, elle sera analysée. Sauf s'il y a un message
différent dans le JSON, le textsuccess
du plan sera affiché.
exemple5expliqué : type : openercommand : '/{page.url}/fileparam:fileXY/download:yes'text : 'Télécharger un fichier'textprogress : '...'textsuccess : 'Télécharger...'
Le {page.url}
dans la command
est un espace réservé et sera remplacé par l'URL de la page actuelle. Il existe quelques espaces réservés prédéfinis, mais vous souhaiterez probablement définir les vôtres. Quelles propriétés de l'objet JSON racine sont analysées pour déterminer le succès, le message et l'URL du fichier peuvent être configurés. Ces sujets seront décrits plus loin dans ce fichier Lisez-moi.
Le paramètre download:yes
peut également être configuré. Il indique au code javascript du plugin de télécharger le fichier et de ne pas l'ouvrir dans une fenêtre contextuelle (car la plupart des navigateurs le bloqueraient par défaut).
Pour cet exemple, répondons en téléchargeant le fichier de licence Kirby. Dans le code de votre modèle, vous devez créer et renvoyer une réponse JSON.
if(param('fileparam') == 'fileXY') { $code = f::exists(kirby()->roots()->index().DS.'license.md') ? 200 : 400 ; $json = ['code' => $code, 'fileurl' => kirby()->urls()->index().'/license.md', ];dormir(5); // attends un peu par exemple finsdie(response::json($json, $code)); }
Veuillez noter qu'il s'agit d'une implémentation très basique du retour de JSON. Le Kirby Cookbook et le Kirby Forum sont de bonnes sources pour faire mieux.
Ouvrez maintenant votre page dans le panneau et appuyez sur le bouton Download fileXY
. La boîte de dialogue de téléchargement de votre navigateur pour le fichier Kirby License.md devrait apparaître. à moins que vous n’ayez supprimé la licence – espèce de petit canaille.
Pour vous assurer que la commande ne peut être appelée qu'à partir du panneau, vous devez ajouter une sorte de protection. Supposons que vous ayez préparé un contrôleur api
(ou simplement un modèle). Ajoutez la définition de champ suivante à tout plan dans lequel vous souhaitez déclencher l'API.
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'Do Work'textprogress: 'working...'textsuccess : 'Terminé.'texterror: 'Échec.'
Ainsi, sur n'importe quelle page du panneau comportant ce champ, vous disposez désormais d'un bouton Do Work
. En appuyant dessus, vous lancerez une requête ajax vers la page api
avec des paramètres supplémentaires. Étant donné que ces paramètres contiennent également des espaces réservés , ceux-ci seront remplacés par des valeurs spécifiques au contexte.
Vous avez maintenant besoin d'un peu de logique pour gérer la demande. Je préfère utiliser un contrôleur en combinaison avec des modèles, alors collez-le sur votre contrôleur api
. Ce plugin est livré avec un exemple de contrôleur pour vous aider à démarrer. Mais regardons comment fonctionne le contrôleur.
<?phpreturn function($site, $pages, $page) { // prépare la réponse json$json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1 : sécurité facultative...// nécessite qu'un utilisateur soit connecté et // la requête doit provenir du plugin d'ouverture du panneau et// elle doit être un appel ajax approprié si ( !$site->user () || !boolval(param('panneau')) || // ajouté automatiquement par le plugin !r::ajax() ) { die(response::json($json, 400)); } // #2 : vérifiez maintenant si du travail doit être effectué. allif(param('mycmd') == 'dowork') { // #3 : faire fonctionner la page à $pageToWork = null ; // #3.1 : essayez autoidif($autoid = param('autoid')) { // il vous reste à implémenter$pageToWork = myGetPageByAutoIdFunction($autoid); } // #3.2 : essayez dirurielse if($diruri = param('diruri')) { // le plugin fournit une méthode pages pour obtenir la page à partir de l'uri encodé// pourquoi encoder l'uri ? car il pourrait contenir plusieurs '/' et cela briserait les paramètres.$pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4 : vous avez trouvé une page ? puis validez avec secret et commencez à travailler // pourquoi un secret ? pour ajouter une disposition supplémentaire de sécurité afin que la création d'une requête // valide soit quelque chose que vous seul pouvez faire et que personne de l'extérieur.if($pageToWork && $pageToWork->openerSecret() == param('secret')) { // faire du travail et dormir(5); // puis réponds...$json['code'] = 200; $json['message'] = 'L'heure du déjeuner !'; } } // par souci de simplicité, quittez simplement nowdie(response::json($json, intval($json['code']))); // normalement, un contrôleur renvoie certaines valeurs au modèle //return compact('json');};
Les espaces réservés vous aident à créer rapidement des commandes. Pourquoi ai-je implémenté des espaces réservés au lieu d’analyser la commande directement ? Ils vous aident à éviter les erreurs en respectant le principe DRY.
remplacez le caractère générique par n’importe quel nom de champ de plan pour obtenir la valeur du champ. seuls les nombres et les chaînes sont pris en charge.
obtiendra les champs et appellera urlencode()
sur sa valeur.
$page->url()
dans le modèle
$page->parent()->url()
dans le modèle
jeton, vous pouvez enregistrer le modèle/contrôleur si la demande est valide. limité à la page.
jeton, vous pouvez enregistrer le modèle/contrôleur si la demande est valide. version générique.
urlencoded($page->diruri())
pour transmettre cette page à un autre. fonctions d'assistance disponibles – voir exemple de contrôleur.
L'utilisation du plugin autoid est une bonne alternative à diruri
si vous implémentez une méthode de recherche rapide, peut-être avec un cache. Puisque le simple fait d'utiliser $site->index()
ou $site->search()
peut être lent si vous avez de nombreuses pages.
Vous pouvez également définir le vôtre en créant un paramètre site/config/config.php
. Ce plugin vous donne accès à $site
et $page
.
c::set('plugin.opener.placeholder', [ 'monchamp' => '$page->monchamp()->fieldmethod()', 'another' => '$page->parent()->diruri ()', 'encore' => '$site->autrechamp()', ]);
Vous pouvez les définir dans votre site/config/config.php
.
défaut: ''
ajoutez votre licence ici et le widget vous rappelant d'en acheter une disparaîtra du Panel.
par défaut : SALT unique pour votre serveur Web
cette valeur est utilisée pour créer le secret
et vous devez définir votre propre valeur pour améliorer la sécurité, mais ce n'est pas obligatoire.
par défaut : vrai
s'il est désactivé, le plugin n'installe aucun blueprints, templates, controllers, hooks and routes
utilisé par ses exemples. utilisez ce paramètre dans un environnement de production.
par défaut : code
utilisez ce paramètre pour définir une propriété json root-object qui sera utilisée pour analyser le code d'état.
par défaut : message
utilisez ce paramètre pour définir une propriété json root-object qui sera utilisée pour analyser le message de réponse.
par défaut : fileurl
utilisez ce paramètre pour définir une propriété json root-object qui sera utilisée pour analyser l'url du fichier à télécharger.
par défaut : 5000
en ms
après ce délai, le bouton est réinitialisé et n'affiche plus le message à son état initial.
par défaut : faux
les téléchargements sont ouverts via la boîte de dialogue Bowser si possible et non sous forme de fenêtres contextuelles que la plupart des navigateurs bloquent
par défaut : 'télécharger :oui'
partie commande pour indiquer au script js du plugin de déclencher le téléchargement du contenu de la réponse JSON (voir json.fileurl
).
par défaut : 'ouvert : oui'
partie commande pour indiquer au script js du plugin de déclencher une nouvelle fenêtre/un nouvel onglet avec la commande comme URL. Il n'y aura pas d'appel ajax.
par défaut : 'copie :oui'
partie de commande pour indiquer au script js du plugin de déclencher la copie du presse-papiers de l'URL. Il n'y aura pas d'appel ajax. Si le navigateur bloque, il se comporte comme avec open:yes
.
par défaut : 'rafraîchir : oui'
partie de commande pour indiquer au script js du plugin de déclencher une actualisation de la page en cas de succès.
par défaut : faux
si activé, vous pouvez utiliser $pageModel
dans vos espaces réservés pour accéder aux fonctions définies dans vos modèles de page Kirby.
par défaut : faux
les commandes permettent uniquement d'enchaîner $page
ou $site
et leurs méthodes mais sans paramètres. Si vous avez activé allow-eval
vous pouvez devenir fou avec vos espaces réservés jusqu'à 100 caractères et une seule instruction. Mais comme eval()
est dangereux, ce paramètre est désactivé par défaut. Veuillez être conscient des risques liés à l'activation de ce paramètre.
Les espaces réservés comme celui-ci deviennent possibles s'ils sont activés :
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->ma méthode($page->somefield()->value( ))', // moins de 100 caractères]);
Ce plugin est fourni « tel quel » sans aucune garantie. Utilisez-le à vos propres risques et testez-le toujours vous-même avant de l'utiliser dans un environnement de production. Si vous rencontrez des problèmes, veuillez créer un nouveau problème.
Kirby Opener peut être évalué aussi longtemps que vous le souhaitez sur le nombre de serveurs privés que vous souhaitez. Pour déployer Kirby Opener sur n'importe quel serveur public, vous devez acheter une licence. Vous avez besoin d'une licence unique par serveur public (tout comme Kirby). Voir license.md
pour les termes et conditions.
Cependant, même avec un code de licence valide, il est déconseillé de l'utiliser dans tout projet promouvant le racisme, le sexisme, l'homophobie, la maltraitance animale ou toute autre forme de discours de haine.
Le support technique est fourni sur GitHub uniquement. Aucune déclaration ou garantie n'est faite concernant le temps de réponse dans lequel les questions d'assistance sont répondues. Mais vous pouvez également rejoindre les discussions sur le forum Kirby.
Kirby Opener est développé et maintenu par Bruno Meilick, un concepteur de jeux et développeur Web allemand. Je tiens à remercier Fabian Michael de m'avoir beaucoup inspiré et Julian Kraan de m'avoir parlé de Kirby en premier lieu.