Kolize handleru a akce ze které se volá

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

Ahoj,
potýkám se s problémem, který vysvětlím na následujícím příkladu.

V DB mám tuto datovou strukturu.

Mám akci Editace na editaci entity z tabulky VariantyRady (atributy nazev a prompt). Zároveň v této akci vykresluji i Gridito, ve kterém jsou všechny varianty náležící této řadě (tabulka Varianty).

V griditu mám na každém řádku odkaz směřující na handler odstranitVariantu a tady nastává problém. Volá se adresa:

admin/varianty/editovat/idVarianty?do=odstranitVariantu

tady to pohoří, protože se hledá záznam ve VariantyRady s id = idVarianty kvůli načtení default values pro formulář.

potřebuju udělat, aby odkaz na handler vypadal nějak takto:

admin/varianty/editovat/idVariantyRady?idVarianty=1&do=odstranitVariantu

, záznam se smazal a přesměroval jsem se zpět na editaci daného záznamu (admin/varianty/editovat/idVariantyRady)

Napadlo mě vytvořit si místo handleru samostatnou action, ale určitě existuje i řešení při zachování handle.

Díky za odpovědi.

Lukáš

davidm
Člen | 81
+
0
-

dej sem i kod toho presenteru, v tomhle je dost tezky se vyznat

Lukáš Růžička
Člen | 15
+
0
-

Presenter vypadá zjednodušeně takto:

<?php

namespace AdminModule;

use Nette\Application\UI\Form,
    Nette\DI,
    Nette\Image,
    Nette\Utils\Paginator,
    Navigation\Navigation,
    Nette;

final class VelikostiPresenter extends BasePresenter{


    public function createComponentVariantyRadyGrid($name){
        $variantyGriditoModel= new \VariantyRadyGriditoDibiModel(\dibi::getConnection(), $this->getParam("id"));

        $grid=new \Gridito\Grid($this, $name);
        $grid->setModel($variantyGriditoModel);
        $grid->addColumn('id', 'ID')->setSortable(true);
        $grid->addColumn("velikost", "Varianta")->setSortable(true);
        $grid->addButton("odstranit", "Odstranit", array(
          "link" => function ($row) use ($grid) {
            return $grid->presenter->link('odstranitVariantu!',array('id'=>$row['id']));
          },
          'showText' => false,
          'icon' => 'ui-icon-trash',
        ));
    }

    protected function createComponentVariantyForm($name){
        $form=new Form($this, $name);
        $form->addText("nazev", "Název: ")->setRequired("Zadejte název");
        $form->addText("prompt", "Výzva: ")->setRequired("Zadejte výzvu")->setOption('description', 'Výzva k výběru varianty. Např.: "-- Vyberte velikost --"');
        $form->addText("typ", "Typ řady:")->setRequired("Zadejte typ řady")->setOption("description", "Typ velikostní řady - ukáže se zákazníkovi v košíku. Např.: Barva, Velikost, ...");
        $form->addCheckbox("raditDleAbecedy", "Seřadit dle abecedy");
        $form->addSubmit("ulozit", "Uložit");
        return $form;
    }

    protected function createComponentPridatVariantuForm($name){
        $formular= new Form ($this, $name);
        $formular->addText("velikost", "Název varianty:")->setRequired("Vyplňte název varianty");
        $formular->addSubmit("pridat", "Přidat");
        $formular->onSuccess[]=array($this, "pridatVariantuFormSubmitted");

        return $formular;
    }

    public function pridatVariantuFormSubmitted($formular){
        if ($formular->isValid()){
            $velikostiModel=new \VelikostiModel;
            $data=$formular->getValues();
            $velikostiModel->pridatVariantu($data);

            $this->flashMessage("Varianta byla uložena.");
        }
        $this->redirect("Velikosti:editovat", $data["idVelikostniRady"]);
    }


    public  function actionEditovat($id){

        $velikostiModel=new \VelikostiModel();

        $velikostniRada=$velikostiModel->getVelikostniRadu($id);


        $this["variantyForm"]->addHidden('id')->setDefaultValue($id);
        $this["variantyForm"]->setDefaults($velikostniRada);
        $this["variantyForm"]->onSuccess[]=array($this, "editVelikostniRadaFormSubmitted");

        $this["pridatVariantuForm"]->addHidden("idVelikostniRady")->setDefaultValue($id);
    }


    public function handleOdstranitVariantu($id2){
        $velikostiModel= new \VelikostiModel();
        $velikostiModel->odstranitVariantu($id2);

        $this->flashMessage("Varaianta byla odstraněna.");
        $this->redirect("Velikosti:default");
    }
}
?>

A v šabloně mám tohle

{block #content}
<h1>Editace velikostní řady</h1>
{control variantyForm}
<h2>Přidat variantu</h2>
{control pridatVariantuForm}
<h2>Varianty</h2>
{control variantyRadyGrid}
bojovyletoun
Člen | 667
+
0
-

nechal bych to na action…ale nějak se mi ten kód nelíbí. PS: zkusil jsi již EditableGrito? (Pozor, existuje více variant – viz network odkaz na githubu.) Nicméně tato verzi mi funguje. (Teď mozná po pár úpravách pro 5.3, nejsem si jist)

Můžete ostatní říci, která verze Gridita (a i celkově, grinder, Datagrid), je ta „nejnovější“, samozřejmě pro 5.3 a samozřejmě editable? Taky by bylo dobré na některé Poslední sobotě „udělat kontrolo a sumarizaci“ všech doplňků, ať se to neválí na různých serverech.

davidm
Člen | 81
+
0
-

Podle toho co pises tak si prepisujes parametr id v route … tak si tu promenou kterou predavas do toho linku pojmenuj jinak treba $varianta. Pak bys mel mit neco jako editovat/<id>?varianta=<varianta>&do=odstranitVariantu

$grid->addButton("odstranit", "Odstranit", array(
	"link" => function ($row) use ($grid) {
		return $grid->presenter->link('odstranitVariantu!',array('varianta' => $row['id']));
 	}
));

handleOdstranitVariantu($varianta)
{
        $velikostiModel= new \VelikostiModel();
        $velikostiModel->odstranitVariantu($varianta);

	$this->flashMessage();
	$this->redirect('this');
}

doufam ze jsem pochopil co si chtel :)

Lukáš Růžička
Člen | 15
+
0
-

Davidm díky! Tušil jsem, že řešení bude nějáká trivialita. Zase jsem o něco chytřejší :)