Skip to content

9.4.0 - Vistas, generateModelFrom, run en componentes y pipe functions

Choose a tag to compare

@osumionline osumionline released this 07 Nov 16:24
· 150 commits to main since this release

Nueva versión 9.4.0, por fin una nueva versión sin breaking changes, pero con muchas novedades.

Vistas

A partir de esta versión se incluye una nueva opción para el router que permite enlazar URLs directamente a archivos estáticos, sin tener que ejecutar un componente. Esto puede servir por ejemplo para páginas que no vayan a cambiar a lo largo del tiempo como una landing page o una página de textos legales.

// Ejemplo de una vista, una URL y el archivo a devolver directamente
ORoute::view('/views/without-layout', 'Module/Views/WithoutLayout.html');
// Las vistas también pueden usar filtros y layouts
ORoute::view('/views/with-layout', 'Module/Views/WithLayout.html', [], DefaultLayoutComponent::class);

Nueva tarea generateModelFrom

Nueva tarea del framework: generateModelFrom. Anteriormente se contaba con la tarea generateModel, que leía las clases de modelo definidas y generaba el código SQL necesario para crear su representación en la base de datos. Esta nueva tarea es la versión inversa. A partir de un archivo de datos JSON, esta tarea crea todas las clases de modelo e incluso genera las funciones necesarias cuando hay tablas con referencias entre sí. Se incluye un archivo de ejemplo en el repositorio new.

Método run en componentes

Hasta esta versión, los componentes que se ejecutaban al acceder a una ruta, primero ejecutaban su método run y luego se renderizaba su resultado. Pero los componentes reutilizables no contaban con este mecanismo. A partir de ahora todos los componentes funcionan igual, si un componente cuenta con un método run, al renderizarlo primero se ejecuta este método y luego se muestra el resultado final.

Sustituciones en templates

Hasta ahora si las templates de los componentes eran .html, .json o .xml, se podía usar en ellas la notación mustache syntax para realizar sustituciones de variables:

Hola {{nombre}} // Si la variable $nombre del componente tiene valor "Jack", se sustituiría como "Hola Jack"

Pero las templates con extensión .php se ejecutaban y no permitían usar este tipo de notaciones. Ahora todos los tipos de archivo permiten usar esta notación, independietemente de la extensión. Además, ahora aparte de realizar sustituciones directas de variables, también permite realizar sustituciones de atributos en objetos.

// Variable $nombre en el componente
Hola {{ nombre }}

// Variable $user, por ejemplo una instancia de la clase de modelo User
Hola {{ user.name }}

Por último, ahora también se permiten espacios entre las llaves de apertura y cierre de las sustituciones, para que no sea tan estricto y falle por un espacio descuidado.

Pipe functions

Ahora las sustituciones de los templates admiten 4 funciones que se les puede combinar llamadas pipe functions. Usando la sintaxis {{ variable | función }} se han añadido 4 funciones que simplificarán la creación de componentes de modelo:

{
  "id": {{ user.id }},
  "name": {{ user.name | string }},
  "score": {{ user.score | number(2, ".", "") }},
  "active": {{ user.active | bool }},
  "created_at": {{ user.created_at | date }}
}

Función string

Devuelve el valor tras hacerle urlencode.

Función number

Para las variables de tipo float, se les aplica la máscara de la función number_format. Se le puede pasar como parámetros el número de decimales a mostrar, separador de decimales y separador de miles. Si no se indican estos parámetros, por defecto muestra dos decimales, separador de decimales con punto y sin separador de miles.

Función bool

Devuelve la representación textual del valor de una variable booleana: "true" o "false".

Función date

Se le aplica una máscara para transformar la fecha al formato deseado. La máscara es la misma de la función date. Por defecto el formato a aplicar es d/m/Y H:i:s.

Todas estas funciones en caso de recibir un valor nulo devuelven "null" como texto. El resultado de estas sustituciones sería:

{
  "id": 1,
  "name": "Nombre+de+usuario",
  "score": 11.5,
  "active": true,
  "created_at": "07/11/2024 17:23:15"
}