Identifikace urpavy formularu

vladimir.biro
Člen | 163
+
0
-

Hello. Jde nejak v zpracovani formularu zjistit, jestli byla vykonana nejaka zmena, nebo jestli jsou to ty same data, jako na vstupu? (teda formular byl odeslanej, ale data nezmenena?)

A nemyslim postup, jak to zjistit, protoze na to prijdu i sam :) ale ci nette na to nema uz neco.

Dekuju.

Kamil Valenta
Člen | 762
+
+1
-

Nemá.
Můžeš si původní hodnoty tahat v hiddenech, ušetříš dotaz na původní data, ale původní hodnoty lze snadno podvrhnout.
Můžeš si před uložením původní data znovu vytáhnout. Dost možná je už stejně v rámci běhu někde k dispozici máš.
Můžeš to řešit na úrovni triggeru v db.

Záleží, k čemu to má celé sloužit…

vladimir.biro
Člen | 163
+
0
-

Kamil Valenta napsal(a):

Nemá.
Můžeš si původní hodnoty tahat v hiddenech, ušetříš dotaz na původní data, ale původní hodnoty lze snadno podvrhnout.
Můžeš si před uložením původní data znovu vytáhnout. Dost možná je už stejně v rámci běhu někde k dispozici máš.
Můžeš to řešit na úrovni triggeru v db.

Záleží, k čemu to má celé sloužit…

Ma to slouzit k editaci udaju, ale bude to zpoplatnena sluzba + to overovani a schvalovani a tak, no ma se zpoplatnit jen v pripade, ze opravdu uzivatel udela nejakou zmenu, ne ze jen odesle formular.

dakur
Člen | 493
+
+4
-

Tak to patří do modelu. Po odeslání formuláře zavoláš metodu v modelu, která na vstupu dostane data z formuláře a vytáhne si aktuální data z databáze. Ta pak spolu porovná a máš výsledek.

Editoval dakur (18. 1. 13:13)

vladimir.biro
Člen | 163
+
0
-

dakur napsal(a):

Tak to patří do modelu. Po odeslání formuláře zavoláš metodu v modelu, která na vstupu dostane data z formuláře a vytáhne si aktuální data z databáze. Ta pak spolu porovná a máš výsledek.

Tohle mi je jasny :) … proto jsem se ptal, ci na to uz nema formular neco, abych tohle nemusel delat.

m.brecher
Generous Backer | 758
+
+3
-

@vladimirbiro

dakur napsal(a): Tak to patří do modelu. Po odeslání formuláře zavoláš metodu v modelu, která na vstupu dostane data z formuláře a vytáhne si aktuální data z databáze. Ta pak spolu porovná a máš výsledek.

Fikanější je provést update a podle výsledku $updated jednoduše vidíš, jestli k editaci došlo nebo ne:

// model:
    public function updateOne(ArrayHash $values): bool
    {
        return $this->database->table('table')->get($values->id)->update($values);
    }

// handler formuláře
    protected function handleUpdate(BaseForm $form, ArrayHash $values): void
    {
        try{
            $updated = $this->tableModel->update($values);
            if($updated ){
                $this->billingMachine->sendBill();

            }else{
		        $this->billingMachine->doNothing();
	        }

        }catch(DriverException| $exception){
            // ...
        }
    }

Editoval m.brecher (19. 1. 0:37)

dakur
Člen | 493
+
+2
-

vladimir.biro napsal(a):

dakur napsal(a):

Tak to patří do modelu. Po odeslání formuláře zavoláš metodu v modelu, která na vstupu dostane data z formuláře a vytáhne si aktuální data z databáze. Ta pak spolu porovná a máš výsledek.

Tohle mi je jasny :) … proto jsem se ptal, ci na to uz nema formular neco, abych tohle nemusel delat.

To přece nedává smysl. Když se shodneme na tom, že to patří do modelu, tak model neví, co jsou formuláře, to je pojem presenter vrstvy. A v presenteru fakt nechceš rozhodovat o tom, jestli má uživatel zaplatit nebo ne :)

vladimir.biro
Člen | 163
+
0
-

dakur napsal(a):

vladimir.biro napsal(a):

dakur napsal(a):

Tak to patří do modelu. Po odeslání formuláře zavoláš metodu v modelu, která na vstupu dostane data z formuláře a vytáhne si aktuální data z databáze. Ta pak spolu porovná a máš výsledek.

Tohle mi je jasny :) … proto jsem se ptal, ci na to uz nema formular neco, abych tohle nemusel delat.

To přece nedává smysl. Když se shodneme na tom, že to patří do modelu, tak model neví, co jsou formuláře, to je pojem presenter vrstvy. A v presenteru fakt nechceš rozhodovat o tom, jestli má uživatel zaplatit nebo ne :)

Kdyby formular vratil informaci o tom, ze zadny input nebyl zmenen (a teda puvodni data = data po odeslani), tak tuhle informaci poslu do modelu a tam pak resim, jestli zaplatit, nebo nezaplatit.

Kdyz formular dokaze kontrolovat to, jestli vybranej select je ze skupiny moznosti selectboxu, tak by mol vedet i to, jestli doslo ke zmene, nebo ne. Ne?

