
Exploit iOS de prueba de concepto que demuestra la sobrescritura de fuentes mediante CVE-2022-46689 para investigación de seguridad y pruebas de vulnerabilidad.

Un campo Flexible fácil y completo para Laravel Nova, perfecto para grupos de campos repetidos y flexibles.

Aquí tienes una guía muy resumida para empezar lo antes posible. Consulta la documentación completa en https://whitecube.github.io/nova-flexible-content
composer require whitecube/nova-flexible-content
Un campo flexible permite gestionar fácilmente grupos de campos repetibles y ordenables. A diferencia de las pocas soluciones existentes para Laravel Nova, esta no tiene restricciones sobre qué campos puedes usar dentro de estos grupos. Eso significa que puedes usar todos los tipos de campo de Laravel Nova, así como cualquier campo creado por la comunidad.
Un layout representa un grupo de campos que se pueden repetir dentro del campo Flexible. Puedes agregar tantos layouts como desees. Si solo se define un layout, el campo se comportará como un simple Repetidor, y al agregar más layouts obtendrás un Contenido Flexible. Ambos conceptos son similares a sus primos en el Plugin ACF de Wordpress.
Los layouts se pueden agregar usando el siguiente método en tus campos Flexible:
addLayout(string $title, string $name, array $fields)
El parámetro $name se usa para almacenar el layout elegido en el valor del campo. Elígelo con cuidado, probablemente lo usarás para identificar los layouts en tu aplicación.
use Whitecube\NovaFlexibleContent\Flexible;
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
// ...
Flexible::make('Content')
->addLayout('Simple content section', 'wysiwyg', [
Text::make('Title'),
Markdown::make('Content')
])
->addLayout('Video section', 'video', [
Text::make('Title'),
Image::make('Video Thumbnail', 'thumbnail'),
Text::make('Video ID (YouTube)', 'video'),
Text::make('Video Caption', 'caption')
])
];
}

Puedes cambiar el texto predeterminado del botón "Añadir layout" de la siguiente manera:
Flexible::make('Content')
->button('Add something amazing!');

