Kirby Opener es un botón de campo del panel Kirby CMS que le permite usar marcadores de posición para crear URL dinámicas que se llaman con y sin respuesta ajax o inician descargas.
NOTA: Este no es un complemento gratuito. Para poder utilizarlo en un servidor de producción, es necesario comprar una licencia. Para obtener detalles sobre el modelo de licencia de Kirby Opener, desplácese hacia abajo hasta la sección Licencia de este documento.
abrir cualquier URL desde dentro del panel
agregue datos personalizados dentro de la URL usando marcadores de posición
llamar fácilmente a funciones de rutas o modelos de página
mostrar mensajes de estado de respuesta JSON personalizados en la etiqueta del botón
desencadenar la descarga de archivos
activar la copia del portapapeles de la URL
activar la actualización de la página en caso de éxito
activar el cuadro de diálogo de confirmación del navegador
marcadores de posición fácilmente extensibles
análisis configural de la respuesta json
Kirby 2.3+
kirby plugin:install bnomei/kirby-opener
$ git submodule add https://github.com/bnomei/kirby-opener.git site/plugins/kirby-opener
Descargue el contenido de este repositorio como archivo ZIP.
Cambie el nombre de la carpeta extraída a kirby-opener
y cópiela en el directorio site/plugins/
de su proyecto Kirby.
Inicie Kirby Panel y cree una nueva página con el openerexample
de plantilla que proporciona este complemento. El complemento también viene con algunos campos de ejemplo para comenzar. Puede encontrar sus definiciones de campos globales en la carpeta kirby-opener/blueprints/fields
.
Para utilizar el complemento al máximo, deberá definir sus propias URL utilizando marcadores de posición y tal vez incluso crear los controladores y/o plantillas para responder con el JSON.
example1: openeropenuser example2: openeropenexternal example3: openeropenpagefield example4: openerpopup example5: openerdownload example6: openersuccess example7: openererror example8: openercontroller
Agregue esta definición de campo a cualquier plano y abra la página en el panel.
ejemplo2explicado:tipo: openercommand: 'https://www.google.com/?q={field.title}/open:yes'text: 'Buscar título en Google'
El {field.title}
se llama marcador de posición . Será reemplazado por algo relacionado con el contexto en la página del panel. En este caso, con el campo title
del objeto $page
actual.
Agregue esta definición de campo a un plano. Creará un nuevo botón opener
en el panel con la etiqueta Download fileXY
. Mientras espera la respuesta se mostrará el ...
Una vez que la página llamada responda con JSON, se analizará. A menos que haya un message
diferente en el JSON, se mostrará el textsuccess
del plano.
ejemplo5explicado:tipo: openercommand: '/{page.url}/fileparam:fileXY/download:yes'text: 'Descargar un archivo'textprogress: '...'textsuccess: 'Descargar...'
La {page.url}
dentro del command
es un marcador de posición y será reemplazada por la URL de la página actual. Hay un par de marcadores de posición predefinidos, pero probablemente querrás definir los tuyos propios. Se pueden configurar qué propiedades del objeto JSON raíz se analizan para determinar el éxito, el mensaje y la URL del archivo. Estos temas se describirán más adelante en este archivo Léame.
El parámetro download:yes
también se puede configurar. Le indica al código JavaScript del complemento que descargue el archivo y no lo abra en una ventana emergente (ya que la mayoría de los navegadores lo bloquearían de forma predeterminada).
Para este ejemplo, respondamos descargando el archivo de licencia de Kirby. En el código de su plantilla necesita crear y devolver una respuesta JSON.
if(param('fileparam') == 'fileXY') { $código = f::exists(kirby()->roots()->index().DS.'license.md')? 200: 400; $json = ['código' => $código, 'fileurl' => kirby()->urls()->index().'/license.md', ];dormir(5); // espera un poco para propósitos de ejemplodie(response::json($json, $code)); }
Tenga en cuenta que esta es una implementación muy básica para devolver JSON. El Kirby Cookbook y el Kirby Forum son buenas fuentes para hacerlo mejor.
Ahora abra su página en el panel y presione el botón Download fileXY
. Debería aparecer el cuadro de diálogo de descarga de su navegador para el archivo Kirby License.md. a menos que le hayas quitado la licencia, pequeño sinvergüenza.
Para asegurarse de que el comando solo se pueda llamar desde el panel, debe agregar algún tipo de protección. Supongamos que tiene preparado un controlador api
(o simplemente una plantilla). Agregue la siguiente definición de campo a cualquier plano que desee activar la API.
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'Do Work'textprogress: 'working...'textsuccess: 'Hecho.'texterror: 'Error.'
Entonces, en cualquier página dentro del panel que tenga este campo, ahora tendrá un botón Do Work
. Al presionarlo se iniciará una solicitud ajax a la página api
con parámetros adicionales. Dado que estos parámetros también contienen algunos marcadores de posición , estos serán reemplazados por valores específicos del contexto.
Ahora necesitas algo de lógica para manejar la solicitud. Prefiero usar un controlador en combinación con plantillas, así que pegue esto en su controlador api
. Este complemento viene con un controlador de ejemplo para ayudarlo a comenzar. Pero echemos un vistazo a cómo funciona el controlador.
<?phpreturn function($sitio, $páginas, $página) { // preparar la respuesta json$json = ['código' => 400, 'mensaje' => '', 'fileurl' => '']; // #1: seguridad opcional...// requiere que un usuario inicie sesión y // la solicitud debe provenir del complemento de apertura del panel y// tiene que ser un callif ajax adecuado (! $ sitio-> usuario () || !boolval(param('panel')) || // agregado automáticamente por el complemento !r::ajax() ) { morir(respuesta::json($json, 400)); } // #2: ahora verifique si es necesario realizar trabajo en allif(param('mycmd') == 'dowork') { // #3: hacer que la página funcione en$pageToWork = null; // #3.1: prueba autoidif($autoid = param('autoid')) { // te queda para implementar$pageToWork = myGetPageByAutoIdFunction($autoid); } // #3.2: prueba dirurielse if($diruri = param('diruri')) { // el complemento proporciona un método de páginas para obtener la página a partir de un uri codificado// ¿por qué codificar el uri? porque podría contener múltiples '/' y eso rompería los parámetros.$pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4: ¿encontraste una página? luego valida con secreto y empieza a trabajar// ¿por qué un secreto? para agregar un diseño adicional de seguridad para que crear una solicitud // válida sea algo que solo usted puede hacer y nadie del exterior.if($pageToWork && $pageToWork->openerSecret() == param('secret')) { // trabajar, dormir (5); // luego responde...$json['código'] = 200; $json['message'] = '¡Hora de comer!'; } } // en aras de la simplicidad, simplemente salga ahoradie(response::json($json, intval($json['code']))); // normalmente un controlador devolvería algunos valores a la plantilla//return compact('json');};
Los marcadores de posición le ayudan a crear comandos rápidamente. ¿Por qué implementé marcadores de posición en lugar de analizar el comando directamente? Le ayudan a evitar errores al apegarse al principio DRY.
reemplace el comodín con cualquier nombre de campo del modelo para obtener el valor del campo. sólo se admiten números y cadenas.
Obtendrá los campos y llamará urlencode()
en su valor.
$page->url()
en plantilla
$page->parent()->url()
en la plantilla
token que puede verificar en la plantilla/controlador si la solicitud es válida. limitado a la página.
token que puede verificar en la plantilla/controlador si la solicitud es válida. versión comodín.
urlencoded($page->diruri())
para reenviar esta página a cualquier otra. Funciones auxiliares disponibles: consulte el ejemplo del controlador.
Usar el complemento autoid es una buena alternativa a diruri
si implementa un método de búsqueda rápida, tal vez con un caché. Dado que simplemente usar $site->index()
o $site->search()
puede ser lento si tiene muchas páginas.
También puedes definir el tuyo propio creando una configuración site/config/config.php
. Este complemento le otorga acceso a $site
y $page
.
c::set('plugin.opener.placeholder', [ 'myfield' => '$page->myfield()->fieldmethod()', 'another' => '$page->parent()->diruri ()', 'aún más' => '$sitio->otrocampo()', ]);
Puede configurarlos en su site/config/config.php
.
por defecto: ''
agregue su licencia aquí y el widget que le recuerda que debe comprar una desaparecerá del Panel.
predeterminado: SALT único para su servidor web
este valor se utiliza para crear el secret
y usted debe establecer su propio valor para mejorar la seguridad, pero no es obligatorio.
predeterminado: verdadero
Si está deshabilitado, el complemento no instala ningún blueprints, templates, controllers, hooks and routes
que utilicen sus ejemplos. Utilice esta configuración en un entorno de producción.
predeterminado: code
use esta configuración para definir una propiedad de objeto raíz json que se usará para analizar el código de estado.
predeterminado: message
use esta configuración para definir una propiedad de objeto raíz json que se usará para analizar el mensaje de respuesta.
predeterminado: fileurl
use esta configuración para definir una propiedad de objeto raíz json que se usará para analizar la URL del archivo que se descargará.
predeterminado: 5000
en ms
después de ese retraso, el botón deja de mostrar el mensaje y vuelve a su estado inicial.
predeterminado: falso
las descargas se abren a través del diálogo de Bowser si es posible y no como ventanas emergentes que la mayoría de los navegadores bloquean.
predeterminado: 'descargar: sí'
parte del comando para indicarle al script js del complemento que active la descarga del contenido de la respuesta JSON (consulte json.fileurl
).
predeterminado: 'abierto: sí'
parte del comando para indicarle al script js del complemento que active una nueva ventana/pestaña con el comando como URL. No habrá llamada ajax.
predeterminado: 'copiar: sí'
parte del comando para indicarle al script js del complemento que active la copia del portapapeles de la URL. No habrá llamada ajax. Si el navegador bloquea, se comporta como con open:yes
.
predeterminado: 'actualizar: sí'
parte del comando para indicarle al script js del complemento que active una actualización de la página en caso de éxito.
predeterminado: falso
Si está habilitado, puede usar $pageModel
en sus marcadores de posición para acceder a las funciones definidas en sus modelos de página Kirby.
predeterminado: falso
Los comandos solo le permiten encadenar $page
o $site
y sus métodos pero sin parámetros. Si habilitaste allow-eval
puedes volverte loco con tus marcadores de posición de hasta 100 caracteres y una sola declaración. Pero como eval()
es peligroso, esta configuración está deshabilitada de forma predeterminada. Tenga en cuenta los riesgos que conlleva habilitar esta configuración.
Si se habilitan, son posibles marcadores de posición como los siguientes:
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->mymethod($page->somefield()->value( ))', // menos de 100 caracteres]);
Este complemento se proporciona "tal cual" sin garantía. Úselo bajo su propia responsabilidad y pruébelo siempre usted mismo antes de usarlo en un entorno de producción. Si encuentra algún problema, cree un nuevo problema.
Kirby Opener se puede evaluar tantas veces como quieras en cuántos servidores privados quieras. Para implementar Kirby Opener en cualquier servidor público, necesita comprar una licencia. Necesita una licencia única por servidor público (tal como lo hace Kirby). Consulte license.md
para conocer los términos y condiciones.
Sin embargo, incluso con un código de licencia válido, se desaconseja su uso en cualquier proyecto que promueva el racismo, el sexismo, la homofobia, el abuso animal o cualquier otra forma de discurso de odio.
El soporte técnico se proporciona únicamente en GitHub. No se hacen representaciones ni garantías con respecto al tiempo de respuesta en el que se responden las preguntas de soporte. Pero también puedes unirte a las discusiones en el Foro Kirby.
Kirby Opener es desarrollado y mantenido por Bruno Meilick, un diseñador de juegos y desarrollador web de Alemania. Quiero agradecer a Fabian Michael por inspirarme mucho y a Julian Kraan por hablarme de Kirby en primer lugar.