Egoblog.cz - Petr Kobelka

Nette, Kdyby\Replicator a výchozí hodnoty

V aktuálním velkém projektu, který chystáme poměrně hojně používáme Nette Kdyby\Replicator. Našel jsem ale jeden zádrhel.


PHP | Komentáře (1) | Shlédnuto 2052 × | Vloženo: 14. července 2015

Kdyby\Replicator je dle mého názoru skvělý nástroj, který vám ušetří hodne času a práce v Nette formulářích. Jeho instalace pomocí Composeru a následná incializace je celkem lehce zvládnutelný úkol. Narazil jsem ale na problém, který vám zde popíšu a zároveň přidám i své řešení, které celkem dobře funguje. Celkem dobře znamená, že se zatím nevyskytl žádný problém a vše je v pořádku :-)

Vývojové prostředí pro práci s Nette a Kdyby\Replicator

Momentálně funguji na IDE Netbeans pro PHP. To ale nemá s problémem nic společného, jen, kdo to myslí s vývojem vážně, měl by nad nějakým komplexním IDE začít uvažovat, protože to šetří opravdu spoustu času. Verze Nette je 2.2.* Momentálně neplánuji povýšit na 2.3, protože tam se mi objevil nějaký problém v kombinaci s GRIDO, který jsem zatím neměl možnost řádně prozkoumat. Něco s Callback funkcemi, pokud by vás to zajímalo.

Kdyby\Replicator je dev master 1.2. V podstatě jsem žádné problémy nezaznamenal až na ten, který vám budu popisovat níže.

Co je to Replicator?

Asi bych to tu nemusel popisovat, ale pro jistotu. Kdyby\Replicator je formulářová komponenta, která vám umožní dynamicky přidávat a odebírat pole ve formuláří. Navíc je to všechno Nette like, takže zůstávají zachovány validační pravidla a k datům se dostanete přes form->getValues(). Navíc nevyužívá javascript!! k tvorbě dalších polí formuláře, ale hezky probublá přes aplikaci!

Problém, který chci popsat spočívá v požadavku nastavení výchozích hodnot prvků, které jsou obsaženy v kontejneru replikátoru. Pokud je nastavíte v rámci metody createComponent, kde tvoříte formulář a hodnotu nastavíte metodou setDefaultValues(), nebude vám toto nastavení aplikováno na replikátorem nově vytvořené kontejnery. Nestudoval jsem, proč tomu tak u mě je, jen jsem hledal řešení. To je celkem jednoduché.

Jak vyřešit výchozí hodnoty nových kontejnerů v replikátoru

Cílem řešení je přenost odpovědnosti naplnění výchozích hodnot na metodu, která vytváří nový kontejner. V metodě, kde máte pravděpodobně neco jako tento kód:

public function novyKontejner(\Nette\Forms\Controls\SubmitButton $button)
{
  $button->parent->createOne();
}

Je to metoda, na kterou je odkazováno z replikátoru pro přidání nové sady formulářových prvků. Pro ilustraci předpokládejme, že kontejner vypadá třeba takto:

$slevy = $form->addDynamic('slevy', function (\Nette\Forms\Container $containerS)
            {
                $containerS->addText('vyse_slevy', '')
                        ->setRequired('Vložte výši slevy')
                        ->addRule(Form::RANGE, 'Hodnota slevy musí být z intervalu %s, %s', [0,999999.99]);

            }, 0);

Uvažujme, že chcete nastavit výchozí částku slevy na 25. Pak stačí poupravit metodu novyKontejner() tímto způsobem:

public function novyKontejner(\Nette\Forms\Controls\SubmitButton $button)
{
  $container = $button->parent->createOne();
  $vyse_slevy = $container->getComponent('vyse_slevy');
  $vyse_slevy->setDefaultValue(25);
}

Tohle řešení mi funguje bezvadně a nemám žádné problémy s tím, že by se výchozí hodnoty neplnily, nebo nedaly přepsat.

Tak co, pomohlo vám to? Rádo se stalo. budu rád, když mi dáte vědět do komentářů.

Podobné články jako "Nette, Kdyby\Replicator a výchozí hodnoty"

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

1
lukendo | vloženo 10. listopadu 2016
Řeším již delší dobu jeden problém.. Mám továrnu na formulář s replikátorem a pořád nemohu přijít na to, jak tlačítkům pro přidání odebrání kontejneru nastavit redirect na kotvu na stránce, je to nějak možné? Děkuji
Petr Kobelka
Ahoj, to by jsi měl spíše řešit v presenteru v metodě, která odebírá. Pokud je odebrání pouze formou odstranění části DOM v html, tak to řešit nemusíš.

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.