NiftyGrid a napojeni na editacni Form

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

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
+
0
-

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)

muflix
Člen | 92
+
0
-

vložit to jako parametr do té metody mě napadlo, s tím polem jsem to nevěděl, to se může hodit, ale hlavní otázka je co s tím dál ? jak to předám těm metodám actionEdit a formu a v jakém pořadí ? :p

David Matějka
Moderator | 6445
+
0
-

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

muflix
Člen | 92
+
0
-

hh ok pokusim se, jinak ten form musim nejak vykreslit a to umim jen pomoci ty render metody resp jak mam zavolat z niftygridu edit.latte kde se nacte edit akce ? nebo zavolat edit akci, ktera by mi vykreslila a vyplnila form ? :p

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
0
-

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

muflix
Člen | 92
+
0
-

no tyhle odkazy sem cetl a podle nich jsem to take udelal, vysledek jsem hodil sem, napriklad metodu kontrolId() jsem nevymyslel ja, ale je zkopirovana z tech odkazu, ale proste nevim jak to zprovoznit aby to fungovalo :(