Kirby Opener 是一個 Kirby CMS 面板欄位按鈕,可讓您使用佔位符建立動態 url,無論是否有 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/
目錄中。
啟動 Kirby 面板並使用此外掛程式提供的範本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。這些主題將在本自述文件的後面進行描述。
download:yes
參數也可以設定。它告訴插件 JavaScript 程式碼下載文件,而不是在彈出視窗中打開它(因為大多數瀏覽器預設會阻止該文件)。
對於此範例,我們透過下載 kirby 許可證檔案來回應。在模板程式碼中,您需要建置並傳回 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 的非常基本的實作。 《星之卡比食譜》和《星之卡比論壇》是做得更好的好資源。
現在在面板中開啟頁面並按下Download fileXY
按鈕。瀏覽器中應該會出現 kirby license.md 檔案的下載對話方塊。除非你取消了許可證——你這個小惡棍。
為了確保只能從面板內呼叫該命令,您需要新增某種排序保護。假設您準備好了一個api
控制器(或只是一個模板)。將以下欄位定義新增至您想要觸發 api 的任何藍圖。
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: '做工作'textprogress: '工作...'textsuccess: “完成。”文字錯誤:“失敗。”
因此,在面板中具有此欄位的任何頁面上,您現在都有一個Do Work
按鈕。按下它將啟動一個帶有附加參數的 ajax 請求到api
頁面。由於這些參數也包含一些佔位符,因此它們將被替換為上下文特定值。
現在您需要一些邏輯來處理請求。我更喜歡將控制器與模板結合使用,因此將其貼到您的api
控制器中。該插件附帶示例控制器來幫助您入門。但讓我們來看看控制器是如何運作的。
<?phpreturn function($site, $pages, $page) { // 準備 json 回應$json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1: 可選安全性... // 要求使用者登入且 // 請求必須來自面板開啟器插件且 // 它必須是正確的 ajax callif( !$site->user ()|| !boolval(param('面板')) || // 由外掛程式自動新增 !r::ajax() ) { die(響應::json($json, 400)); } // #2: 現在檢查是否要完成工作 if(param('mycmd') == 'dowork') { // #3: 讓頁面運作 at$pageToWork = null; // #3.1: 試 autoidif($autoid = param('autoid')) { // 留給你實作$pageToWork = myGetPageByAutoIdFunction($autoid); } // #3.2: try dirurielse if($diruri = param('diruri')) { // 外掛程式提供了一個pages方法來從編碼的uri中取得頁面 // 為什麼要對uri進行編碼?因為它可能包含多個“/”,這會破壞參數。 } // #4: 找到頁面?然後用秘密驗證並開始工作//為什麼要秘密?新增額外的安全性佈局,因此只有您才能建立有效的//要求,外部沒有人可以做。 5); // 然後回應...$json['code'] = 200; $json['message'] = '午餐時間! } } // 為了簡單起見,只要退出 nowdie(response::json($json, intval($json['code']))); // 通常控制器會向模板傳回一些值//return Compact('json');};
佔位符可協助您快速建立命令。為什麼我要實作佔位符而不是直接解析指令?它們可以幫助您避免在堅持 DRY 原則時犯錯。
將通配符替換為任何藍圖欄位名稱以取得該欄位的值。僅支援數字和字串。
將獲取欄位並對其值呼叫urlencode()
。
模板中的$page->url()
模板中的$page->parent()->url()
令牌,您可以在模板/控制器中檢查請求是否有效。僅限於頁面。
令牌,您可以在模板/控制器中檢查請求是否有效。通配符版本。
urlencoded($page->diruri())
將此頁面轉發到任何其他頁面。可用的輔助功能 - 請參閱控制器範例。
如果您使用快取實作快速尋找方法,那麼使用 autoid 外掛程式是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
中設定這些。
預設: ''
在此處新增您的許可證,提醒您購買許可證的小工具將從面板中消失。
預設值:您的網頁伺服器的唯一 SALT
該值用於建立secret
,您應該設定自己的值以提高安全性,但這不是必需的。
預設值:true
如果停用,該插件不會安裝其範例使用的任何blueprints, templates, controllers, hooks and routes
。在生產環境中使用此設定。
預設值: code
使用此設定定義將用於解析狀態代碼的 json 根物件屬性。
預設: message
使用此設定來定義將用於解析回應訊息的 json 根物件屬性。
預設值: fileurl
使用此設定定義一個 json 根物件屬性,該屬性將用於解析要下載的檔案的 url。
預設值: 5000
(毫秒)
延遲之後,按鈕將從顯示訊息重設為其初始狀態。
預設值:假
如果可能的話,下載是透過 Bowser 對話框打開的,而不是大多數瀏覽器阻止的彈出窗口
預設值:“下載:是”
命令部分告訴插件 js 腳本觸發下載 JSON 回應內容(請參閱json.fileurl
)。
預設值:'打開:是'
命令部分告訴插件 js 腳本觸發一個新視窗/選項卡,命令為 url。不會有ajax呼叫。
預設值:'複製:是'
命令部分告訴插件 js 腳本觸發 url 的剪貼簿複製。不會有ajax呼叫。如果瀏覽器阻止,其行為類似於open:yes
。
預設值:“刷新:是”
命令部分告訴插件 js 腳本成功時觸發頁面刷新。
預設值:假
如果啟用,您可以在佔位符中使用$pageModel
來存取 Kirby 頁面模型中定義的函數。
預設值:假
命令僅允許您連結$page
或$site
及其方法,但不帶參數。如果您啟用了allow-eval
您可能會對最多100個字元的佔位符和一條語句感到瘋狂。但由於eval()
很危險,因此預設情況下會停用此設定。請注意啟用此設定的風險。
如果啟用,可以使用下列佔位符:
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->mymethod($page->somefield()->value( ))', // 少於100 個字元]);
該插件“按原樣”提供,不提供任何保證。使用它的風險由您自行承擔,並且在生產環境中使用它之前請務必自行測試。如果您發現任何問題,請建立一個新問題。
只要您願意,Kirby Opener 就可以在您想要的私人伺服器上進行評估。要在任何公共伺服器上部署 Kirby Opener,您需要購買許可證。每台公共伺服器都需要一個唯一的許可證(就像 Kirby 一樣)。有關條款和條件,請參閱license.md
。
然而,即使擁有有效的許可證代碼,也不鼓勵在任何宣揚種族主義、性別歧視、恐同、虐待動物或任何其他形式的仇恨言論的項目中使用它。
僅在 GitHub 上提供技術支援。對於回答支援問題的回應時間不做任何陳述或保證。但您也可以加入星之卡比論壇中的討論。
Kirby Opener 由來自德國的遊戲設計師和網頁開發人員 Bruno Meilick 開發和維護。我要感謝法比安·邁克爾(Fabian Michael)給了我很大的啟發,還要感謝朱利安·克蘭(Julian Kraan)首先告訴我有關卡比的事情。