Kirby Opener ist eine Kirby CMS Panel Field-Schaltfläche, mit der Sie Platzhalter verwenden können, um dynamische URLs zu erstellen, die mit und ohne Ajax-Antwort aufgerufen werden oder Downloads starten.
HINWEIS: Dies ist kein kostenloses Plugin. Um es auf einem Produktionsserver nutzen zu können, müssen Sie eine Lizenz erwerben. Für Einzelheiten zum Lizenzmodell von Kirby Opener scrollen Sie nach unten zum Abschnitt „Lizenz“ dieses Dokuments.
Öffnen Sie eine beliebige URL im Panel
Fügen Sie mithilfe von Platzhaltern benutzerdefinierte Daten innerhalb der URL hinzu
Rufen Sie ganz einfach Routen- oder Seitenmodellfunktionen auf
Zeigen Sie benutzerdefinierte JSON-Antwortstatusmeldungen auf der Schaltflächenbeschriftung an
das Herunterladen von Dateien auslösen
Auslösen einer Kopie der URL in der Zwischenablage
Bei Erfolg eine Seitenaktualisierung auslösen
Browser-Bestätigungsdialog auslösen
leicht erweiterbare Platzhalter
Konfigurationsanalyse der JSON-Antwort
Kirby 2.3+
kirby plugin:install bnomei/kirby-opener
$ git submodule add https://github.com/bnomei/kirby-opener.git site/plugins/kirby-opener
Laden Sie den Inhalt dieses Repositorys als ZIP-Datei herunter.
Benennen Sie den extrahierten Ordner in kirby-opener
um und kopieren Sie ihn in das Verzeichnis site/plugins/
in Ihrem Kirby-Projekt.
Starten Sie das Kirby Panel und erstellen Sie eine neue Seite mit der Vorlage openerexample
die dieses Plugin bereitstellt. Das Plugin enthält außerdem einige Beispielfelder, um Ihnen den Einstieg zu erleichtern. Sie finden ihre globalen Felddefinitionen im Ordner kirby-opener/blueprints/fields
.
Um das Plugin optimal nutzen zu können, müssen Sie Ihre eigenen URLs mithilfe von Platzhaltern definieren und möglicherweise sogar die Controller und/oder Vorlagen erstellen, um mit dem JSON zu antworten.
example1: openeropenuser example2: openeropenexternal example3: openeropenpagefield example4: openerpopup example5: openerdownload example6: openersuccess example7: openererror example8: openercontroller
Fügen Sie diese Felddefinition zu einem beliebigen Blueprint hinzu und öffnen Sie die Seite im Panel.
example2explained:type: openercommand: 'https://www.google.com/?q={field.title}/open:yes'text: 'Nach Titel in Google suchen'
Der {field.title}
wird als Platzhalter bezeichnet. Es wird durch etwas Kontextbezogenes auf der Panel-Seite ersetzt. In diesem Fall mit dem title
des aktuellen $page
-Objekts.
Fügen Sie diese Felddefinition einem Blueprint hinzu. Es wird im Panel ein neuer opener
-Button mit der Bezeichnung Download fileXY
erstellt. Während Sie auf die Antwort warten, wird ...
angezeigt. Sobald die aufgerufene Seite mit JSON antwortet, wird sie analysiert. Sofern es keine andere message
im JSON gibt, wird der textsuccess
aus dem Blueprint angezeigt.
example5explained:type: openercommand: '/{page.url}/fileparam:fileXY/download:yes'text: 'Eine Datei herunterladen'textprogress: '...'textsuccess: 'Download...'
Die {page.url}
im command
ist ein Platzhalter und wird durch die URL der aktuellen Seite ersetzt. Es gibt einige vordefinierte Platzhalter , aber Sie möchten wahrscheinlich Ihre eigenen definieren. Welche Eigenschaften des Root-JSON-Objekts analysiert werden, um den Erfolg zu bestimmen, Nachrichten und URL der Datei können konfiguriert werden. Diese Themen werden später in dieser Readme-Datei beschrieben.
Der download:yes
-Parameter kann ebenfalls konfiguriert werden. Es weist den Javascript-Code des Plugins an, die Datei herunterzuladen und sie nicht in einem Popup-Fenster zu öffnen (da die meisten Browser dies standardmäßig blockieren würden).
Lassen Sie uns für dieses Beispiel mit dem Herunterladen der Kirby-Lizenzdatei reagieren. In Ihrem Vorlagencode müssen Sie eine JSON-Antwort erstellen und zurückgeben.
if(param('fileparam') == 'fileXY') { $code = f::exists(kirby()->roots()->index().DS.'license.md') ? 200 : 400; $json = ['code' => $code, 'fileurl' => kirby()->urls()->index().'/license.md', ];sleep(5); // für Beispielzwecke etwas wartendie(response::json($json, $code)); }
Bitte beachten Sie, dass dies eine sehr einfache Implementierung der Rückgabe von JSON ist. Das Kirby-Kochbuch und das Kirby-Forum sind gute Quellen, um es besser zu machen.
Öffnen Sie nun Ihre Seite im Panel und klicken Sie auf die Schaltfläche Download fileXY
. Der Download-Dialog Ihres Browsers für die Datei kirby License.md sollte erscheinen. Es sei denn, du hast den Führerschein entzogen – du kleiner Schurke.
Um sicherzustellen, dass der Befehl nur innerhalb des Panels aufgerufen werden kann, müssen Sie einen Sortierschutz hinzufügen. Nehmen wir an, Sie haben einen api
-Controller (oder nur eine Vorlage) vorbereitet. Fügen Sie die folgende Felddefinition zu jedem Blueprint hinzu, der die API auslösen soll.
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'Do Work'textprogress: 'working...'textsuccess: 'Fertig.'texterror: 'Fehlgeschlagen.'
Auf jeder Seite im Panel, die dieses Feld enthält, gibt es jetzt die Schaltfläche Do Work
. Durch Drücken wird eine Ajax-Anfrage an die api
-Seite mit zusätzlichen Parametern gestartet. Da diese Parameter auch einige Platzhalter enthalten, werden diese durch kontextspezifische Werte ersetzt.
Jetzt benötigen Sie eine Logik, um die Anfrage zu bearbeiten. Ich bevorzuge die Verwendung eines Controllers in Kombination mit Vorlagen, also fügen Sie diesen in Ihren api
-Controller ein. Dieses Plugin enthält einen Beispiel-Controller, der Ihnen den Einstieg erleichtert. Aber werfen wir einen Blick auf die Funktionsweise des Controllers.
<?phpreturn function($site, $pages, $page) { // JSON-Antwort vorbereiten$json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1: optionale Sicherheit...// erfordern, dass ein Benutzer angemeldet ist und // die Anfrage muss vom Panel-Opener-Plugin kommen und// es muss ein richtiger Ajax-Aufruf seinif( !$site->user () || !boolval(param('panel')) || // automatisch vom Plugin hinzugefügt !r::ajax() ) { die(response::json($json, 400)); } // #2: Jetzt prüfen, ob bei allif(param('mycmd') == 'dowork') { Arbeit erledigt werden muss // #3: Seite zum Laufen bringen at$pageToWork = null; // #3.1: versuchen Sie es mit autoidif($autoid = param('autoid')) { // bleibt Ihnen zur Implementierung überlassen$pageToWork = myGetPageByAutoIdFunction($autoid); } // #3.2: Versuchen Sie es mit dirurielse if($diruri = param('diruri')) { // Das Plugin stellt eine Seitenmethode bereit, um eine Seite aus einer codierten URI abzurufen. // Warum die URI codieren? weil es mehrere „/“ enthalten könnte und das die Parameter zerstören würde.$pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4: Seite gefunden? Dann mit „Geheimnis“ validieren und mit der Arbeit beginnen // Warum ein Geheimnis? um ein zusätzliches Sicherheitslayout hinzuzufügen, damit nur Sie und niemand von außen eine gültige Anfrage erstellen kann.if($pageToWork && $pageToWork->openerSecret() == param('secret')) { // mache worksleep(5); // dann antworten...$json['code'] = 200; $json['message'] = 'Mittagspause!'; } } // Der Einfachheit halber beenden Sie einfach nowdie(response::json($json, intval($json['code']))); // Normalerweise würde ein Controller einige Werte an die Vorlage zurückgeben //return compact('json');};
Die Platzhalter helfen Ihnen, Befehle schnell zu erstellen. Warum habe ich Platzhalter implementiert, anstatt den Befehl direkt zu analysieren? Sie helfen Ihnen, Fehler bei der Einhaltung des DRY-Prinzips zu vermeiden.
Ersetzen Sie den Platzhalter durch einen beliebigen Blueprint-Feldnamen, um den Wert des Feldes zu erhalten. Es werden nur Zahlen und Zeichenfolgen unterstützt.
ruft die Felder ab und ruft urlencode()
für ihren Wert auf.
$page->url()
in der Vorlage
$page->parent()->url()
in der Vorlage
Mit dem Token können Sie die Vorlage/den Controller einchecken, wenn die Anfrage gültig ist. auf Seite beschränkt.
Mit dem Token können Sie die Vorlage/den Controller einchecken, wenn die Anfrage gültig ist. Wildcard-Version.
urlencoded($page->diruri())
um diese Seite an eine andere weiterzuleiten. Hilfsfunktionen verfügbar – siehe Controller-Beispiel.
Die Verwendung des Autoid-Plugins ist eine gute Alternative zu diruri
, wenn Sie eine schnelle Suchmethode implementieren, möglicherweise mit einem Cache. Da die alleinige Verwendung von $site->index()
oder $site->search()
möglicherweise langsam ist, wenn Sie viele Seiten haben.
Sie können auch Ihre eigenen definieren, indem Sie eine site/config/config.php
-Einstellung erstellen. Dieses Plugin gewährt Ihnen Zugriff auf $site
und $page
.
c::set('plugin.opener.placeholder', [ 'myfield' => '$page->myfield()->fieldmethod()', 'another' => '$page->parent()->diruri ()', 'yetmore' => '$site->otherfield()', ]);
Sie können diese in Ihrer site/config/config.php
festlegen.
Standard: ''
Fügen Sie hier Ihre Lizenz hinzu und das Widget, das Sie daran erinnert, eine zu kaufen, verschwindet aus dem Panel.
Standard: eindeutiges SALT für Ihren Webserver
Dieser Wert wird zum Erstellen des secret
verwendet und Sie sollten Ihren eigenen Wert festlegen, um die Sicherheit zu verbessern, dies ist jedoch nicht erforderlich.
Standard: wahr
Wenn es deaktiviert ist, installiert das Plugin keine blueprints, templates, controllers, hooks and routes
, die von seinen Beispielen verwendet werden. Verwenden Sie diese Einstellung in der Produktionsumgebung.
Standard: code
Verwenden Sie diese Einstellung, um eine JSON-Root-Objekteigenschaft zu definieren, die zum Parsen des Statuscodes verwendet wird.
Standard: message
Verwenden Sie diese Einstellung, um eine JSON-Root-Objekteigenschaft zu definieren, die zum Parsen der Antwortnachricht verwendet wird.
Standard: Datei- fileurl
Verwenden Sie diese Einstellung, um eine JSON-Root-Object-Eigenschaft zu definieren, die zum Parsen der URL der herunterzuladenden Datei verwendet wird.
Standard: 5000
in ms
Nach dieser Verzögerung wird die Schaltfläche von der Anzeige der Meldung auf ihren ursprünglichen Zustand zurückgesetzt.
Standard: false
Downloads werden nach Möglichkeit über den Browser-Dialog geöffnet und nicht als Popup-Fenster, die die meisten Browser blockieren
Standard: 'Download:Ja'
Befehlsteil, um das Plugin-JS-Skript anzuweisen, den Download für den Inhalt der JSON-Antwort auszulösen (siehe json.fileurl
).
Standard: 'open:yes'
Befehlsteil, um das Plugin-JS-Skript anzuweisen, ein neues Fenster/eine neue Registerkarte mit dem Befehl als URL auszulösen. Es erfolgt kein Ajax-Aufruf.
Standard: 'kopieren:ja'
Befehlsteil, um das Plugin-JS-Skript anzuweisen, eine Kopie der URL in die Zwischenablage auszulösen. Es erfolgt kein Ajax-Aufruf. Wenn der Browser blockiert, verhält es sich wie bei open:yes
.
Standard: 'aktualisieren: ja'
Befehlsteil, um das Plugin-JS-Skript anzuweisen, bei Erfolg eine Seitenaktualisierung auszulösen.
Standard: false
Wenn diese Option aktiviert ist, können Sie $pageModel
in Ihren Platzhaltern verwenden, um auf Funktionen zuzugreifen, die in Ihren Kirby-Seitenmodellen definiert sind.
Standard: false
Mit Befehlen können Sie nur $page
oder $site
und ihre Methoden verketten, jedoch ohne Parameter. Wenn Sie allow-eval
aktiviert haben, können Sie mit Ihren Platzhaltern bis zu 100 Zeichen und einer einzelnen Anweisung verrückt spielen. Da eval()
jedoch gefährlich ist, ist diese Einstellung standardmäßig deaktiviert. Bitte beachten Sie die Risiken, die mit der Aktivierung dieser Einstellung verbunden sind.
Platzhalter wie die folgenden sind möglich, wenn sie aktiviert sind:
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->mymethod($page->somefield()->value( ))', // weniger als 100 Zeichen]);
Dieses Plugin wird „wie besehen“ ohne Garantie bereitgestellt. Die Nutzung erfolgt auf eigene Gefahr und testen Sie es immer selbst, bevor Sie es in einer Produktionsumgebung verwenden. Wenn Sie Probleme finden, erstellen Sie bitte ein neues Problem.
Kirby Opener kann beliebig lange auf beliebig vielen privaten Servern evaluiert werden. Um Kirby Opener auf einem öffentlichen Server bereitzustellen, müssen Sie eine Lizenz erwerben. Sie benötigen eine eindeutige Lizenz pro öffentlichem Server (genau wie Kirby). Die Allgemeinen Geschäftsbedingungen finden Sie unter license.md
.
Selbst mit einem gültigen Lizenzcode wird jedoch davon abgeraten, ihn in Projekten zu verwenden, die Rassismus, Sexismus, Homophobie, Tierquälerei oder andere Formen von Hassreden fördern.
Technischer Support wird nur auf GitHub bereitgestellt. Es werden keine Zusicherungen oder Garantien hinsichtlich der Reaktionszeit, in der Supportfragen beantwortet werden, übernommen. Sie können sich aber auch im Kirby-Forum an den Diskussionen beteiligen.
Kirby Opener wird von Bruno Meilick, einem Spieledesigner und Webentwickler aus Deutschland, entwickelt und gepflegt. Ich möchte Fabian Michael dafür danken, dass er mich sehr inspiriert hat, und Julian Kraan, der mir überhaupt von Kirby erzählt hat.