Kdyby/Replicator a ajaxové přidávání/mazání prvků
- martinprihoda
- Člen | 8
Zdravím,
mám jednoduchý formálář s replicatorem
protected function createComponentForm()
{
$form = $this->formFactory->create();
$users = $form->addDynamic('users', function (Container $user) {
$user->addText('name', 'Jméno a příjmení');
$user->addText('email', 'E-mail');
$user->addCheckboxList('categoriesToBuy', 'Předplatit kategorie', $this->categories);
$user->addSubmit('remove', 'Odstranit')
->setValidationScope(FALSE)
->onClick[] = callback($this, 'removeCallback');
}, 1);
$users->addSubmit('add', 'Přidat další')
->setValidationScope(FALSE)
->onClick[] = callback($this, 'addCallback');
$form->addSubmit('send', 'Odeslat')
->onClick[] = callback($this, 'formSubmit');
return $form;
}
public function addCallback(SubmitButton $button)
{
$button->parent->createOne();
}
public function removeCallback(SubmitButton $button)
{
$users = $button->parent->parent;
$users->remove($button->parent, TRUE);
}
public function formSubmit(SubmitButton $button)
{
// ...
}
Vykreslení takto
{form form}
{foreach $form['users']->containers as $id => $user}
{input users-$id-name}
{input users-$id-email}
{input users-$id-categoriesToBuy}
{input users-$id-remove}
{/foreach}
{input $form['users']['add']}
{input send}
{/form}
Chci tento formulář zajaxovat a tak přidám tlačítku pro přidání dalšího prvku class ajax
$users->addSubmit('add', 'Přidat další')
->setAttribute('class', 'ajax')
->setValidationScope(FALSE)
->onClick[] = callback($this, 'addCallback');
ale nyní se to do callback metody tlačítka „add“ ani nedostane a vrátí mi v response celou html stránku. Ajax mi jinak funguje správně, potřebné js knihovny nalinkované, ostatně když do formuláře přidám $form->onSubmit[] = $this->formSubmit, přičemž náležitě upravím metodu formSubmit aby přijímala instanci třídy Form, tak mi ajax funguje, ale zase mi v tělě metody nejde zjistit, jakým tlačítkem byl formulář odeslaný.
Prosím tedy o radu jaké je nejjednodušší zajaxování Kdyby/Replicatoru, respektive dělám něco zle skrze callbacky?
Díky moc
Editoval martinprihoda (24. 3. 2015 12:07)
- martinprihoda
- Člen | 8
Díky to samozřejmě chápu, ale signál se do callbacku „addCallback“ vůbec nedostane.
- F.Vesely
- Člen | 369
Ale ano, dostane. Pokud te mate, ze ti jako response vrati celou stranku, tak je to tim, ze jsi presenteru nerekl, aby ti vratil pouze snippet.
<?php
public function addCallback(SubmitButton $button)
{
$button->parent->createOne();
$this->redrawControl('usersSnippet');
}
?>
{form form}
{snippet usersSnippet}
{foreach $_form['users']->containers as $id => $user}
{input users-$id-name}
{input users-$id-email}
{input users-$id-categoriesToBuy}
{input users-$id-remove}
{/foreach}
{/snippet}
{input $form['users']['add']}
{input send}
{/form}
a v render metode si hod
<?php
$this->template->_form = $this['form'];
?>
aby byl videt ve snippetu
- martinprihoda
- Člen | 8
Tyhle věci vím, to bych jinak dal do sekce pro začátečníky, šlo o to, že se mi ten signál opravdu nedostával vůbec do callbacku, takže invalidování jsem v tu dobu vůbec nepotřeboval řešit, proto jsem to ani v zadání neuváděl, což je spíš moje chyba, ale díky moc za snahu :) Třeba tvé příspěvky pomohly někomu jinému se stejným problémem.
U mě byl problém v tom, že starý nette.ajax.js verze 1.x.x nedokázal rozlišit jakým tlačítkem byl formulář odeslán. Stačilo tedy povýšit nette.ajax.js na verzi 2.0.0 a problém byl vyřešen.
Díky.
Editoval martinprihoda (25. 3. 2015 13:37)