
Proof-of-concept-App zum Überschreiben von Schriftarten auf iOS mithilfe von CVE-2022-46689.

Ein einfaches & vollständiges Flexible Field für Laravel Nova, perfekt für wiederholte und flexible Feldgruppen.

Hier ist eine sehr kompakte Anleitung, um sofort loszulegen. Die vollständige Dokumentation findest du unter https://whitecube.github.io/nova-flexible-content
composer require whitecube/nova-flexible-content
Ein Flexible Field ermöglicht die einfache Verwaltung von wiederholbaren und sortierbaren Feldgruppen. Im Gegensatz zu den wenigen bestehenden Lösungen für Laravel Nova gibt es hier keine Einschränkungen, welche Felder du innerhalb dieser Gruppen verwenden darfst. Das bedeutet, dass du alle Laravel-Nova-Feldtypen sowie alle von der Community erstellten Felder verwenden kannst.
Ein Layout repräsentiert eine Gruppe von Feldern, die innerhalb des Flexible-Fields wiederholt werden kann. Du kannst so viele Layouts hinzufügen, wie du möchtest. Wenn nur ein Layout definiert ist, verhält sich das Feld wie ein einfacher Repeater, und durch das Hinzufügen weiterer Layouts erhältst du einen Flexible Content. Beide Konzepte ähneln ihren Verwandten im ACF-Plugin von Wordpress.
Layouts können mit der folgenden Methode zu deinen Flexible-Fields hinzugefügt werden:
addLayout(string $title, string $name, array $fields)
Der Parameter $name wird verwendet, um das gewählte Layout im Wert des Feldes zu speichern. Wähle ihn weise, denn du wirst ihn wahrscheinlich verwenden, um die Layouts in deiner Anwendung zu identifizieren.
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')
])
];
}

Du kannst den Text des standardmäßigen „Add layout"-Buttons wie folgt ändern:
Flexible::make('Content')
->button('Add something amazing!');

