Formuláře – rozeznání typu podle url

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

Zdravím,

mám dotaz. Jakým způsobem řešíte editaci/vkládání záznamů, když to taháte přes jeden formulář? Já mám jeden formulář a potom podle URL poznávám, jestli se jedná o editaci nebo nový záznam a podle toho tam načtu výchozí záznamy nebo nenačtu, např:

/produkty/vlozit
/produkty/upravit/1

V podstatě je to vyhovující, protože si akorát zavolám že při editaci se mají načíst výchozí hodnoty:

<?php
protected function createComponentFormularKategorie() {

        $form = new Nette\Application\UI\Form;

        $form->addText('nazev', 'Název:')
                ->setAttribute('placeholder', 'Vložte název kategorie')
                ->setRequired('Je potřeba vyplnit název kategorie.')
                ->getControlPrototype()->setClass('form-control');

        $form->addSelect('patri_pod', 'Kategorie:', $this->kategorie_select)
                ->getControlPrototype()->setClass('form-control input-large');

        $form->getElementPrototype()->class = 'form-horizontal';

        // Pokud upravujeme, tak nastavíme výchozí hodnoty
        if ($this->akce == "upravit") {
            // načteme výchozí hodnoty
            $hodnoty = $this->database->table("shop_produkty_kategorie")
                ->where("id", $this->id)
                ->fetch();

            $form->setDefaults(array(
                "nazev" => $hodnoty->nazev,
                "patri_pod" => $hodnoty->patri_pod
            ));
        }

        $form->onSuccess[] = $this->formularKategorieOdeslan;
        return $form;

    }
?>

Jenže problém je v tom, že při zpracování formuláře nejsem schopen zjistit z URL jestli se jedná o editaci a případně ID záznamu, což znamená, že bych si musel ještě posílat tyto inputy:

<input type="hidden" name="akce" value="upravit" />
<input type="hidden" name="id" value="5" />

a to mi přijde už trochu zbytečné, když to mám v URL. Jenže router to předá presenteru až po odeslání toho formuláře. Tak zkoumám, jestli je běžné tam posílat ty hodnoty přes hidden nebo jestli je jiná cesta.

<?php
$router[] = new Route('//admin.%domain%/produkty/kategorie[/<akce>/<id [0-9]+>]', 'Admin:ProduktyKategorie:vypis');
?>
Hafran
Člen | 121
+
0
-

No já to osobně přes hidden posílám, stačí ti id, protože když není definované, tak to znamená že se vkládá, když je, tak edituješ. Jestli to je v administrační části a dá se zabezpečit, že tam nebude žádný filuta co ti tu hodnotu bude přepisovat, tak je to podle mě dostačující. Kontrolovat oprávnění na editaci třeba přihlášeného uživatele na konkrétní id bych ale určitě dělal.

Oli
Člen | 1215
+
+1
-

Ja si to tahám z presenteru. Action dostane od, vytvorim z něj entitu a tu predam setrem formulari. Pokud entita neexistuje insert, pokud existuje edit.

leninzprahy
Člen | 150
+
0
-

Zpracování formuláře probíhá na stejné kombinaci Module:Presenter:action, jen se volá navíc signál, takže zjištění těch parametrů (akce, id) by mělo být stejné, jako při vykreslování…

Editoval leninzprahy (17. 9. 2014 11:53)