Kirby Opener は、Kirby CMS パネルのフィールド ボタンで、プレースホルダーを使用して、Ajax 応答の有無にかかわらず呼び出される動的な URL を作成したり、ダウンロードを開始したりできるようにします。
注:これは無料のプラグインではありません。運用サーバーで使用するには、ライセンスを購入する必要があります。 Kirby Opener のライセンス モデルの詳細については、このドキュメントの「ライセンス」セクションまで下にスクロールしてください。
パネル内から任意の URL を開きます
プレースホルダーを使用して URL 内にカスタム データを追加する
ルートまたはページモデル関数を簡単に呼び出す
カスタム JSON 応答ステータス メッセージをボタン ラベルに表示します
ファイルのダウンロードをトリガーする
URLのクリップボードコピーをトリガーする
成功時にページの更新をトリガーする
ブラウザ確認ダイアログをトリガーする
簡単に拡張できるプレースホルダー
JSON 応答の構成解析
カービィ2.3+
kirby plugin:install bnomei/kirby-opener
$ git submodule add https://github.com/bnomei/kirby-opener.git site/plugins/kirby-opener
このリポジトリの内容を ZIP ファイルとしてダウンロードします。
抽出したフォルダーの名前をkirby-opener
に変更し、それを Kirby プロジェクトのsite/plugins/
ディレクトリにコピーします。
カービィ パネルを起動し、このプラグインが提供するテンプレートopenerexample
を使用して新しいページを作成します。このプラグインには、開始するためのいくつかのサンプルフィールドも付属しています。グローバル フィールド定義はkirby-opener/blueprints/fields
フォルダーにあります。
プラグインを最大限に使用するには、プレースホルダーを使用して独自の URL を定義する必要があり、場合によっては JSON で応答するコントローラーやテンプレートを作成することもできます。
example1: openeropenuser example2: openeropenexternal example3: openeropenpagefield example4: openerpopup example5: openerdownload example6: openersuccess example7: openererror example8: openercontroller
このフィールド定義をブループリントに追加し、パネルでページを開きます。
example2explained:type: openercommand: 'https://www.google.com/?q={field.title}/open:yes'text: 'Google でタイトルを検索'
{field.title}
はプレースホルダーと呼ばれます。これは、パネル ページ上のコンテキストに関連するものに置き換えられます。この場合は、現在の$page
オブジェクトのtitle
フィールドを使用します。
このフィールド定義をブループリントに追加します。これにより、パネルにDownload fileXY
ラベルが付いた新しいopener
ボタンが作成されます。応答を待っている間は...
が表示されます。呼び出されたページが JSON で応答すると、解析されます。 JSON に別のmessage
がない限り、ブループリントからのtextsuccess
が表示されます。
example5explained:type: openercommand: '/{page.url}/fileparam:fileXY/download:yes'text: 'ファイルをダウンロード'textprogress: '...'textsuccess: 'ダウンロード...'
command
内の{page.url}
はプレースホルダーであり、現在のページの URL に置き換えられます。事前定義されたプレースホルダーがいくつかありますが、おそらく独自のプレースホルダーを定義する必要があるでしょう。ルート JSON オブジェクトのどのプロパティを解析して成功を判断するか、ファイルのメッセージおよび URL を構成できます。これらのトピックについては、この Readme の後半で説明します。
download:yes
-パラメータも設定できます。これは、ファイルをダウンロードし、ポップアップ ウィンドウで開かないようにプラグインの JavaScript コードに指示します (ほとんどのブラウザはデフォルトでブロックするため)。
この例では、カービィのライセンス ファイルをダウンロードして応答しましょう。テンプレート コードでは、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', ];スリープ(5); // 目的のために少し待ってくださいdie(response::json($json, $code)); }
これは JSON を返す非常に基本的な実装であることに注意してください。 Kirby Cookbook と Kirby Forum は、より良いものを作るための良い情報源です。
次に、パネルでページを開き、 Download fileXY
ボタンを押します。ブラウザの kirby License.md ファイルのダウンロード ダイアログが表示されます。ライセンスを削除しない限り、この悪党は。
コマンドがパネル内からのみ呼び出せるようにするには、ソート保護を追加する必要があります。 api
コントローラー (または単なるテンプレート) が準備されていると仮定します。 API をトリガーするブループリントに次のフィールド定義を追加します。
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'Do Work'textprogress: 'working...'textsuccess: 「完了しました。」texterror: 「失敗しました。」
したがって、このフィールドがあるパネル内のどのページにも、 Do Work
ボタンが表示されます。これを押すと、追加のパラメーターを使用してapi
ページへの ajax リクエストが開始されます。これらのパラメータにはいくつかのプレースホルダも含まれているため、これらはコンテキスト固有の値に置き換えられます。
ここで、リクエストを処理するためのロジックが必要になります。私はコントローラーをテンプレートと組み合わせて使用することを好むため、これをapi
コントローラーに貼り付けます。このプラグインには、開始に役立つサンプル コントローラーが付属しています。しかし、コントローラーがどのように機能するかを見てみましょう。
<?phpreturn function($site, $pages, $page) { // json の応答を準備 $json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1: オプションのセキュリティ...// ユーザーがログインする必要があり、 // リクエストはパネル オープナー プラグインから送信される必要があり、 // 適切な ajax 呼び出しである必要があります if( !$site->user () || !boolval(param('パネル')) || // プラグインによって自動的に追加される !r::ajax() ) { die(response::json($json, 400)); } // #2: allif(param('mycmd') == 'dowork') { で作業を行う必要があるかどうかを確認します。 // #3: $pageToWork = null; でページを動作させるように取得します。 // #3.1: autoidif($autoid = param('autoid')) を試してください { // 実装はあなたに任せます$pageToWork = myGetPageByAutoIdFunction($autoid); } // #3.2: dirurielse を試してみる if($diruri = param('diruri')) { // プラグインは、エンコードされた uri からページを取得するページ メソッドを提供します// なぜ uri をエンコードするのでしょうか?複数の「/」が含まれる可能性があり、パラメーターが壊れる可能性があるためです。 $pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4: ページは見つかりましたか?次にシークレットで検証して作業を開始します// なぜシークレットなのか?セキュリティの特別なレイアウトを追加するため、有効な // リクエストの作成はあなただけが行うことができ、外部からは誰も行うことができません。if($pageToWork && $pageToWork->openerSecret() == param('secret')) { // worksleep(5) を実行します。 // 次に応答します...$json['code'] = 200; $json['メッセージ'] = 'ランチタイム!'; } } // 簡単にするために、ただ終了します nowdie(response::json($json, intval($json['code']))); // 通常、コントローラーはいくつかの値をテンプレートに返します。//return Compact('json');};
プレースホルダーは、コマンドを迅速に作成するのに役立ちます。コマンドを直接解析せずにプレースホルダーを実装したのはなぜですか?これらは、DRY 原則を遵守する際の間違いを避けるのに役立ちます。
フィールドの値を取得するには、ワイルドカードをブループリントのフィールド名に置き換えます。数値と文字列のみがサポートされます。
フィールドを取得し、その値に対してurlencode()
を呼び出します。
テンプレート内の$page->url()
テンプレート内の$page->parent()->url()
リクエストが有効であれば、テンプレート/コントローラーでチェックインできるトークン。ページ限定。
リクエストが有効であれば、テンプレート/コントローラーでチェックインできるトークン。ワイルドカードバージョン。
urlencoded($page->diruri())
このページを他のページに転送します。ヘルパー関数が利用可能 – コントローラーの例を参照してください。
autoid-plugin の使用は、おそらくキャッシュを使用して高速検索メソッドを実装する場合、 diruri
の良い代替手段となります。ページ数が多い場合は$site->index()
または$site->search()
を使用するだけでは処理が遅くなる可能性があるためです。
site/config/config.php
設定を作成して独自に定義することもできます。このプラグインにより、 $site
および$page
へのアクセスが許可されます。
c::set('plugin.opener.placeholder', [ 'myfield' => '$page->myfield()->fieldmethod()', 'another' => '$page->parent()->diruri ()', 'yetmore' => '$site->otherfield()', ]);
これらはsite/config/config.php
で設定できます。
デフォルト: ''
ここにライセンスを追加すると、購入を促すウィジェットがパネルから消えます。
デフォルト: Webサーバーに固有のSALT
この値はsecret
の作成に使用され、セキュリティを向上させるために独自の値を設定する必要がありますが、必須ではありません。
デフォルト: true
無効にすると、プラグインは、サンプルで使用されるblueprints, templates, controllers, hooks and routes
インストールしません。運用環境ではこの設定を使用してください。
デフォルト: code
この設定を使用して、ステータス コードの解析に使用される json ルートオブジェクト プロパティを定義します。
デフォルト: message
この設定を使用して、応答メッセージの解析に使用される json ルートオブジェクト プロパティを定義します。
デフォルト: fileurl
この設定を使用して、ダウンロードするファイルの URL を解析するために使用される json ルートオブジェクト プロパティを定義します。
デフォルト: 5000
ミリ秒
その遅延の後、ボタンはメッセージの表示から初期状態にリセットされます。
デフォルト: false
ダウンロードは、ほとんどのブラウザがブロックするポップアップ ウィンドウではなく、可能であればバウザー ダイアログ経由で開かれます。
デフォルト: 'ダウンロード: はい'
コマンド部分は、JSON 応答のコンテンツのダウンロードをトリガーするようにプラグイン JS スクリプトに指示します ( json.fileurl
を参照)。
デフォルト: 'オープン: はい'
コマンド部分は、URL としてコマンドを使用して新しいウィンドウ/タブをトリガーするようにプラグイン JS スクリプトに指示します。 ajax 呼び出しは行われません。
デフォルト: 'コピー: はい'
コマンド部分は、URL のクリップボード コピーをトリガーするようにプラグイン JS スクリプトに指示します。 ajax 呼び出しは行われません。ブラウザがブロックした場合、 open:yes
と同様に動作します。
デフォルト: 'リフレッシュ: はい'
コマンド部分は、成功時にページの更新をトリガーするようにプラグイン JS スクリプトに指示します。
デフォルト: false
有効にすると、プレースホルダーで$pageModel
使用して、Kirby Page Models で定義された関数にアクセスできます。
デフォルト: false
コマンドでは、 $page
または$site
とそのメソッドのみをチェーンできますが、パラメータは必要ありません。 allow-eval
有効にすると、最大 100 文字と 1 つのステートメントのプレースホルダーを使用できます。ただし、 eval()
は危険であるため、この設定はデフォルトで無効になっています。この設定を有効にするとリスクがあることに注意してください。
有効にすると、次のようなプレースホルダーが可能になります。
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->mymethod($page->somefield()->value( ))', // 100 文字未満]);
このプラグインは「現状のまま」提供され、保証はありません。自己責任で使用し、運用環境で使用する前に必ず自分でテストしてください。問題が見つかった場合は、新しい問題を作成してください。
Kirby Opener は、必要な数のプライベート サーバーで必要なだけ評価できます。 Kirby Opener を公開サーバーに展開するには、ライセンスを購入する必要があります。 (Kirby と同様に) パブリック サーバーごとに 1 つの固有のライセンスが必要です。利用規約については、 license.md
参照してください。
ただし、有効なライセンス コードがあっても、人種差別、性差別、同性愛嫌悪、動物虐待、またはその他のヘイトスピーチを促進するプロジェクトで使用することはお勧めできません。
テクニカル サポートは GitHub でのみ提供されます。サポートの質問に対する回答時間については、いかなる表明も保証も行われません。ただし、カービィ フォーラムのディスカッションに参加することもできます。
Kirby Opener は、ドイツのゲーム デザイナー兼 Web 開発者である Bruno Meilick によって開発および保守されています。私に多大なインスピレーションを与えてくれたファビアン・マイケルと、最初にカービィについて教えてくれたジュリアン・クラーンに感謝したい。