Kolize handleru a akce ze které se volá
- Lukáš Růžička
- Člen | 15
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áš
- Lukáš Růžička
- Člen | 15
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
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
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
Davidm díky! Tušil jsem, že řešení bude nějáká trivialita. Zase jsem o něco chytřejší :)