Kdyby/replicator – přidání dalších prvků odešle celý formulář

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

Zdravím používám prvně Kdyby/Replicator, jedu podle návodu a dostal jsem se do slepé uličky. Když mám tlačítko, které má přidat další elementy do formuláře (je vytvořen jako továrna), tak se místo toho přidání odešle celý formulář, což nechci, při tom tam žádný kód na zpracování snad nemám (pro ty submity), je to tím že jsou taky typu submit a když jsem pak zkoušel to přidání a odebrání řešit přes ajax, tak metoda renderSnipept je pro třídu Control, ale jde to i pro Factory ne? Děkuji

public function create(callable $onSuccess)
{
        $form = $this->factory->create();
	$removeEvent = \Nette\Utils\Callback::closure($this, 'AddNewReportFormRemoveElementClicked');
        $files = $form->addDynamic('files', function (Container $file) use ($removeEvent) {
            $file->addText('path')->setAttribute('placeholder', 'adresa obrázku')->setDisabled(TRUE)->getControlPrototype()->id('uploadFile');
            $file->addUpload('files_url')->getControlPrototype()->id('uploadBtn')->class('upload');
            $file->addSubmit('remove', 'Odstranit')
                ->setAttribute('class', 'ui primary button')
                ->setValidationScope(FALSE) # disables validation
                ->onClick[] = $removeEvent;
            }, 1);
        $files->addSubmit('new', 'Přidat další')
            ->setAttribute('class', 'ui primary button')
            ->setValidationScope(FALSE)
            ->onClick[] = \Nette\Utils\Callback::closure($this, 'AddNewReportFormAddElementClicked');
//
$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
			//kod pro přidání do db
			$onSuccess();
		};
}

 /**
	 * @param Nette\Forms\Controls\SubmitButton $button
	 */
	public function AddNewReportFormAddElementClicked(SubmitButton $button)
	{
    	     $button->parent->createOne();
    }

    public function AddNewReportFormRemoveElementClicked(SubmitButton $button)
	{
		$files = $button->parent->parent;
    	$files->remove($button->parent, TRUE);

	}

Edit: tak když jsem odstranil js validaci na formulář tak se to chová normálně, tudíž řešení je asi takové že bych ty dynamický inputy měl asi fakt vykreslovat ajaxově

Editoval lukendo (16. 8. 2016 15:36)

akadlec
Člen | 1326
+
0
-

Ale to je správně že se odešle celý form. Jen pak díky tomu že na těch buttonech pro přidání/odebrání položek máš navěšeny události co je zpracují.

lukendo
Člen | 96
+
0
-

akadlec napsal(a):

Ale to je správně že se odešle celý form. Jen pak díky tomu že na těch buttonech pro přidání/odebrání položek máš navěšeny události co je zpracují.

tak jak teda pořešit aby se neodeslal celý ale přidali se jenom ty inputy, protože mě se tam nepřidají protože formulář není validní na odeslání

Oli
Člen | 1215
+
0
-

Tu metodu odstraň

$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
	//kod pro přidání do db
	$onSuccess();
}

a pověs si ji na tlačítko

$form->addSubmit('send', 'Odeslat')
	->setAttribute('class', 'ui primary button')
    ->onClick[] = function (SubmitButton $button) use ($onSuccess) {
		$form = $button->getForm();
		$onSuccess();
	}

Aby se nebrala v potaz validace formuláře, tak k tomu slouží ->setValidationScope(FALSE).


A tohle:

\Nette\Utils\Callback::closure($this, 'AddNewReportFormAddElementClicked');

Nahraď za tohle:

[$this, 'AddNewReportFormAddElementClicked'];

Protože v Nette 2.4 by ti to stejně přestalo fungovat…