Si estás usando Laravel 6 o versiones anteriores, o no quieres usar casts, por favor usa un accessor en tu modelo con el trait HasFlexible.
Laravel 7 trae casts personalizados, y los campos de contenido flexible son el caso de uso perfecto para ellos. El campo almacena sus valores como una única cadena JSON, lo que significa que esta cadena debe ser analizada antes de poder usarse en tu aplicación. Esto se puede hacer trivialmente usando la clase FlexibleCast de este paquete:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Whitecube\NovaFlexibleContent\Value\FlexibleCast;
class MyModel extends Model
{
protected $casts = [
'flexible-content' => FlexibleCast::class
];
}
Por defecto, la clase FlexibleCast recopilará instancias básicas de Layout. Si deseas mapear los layouts en instancias de Layout personalizadas, también es posible. Primero, crea un cast flexible personalizado ejecutando php artisan flexible:cast MyFlexibleCast. Esto creará el archivo en el directorio App\Casts.
Luego mapea fácilmente tus clases de layout personalizadas a las claves correspondientes:
namespace App\Casts;
class MyFlexibleCast extends FlexibleCast
{
protected $layouts = [
'wysiwyg' => \App\Nova\Flexible\Layouts\WysiwygLayout::class,
'video' => \App\Nova\Flexible\Layouts\VideoLayout::class,
]
}
Si necesitas más control, puedes sobrescribir el método getLayoutMappings en su lugar.
Las colecciones devueltas por el cast FlexibleCast y el trait HasFlexible extienden la Illuminate\Support\Collection original. Estas colecciones de layout personalizadas exponen un método find(string $name) que devuelve el primer layout que tenga el $name de layout dado.
Los layouts son una especie de modelos falsos. Usan el trait HasAttributes de Laravel, lo que significa que puedes definir accessors y mutators para los atributos del layout. Además, también es posible acceder a las propiedades del Layout usando los siguientes métodos:
name()Devuelve el nombre del layout.
title()Devuelve el título del layout (tal como se muestra en Nova).
key()Devuelve la clave única del layout (el identificador único del layout).
Al usar el campo Flexible Content, te encontrarás rápidamente con algunos casos de uso donde los conceptos básicos descritos anteriormente no son suficientes. Por eso desarrollamos el paquete de manera extensible, haciendo posible agregar fácilmente comportamientos y/o capacidades personalizadas al campo y su salida.
A veces, las definiciones de addLayout pueden volverse bastante largas, o quizás quieras que sean compartidas con otros campos Flexible. La respuesta a esto es extraer tu Layout a su propia clase. Consulta la documentación para más información.
Además de las clases de Layout reutilizables, puedes ir un paso más allá y crear clases Preset para tus campos Flexible. Estas te permiten reutilizar todo tu campo Flexible en cualquier lugar que desees. También facilitan hacer que tus campos Flexible sean dinámicos, por ejemplo, si quieres agregar Layouts condicionalmente. Y por último, pero no menos importante, también tienen el beneficio adicional de limpiar tus clases de Recurso Nova, si tu campo Flexible tiene muchas definiciones addLayout. Consulta la documentación para más información.
Por defecto, el campo aprovecha una columna JSON en la tabla de tu modelo. En algunos casos, realmente te gustaría usar este campo, pero por alguna razón un atributo JSON no es el camino a seguir. Por ejemplo, podrías querer almacenar los valores en otra tabla (lo que significa que usarás el campo Flexible Content en lugar de un campo tradicional BelongsToMany o HasMany). ¡No te preocupes, te tenemos cubierto!
Dile al campo cómo almacenar y recuperar su contenido creando tu propia clase Resolver, que básicamente solo contiene dos métodos simples: get y set. Consulta la documentación para más información.
Quizás hayas oído hablar de uno de nuestros otros paquetes, nova-page, que es una herramienta de Nova que permite editar páginas estáticas como una página "Acerca de" (o similar) sin tener que declarar un modelo para ella individualmente. La mayoría de las veces, el campo Flexible Content resulta muy útil. ¡No te preocupes, ambos paquetes funcionan bien juntos! Primero crea una plantilla de nova page y agrega un contenido flexible a los campos de la plantilla.
Como se explica en la documentación, puedes acceder al contenido estático de nova-page en tus vistas blade usando {{ Page::get('attribute') }}. Al solicitar el contenido flexible de esta manera, devuelve una cadena JSON sin procesar que describe el contenido flexible, lo que por supuesto no es muy útil. En su lugar, puedes simplemente implementar el trait Whitecube\NovaFlexibleContent\Concerns\HasFlexible en tus plantillas de página, lo que expondrá el método de fachada Page::flexible('attribute') y se encargará de la transformación del contenido flexible.
namespace App\Nova\Templates;
// ...
use Whitecube\NovaFlexibleContent\Concerns\HasFlexible;
class Home extends Template
{
use HasFlexible;
// ...
}
Si dependes de este paquete en tus aplicaciones de producción, considera patrocinarnos. Es la mejor manera de ayudarnos a seguir haciendo lo que amamos: crear excelente software de código abierto.
Siéntete libre de sugerir cambios, solicitar nuevas funciones o corregir errores tú mismo. Estamos seguros de que todavía hay muchas mejoras que se pueden hacer, y estaríamos muy felices de fusionar solicitudes de extracción útiles.
¡Gracias!
Al agregar una nueva función o corregir un error, agrega las pruebas unitarias correspondientes. El conjunto actual de pruebas es limitado, pero cada prueba unitaria agregada mejorará la calidad del paquete.
Ejecuta PHPUnit llamando a composer test.
En Whitecube usamos mucho software de código abierto como parte de nuestro trabajo diario. Por lo tanto, cuando tenemos la oportunidad de devolver algo, ¡estamos súper emocionados!
Esperamos que disfrutes esta pequeña contribución de nuestra parte y nos encantaría saber de ti si la encuentras útil en tus proyectos. ¡Síguenos en Twitter para más actualizaciones!