vladimir.biro
Člen | 163
+
0
-

Ano, tohle je fikane a zcela logicke reseni. Problem je ale v tom, ze v tomhle pripade je update vlastne insert, kvuli archivu dat. :) 🤷‍♂️

m.brecher napsal(a):

@vladimirbiro

dakur napsal(a): Tak to patří do modelu. Po odeslání formuláře zavoláš metodu v modelu, která na vstupu dostane data z formuláře a vytáhne si aktuální data z databáze. Ta pak spolu porovná a máš výsledek.

Fikanější je provést update a podle výsledku $updated jednoduše vidíš, jestli k editaci došlo nebo ne:

// model:
    public function updateOne(ArrayHash $values): bool
    {
        return $this->database->table('table')->get($values->id)->update($values);
    }

// handler formuláře
    protected function handleUpdate(BaseForm $form, ArrayHash $values): void
    {
        try{
            $updated = $this->tableModel->update($values);
            if($updated ){
                $this->billingMachine->sendBill();

            }else{
		        $this->billingMachine->doNothing();
	        }

        }catch(DriverException| $exception){
            // ...
        }
    }
dakur
Člen | 493
+
0
-

vladimir.biro napsal(a):

Kdyby formular vratil informaci o tom, ze zadny input nebyl zmenen (a teda puvodni data = data po odeslani), tak tuhle informaci poslu do modelu a tam pak resim, jestli zaplatit, nebo nezaplatit.

Kdyz formular dokaze kontrolovat to, jestli vybranej select je ze skupiny moznosti selectboxu, tak by mol vedet i to, jestli doslo ke zmene, nebo ne. Ne?

Zeptám se jinak – proč ti tak záleží na tom, aby se to dělo v presenteru? Má to nějaký důvod?

vladimir.biro
Člen | 163
+
0
-

Ja ale nepotrebuju, aby se to delo v presenteru. Ja mam forular v komponente a komponenta pracuje s modelem.

dakur napsal(a):

vladimir.biro napsal(a):

Kdyby formular vratil informaci o tom, ze zadny input nebyl zmenen (a teda puvodni data = data po odeslani), tak tuhle informaci poslu do modelu a tam pak resim, jestli zaplatit, nebo nezaplatit.

Kdyz formular dokaze kontrolovat to, jestli vybranej select je ze skupiny moznosti selectboxu, tak by mol vedet i to, jestli doslo ke zmene, nebo ne. Ne?

Zeptám se jinak – proč ti tak záleží na tom, aby se to dělo v presenteru? Má to nějaký důvod?

dakur
Člen | 493
+
+4
-

vladimir.biro napsal(a):

Ja ale nepotrebuju, aby se to delo v presenteru. Ja mam forular v komponente a komponenta pracuje s modelem.

Komponenty jsou v MVC architektuře součástí controller vrstvy (v nette terminologii presenter vrstva). Proč ti tedy záleží na tom, aby se to dělo v této vrstvě a ne až v modelu? Tj. proč nepředáš do modelu data z formu a nevytahuješ si původní data z db v tu chvíli?

// komponenta
$this->model->update($dataZformu);

// model
public function update(array $data)
{
  // vytahnu z db aktuální (tj. nezměněná) data
  // porovnám s $data
  // pokud změněno, účtuji uživateli
}
vladimir.biro
Člen | 163
+
0
-

Ja to takhle udelam, to neni problem. Jen je to proste rozsahlej formular s daty z vice tabulek a proste jsem si chtel usetrit praci, kdyby tohle uz nette nejak resilo. To je cely.

dakur napsal(a):

vladimir.biro napsal(a):

Ja ale nepotrebuju, aby se to delo v presenteru. Ja mam forular v komponente a komponenta pracuje s modelem.

Komponenty jsou v MVC architektuře součástí controller vrstvy (v nette terminologii presenter vrstva). Proč ti tedy záleží na tom, aby se to dělo v této vrstvě a ne až v modelu? Tj. proč nepředáš do modelu data z formu a nevytahuješ si původní data z db v tu chvíli?

// komponenta
$this->model->update($dataZformu);

// model
public function update(array $data)
{
  // vytahnu z db aktuální (tj. nezměněná) data
  // porovnám s $data
  // pokud změněno, účtuji uživateli
}
dakur
Člen | 493
+
+2
-

Mně je to taky jedno, jen ti ze zkušenosti říkám, že na tom přístupu něco zavání :)

mystik
Člen | 291
+
+3
-

Kdyz to budes resit na urovni formulare tak ti to nevyresi pripady kdy se stejnymi daty pracuje uzivatel ve vice oknech nebo na vice zarizenich. Tohle 100% patri do modelu tesne pres to nez data ulozis

Taco
Člen | 46
+
0
-

mystik napsal(a):

Kdyz to budes resit na urovni formulare tak ti to nevyresi pripady kdy se stejnymi daty pracuje uzivatel ve vice oknech nebo na vice zarizenich. Tohle 100% patri do modelu tesne pres to nez data ulozis

Plus si tedy ještě musíš posílat značku, jestli ukládáš data, které ti někdo jiný mezitím nezměnil pod rukama.