Funkce onClick u SubmitButton

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

Dobry den.
Chtel bych pridat funkci, ktera by pobehla pri stisknuti tlacitka, ale podle me asi nefunguje.

$container->addSubmit('submit', 'Save')->onClick = function () use ($container, $item, $tdate) {
            $dd = $container->getValues();
        $this->model->database->exec('UPDATE request_item SET it_delivery_date=? WHERE id=', $dd['it_date'], $item['id']);
        };

Mozna mam chybu nekde v inicializaci te funkci?

Editoval kuchuali (15. 7. 2013 17:01)

JHadamcik
Člen | 47
+
0
-

Nikdy jsem s tím nepracoval, ale nedá se na to použít onSubmit callback?

$container->onSubmit[] = $this->onSubmit;

Teoreticky by se mohl volat po každém kliknutí na tlačítko a callback onSuccess až po úspěšném všem.

Editoval JHadamcik (15. 7. 2013 17:07)

kuchuali
Člen | 15
+
0
-

JHadamcik napsal(a):

Nikdy jsem s tím nepracoval, ale nedá se na to použít onSubmit callback?

$container->onSubmit[] = $this->onSubmit;

Teoreticky by se mohl volat po každém kliknutí na tlačítko a callback onSuccess až po úspěšném všem.

No, ja jsem to ted' zkusil. Udelal jsem to takhle:

public function submitDeliveryDate($container, $item){
        $dd = $container->getValues();
        $this->model->database->exec('UPDATE request_item SET it_delivery_date=? WHERE id=', $dd['it_date'], $item['id']);
    }

A pak ten puvodni kod jsem zmenil tak:

$container->addSubmit('submit', 'Save');
        $container->onSubmit[] = $this->submitDeliveryDate($container, $item);

ted mi to ale pise chybu a nechce stranku otevirat

jiri.pudil
Nette Blogger | 1032
+
0
-

onClick[] použít půjde, ale musíš za tím mít ty hranaté závorky.

JHadamcik
Člen | 47
+
0
-

kuchuali napsal(a):
No, ja jsem to ted' zkusil. Udelal jsem to takhle:

public function submitDeliveryDate($container, $item){
        $dd = $container->getValues();
        $this->model->database->exec('UPDATE request_item SET it_delivery_date=? WHERE id=', $dd['it_date'], $item['id']);
    }

A pak ten puvodni kod jsem zmenil tak:

$container->addSubmit('submit', 'Save');
        $container->onSubmit[] = $this->submitDeliveryDate($container, $item);

ted mi to ale pise chybu a nechce stranku otevirat

Callbacku nemůžeš takto předat parametry. Jako parametr bere $container. Zkus ten onClick[] = function(…){…};

kuchuali
Člen | 15
+
0
-

Callbacku nemůžeš takto předat parametry. Jako parametr bere $container. Zkus ten onClick[] = function(…){…};

Uz jsem zkusil. Nefunguje to, po stisknuti tlacitka „Save“ mi to pise chybu. Mozna jsem nejak spatne udelal inicializaci anonimni funkci?

JHadamcik
Člen | 47
+
0
-

Co takhle kouknout do Tracy?

//Sázím na absenci $that v use

$that = $this;
function() use ($container, $item, $that) {
}

$tdate jsem tam schválně nepsal, protože nevidím, kde ho tam využíváš.

//edit2: pochopitelně pak nevoláš $this→ ale $that->

Editoval JHadamcik (15. 7. 2013 17:48)

David Matějka
Moderator | 6445
+
0
-

container nema zadnej onSubmit callback, pouzij ten callback onClick na buttonu.
ten prvni kod by skoro mohl fungovat, jen chybeji zavorky (nejsou nutny, ale muze to zpusobit problem) a $this muzes pouzivat v anonymni fci od php 5.4. a taky bych nedoporucoval predavat container pres use :)

Editoval matej21 (15. 7. 2013 17:49)

JHadamcik
Člen | 47
+
0
-

matej21 napsal(a):

container nema zadnej onSubmit callback, pouzij ten callback onClick na buttonu.
ten prvni kod by skoro mohl fungovat, jen chybeji zavorky (nejsou nutny, ale muze to zpusobit problem) a $this muzes pouzivat v anonymni fci od php 5.4. a taky bych nedoporucoval predavat container pres use :)

Děkuji za poučení :)

kuchuali
Člen | 15
+
0
-

matej21 napsal(a):

container nema zadnej onSubmit callback, pouzij ten callback onClick na buttonu.
ten prvni kod by skoro mohl fungovat, jen chybeji zavorky (nejsou nutny, ale muze to zpusobit problem) a $this muzes pouzivat v anonymni fci od php 5.4. a taky bych nedoporucoval predavat container pres use :)

