Kirby Opener é um botão de campo do painel Kirby CMS que permite usar espaços reservados para criar URLs dinâmicos que são chamados com e sem resposta ajax ou iniciar downloads.
NOTA: Este não é um plugin gratuito. Para usá-lo em um servidor de produção, você precisa comprar uma licença. Para obter detalhes sobre o modelo de licença do Kirby Opener, role para baixo até a seção Licença deste documento.
abra qualquer URL de dentro do painel
adicione dados personalizados no URL usando espaços reservados
chame facilmente funções de rotas ou modelos de página
exibir mensagens personalizadas de status de resposta JSON no rótulo do botão
acionar o download de arquivos
acionar cópia da url na área de transferência
acionar a atualização da página em caso de sucesso
acionar caixa de diálogo de confirmação do navegador
espaços reservados facilmente extensíveis
análise configuracional da resposta json
Kirby 2.3+
kirby plugin:install bnomei/kirby-opener
$ git submodule add https://github.com/bnomei/kirby-opener.git site/plugins/kirby-opener
Baixe o conteúdo deste repositório como arquivo ZIP.
Renomeie a pasta extraída para kirby-opener
e copie-a para o diretório site/plugins/
em seu projeto Kirby.
Inicie o Kirby Panel e crie uma nova página com o modelo openerexample
que este plugin fornece. O plugin também vem com alguns campos de exemplo para você começar. Você pode encontrar suas definições de campo globais na pasta kirby-opener/blueprints/fields
.
Para usar o plugin ao máximo você terá que definir suas próprias urls usando placeholders e talvez até criar os controladores e/ou templates para responder com o JSON.
example1: openeropenuser example2: openeropenexternal example3: openeropenpagefield example4: openerpopup example5: openerdownload example6: openersuccess example7: openererror example8: openercontroller
Adicione esta definição de campo a qualquer blueprint e abra a página no painel.
exemplo2explicado: tipo: openercommand: 'https://www.google.com/?q={field.title}/open:yes'text: 'Pesquisar título no Google'
O {field.title}
é chamado de espaço reservado . Ele será substituído por algo relacionado ao contexto na página do painel. Neste caso, com o campo title
do objeto $page
atual.
Adicione esta definição de campo a um blueprint. Ele criará um novo botão opener
no painel com o rótulo Download fileXY
. Enquanto aguarda a resposta o ...
será exibido. Assim que a página chamada responder com JSON, ela será analisada. A menos que haja uma message
diferente no JSON, o textsuccess
do blueprint será exibido.
exemplo5explicado: tipo: openercommand: '/{page.url}/fileparam:fileXY/download:yes'text: 'Baixar um arquivo'textprogress: '...'textsuccess: 'Baixar...'
O {page.url}
dentro do command
é um espaço reservado e será substituído pelo URL da página atual. Existem alguns espaços reservados predefinidos, mas você provavelmente desejará definir o seu próprio. Quais propriedades do objeto JSON raiz são analisadas para determinar o sucesso, a mensagem e o URL do arquivo podem ser configurados. Esses tópicos serão descritos posteriormente neste leia-me.
O parâmetro download:yes
também pode ser configurado. Ele informa ao código javascript do plug-in para baixar o arquivo e não abri-lo em uma janela pop-up (já que a maioria dos navegadores bloquearia isso por padrão).
Para este exemplo, vamos responder baixando o arquivo de licença Kirby. No código do seu modelo, você precisa construir e retornar uma resposta JSON.
if(param('fileparam') == 'fileXY') { $code = f::exists(kirby()->roots()->index().DS.'license.md') ? 200: 400; $json = ['código' => $código, 'fileurl' => kirby()->urls()->index().'/license.md', ];dormir(5); // espere um pouco, por exemplo, die(response::json($json, $code)); }
Observe que esta é uma implementação muito básica de retorno de JSON. O Kirby Cookbook e o Kirby Forum são boas fontes para fazer melhor.
Agora abra sua página no painel e pressione o botão Download fileXY
. A caixa de diálogo de download do arquivo Kirby License.md do seu navegador deve aparecer. a menos que você tenha removido a licença – seu canalha.
Para garantir que o comando só possa ser chamado de dentro do painel, você precisa adicionar alguma proteção de classificação. Vamos supor que você tenha um controlador api
(ou apenas um modelo) preparado. Adicione a seguinte definição de campo a qualquer blueprint que você deseja acionar a API.
exemploController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'Do Work'textprogress: 'working...'textsuccess: 'Concluído.'texterror: 'Falha.'
Portanto, em qualquer página do painel que possua este campo, você terá agora um botão Do Work
. Pressioná-lo iniciará uma solicitação ajax para a página api
com parâmetros adicionais. Como esses parâmetros também contêm alguns espaços reservados , eles serão substituídos por valores específicos do contexto.
Agora você precisa de alguma lógica para lidar com a solicitação. Eu prefiro usar um controlador em combinação com modelos, então cole-o no seu controlador api
. Este plugin vem com um controlador de exemplo para ajudá-lo a começar. Mas vamos dar uma olhada em como o controlador funciona.
<?phpreturn function($site, $pages, $page) { //preparar resposta json$json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1: segurança opcional...// exige que um usuário esteja logado e // a solicitação deve vir do plugin de abertura de painel e // deve ser um callif( !$site->user) adequado do ajax () || !boolval(param('painel')) || // adicionado automaticamente pelo plugin !r::ajax() ) { morrer(resposta::json($json, 400)); } // #2: agora verifique se o trabalho precisa ser feito em allif(param('mycmd') == 'dowork') { // #3: faz a página funcionar em$pageToWork = null; // #3.1: tente autoidif($autoid = param('autoid')) { // resta para você implementar$pageToWork = myGetPageByAutoIdFunction($autoid); } // #3.2: tente dirurielse if($diruri = param('diruri')) { // o plugin fornece um método de páginas para obter a página do uri codificado // por que codificar o uri? porque poderia conter vários '/' e isso quebraria os parâmetros.$pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4: encontrou uma página? então valide com segredo e comece a trabalhar // por que segredo? para adicionar um layout extra de segurança, portanto, criar uma solicitação // válida é algo que só você pode fazer e ninguém de fora.if($pageToWork && $pageToWork->openerSecret() == param('secret')) { // fazer trabalho, dormir(5); // então responda...$json['code'] = 200; $json['message'] = 'Hora do almoço!'; } } // por uma questão de simplicidade, basta sair nowdie(response::json($json, intval($json['code']))); // normalmente um controlador retornaria alguns valores para o template//return compact('json');};
Os espaços reservados ajudam você a criar comandos rapidamente. Por que implementei espaços reservados em vez de analisar o comando diretamente? Eles ajudam você a evitar erros ao seguir o princípio DRY.
substitua o curinga por qualquer nome de campo do blueprint para obter o valor do campo. apenas números e strings são suportados.
obterá os campos e chamará urlencode()
seu valor.
$page->url()
no modelo
$page->parent()->url()
no modelo
token você pode verificar no modelo/controlador se a solicitação for válida. limitado à página.
token você pode verificar no modelo/controlador se a solicitação for válida. versão curinga.
urlencoded($page->diruri())
para encaminhar esta página para qualquer outra. funções auxiliares disponíveis – veja o exemplo do controlador.
Usar o plugin autoid é uma boa alternativa ao diruri
se você implementar um método de pesquisa rápido, talvez com um cache. Já que apenas usar $site->index()
ou $site->search()
pode ser lento se você tiver muitas páginas.
Você também pode definir o seu próprio criando uma configuração site/config/config.php
. Este plugin concede acesso a $site
e $page
.
c::set('plugin.opener.placeholder', [ 'meucampo' => '$page->meucampo()->fieldmethod()', 'another' => '$page->parent()->diruri ()', 'ainda mais' => '$site->outrocampo()', ]);
Você pode defini-los em seu site/config/config.php
.
padrão: ''
adicione sua licença aqui e o widget lembrando você de comprar uma desaparecerá do Painel.
padrão: SALT exclusivo para seu servidor web
esse valor é usado para criar o secret
e você deve definir seu próprio valor para melhorar a segurança, mas não é obrigatório.
padrão: verdadeiro
se desabilitado, o plugin não instala nenhum blueprints, templates, controllers, hooks and routes
que são usados por seus exemplos. use esta configuração no ambiente de produção.
padrão: code
use esta configuração para definir uma propriedade de objeto raiz json que será usada para analisar o código de status.
padrão: message
use esta configuração para definir uma propriedade de objeto raiz json que será usada para analisar a mensagem de resposta.
padrão: fileurl
use esta configuração para definir uma propriedade de objeto raiz json que será usada para analisar a URL do arquivo a ser baixado.
padrão: 5000
em ms
após esse atraso, o botão deixa de exibir a mensagem para seu estado inicial.
padrão: falso
os downloads são abertos através da caixa de diálogo do Bowser, se possível, e não como janelas pop-up que a maioria dos navegadores bloqueia
padrão: 'baixar: sim'
parte do comando para informar ao script js do plug-in para acionar o download do conteúdo da resposta JSON (consulte json.fileurl
).
padrão: 'abrir: sim'
parte do comando para informar ao script js do plugin para acionar uma nova janela/guia com o comando como url. Não haverá chamada ajax.
padrão: 'copiar: sim'
parte do comando para informar ao script js do plugin para acionar a cópia da url na área de transferência. Não haverá chamada ajax. Se o navegador bloquear, ele se comportará como open:yes
.
padrão: 'atualizar: sim'
parte do comando para informar ao script js do plugin para acionar uma atualização da página em caso de sucesso.
padrão: falso
se ativado, você pode usar $pageModel
em seus espaços reservados para acessar funções definidas em seus modelos de página Kirby.
padrão: falso
comandos permitem apenas encadear $page
ou $site
e seus métodos, mas sem parâmetros. Se você habilitou allow-eval
você pode enlouquecer com seus espaços reservados de até 100 caracteres e uma única instrução. Mas como eval()
é perigoso, esta configuração está desabilitada por padrão. Esteja ciente dos riscos de você ativar esta configuração.
Espaços reservados como os seguintes tornam-se possíveis se ativados:
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->mymethod($page->somefield()->value( ))', // menos de 100 caracteres]);
Este plugin é fornecido "como está", sem garantia. Use-o por sua conta e risco e sempre teste-o antes de usá-lo em um ambiente de produção. Se você encontrar algum problema, crie um novo problema.
Kirby Opener pode ser avaliado pelo tempo que você quiser em quantos servidores privados você quiser. Para implantar o Kirby Opener em qualquer servidor público, você precisa comprar uma licença. Você precisa de uma licença exclusiva por servidor público (assim como Kirby). Consulte license.md
para obter os termos e condições.
No entanto, mesmo com um código de licença válido, é desencorajado a sua utilização em qualquer projecto que promova racismo, sexismo, homofobia, abuso de animais ou qualquer outra forma de discurso de ódio.
O suporte técnico é fornecido apenas no GitHub. Nenhuma representação ou garantia é feita em relação ao tempo de resposta em que as perguntas de suporte são respondidas. Mas você também pode participar das discussões no Fórum Kirby.
Kirby Opener é desenvolvido e mantido por Bruno Meilick, designer de jogos e desenvolvedor web da Alemanha. Quero agradecer a Fabian Michael por me inspirar bastante e a Julian Kraan por me contar sobre Kirby em primeiro lugar.