Kirby Opener — это кнопка поля панели Kirby CMS, которая позволяет вам использовать заполнители для создания динамических URL-адресов, которые вызываются с ответом ajax или без него или запускают загрузку.
ПРИМЕЧАНИЕ. Это не бесплатный плагин. Чтобы использовать его на рабочем сервере, вам необходимо купить лицензию. Для получения подробной информации о модели лицензирования 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
и скопируйте ее в каталог site/plugins/
вашего проекта Kirby.
Запустите панель 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}
называется заполнителем . Он будет заменен чем-то связанным с контекстом на странице панели. В данном случае с полем title
текущего объекта $page
.
Добавьте это определение поля в схему элементов. На панели будет создана новая кнопка opener
с меткой Download fileXY
. Во время ожидания ответа будет отображаться ...
Как только вызываемая страница ответит JSON, она будет проанализирована. Если в JSON нет другого message
, будет отображаться textsuccess
из проекта.
example5explained:type: openercommand: '/{page.url}/fileparam:fileXY/download:yes'text: 'Загрузить файл'textprogress: '...'textsuccess: 'Загрузить...'
{page.url}
в command
является заполнителем и будет заменен URL-адресом текущей страницы. Есть несколько предопределенных заполнителей , но вы, вероятно, захотите определить свои собственные. Какие свойства корневого объекта JSON анализируются для определения успеха, можно настроить сообщение и URL-адрес файла. Эти темы будут описаны позже в этом файле readme.
Параметр 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: 'Do Work'textprogress: 'working...'textsuccess: «Готово». Текстовая ошибка: «Не удалось».
Таким образом, на любой странице панели, где есть это поле, теперь есть кнопка Do Work
. Нажатие на нее запустит ajax-запрос к странице api
с дополнительными параметрами. Поскольку эти параметры также содержат некоторые заполнители , они будут заменены значениями, зависящими от контекста.
Теперь вам нужна логика для обработки запроса. Я предпочитаю использовать контроллер в сочетании с шаблонами, поэтому вставьте это в свой контроллер 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')) { // плагин предоставляет метод 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-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 ()', 'etmore' => '$site->otherfield()', ]);
Вы можете установить их в своем site/config/config.php
.
по умолчанию: ''
добавьте сюда свою лицензию, и виджет с напоминанием о ее покупке исчезнет с панели.
по умолчанию: уникальная соль для вашего веб-сервера.
это значение используется для создания secret
, и вам следует установить собственное значение для повышения безопасности, но это не обязательно.
по умолчанию: правда
если отключено, плагин не устанавливает никаких blueprints, templates, controllers, hooks and routes
, которые используются в его примерах. используйте этот параметр в производственной среде.
по умолчанию: code
используйте этот параметр, чтобы определить свойство корневого объекта json, которое будет использоваться для анализа кода состояния.
по умолчанию: message
используйте этот параметр, чтобы определить свойство корневого объекта json, которое будет использоваться для анализа ответного сообщения.
по умолчанию: fileurl
используйте этот параметр, чтобы определить свойство корневого объекта json, которое будет использоваться для анализа URL-адреса загружаемого файла.
по умолчанию: 5000
в мс
после этой задержки кнопка сбрасывается с отображения сообщения в исходное состояние.
по умолчанию: ложь
загрузки открываются через диалоговое окно браузера, если это возможно, а не в виде всплывающих окон, которые блокируются большинством браузеров.
по умолчанию: 'загрузка: да'
командная часть, указывающая 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 на любом общедоступном сервере, вам необходимо купить лицензию. Вам нужна одна уникальная лицензия на каждый общедоступный сервер (точно так же, как это делает Кирби). Условия использования см. на сайте license.md
.
Однако даже при наличии действующего лицензионного кода не рекомендуется использовать его в любом проекте, пропагандирующем расизм, сексизм, гомофобию, жестокое обращение с животными или любую другую форму разжигания ненависти.
Техническая поддержка предоставляется только на GitHub. Никаких заявлений и гарантий относительно времени ответа на вопросы поддержки не делается. Но вы также можете присоединиться к обсуждениям на форуме Кирби.
Kirby Opener разработан и поддерживается Бруно Мейликом, игровым дизайнером и веб-разработчиком из Германии. Я хочу поблагодарить Фабиана Майкла за то, что он меня очень вдохновил, и Джулиана Краана за то, что он вообще рассказал мне о Кирби.