Ja ale pres $this ten container nedostanu, protoze delam to cyklem foreach, a ten container se nikde neuklada. Mozna bych mel vytvorit nejakou $buffer uvnitr cele tridy, aby ten container se v ni ukladal? :(

David Matějka
Moderator | 6445
+
0
-

onClick udalost posila jako parametr button, na ktery se kliknulo.. muzes tedy

$button->onClick[] = function($button)
{
	$container = $button->getParent();
}
kuchuali
Člen | 15
+
0
-

matej21 napsal(a):

onClick udalost posila jako parametr button, na ktery se kliknulo.. muzes tedy

$button->onClick[] = function($button)
{
	$container = $button->getParent();
}

No, nevim… Stale mi po stisknuti vypisuje chybu, a ani nevim, co s tim delat. Drive to aspon chybu nevypisovalo, ale stale v databazi nedelalo nic. Takze zdava se mi, ze problem je prave s ni…
Ja jeste zkusim pomoci nejakych prikazu tam zjistit, je-li opravdu problem v spojeni s databazi, pak tady napisu.

David Matějka
Moderator | 6445
+
0
-

no jako prvni by se aspon hodilo napsat, jaka chyba se zobrazuje

2k
Člen | 15
+
0
-

Nejprve bych si pročetl toto: https://doc.nette.org/cs/forms#…

kuchuali
Člen | 15
+
0
-

2k napsal(a):

Nejprve bych si pročetl toto: https://doc.nette.org/cs/forms#…

Dik. Jen prosim takova otazka: da li funkci callback predat jako parametr container?

2k
Člen | 15
+
0
-

Dik. Jen prosim takova otazka: da li funkci callback predat jako parametr container?

Jestli je opravdu potřeba předávat container, tak to bude „jednodušší“ přes tu lambdu.

kuchuali
Člen | 15
+
0
-

Takze metodou chyb a pokusu jsem zjistil, ze pridat onClick anonymni funkci se v Nette bohuzel asi neda.

jiri.pudil
Nette Blogger | 1032
+
0
-

Takze metodou chyb a pokusu jsem zjistil, ze pridat onClick anonymni funkci se v Nette bohuzel asi neda.

Z čeho tak usuzuješ?

kuchuali
Člen | 15
+
0
-

jiri.pudil napsal(a):

Takze metodou chyb a pokusu jsem zjistil, ze pridat onClick anonymni funkci se v Nette bohuzel asi neda.

Z čeho tak usuzuješ?

Z toho, ze mi to vzdy vratilo chybu. Ja jsem ten kod delal krok za krokem jeste jednodussi, dokud jsem nevyzkousel proste zustavit v te funkci na onClick jenom redirect na jinou stranku, ale i to mi nefungovalo.

David Matějka
Moderator | 6445
+
0
-

asi 4× si tu napsal, ze ti to vypsalo chybu, ale ani jednou jsi nenapsal jakou chybu.

onClick event samozrejme na buttonu funguje, vetsinou je ale vhodnejsi resit ukladani v onSuccess na formu

peter.z
Člen | 37
+
+1
-

Funkcia onClick sa zavola len v pripade, ze form / kontajner je validny (t.j. neobsahuje ziadne chyby). Nemoze byt chyba v tom?

JoeKE
Člen | 7
+
0
-

Cavte
Riesim podobny problem, pouzivam:
Nette 2.0.8

use Nette\Application\UI\Form;
use Nette\Forms\Controls\SubmitButton;
class MojForm extends Form
{
 ...
$this->addSubmit("add", "odoslat")->onClick[] = callback($this, 'add');

public function add(SubmitButton $button)
    {
        $values = $button->getForm()->getValues();
         ...
        $this->presenter->invalidateControl("dataGrid");
    }

problem je, ze sa formular odosle ale funkcia add uz sa nezavola. Formular je validny, onSuccess nepouzivam lebo tam chcem pouzit niekolko Buttonov

dakujem

Editoval JoeKE (2. 11. 2013 20:10)

netije
Člen | 1
+
0
-

Ako som pochopil zo starsieho (4 roky?) prispevku https://forum.nette.org/…te-formularu je nutne zavolat na forme fireEvents() rucne. A potom sa vyvolaju callbacks.

Mylim sa?

<?php
    public function renderEdit($id = 0)
    {
        $form = $this['form'];

        if ($form->isSubmitted()) {
	        $form->fireEvents();
            return $this;
        }
        ....
    }
?>