NiftyGrid a napojeni na editacni Form
- muflix
- Člen | 92
Dobrý den, mám vypsanou tabulku s daty a ve sloupci Akce editační tlačítko, bohužel nevím jakým způsobem se po kliku přesměrovat na ten formulář.
templates/Admin/editujNovinku.latte
...
{control editNovinkuForm}
AdminPresenter.php (funkce vztahujici se k formulari)
public function renderEditujNovinku(){}
protected function kontrolaId($id)
{
$item = $this->novinky->kontrolaId($id);
if (!$item) {
$this->flashMessage("Záznam s id: $id neexistuje.", 'error');
$this->redirect('default');
}
return $item;
}
protected function createComponentEditNovinkuForm()
{
$form = new Nette\Application\UI\Form;
$form->addProtection('CSFR ochrana: Vypršel casový limit, odešlete formulár znovu');
$form->addText('perex', 'Perex:');
$form->addTextArea('text', 'Text:')->getControlPrototype()->class('mceEditor');
$form->addDatePicker('datePicker1');
$form->addSubmit('vlozit', 'vložit');
$form->getElementPrototype()->onsubmit('tinyMCE.triggerSave()'); //kvuli TinyMce
$form->onSuccess[] = callback($this, 'actionEdit');
return $form;
}
public function actionEdit($id)
{
$id = $this->kontrolaId($id);
$this['editNovinkuForm']->setDefaults($this->novinky->vratPoleHodnot($id));
/* ... db update + redirect na niftygrid s flash zpravou ?:p */
}
models/Novinky.php (sql, ktere predchozi funkce vyuzivaji)
public function kontrolaId($id)
{
return $this->db->fetchSingle("SELECT id FROM novinky WHERE id=$id");
}
public function vratPoleHodnot($id)
{
return $this->db->query("SELECT * FROM novinky WHERE id=$id");
}
a nakonec NiftyGrid.php, který generuje tabulku
...
$this->addButton("edit", "Editovat")
->setClass("edit")
->setLink(function($row) use ($presenter){return $presenter->link("editujNovinku", $row['id']);})
->setAjax(FALSE);
...
při kliku na ‚edit‘ odkaz mi browser hodí chybu ‚Neznámý
protokol‘ a v address baru je
error: Passed more parameters than method AdminPresenter::renderEditujNovinku%28%29%20expects.
to znamená, že musím nějak ten parametr s id předat do renderu a pak do
metody
createComponentEditNovinkuForm() přičemž defaultní hodnoty mi vyplňuje
metoda actinEdit(), která se ale spustí až po kliku tlačítka ve
vygenerovaném formu ? poradili byste mi jak to dát do pořádku ?
Děkuji :)
- David Matějka
- Moderator | 6445
pokud argumenty odkazu (druhy a dalsi parametr metody) v
$presenter->link()
neuvadis jako pole s klici (treba
array("id"=>$row["id"])
) tak se nette snazi zjistit nazev
parametru podle parametru metody, ktera obsluhuje prislusnou akci (pokud
neexistuje action<nazev> metoda, tak podle render<nazev> metody)
takze bud to uvest jako pole, nebo upravit definici metody renderEditujNovinku na
<?php
public function renderEditujNovinku($id){}
?>
Editoval matej21 (28. 8. 2012 20:35)
- David Matějka
- Moderator | 6445
za 1. pokus se pouzivat jen anglicky nazvy metod atd. takhle to vypada hrozne :)
a taky nevim, proc tam pouzivas to editujNovinku (nazev latte souboru a nazev
render metody)
nejlepsi bude tu renderEditujNovinku smazat, latte prejmenovat na edit.latte a
odkazat na edit akci
- David Matějka
- Moderator | 6445
form se vykresluje az v sablone.
koukni na cyklus, mozna pomuze:
https://doc.nette.org/…n/presenters#…
kdyz vytvoris link (treba z jiny komponenty – niftygrid..) pomoci
$presenter->link('edit', array("id"=>$id));
(nebo tim druhym
zpusobem jak jsem psal) tak po kliknuti se dostanes do soucasnyho presenteru,
zavola se akce actionEdit a podle nastaveneho view (defaultne stejny jako akce,
tedy ‚edit‘) se zavola (kdyz existuje) metoda renderEdit a vykresli se
sablona edit.latte
nejlepsi by bylo naplnit form hodnotama v metode
createComponentEditNovinkuForm
a v zadnym action ani render se
o to nestarat.. proste se vyplni az pri vykreslovani…
- muflix
- Člen | 92
Tak sem to upravil, ale moudrej z toho nejsem navíc sem narazil na komplikaci
z NiftyGrid.php tedy spustim akci actionEditujNovinku() v aktualnim presenteru
$this->addButton("edit", "Editovat")
->setClass("edit")
->setLink(function($row) use ($presenter){return $presenter->link("editujNovinku", array("id"=>$row['id']));})
->setAjax(FALSE);
takže nejřív se mi spustí
actionEditujNovinku()
pak
renderEditujNovinku(), která mi vykreslí editujNovinku.latte a z ní se mi
spustí
createComponentEditNovinkuForm()
public function actionEditujNovinku()
{
/* db update + redirect na niftygrid s flash zpravou ?:p */
}
public function renderEditujNovinku()
{
}
protected function kontrolaId($id)
{
$item = $this->novinky->kontrolaId($id);
if (!$item) {
$this->flashMessage("Záznam s id: $id neexistuje.", 'error');
$this->redirect('default'); // aka items list
}
return $item;
}
protected function createComponentEditNovinkuForm($id)
{
$id = $this->kontrolaId($id);
$form = new Nette\Application\UI\Form;
$form->addProtection('CSFR ochrana: Vypršel casový limit, odešlete formulár znovu');
$form->addText('perex', 'Perex:');
$form->addTextArea('text', 'Text:')->getControlPrototype()->class('mceEditor');
$form->addDatePicker('datePicker1');
$form->addSubmit('vlozit', 'vložit');
$form->getElementPrototype()->onsubmit('tinyMCE.triggerSave()'); //kvuli TinyMce
$form->onSuccess[] = callback($this, 'actionEditujNovinku');
$this['editNovinkuForm']->setDefaults($this->novinky->vratPoleHodnot($id));
return $form;
}
ale, musel sem do createComponentEditNovinkuForm() přidat $id parametr, jinak mi to házelo chybu v
$id = $this->kontrolaId($id);
teď mi to ale hází chybu
Unknown column 'editNovinkuForm' in 'where clause' search
SELECT id
FROM novinky
WHERE id=editNovinkuForm
tzn, že v $id do createComponentEditNovinkuForm() se mi přidalo ‚editNovinkuForm‘ ??
a poslední problém, v createComponentEditNovinkuForm() volám
$form->onSuccess[] = callback($this, ‚actionEditujNovinku‘);
ale to je ta metoda, která se mi zavolala z NiftyGridu, tak ty db udate dotazy
mám hodit do jiné akce ? v tom případě bych pak měl funkci
actionEditujNovinku() prázdnou a mohl bych jí smazat a asi by se mi rovnou
načetl ten render. actionEditujNovinku sem místo actionEdit pojmenoval proto,
protože v tom presenteru mám i jiné metody tak aby se mi to nepletlo.
Editoval muflix (29. 8. 2012 10:47)
- David Matějka
- Moderator | 6445
ty data by sis musel pripravit v action nebo k nim pristoupit nejak jinak,
ale jak ted ctu, tak asi neni doporucovany ty defaultni data plnit
v tovarnicce, zkus si precist
https://doc.nette.org/…editing-form
https://pla.nette.org/…cni-formular
treba pomuze