Identifikace urpavy formularu
- vladimir.biro
- Člen | 163
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 | 815
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
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.
- vladimir.biro
- Člen | 163
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 | 863
@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
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
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
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
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
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
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
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 }
- Taco
- Člen | 50
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.