Má někdo zkušenost s globálními tlačítky NiftyGrid?

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

Zdarec,dělám si niftygrig a potřeboval bych rozchodit přidávání nových záznamů.

Bohužel ne a ne se dopídit k tomu, jak by se toto globální tlačítko naimplementovalo :-(.

Používám nette 2.0.3 a nejnovější Niftygrid ze gubhitu

Grid:

<?php
<?php
use \NiftyGrid\Grid;

class PobockyGrid extends Grid
{
    protected $pobocky;

    public function __construct($pobocky)
    {
        parent::__construct();
        $this->pobocky = $pobocky;
    }

    protected function configure($presenter)
    {
        $source = new \NiftyGrid\DataSource\NDataSource($this->pobocky->select('pobocky.id,typ,ulice, psc, mesto, kraj, firmy.nazev_firmy'));

        $this->setDataSource($source);

        $this->setWidth("1000px");


        $this->addColumn('nazev_firmy', 'Firma', '150px')
             ->setTableName("firmy.nazev_firmy")
             ->setTextFilter()
             ->setAutocomplete(5);

        $this->addColumn('typ', 'Typ', '100px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('ulice', 'Ulice', '200px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('psc', 'PSČ', '100px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('mesto', 'Město', '200px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('kraj', 'Kraj', '100px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);


       $self = $this;


       $this->setRowFormCallback(function($values) use ($self, $presenter){
                $vals = array(
                    "id" => $values["id"],
                    "ulice" => $values["ulice"],
                    "psc" => $values["psc"],
                    "mesto" => $values["mesto"],
                    "kraj" => $values["kraj"]

                );
                $presenter->context->database->table('pobocky')->where("id", $vals["id"])->update($vals);
                $self->flashMessage("Pobočka byla úspěšně upravena.","grid-successful");
            }
        );

        $this->addButton(Grid::ROW_FORM, "Editace")
             ->setClass("fast-edit");


        $this->addButton("delete", "Smazat")
             ->setClass("delete")
             ->setAjax(FALSE)
             ->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
             ->setConfirmationDialog(function($row){return "Určitě chcete smazat tuto pobočku?";});


        $this->addSubGrid("kontakty", "Zobrazit kontakt na pobočku")
             ->setGrid(new KontaktyGridByPobockyId($presenter->context->database->table('kontakty'), $this->activeSubGridId))
	     ->setCellStyle("background-color:#f6f6f6; padding:20px;");
	}

    function handleDelete($id) {
    $this->pobocky->where('id',$id)->delete();
    $this->flashMessage("Pobočka byla smazána","grid-info");
    $this->redirect('this');
    }

}
?>

Za každou radu díky

MW
Člen | 626
+
0
-
$this->addGlobalButton(Grid::ADD_ROW, 'Přidat nový záznam');

a volá to stejný callback jako pro editaci.

Nevinho
Člen | 77
+
0
-

jj díky, tlačítko se mi už zobrazí, ale bohužel neprovede žádnou akci :-(.

Zde je můj callback:

<?php
$self = $this;


       $this->setRowFormCallback(function($values) use ($self, $presenter){
                $vals = array(
                    "id" => $values["id"],
                    "nazev_firmy" => $values["nazev_firmy"]
                );

                if(isset($values['id'])){

               $presenter->context->database->table('firmy')->where("id", $vals["id"])->update($vals);
                $self->flashMessage("Firma byla úspěšně upravena","grid-successful");
    }
    else{
        $presenter->context->database->table('firmy')->insert($vals);
                $self->flashMessage("Firma byla úspěšně vložena","grid-successful");

    }

            }
        );

        $this->addButton(Grid::ROW_FORM, "Editace")
         ->setClass("fast-edit");

        $this->addGlobalButton(Grid::ADD_ROW, 'Přidat nový záznam');
?>

co dělám špatně při tom vkládání? Jakokdyby se to vůbec nedostalo do té větve else mi příjde..

Díky.

Editoval Nevinho (7. 12. 2012 13:43)

MW
Člen | 626
+
0
-

Zkusi to pouzit podle tohoto vzoru:

$this->setRowFormCallback(function($values) use ($articles){
    if(isset($values['id'])){
        //update
    }
    else{
        //insert
    }
}
Nevinho
Člen | 77
+
0
-

Však podle tohoto vzoru jsem to taky dělal, právěže ta větev if se mi provede normálně update, ale to else už to vůbec nevleze když chci vložit nový záznam :(

Nevinho
Člen | 77
+
0
-

Nikdo nevíte kde by mohla být chyba? Proč se to vůbec nedostane do té else větve?

MartinitCZ
Člen | 580
+
0
-

Nevinho napsal(a):

Však podle tohoto vzoru jsem to taky dělal, právěže ta větev if se mi provede normálně update, ale to else už to vůbec nevleze když chci vložit nový záznam :(

Zjisti si, jak funguje isset() (pak zjistíš, proč nikdy nedojde na else), tohle vůbec nesouvisí s nette!
T, že nikdo neodpověděl neznamené, že musíš za další 2h psát nový post.

Nevinho
Člen | 77
+
0
-

No pořád nějak nechápu, jak by to mělo vypadat.. Může mi prosím někdo poradit?

Jak otestovat v callbacku aby věděl jestli zavolat tlačítko edit a nebo add?

Editoval Nevinho (8. 12. 2012 16:26)

Nevinho
Člen | 77
+
0
-

Asi to nefunguje díky té metodě isset, ale bohužel nevím jak by to mělo fungoval. Chci se zeptat, nepomohla by místo funkce isset funkce empty?

<?php
$this->setRowFormCallback(function($values) use ($self, $presenter){
                $vals = array(
                    "id" => $values["id"],
                    "nazev_firmy" => $values["nazev_firmy"]
                );

                if(!empty($values['id'])){

               $presenter->context->database->table('firmy')->where("id", $vals["id"])->update($vals);
                $self->flashMessage("Firma byla úspěšně upravena","grid-successful");
    }
    else{
        $presenter->context->database->table('firmy')->insert($vals["nazev_firmy"]);
                $self->flashMessage("Firma byla úspěšně vložena","grid-successful");

    }

            }
        );

?>

Nějak takhle to nemůže fungovat?

Dík za radu.

mildabre
Člen | 62
+
0
-

Budu mít pár poznámek k přehlednosti kódu jaký Jsi výše prezentoval.

Máš tam tohle, proč?

$self = $this;

Použil bych normálně všude $this.

Tohle je asi správně ale není to moc přehledné:

$presenter->context->database->table('firmy')->where("id", $vals["id"])->update($vals);

Měl by Jsi si udělat nějaký přehledný model a tuhle komplikovanou metodu zapouzdřit do nějaké třídy v modelu – projdi si tutoriál Nette quickstart kde je tenhle postup hezky ukázán. Jinak ten kód sice může fungovat, ale bude hodně nepřehledný.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

@mildabre $self tam má pochopitelně proto, aby mohl public metody z $this používat uvnitř té anonymní funkce. A btw, Jsi uprostřed věty nedává smysl, velká písmena se takto nepoužívají, maximálně u zájmena, a to obvykle jen v dopisech, kde chceme projevit úctu nebo tak něco…

Editoval vojtech.dobes (10. 12. 2012 15:29)

Nevinho
Člen | 77
+
0
-

Tak vidím, že Vojta už odpověděl za mě :-). Ale pořád nemůžu přijít na to jak ten callback přimět jak se rozhodnout jestli použít edit nebo insert, pořád mi to nejede a už jsem celkem zoufalej, protože vážně nevím jak na to.

Pokud vynechám řádek „id“ ⇒ $values[„id“]
tak se mi to dostane i do větve else, a funguje i tlačítko uložit, bohužel se však žádný záznam nepřidá, to znamená, že nejspíš bude chyba i tady
$presenter->context->database->table(‚firmy‘)->insert($vals[„nazev_firmy“]);

Kdyby se našel někdo kdo by mi s tím pomohl, byl bych mu velice vděčný.

Editoval Nevinho (11. 12. 2012 7:10)

jiri.pudil
Nette Blogger | 1032
+
0
-

nejspíš bude chyba i tady: $presenter->context->database->table('firmy')->insert($vals["nazev_firmy"]);

Metodě Selection::insert musíš předat pole ve tvaru název_sloupce ⇒ hodnota.

Nevinho
Člen | 77
+
0
-

Tak problém s vkládáním nových záznamů vyřešen.

Pro zájemce přikládámfunkční kód gridu:

<?php
<?php
use \NiftyGrid\Grid;

class FirmyGrid extends Grid
{
    protected $firmy;


    public function __construct($firmy)
    {
        parent::__construct();
        $this->firmy = $firmy;
    }

    protected function configure($presenter)
    {
        $source = new \NiftyGrid\DataSource\NDataSource($this->firmy->select('firmy.id,nazev_firmy'));

        $this->setDataSource($source);

        $this->setWidth("400px");


        $this->addColumn('nazev_firmy', 'Firma', '400px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

       $self = $this;


       $this->setRowFormCallback(function($values) use ($self, $presenter){

           if(isset($values['id'])){
                $presenter->context->database->table('firmy')->where("id", $values["id"])->update($values);
                $self->flashMessage("Firma $values[nazev_firmy] byla editována!", "grid-successful");
            }
            else{   $firma=array('nazev_firmy'=>$values['nazev_firmy']);
                    $presenter->context->database->table('firmy')->insert($firma);
                    $self->flashMessage("Firma $values[nazev_firmy] byla vložena!", "grid-info");
            }

            }
        );



        $this->addButton(Grid::ROW_FORM, "Editace")
         ->setClass("fast-edit");

        $this->addGlobalButton(Grid::ADD_ROW, 'Přidat firmu');


        $this->addButton("delete", "Smazat")
        ->setClass("delete")
        ->setAjax(FALSE)
        ->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
        ->setConfirmationDialog(function($row){return "Určitě chcete odstranit firmu $row[nazev_firmy]?";});
    }


    function handleDelete($id) {
    $this->firmy->where('id',$id)->delete();
    $this->flashMessage("Firma byla smazána","grid-info");
    $this->redirect('this');
    }

}


?>

Editoval Nevinho (11. 12. 2012 23:30)