Dynamické přídání položek do formuláře se provede jenom jednou
- spiider
- Člen | 162
Ahoj, v šabloně mám button a na jeho klik mám navázáno zavolání handle a přídání dalších dvou text inputů. Po prvním kliku na button se vše přidá v pořadku ale po druhém kliku už ne, přitom ve firebugu žádná chyba, vše se odešle v pořádku, odpověď je taky správně, ale jakoby se napodruhé už snippet nepřekreslil. Tady je kód:
šablona
{snippet variants}
{control addMortiseForm}
{/snippet}
<input type="button" class="addVariant ajax" value="Přidat variantu" />
<script type="text/javascript">
$('.addVariant').on('click', function() {
$.nette.ajax({
type: 'GET',
url: {link addVariant!},
data: {
'value': $('.unitTitle').length + 1,
}
});
});
</script>
Handle:
public function handleAddVariant($value)
{
$this['addMortiseForm']->addText('unitTitle' . $value, 'Název:')->setAttribute('class', 'unitTitle');
$this['addMortiseForm']->addText('unit' . $value, 'Jednotka:');
$this->invalidateControl('variants');
}
v js jsem přidával i
$.nette.init();
$.nette.ext('load', {
success: function () {
$.nette.load();
}
});
ale pořád nic.
Nevíte kde mám co špatně?
Díky za rady
Editoval spiider (31. 7. 2014 11:05)
- David Matějka
- Moderator | 6445
Tohle ti nebude fungovat. Nette pokazde vytvari formular znovu –
pravdepobodne se ti tedy asi nepridavaji ty predchozi inputy
z handleAddVariant
reseni: pouzij kdyby/replicator
- spiider
- Člen | 162
Tak jsem to zkusil použít takhle, ale vrací mi to fatal error Class
‚Nette\Utils\Callback‘ not found
Kod vytvoření formuláře:
$form = new Form;
$form->addText('title', 'Název:');
$form->addTextArea('description', 'Popis:');
$form->addDynamic('variants', function(Container $variants) {
$variants->addText('unitTitle1', 'Název:')->setAttribute('class', 'unitTitle');
$variants->addText('unit1', 'Jednotka:');
}, 1);
$form->addSubmit('save', 'Uložit');
$form->onSuccess[] = $this->saveForm;
return $form;
A handle pro dynamické přidaní text inputu:
$this['addMortiseForm']->addDynamic('variants', function(Container $variants) {
$variants->addText('unitTitle' . $value, 'Název:')->setAttribute('class', 'unitTitle');
$variants->addText('unit' . $values, 'Jednotka:');
}, 1);
Neporadíte co dělám špatně…s kdyby pracuju poprve.
Díky
- iguana007
- Člen | 970
Replicator jsem ještě nepoužil, ale jestli to nebude tím, že Callback je v Nette 2.2 deprecated – viz.: https://api.nette.org/…allback.html
Už se o tomto ví a asi se to i řeší – více bude vědět autor @FilipProcházka – viz.: https://help.kdyby.org/question/?…
- David Matějka
- Moderator | 6445
nainstaloval si to pres composer? ten by si mel ohlidat spravnou verzi, jelikoz Nette\Utils\Callback, ktery je od 2.2 (a ty mas asi 2.1, ze?), je pouzit az v masteru
Editoval matej21 (1. 8. 2014 12:18)
- David Matějka
- Moderator | 6445
Hlavne doporucuji prejit na composer :) (nebo si pro 2.0 stahni verzi z prislusne branche: https://github.com/…ee/nette-2.0)
Prechod z 2.0 na 2.2 by nebyl bezbolestny, takze zalezi na tobe.. Minimalne ale updatuj na 2.0.15.
- spiider
- Člen | 162
Tak jsem aktualizoval nette na 2.1, stáhnul kdyby a přidal do formuláře:
$form->addDynamic('variants', function(Container $variants) {
$variants->addText('unitTitle1', 'Název:')->setAttribute('class', 'unitTitle');
$variants->addText('unit1', 'Jednotka:');
}, 1);
Handler mám pak takto:
$form = $this['addMortiseForm'];
$variants = $form['variants'];
$variants->addText('unitTitle' . $value, 'Název:')->setAttribute('class', 'unitTitle');
$variants->addText('unit' . $value, 'Jednotka:');
$this->invalidateControl('variants');
Nicméně se to chová úplně stejně jako bez použití kdyby. Přidá se
po kliku na tlačítko textbox ale po dalším kliku už ne :(
Nenapadá někoho kde dělám chybu?
Díky
- David Matějka
- Moderator | 6445
$form->addDynamic('variants', function(Container $variants) {
$variants->addText('unitTitle', 'Název:')->setAttribute('class', 'unitTitle');
$variants->addText('unit', 'Jednotka:');
}, 1);
$form['variants']->addSubmit('add', 'Přidat')
->setValidationScope(FALSE)
->addCreateOnClick(/*parametr TRUE umozni pridat radky dopredu, aniz by musely byt vyplneny*/);
Editoval matej21 (19. 8. 2014 11:26)
- David Matějka
- Moderator | 6445
Asi pro to nebude zadna zkratka, budes to muset vyresit rucne, zkus:
$i = 1;
$form->addDynamic('variants', function(Container $variants) use(&$i) {
$variants->addText('unitTitle', "Název $i:")->setAttribute('class', 'unitTitle');
$variants->addText('unit', 'Jednotka:');
$i++;
}, 1);
- spiider
- Člen | 162
To je i s tou upravou podle toho na githubu
$form['variants']->addSubmit('add', 'Přidat')->setValidationScope(FALSE)
->addCreateOnClick(TRUE)->setAttribute('class', 'ajax');
$self = $this;
$form['variants']->addSubmit('del', 'Odebrat')->setValidationScope(FALSE)
->addRemoveOnClick(function($replicator, $container) use($self) {
if ($self->presenter->isAjax()) {
$self->presenter->invalidateControl('variants');
}
else {
$self->presenter->redirect('this');
}
})
->setAttribute('class', 'ajax');
$form->onSuccess[] = $this->saveMortise;
- David Matějka
- Moderator | 6445
@spiider ten delete button neni pro cely form, ale pro jednotlive dynamicke containery – musi byt tedy uvnitr te closury (jak jinak by to vedelo, ktery prvek chces smazat, ze? :))
$i = 1;
$form->addDynamic('variants', function(Container $variants) use(&$i) {
$variants->addText('unitTitle', "Název $i:")->setAttribute('class', 'unitTitle');
$variants->addText('unit', 'Jednotka:');
$variants->addSubmit('del')->addRemoveOnClick();
$i++;
}, 1);