Wenn du Laravel 6 oder älter verwendest oder keine Casts nutzen möchtest, verwende bitte einen Accessor auf deinem Model mit dem HasFlexible-Trait.
Laravel 7 bringt Custom Casts ins Spiel, und Flexible-Content-Felder sind der perfekte Anwendungsfall dafür. Das Feld speichert seine Werte als einzelnen JSON-String, was bedeutet, dass dieser String geparst werden muss, bevor er in deiner Anwendung verwendet werden kann. Das lässt sich problemlos mit der FlexibleCast-Klasse aus diesem Paket bewerkstelligen:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Whitecube\NovaFlexibleContent\Value\FlexibleCast;
class MyModel extends Model
{
protected $casts = [
'flexible-content' => FlexibleCast::class
];
}
Standardmäßig sammelt die FlexibleCast-Klasse einfache Layout-Instanzen. Wenn du die Layouts in benutzerdefinierte Layout-Instanzen abbilden möchtest, ist auch das möglich. Erstelle zuerst einen benutzerdefinierten Flexible-Cast, indem du php artisan flexible:cast MyFlexibleCast ausführst. Dadurch wird die Datei im Verzeichnis App\Casts erstellt.
Anschließend kannst du deine benutzerdefinierten Layout-Klassen einfach den passenden Schlüsseln zuordnen:
namespace App\Casts;
class MyFlexibleCast extends FlexibleCast
{
protected $layouts = [
'wysiwyg' => \App\Nova\Flexible\Layouts\WysiwygLayout::class,
'video' => \App\Nova\Flexible\Layouts\VideoLayout::class,
]
}
Wenn du mehr Kontrolle benötigst, kannst du stattdessen die Methode getLayoutMappings überschreiben.
Collections, die vom FlexibleCast-Cast und vom HasFlexible-Trait zurückgegeben werden, erweitern die ursprüngliche Illuminate\Support\Collection. Diese benutzerdefinierten Layout-Collections bieten eine Methode find(string $name), die das erste Layout mit dem angegebenen Layout-$name zurückgibt.
Layouts sind eine Art Pseudo-Models. Sie verwenden den HasAttributes-Trait von Laravel, was bedeutet, dass du Accessors & Mutators für die Attribute des Layouts definieren kannst. Darüber hinaus ist es auch möglich, auf die Eigenschaften des Layouts mit den folgenden Methoden zuzugreifen:
name()Gibt den Namen des Layouts zurück.
title()Gibt den Titel des Layouts zurück (wie er in Nova angezeigt wird).
key()Gibt den eindeutigen Schlüssel des Layouts zurück (die eindeutige Kennung des Layouts).
Bei der Verwendung des Flexible-Content-Feldes wirst du schnell auf Anwendungsfälle stoßen, für die die oben beschriebenen Grundlagen nicht ausreichen. Deshalb haben wir das Paket erweiterbar entwickelt, sodass du problemlos benutzerdefinierte Verhaltensweisen und/oder Fähigkeiten zum Field und seiner Ausgabe hinzufügen kannst.
Manchmal können addLayout-Definitionen ziemlich lang werden, oder du möchtest sie mit anderen Flexible-Feldern teilen. Die Lösung dafür ist, dein Layout in eine eigene Klasse auszulagern. Weitere Informationen dazu findest du in der Dokumentation.
Zusätzlich zu wiederverwendbaren Layout-Klassen kannst du noch einen Schritt weiter gehen und Preset-Klassen für deine Flexible-Felder erstellen. Diese ermöglichen es dir, dein gesamtes Flexible-Feld überall dort wiederzuverwenden, wo du es möchtest. Sie erleichtern es auch, deine Flexible-Felder dynamisch zu gestalten, zum Beispiel wenn du Layouts bedingt hinzufügen möchtest. Und nicht zuletzt haben sie den zusätzlichen Vorteil, dass sie deine Nova-Ressourcenklassen aufräumen, wenn dein Flexible-Feld viele addLayout-Definitionen enthält. Weitere Informationen dazu findest du in der Dokumentation.
Standardmäßig nutzt das Feld eine JSON-Spalte in der Tabelle deines Models. In manchen Fällen möchtest du dieses Feld wirklich verwenden, aber aus irgendeinem Grund ist ein JSON-Attribut nicht der richtige Weg. Zum Beispiel könntest du die Werte in einer anderen Tabelle speichern wollen (das heißt, du verwendest das Flexible-Content-Feld anstelle eines traditionellen BelongsToMany- oder HasMany-Feldes). Keine Sorge, wir haben dich abgedeckt!
Teile dem Feld mit, wie es seinen Inhalt speichern und abrufen soll, indem du deine eigene Resolver-Klasse erstellst, die im Grunde nur zwei einfache Methoden enthält: get und set. Weitere Informationen dazu findest du in der Dokumentation.
Vielleicht hast du von einem unserer anderen Pakete gehört, nova-page, einem Nova-Tool, mit dem du statische Seiten wie eine „Über uns"-Seite (oder ähnliches) bearbeiten kannst, ohne dafür ein Model einzeln deklarieren zu müssen. Sehr oft ist das Flexible-Content-Feld dabei sehr nützlich. Keine Sorge, beide Pakete funktionieren gut zusammen! Erstelle zuerst eine nova-page-Vorlage und füge einen Flexible Content zu den Feldern der Vorlage hinzu.
Wie in der Dokumentation erklärt, kannst du in deinen Blade-Views mit {{ Page::get('attribute') }} auf die statischen Inhalte von nova-page zugreifen. Wenn du den Flexible Content auf diese Weise anforderst, erhältst du einen rohen JSON-String, der den Flexible Content beschreibt, was natürlich nicht sehr nützlich ist. Stattdessen kannst du einfach den Trait Whitecube\NovaFlexibleContent\Concerns\HasFlexible auf deinen Seiten-Templates implementieren, wodurch die Fassadenmethode Page::flexible('attribute') verfügbar gemacht wird und die Transformation des Flexible Contents übernommen wird.
namespace App\Nova\Templates;
// ...
use Whitecube\NovaFlexibleContent\Concerns\HasFlexible;
class Home extends Template
{
use HasFlexible;
// ...
}
Wenn du in deinen Produktionsanwendungen von diesem Paket abhängig bist, denke darüber nach, uns zu sponsern! Es ist der beste Weg, uns dabei zu helfen, weiterhin das zu tun, was wir lieben: großartige Open-Source-Software zu entwickeln.
Du kannst gerne Änderungen vorschlagen, neue Funktionen anfragen oder Fehler selbst beheben. Wir sind sicher, dass es noch viele Verbesserungsmöglichkeiten gibt, und wir würden uns sehr freuen, nützliche Pull Requests zu mergen.
Danke!
Wenn du eine neue Funktion hinzufügst oder einen Fehler behebst, füge bitte entsprechende Unit-Tests hinzu. Der aktuelle Satz an Tests ist begrenzt, aber jeder hinzugefügte Unit-Test verbessert die Qualität des Pakets.
Führe PHPUnit aus, indem du composer test aufrufst.
Bei Whitecube verwenden wir täglich eine Menge Open-Source-Software. Wenn wir also die Gelegenheit haben, etwas zurückzugeben, sind wir super begeistert!
Wir hoffen, dass dir dieser kleine Beitrag von uns gefällt, und würden uns freuen, von dir zu hören, wenn du ihn in deinen Projekten nützlich findest. Folge uns auf Twitter für weitere Updates!