Vykreslení chyby obsahující kus HTML kódu
- dakur
- Člen | 493
Ahoj,
řeším, jak nejčistěji vyřešit následující problém. Pokud v
onSuccess
metodě nastane chyba (určitá podmínka je vyhodnocena
jako pravdivá), chci vykreslit v UI poměrně komplikovaný kus HTML kódu.
Mám možnost to udělat jedním z těchto způsobů:
$form->addError('<p>složité html</p>')
$form->addError(Html::el('p')->setText('složité html'))
Ať už tak nebo tak, přidává to prezentační kód do PHP, což nechci.
Jediné, co mě napadá, je do addError()
přidat určitý klíč,
na který se pak dotážu v render
metodě presenteru a nastavím
určitou proměnnou.
onSuccess:
$form->addError('collisionError')
render metoda presenteru:
$this->template->displayError = $form->hasErrors() && \in_array('collisionError', $form->getErrors())
šablona:
{if $displayError}<p>složité html</p>{/if}
To mi však zase přijde jako hackování addError()
metody
k něčemu, k čemu nebyla zamýšlena.
Jak byste to řešili? Příp. jak jste to už vyřešili?
Díky.
- h4kuna
- Backer | 740
onSuccess je callback, kam si můžeš předat vnější objekt nebo proměnou referencí, která ti bude určovat stav. Ten stav pak naplníš v render metodě daného view. A v šabloně můžeš na ten stav reagovat.
Mimochodem pokud řešíš nějakou validaci tak k tomu je onValidate.
Editoval h4kuna (1. 10. 2019 7:46)
- jiri.pudil
- Nette Blogger | 1029
onSuccess je callback, kam si můžeš předat vnější objekt nebo proměnou referencí, která ti bude určovat stav. Ten stav pak naplníš v render metodě daného view. A v šabloně můžeš na ten stav reagovat.
On je tam ještě takový nepěkná věc, že k formuláři je stejně
potřeba přidat aspoň nějakou chybu, aby byl nevalidní a nezpracovával se
dál. Takže volání addError
tam stejně musí proběhnout.
Jak byste to řešili? Příp. jak jste to už vyřešili?
Napadá mě – a je to teda taky trochu nepěkné – do
addError
předat klíč a v šabloně podle něj includovat blok,
pokud existuje:
$form->addError('collisionError');
{define collisionError}
<p>
složité html
</p>
{/define}
<form n:name="form">
{foreach $form->getErrors() as $error}
{ifset #$error}
{include #$error}
{else}
{$error}
{/ifset}
{/foreach}
</form>
- dakur
- Člen | 493
Nakonec jsme s @jiripudil zvolili řešení původní, tj. přes
proměnnou v Template
.
jiri.pudil: Mně nepřipadá špatné dávat do addError jenom nějaký zástupný klíč, koneckonců tak fungují překlady, kde až jiná vrstva (translator) na základě klíče rozhodne, jak chybu reprezentovat uživateli. V případě překladů je to líp (=přímo) integrované do formuláře, ale jinak mi to připadá jako stejný případ: chyba je identifikovaná nějakým klíčem a až šablona ví, jak ji vykreslit; jen se mi nelíbilo to ifování, takže jsem doiteroval k blokům.
Formulář stejně potřebuje vědět, že je nevalidní, takže se mi moc nezdá tu informaci duplikovat ještě do presenteru jen kvůli tomu, že se jinak vykresluje.
dakur: (…) Nicméně v našem konkrétním případě bych zůstal u proměnné, protože máme jen jeden error a přijde mi to less magic, když se to předává přes proměnnou.