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进行编码?因为它可能包含多个“/”,这会破坏参数。$pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4: 找到页面?然后用秘密验证并开始工作//为什么要秘密?添加额外的安全布局,因此只有您才能创建有效的//请求,外部没有人可以做。if($pageToWork && $pageToWork->openerSecret() == param('secret')) { //工作睡眠(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 开发和维护。我要感谢法比安·迈克尔给了我很大的启发,还要感谢朱利安·克兰首先告诉我关于卡比的事。