Principios¶
Creación de una aplicación Rapido¶
Estos son los pasos básicos para crear una aplicación Rapido:
- vaya a la carpeta de temas (en Configuración del sitio / Tema si preferimos trabajar en línea o, si prefiere trabajar en el sistema de archivos, eso puede estar en la carpeta
static
paquete de tema o en la carpeta deresources
de su instalación de Plone, si no tiene un paquete personalizado), - añadir una nueva carpeta llamada
rapido
, - en la carpeta
rapido
, agregue una nueva carpeta llamadamyapp
.
Eso es todo.
Ahora, podemos implementar nuestra aplicación en esta carpeta. Aquí está una estructura típica para una aplicación rapido:
/rapido
/myapp
settings.yaml
/blocks
stats.html
stats.py
stats.yaml
tags.html
tags.py
tags.yaml
Nota
el archivo settings.yaml
no es obligatorio, pero permite definir los derechos de acceso si es necesario.
Nota
Una aplicación Rapido también se puede ubicar en un tema no activo (ver Aplicación)
Los componentes de la aplicación son blocks
. Un bloque se define por un conjunto de 3 archivos (HTML, Python y YAML) que se encuentran en la carpeta de blocks
.
El archivo YAML define los elementos. Un elemento es cualquier elemento generado dinámicamente en un bloque: puede ser un campo de formulario (input, select, etc.), pero también un botón (ACTION
), o incluso un fragmento de HTML generado (BASIC
).
El archivo HTML contiene el diseño del bloque. El mecanismo de plantilla es super simple, los elementos se adjuntan entre paréntesis, como esto: {my_element}
.
El archivo Python contiene la lógica de la aplicación. Es un conjunto de funciones, cada una nombrada para el elemento o el evento al que corresponde.
Para un elemento BASIC
, por ejemplo, necesitamos proporcionar una función con el mismo nombre que el elemento; Su valor de retorno reemplaza al elemento en el bloque.
Para un elemento ACTION
, se supone que debemos proporcionar una función con el mismo nombre que el elemento; En este caso, se ejecutará cuando un usuario haga clic en el botón de acción.
Aquí está un ejemplo básico:
rapido/myapp/blocks/simpleblock.yaml
:elements: result: BASIC do_something: type: ACTION label: Do something
rapido/myapp/blocks/simpleblock.html
:<p>the answer to life, the universe, and everything is {result}</p> {do_something}
rapido/myapp/blocks/simpleblock.py
:def result(context): return "<strong>42</strong>" def do_something(context): context.app.log('Hello')
Podemos ver nuestro bloque, visitando la siguiente URL:
Funciona bien, pero ¿dónde está nuestro sitio de Plone ahora?
Insertando nuestro bloque en una página Plone¶
Para poner nuestro bloque en algún lugar del sitio de Plone, usamos una regla de Diazo:
<before css:content="#content-core">
<include css:content="form" href="/@@rapido/myapp/blocks/simpleblock" />
</before>
Ahora, si visitamos cualquier página de nuestro sitio, veremos nuestro bloque.
Nota
Si queremos mostrarlo solo en la carpeta _News_, usaremos css:if-content
:
<before css:content="#content-core" css:if-content=".section-news">
<include css:content="form" href="/@@rapido/myapp/blocks/simpleblock" />
</before>
Consulte la documentación de Diazo para obtener más detalles.
Pero desafortunadamente, cuando hacemos clic en nuestro botón «Hacer algo», estamos redirigidos al bloque original.
To remain in the Plone page, we need to activate the ajax
target in
rapido/myapp/blocks/simpleblock.yaml
:
target: ajax
elements:
result: BASIC
do_something:
type: ACTION
label: Do something
Ahora, cuando hacemos clic en nuestro botón, el bloque rapido se vuelve a cargar dentro de la página de Plone.
En lugar de agregar un bloque a una vista Plone existente, es posible que tengamos que proporcionar una nueva representación, asignada a una URL específica. Podemos hacerlo declarando nuestro bloque como una vista de Plone en su archivo YAML:
view:
id: my-custom-view
with_theme: true
Y luego llamamos a @@my-custom-view
en cualquier contenido, como:
Podemos crear tantas vistas como nosotros quizas necesitemos (como @@subscribe
, @@unsubscribe
, @@stats
, …).
Nota
Añadir un montón de reglas rapido en nuestro archivo rules.xml
no es ideal.
Nosotros podríamos preferir crear un archivo rules.xml
en nuestra carpeta rapido/myapp
e incluirlo en nuestro archivo rules.xml
como este:
<xi:include href="rapido/myapp/rules.xml" />
Ejecución de código Python¶
Cada función en nuestros archivos de Python toma un parámetro llamado``context``. El contexto da acceso a objetos útiles:
context.app
: la actual aplicación rapido,context.block
: (si se ejecuta en un contexto de bloque) el bloque actual,context.record
: (si se ejecuta en un contexto de registro) el registro actual,context.request
: la petición actual a rapido (la sub-petición, si se llama de Diazo),context.parent_request
: el request de la página actual (cuando se llama desde Diazo),context.portal
: el objeto de portal Plone,context.content
: el actual objeto de contenido Plone,context.api
: la API de Plone.
Advertencia
context
no es el context
habitual que conocemos en Plone (como context
en una plantilla ZPT o un PythonScript, o self.context
en un BrowserView).
El context
Plone suele ser el contenido actual. En Rapido podemos obtenerlo usando context.content
.
Esto nos permite interactuar con Plone de muchas maneras, por ejemplo, podemos ejecutar consultas de catálogo, crear contenidos, cambiar el estado del flujo de trabajo, etc.
Sin embargo, se comportará como se esperaba:
- el código siempre se ejecutará con el actual derecho de acceso del usuario, por lo que se aplicarán las restricciones de acceso correspondientes de Plone,
- la política CSRF también se aplicará (por ejemplo, una operación Plone marcada como
PostOnly
fallaría si se realiza en una solicitud GET).
Nota
El código que ponemos en nuestros archivos de Python se compila y ejecuta en un entorno de espacio aislado (proporcionado por zope.untrustedpython.interpreter).
Para ayudarnos a depurar nuestro código, podemos agregar:
debug: true
en nuestro archivo settings.yaml
de aplicación. Entonces podemos agregar algún mensaje de registro en nuestro código:
context.app.log("OK")
context.app.log({"something": 1)
y se mostrarán tanto en el registro del servidor como en la consola javascript del navegador.
Almacenando y recuperando datos¶
Una aplicación rapido proporciona un servicio de almacenamiento integrado, basado en Souper.
Nota
Souper está diseñado para almacenar (e indexar) enormes cantidades de datos pequeños (puede almacenar fácilmente los resultados de la encuesta, comentarios, clasificaciones, etc., pero no será apropiado para los archivos adjuntos, por ejemplo).
El servicio de almacenamiento Rapido almacena registros y los registros contienen elementos.
Hay 3 maneras de crear registros en Rapido:
podemos crear registros enviando un bloque: si un bloque contiene algunos elementos de campos (como elementos
TEXT
oNUMBER
por ejemplo), y si el bloque contiene un botón de guardar (agregando{_save}
en su diseño), cada vez que el usuario ingrese valores en los campos y haga clic en guardar, los valores enviados se guardarán en un nuevo registro,podemos crear registros por código:
record = context.app.create_record(id='myrecord')
podemos crear registros utilizando el API REST JSON de Rapido:
POST /:site_id/@@rapido/:app_id Accept: application/json {"item1": "value1"}
o:
PUT /:site_id/@@rapido/:app_id/record/:record_id Accept: application/json {"item1": "value1"}
Lo mismo ocurre con el acceso a los datos:
podemos mostrar registros llamando a su dirección URL, y se renderizarán usando el bloque con el que fueron creados:
/@@rapido/myapp/record/myrecord
podemos obtener un registro por código:
record = context.app.get_record(id='myrecord') some_records = context.app.search('author=="JOSEPH CONRAD"')
podemos obtener registros utilizando el API REST JSON de Rapido:
GET /:site_id/@@rapido/:app_id/record/:record_id Accept: application/json
Integración con Plone¶
Además de la inserción de bloques Rapido usando Diazo en nuestro tema, también podemos integrar nuestros desarrollos Rapido en Plone utilizando:
- Mosaico: Rapido proporciona un tile para Mosaic que nos permite insertar un bloque Rapido en nuestro diseño de página.
- Reglas de contenido: Rapido proporciona una acción de regla de contenido de Plone que nos permite llamar a una función de Python de un bloque cuando ocurre un evento de Plone dado.
- Patrones de Mockup: los patrones de modal y loader de contenido pueden cargar y mostrar bloques Rapido.