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 de resources 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 llamada myapp.

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 o NUMBER 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.

Ver Mostrando Rapido en Plone.