Formuláře
TiptapEditor
Plnohodnotný rich text editor postavený na TipTap / ProseMirror. Konfigurovatelný toolbar, volitelná rozšíření (tabulky, obrázky, zarovnání textu, zvýraznění) a HTML nebo JSON výstup.
Na této stránce
Plnohodnotný rich text editor postavený na TipTap / ProseMirror. Konfigurovatelný toolbar, volitelná rozšíření (tabulky, obrázky, zarovnání textu, zvýraznění) a HTML nebo JSON výstup.
use NyonCode\WireForms\Components\TiptapEditor;
Nastavení
Žádné. JavaScript editoru se dodává předbundlovaný uvnitř balíčku a Blade
pohled pole ho automaticky injektuje. Žádný npm install, žádný build krok a žádný
app.js import — jen použijte pole a funguje hned.
Editor je code-split: základní bundle (jádro TipTapu + vždy zapnutá rozšíření)
se servíruje na /wire-forms/tiptap/tiptap-editor.js, a volitelná rozšíření
(withTables() / withImages() / withHighlight() / withTextAlign()) jsou v
samostatném addon bundlu, který se načte jen když je nějaké pole na stránce zapne.
Oba sdílejí jeden chunk s jádrem, takže stránka bez těchto rozšíření stáhne méně a
zapnutí tabulek nikdy neposílá druhou kopii jádra editoru. Script tagy
<script type="module"> se injektují jednou za stránku přes Livewire direktivu
@assets; registrují Alpine komponentu tiptapEditor, na kterou pohled spoléhá
(Alpine se dodává s Livewire).
Publikování assetu (volitelné). Pokud má soubory servírovat váš webserver místo routy balíčku, publikujte je pomocí:
php artisan vendor:publish --tag=laravel-assets --forceTo zkopíruje bundly do
public/vendor/wire-forms/— celého stacku, nejen tohoto balíčku — a editor od té chvíle emituje tyhle cesty včetně cache-busteru. Publish zrcadlídist/doslova, takže si entry pointy dál resolvují sdílený chunk relativně vůčivendor/wire-forms/tiptap/. Viz Začínáme → JavaScriptové assety.
Přispěvatelé. Bundly se generují z
packages/forms/resources/js/tiptap-editor.jsatiptap-editor-addons.jsa commitují (se sdíleným chunkem) dopackages/forms/dist/tiptap/. Po editaci zdroje je přebuildujte pomocí:npm run build:forms-assets
Základní použití
TiptapEditor::make('content')
Výchozí obsah
Editor se otevře nad hodnotou z ->default() — kanonického výchozího nastavení,
které má každá komponenta; žádná metoda navíc jen pro editor. Je to markup, ne
holý text, takže šablona přichází předformátovaná:
TiptapEditor::make('minutes') ->default('<h2>Zápis z porady</h2><p>Nějaký <strong>text</strong>.</p><ul><li>První bod</li></ul>')
Jak se to vyhodnotí, v tomto pořadí:
- Runtime formuláře hodnotu naseeduje.
fill()(a stejně tak výchozí stav modalové akce) zapíše->default()do state bagu pro každý klíč, který volající nedodal, takže editor se prostě otevře nad hodnotou, která už tam je. - Editor ji naseeduje, když to hostitel neudělal —
nullsloupec, ručně navázaná property — výchozí obsah dosadí vždy, když je navázaná hodnota prázdná, a rozparsovaný dokument pošle zpět do Livewire, takže uložení formuláře, kterého se uživatel ani nedotkl, uloží šablonu, a ne nic. - Vyprázdněný editor není prázdný. Smazání obsahu uloží
<p></p>, takže znovuotevření dokumentu, který uživatel záměrně vyčistil, výchozí obsah nevrátí. U editačního formuláře, kde je sloupec skutečněnull, přidejte->defaultOnNull(), aby default doplnil hodnotu i na straně serveru.
Při ->outputJson() může být výchozí hodnotou TipTap JSON dokument jako řetězec,
nebo totéž HTML — HTML se tak jako tak rozparsuje na dokument a uloží jako JSON.
Vlastní toolbar
TiptapEditor::make('content') ->toolbarButtons([ 'bold', 'italic', 'underline', '|', 'h2', 'h3', '|', 'bulletList', 'orderedList', '|', 'link', 'undo', 'redo', ])
Použijte '|' jako vizuální oddělovač mezi skupinami.
Znepřístupnit konkrétní tlačítka
TiptapEditor::make('content') ->disableToolbarButtons(['codeBlock', 'code'])
Bez toolbaru
TiptapEditor::make('content') ->disableAllToolbarButtons()
Rozšíření
Zapínejte volitelná rozšíření jednotlivě:
TiptapEditor::make('content') ->withTables() // vkládání + editace tabulek ->withImages() // vkládání obrázků (přes URL prompt) ->withTextAlign() // tlačítka zarovnání left / center / right ->withHighlight() // tlačítko zvýraznění textu
Když je rozšíření zapnuto, jeho toolbarové tlačítko se přidá automaticky.
Formát výstupu
// Výchozí: HTML řetězec uložený v modeluTiptapEditor::make('body')->outputHtml() // Uložit jako TipTap JSON dokument (serializovaný jako JSON řetězec)TiptapEditor::make('body')->outputJson()
Limit znaků
TiptapEditor::make('summary') ->maxLength(2000) // zobrazí živé počítadlo, vynuceno rozšířením CharacterCount
Výška
TiptapEditor::make('content') ->minHeight(400) // minimální výška v pixelech (výchozí 240)
Read-only / disabled
TiptapEditor::make('content') ->readOnly() ->disabled(fn () => ! $this->canEdit)
Lokalizace
Editor si nenese vlastní angličtinu. Tooltipy toolbaru, popisky nadpisů i
prohlížečové prompty, které otevírá tlačítko odkazu a obrázku, se všechny
překládají z wire-forms::fields.editor.*, takže pole respektuje
app()->getLocale(). Angličtina (en) a čeština (cs) jsou součástí balíčku —
česká aplikace zobrazí Tučné, Odrážkový seznam, Nadpis 2 a prompt
URL odkazu.
Titulky promptů se vyhodnocují v PHP a předávají se do Alpine konfigurace editoru — proto se změna jazyka propíše i do řetězců, které žijí uvnitř JS bundlu.
RichEditor a MarkdownEditor popisují své toolbary z týchž klíčů, takže všechny tři editory zní v každém jazyce stejně.
Formulaci změníte (nebo přidáte další jazyk) publikováním překladů a úpravou
lang/vendor/wire-forms/{locale}/fields.php:
php artisan vendor:publish --tag=wire-forms::translations
Popisky tlačítek zůstávají H1 / H2 / H3 ve všech jazycích — to jsou
symboly, ne slova; překládá se tooltip.
Dostupná toolbarová tlačítka
| Klíč | Popis |
|---|---|
bold |
Tučné |
italic |
Kurzíva |
underline |
Podtržení |
strike |
Přeškrtnutí |
code |
Inline kód |
highlight |
Zvýraznění (vyžaduje withHighlight()) |
h1 |
Nadpis 1 |
h2 |
Nadpis 2 |
h3 |
Nadpis 3 |
bulletList |
Neseřazený seznam |
orderedList |
Seřazený seznam |
blockquote |
Blockquote |
codeBlock |
Blok kódu |
link |
Hypertextový odkaz (otevře URL prompt) |
image |
Obrázek (vyžaduje withImages()) |
table |
Vložit tabulku (vyžaduje withTables()) |
alignLeft |
Zarovnat vlevo (vyžaduje withTextAlign()) |
alignCenter |
Zarovnat na střed (vyžaduje withTextAlign()) |
alignRight |
Zarovnat vpravo (vyžaduje withTextAlign()) |
undo |
Zpět |
redo |
Znovu |
| |
Vizuální oddělovač |
Srovnání s RichEditor
| Funkce | RichEditor | TiptapEditor |
|---|---|---|
| Engine | document.execCommand (zastaralé) |
ProseMirror (stabilní) |
| Cross-browser | Nekonzistentní | Konzistentní |
| Rozšíření | Žádná | Tabulky, obrázky, zarovnání, zvýraznění, … |
| Výstup | HTML | HTML nebo JSON |
| npm závislost | Ne | Ano |
| Náročnost nastavení | Nulová | npm install + jeden import |
Metody
| Metoda | Typ | Popis |
|---|---|---|
toolbarButtons(array) |
array | Přepsat seznam toolbarových tlačítek |
disableToolbarButtons(array) |
array | Odstranit konkrétní tlačítka |
disableAllToolbarButtons() |
— | Skrýt toolbar úplně |
default(string|Closure) |
string | Předformátovaný dokument, nad kterým se prázdný editor otevře |
defaultOnNull() |
— | Nechat default() doplnit i existující null při fill |
outputHtml() |
— | Uložit obsah jako HTML (výchozí) |
outputJson() |
— | Uložit obsah jako TipTap JSON řetězec |
withImages(bool) |
bool | Zapnout rozšíření obrázků + tlačítko |
withTables(bool) |
bool | Zapnout rozšíření tabulek + tlačítko |
withTextAlign(bool) |
bool | Zapnout rozšíření text-align + tlačítka |
withHighlight(bool) |
bool | Zapnout rozšíření zvýraznění + tlačítko |
minHeight(int) |
int | Minimální výška editoru v pixelech (výchozí 240) |
maxLength(int|null) |
int | Limit znaků s živým počítadlem |
disabled(bool|Closure) |
bool | Znepřístupnit editor |
readOnly(bool|Closure) |
bool | Read-only režim |
required() |
— | Označit jako povinné |
placeholder(string|Closure) |
string | Placeholder zobrazený, když je prázdné |
live() |
— | Spustit Livewire update při každé změně |
debounce(int) |
ms | Debounce prodleva pro live() |
Label, hint, tooltip a další sdílené metody viz Společné API pole.