Kdyby/Replicator a ajaxové přidávání/mazání prvků

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
martinprihoda
Člen | 8
+
0
-

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)

F.Vesely
Člen | 369
+
0
-

Musis ten foreach obalit do snippetu a ve funkcich addCallback a removeCallback tento snippet invalidovat.

martinprihoda
Člen | 8
+
0
-

Díky to samozřejmě chápu, ale signál se do callbacku „addCallback“ vůbec nedostane.

F.Vesely
Člen | 369
+
+1
-

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
+
+2
-

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)