Vykreslení formulářového prvku (submit) s OnClick callbackem

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

Ahoj, jak vykreslujete formulářové prvky (submit inputy) s callbackem?

<?php
$form->addSubmit('name', 'popis')
	->onClick[] = function(SubmitButton $button) {
        	dump($button);
        };
?>

v šabloně: {$form[‚name‘]->control}

a Nette (resp. PHP) hlásí: Object of class Closure could not be converted to string

Díky, Dalibor

Filip Procházka
Moderator | 4668
+
0
-
{$form['name']->control}

Ukaž celou laděnku. Něco takového by nemělo nastat.

uestla
Backer | 799
+
0
-

U mně vše funguje – evidentně ale máš v presenteru něco jiného, než nám tu ukazuješ (soudě podle výpisu laděnky), čili ukaž přesně, jak callback navěšuješ.

Dalibor
Člen | 26
+
0
-

Já jsem to zjednodušil.. jde o komponentu, mrkněte sami..:

<?php
	public function createComponentEditForm(){
	$form = new Form();
	$form->setTranslator($this->translator);


	if ($this->products) {
		foreach ($this->products as $product) {
			$form->addSubmit('activeX'.$product->getId(), $product->getActive()?'Ano':'Ne')
			->getControlPrototype()->class($product->getActive()?'greenbtn':'redbtn')
					->onClick[] = function(SubmitButton $button) {
        				$values = $button->form->values;
        				dump($button);
        			};
			}
		}


		return $form;
	}

?>

jo a to activeX nemá s activeX nic společného, X používám jako oddělovač pro jiné případy než je tady.. takhle se to sešlo ;)

Editoval Dalibor (19. 8. 2011 15:04)

voda
Člen | 561
+
0
-

Protože ‚onClick‘ dávš na ControlPrototype a ne na Submit, který ti vrátil ‚$form->addSubmit()‘. Použij

$submit = $form->addSubmit(...);
$submit->onClick[] = function() {...};
Filip Procházka
Moderator | 4668
+
0
-

Nojo… to v tom máš guláš :) Správně je to takto:

public function createComponentEditForm()
{
	$form = new Form();
	$form->setTranslator($this->translator);

	$active = $form->addContainer('active');
	foreach ($this->products as $product) {
		$submit = $active->addSubmit($product->getId(), $product->getActive() ? 'Ano' : 'Ne');
		$submit->getControlPrototype()
			->class($product->getActive()?'greenbtn':'redbtn');
		$submit->onClick[] = function(SubmitButton $button) {
				$values = $button->form->values; dump($button);
			};
	}

	return $form;
}

Všimni si jak jsem ti rozdělil ty tlačítka, aby jsi nemusel v šabloně hackovat hnusně ten název a taky si všimni, že když zavoláš ->getControlPrototype, voláš pak metody nad objektem Html, né SubmitButton. Takže se to pak snaží vykreslovat i s tou closurou, což nejde.

Editoval HosipLan (19. 8. 2011 15:17)

Dalibor
Člen | 26
+
0
-

voda napsal(a):

Protože ‚onClick‘ dávš na ControlPrototype a ne na Submit, který ti vrátil ‚$form->addSubmit()‘. Použij

$submit = $form->addSubmit(...);
$submit->onClick[] = function() {...};

Ahaa ;-) Díky moc, neuvědomil jsem si to!

Dalibor
Člen | 26
+
0
-

HosipLan napsal(a):

Nojo… to v tom máš guláš :) Správně je to takto:

>

Všimni si jak jsem ti rozdělil ty tlačítka, aby jsi nemusel v šabloně hackovat hnusně ten název a taky si všimni, že když zavoláš ->getControlPrototype, voláš pak metody nad objektem Html, né SubmitButton. Takže se to pak snaží vykreslovat i s tou closurou, což nejde.

Díky, mrknu na ten Container – tohle jsem zatím nepoužíval, ale zdá se, že to řeší problém s identifikací tlačítek podle ID ;-)