Vlastní „nestandardní“ input ve formuláři

Alsatian
Člen | 175
+
0
-

Ahoj.

Tvořím fakturační formulář, který bude obsahovat krom standardních polí (například) jméno, splatnost, var. symbol… taky fakturované položky. Rád bych vytvořil jejich vlastní vzhled. Na jednom řádku „název položky“, „množství“ a „cena“.
Někde dole tlačítko „přidat položky“ a odebrat. S tím už si poradím.

Jak mám, prosím, vykreslit vlastní vzhled prvků fakturovaných položek aniž bych musel celý formulář vykreslovat ručně?

Napadlo mě vytvořit si vlastní komponentu, do bootstrap.php jsem přidal (uvádím nalezený příklad s addDate…)

Nette\Forms\Container::extensionMethod('addDate', function ($form, $name, $label = null) {
    return $form[$name] = new Nette\Forms\Controls\TextInput($label);
});

což neřeší můj problém. Jde to vůbec nějak nebo takto lze přidávat pouze „pozměněné“, standardní formulářové prvky?

Formulář v Latte vykresluji takto:

{import '../components/form.latte'} ... vlastni bootstrap vykresleni formulare
{include bootstrap4form editForm}

PS: takto to mám nyní v NE nette aplikaci: https://imgup.cz/image/LKA8

PS2: vykreslil bych formulář ručně, přijde mi to ale zdlouhavé a pokud změním vykreslení formulářů ve své form.latte šabloně, budu muset překreslit i všechny ručně vytvořené šablony :(

Díky moc :)

Editoval Alsatian (21. 9. 2018 16:40)

CZechBoY
Člen | 3608
+
0
-

Jaktože vlastní input neřeší tvůj problém?

Ty jen potřebuješ udělat nastylovaný input, ne?

Alsatian
Člen | 175
+
0
-

@CZechBoY
Prosím, ukázal bys mi jak by měl kód pro vykreslení vypadat? Nevím si s tím rady. Děkuji :)

Editoval Alsatian (22. 9. 2018 8:53)

Phalanx
Člen | 310
+
+2
-

Napadají mě dvě možnosti:

  1. buď použiješ vlastní formulářový prvek, pokud používáš na více místech (řešilo se – https://forum.nette.org/…do-formulare#… )
  2. nebo si rozdělíš formulář do částí(kontejnerů) a ty pak vykreslíš

https://forum.nette.org/…ms-container#…

Alsatian
Člen | 175
+
0
-

@Phalanx

Díky moc, nakoplo mě to správným směrem. Ještě se snažím zjistit, jak mám validovat takto přidané vstupy. Zřejmě bude nutné je ručně ošetřit po odeslání formuláře v PHP.

Editoval Alsatian (22. 9. 2018 19:55)

Alsatian
Člen | 175
+
0
-

Zatím se mi validace mnou přidaných prvků nedaří. Ošetřím hodnoty, vyhodím

$form->addError('Popis chyby...');

a nevím, jak znovu vypsat při chybě položky do formuláře. Musím je zadat znovu.

HTML mnou přidaných prvků vypadá takto (nejedná se o jeden klasický input)

<div ...>
	<input type="text" class="form-control" name="polozka_text[]" value="">
	<input type="text" class="form-control" name="polozka_cena[]" value="">
	<input type="text" class="form-control" name="polozka_kusy[]" value="">
</div>

$form->getValues() – funguje až při validaci formuláře, nenačtu zde vyplněné hodnoty při chybě (addError) ve formuláři.
$form->getHttpData() – funguje taky až v „public function editFormSucceeded($form, $values)…“ ne při vykreslování formuláře.

Jak toto řešit, prosím?

Editoval Alsatian (22. 9. 2018 19:56)

CZechBoY
Člen | 3608
+
0
-

Ošetřit form inputy můžeš klasicky přes formulářová pravidla.

Alsatian
Člen | 175
+
0
-

@CZechBoY Už jsem dnes asi vysílený :D Nevím jak :(

Phalanx
Člen | 310
+
0
-

@Alsatian Píšeš, že voláš addError – takže předpokládám, že v metodě onSuccess formuláře. Nechybí ti tam return? Protože na konci bývá většinou redirect.

<?php
if ($error) {
    $form->addError('Popis chyby...');
    return; // myslim ze ti chybi
}

$this->getPresenter()->redirect(':Admin:Polozky:detail', $id);
?>

Klidně sem hoď část kódu z onSuccess metody, takhle jenom hádáme.

@CZechBoY tím myslel mít formulářové prvky polozka_text[], atd. definované už tam, kde tvoříš formulář. Používal se na to dobře Kdyby/Replicator, ovšem už je abandoned (a náhradu za něj neznám). https://github.com/…/en/index.md

Alsatian
Člen | 175
+
0
-

@Phalanx Jo, return mi chyběl. I když jej tam ale dám, nic to v mém případě nevyřeší. Blok s položkami generuji pomocí JS. Při chybě musím již vyplněné položky (nějak) zachytit už při vytváření formuláře, což zatím nevím jak, a vypsat je znovu.

Možná na to jdu až příliš složitě. Nevím. Díval jsem se na Kdyby/Repliacator, vypadá hodně dobře a funguje, jediné co se mi nedaří je vypsat položky „po svém“, do řádku a ne jako ostatní pole ve formuláři pod sebe.