Vykreslení chyby obsahující kus HTML kódu

dakur
Člen | 493
+
0
-

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ů:

  1. $form->addError('<p>složité html</p>')
  2. $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.

MajklNajt
Člen | 471
+
0
-

ahoj, ja na to zneužívam makro translate – v presenteri predám jednoduchý kľúč, pod ktorým mám uložené HTML cele chybovej hlášky v xxx.sk_SK.neon – nie je to tiež úplne čisté riešenie, ale osvedčilo sa mi to ako celkom udržiavateľné…

dakur
Člen | 493
+
0
-

Ahoj, děkuju, ale neřeší to problém, jen ho přesouvá ještě dál. Mně jde o to, jak to udělat, aby HTML zůstalo v HTML, kam patří.

h4kuna
Backer | 740
+
0
-

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 | 1028
+
+4
-

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>
h4kuna
Backer | 740
+
0
-

@jiripudil Ano ten addError se musí vždy volat, jsem to nenapsal, díky za doplnění. Jinak toto řešení si myslím že je dostačující.

dakur
Člen | 493
+
0
-

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.

_rasel^
Člen | 59
+
-4
-

Najjednoduchšie riešenie je použitie noescape v latte šablóne.

{$error|noescape}