
Proof-of-concept per iOS che dimostra la sovrascrittura dei font tramite CVE-2022-46689 per ricerca sulla sicurezza e test delle vulnerabilità.

Un campo Flexible facile e completo per Laravel Nova, perfetto per gruppi di campi ripetibili e flessibili.

Ecco una guida molto sintetica per iniziare subito. Consulta la documentazione completa su https://whitecube.github.io/nova-flexible-content
composer require whitecube/nova-flexible-content
Un campo flexible permette una gestione facile di gruppi di campi ripetibili e ordinabili. A differenza delle poche soluzioni esistenti per Laravel Nova, questo non ha vincoli su quali campi puoi usare all'interno di questi gruppi. Ciò significa che puoi usare tutti i tipi di campo di Laravel Nova e anche i campi creati dalla community.
Un layout rappresenta un gruppo di campi che può essere ripetuto all'interno del campo Flexible. Puoi aggiungere tutti i layout che desideri. Se viene definito un solo layout, il campo si comporterà come un semplice Repeater; aggiungendo più layout otterrai invece un Flexible Content. Entrambi i concetti sono simili ai loro cugini nel plugin ACF di WordPress.
I layout possono essere aggiunti utilizzando il seguente metodo sui tuoi campi Flexible:
addLayout(string $title, string $name, array $fields)
Il parametro $name viene usato per salvare il layout scelto nel valore del campo. Sceglilo con attenzione: probabilmente lo userai per identificare i layout nella tua applicazione.
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')
])
];
}

Puoi modificare il testo predefinito del pulsante "Aggiungi layout" in questo modo:
Flexible::make('Content')
->button('Add something amazing!');

Se stai usando Laravel 6 o versioni precedenti, o non vuoi usare i cast, utilizza un accessor sul tuo modello con il trait HasFlexible](https://whitecube.github.io/nova-flexible-content/#/?id=with-the-hasflexible-trait).
Laravel 7 introduce i cast personalizzati e i campi Flexible Content sono il caso d'uso perfetto per essi. Il campo salva i suoi valori come una singola stringa JSON, quindi questa stringa deve essere analizzata prima di poter essere utilizzata nella tua applicazione. Può essere fatto banalmente usando la classe FlexibleCast inclusa in questo pacchetto:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Whitecube\NovaFlexibleContent\Value\FlexibleCast;
class MyModel extends Model
{
protected $casts = [
'flexible-content' => FlexibleCast::class
];
}
Di default, la classe FlexibleCast raccoglie istanze Layout di base. Se vuoi mappare i layout in istanze di Layout personalizzate, è anche possibile. Per prima cosa crea un cast flexible personalizzato eseguendo php artisan flexible:cast MyFlexibleCast. Questo creerà il file nella directory App\Casts.
Poi mappa facilmente le tue classi di layout personalizzate alle chiavi appropriate:
namespace App\Casts;
class MyFlexibleCast extends FlexibleCast
{
protected $layouts = [
'wysiwyg' => \App\Nova\Flexible\Layouts\WysiwygLayout::class,
'video' => \App\Nova\Flexible\Layouts\VideoLayout::class,
]
}
Se hai bisogno di più controllo, puoi sovrascrivere il metodo getLayoutMappings.
Le Collection restituite dal cast FlexibleCast e dal trait HasFlexible estendono la classe originale Illuminate\Support\Collection. Queste Collection di layout personalizzate espongono un metodo find(string $name) che restituisce il primo layout con il $name indicato.
I layout sono una sorta di fake models. Usano il trait HasAttributes di Laravel, il che significa che puoi definire accessor e mutator per gli attributi del layout. Inoltre, è anche possibile accedere alle proprietà del Layout tramite i seguenti metodi:
name()Restituisce il nome del layout.
title()Restituisce il titolo del layout (come mostrato in Nova).
key()Restituisce la chiave univoca del layout (l'identificatore univoco del layout).
Quando utilizzi il campo Flexible Content, ti imbatterai presto in casi d'uso per cui le basi descritte sopra non bastano. Per questo abbiamo sviluppato il pacchetto in modo estendibile, rendendo possibile aggiungere facilmente comportamenti e/o capacità personalizzati al campo e al suo output.
A volte le definizioni addLayout possono diventare piuttosto lunghe, o magari vuoi condividerle con altri campi Flexible. La risposta è estrarre il tuo Layout in una propria classe. Consulta la documentazione per maggiori informazioni.
Oltre alle classi di Layout riutilizzabili, puoi fare un passo avanti e creare classi Preset per i tuoi campi Flexible. Queste ti permettono di riutilizzare l'intero campo Flexible dove vuoi. Rende inoltre più semplice rendere dinamici i tuoi campi Flexible, ad esempio se vuoi aggiungere Layout condizionalmente. E, ultimo ma non meno importante, hanno anche il vantaggio di ripulire le tue classi di risorse Nova, se il tuo campo Flexible ha molte definizioni addLayout. Consulta la documentazione per maggiori informazioni.
Di default, il campo sfrutta una colonna JSON nella tabella del tuo modello. In alcuni casi, vorresti davvero usare questo campo, ma per qualche motivo un attributo JSON non è la strada giusta. Ad esempio, potresti voler salvare i valori in un'altra tabella (il che significa usare il campo Flexible Content invece di un tradizionale campo BelongsToMany o HasMany). Nessun problema, ci pensiamo noi!
Indica al campo come salvare e recuperare il suo contenuto creando una tua classe Resolver, che in pratica contiene solo due semplici metodi: get e set. Consulta la documentazione per maggiori informazioni.
Forse hai sentito parlare di uno dei nostri altri pacchetti, nova-page, che è un Nova Tool che consente di modificare pagine statiche come una pagina "About" (o simili) senza dover dichiarare un modello per essa singolarmente. Molto spesso, il campo Flexible Content torna utile. Non preoccuparti, entrambi i pacchetti funzionano bene insieme! Per prima cosa crea un template di nova page e aggiungi un flexible content ai campi del template.
Come spiegato nella documentazione, puoi accedere al contenuto statico di nova-page nelle tue viste blade usando {{ Page::get('attribute') }}. Quando richiedi il contenuto flexible in questo modo, viene restituita una stringa JSON grezza che descrive il contenuto flexible, il che ovviamente non è molto utile. Invece, puoi semplicemente implementare il trait Whitecube\NovaFlexibleContent\Concerns\HasFlexible sui tuoi Template di pagina, che esporrà il metodo facade Page::flexible('attribute') e si occuperà della trasformazione del contenuto flexible.
namespace App\Nova\Templates;
// ...
use Whitecube\NovaFlexibleContent\Concerns\HasFlexible;
class Home extends Template
{
use HasFlexible;
// ...
}
Se dipendi da questo pacchetto nelle tue applicazioni in produzione, prendi in considerazione l'idea di sponsorizzarci! È il modo migliore per aiutarci a continuare a fare ciò che amiamo: creare ottimo software open source.
Sei libero di suggerire modifiche, chiedere nuove funzionalità o correggere bug da solo. Siamo sicuri che ci siano ancora molti miglioramenti possibili e saremmo felicissimi di integrare pull request utili.
Grazie!
Quando aggiungi una nuova funzionalità o correggi un bug, aggiungi i corrispondenti test unitari. La suite di test attuale è limitata, ma ogni test unitario aggiunto migliorerà la qualità del pacchetto.
Esegui PHPUnit chiamando composer test.
Da Whitecube usiamo un sacco di software open source come parte del nostro lavoro quotidiano. Quindi, quando abbiamo l'opportunità di restituire qualcosa, siamo super entusiasti!