NiftyGrid – Please select a valid option

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

Ahoj, snažím se o in-line editaci a při kliknutí na uložit mi NiftyGrid vyhodí chybu „Please select a valid option.“ viz obrázek

Kód

<?php

use \NiftyGrid\Grid;

class GridProducts extends Grid {

    protected $products;

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

    protected function configure($presenter)
    {
        //Vytvoříme si zdroj dat pro Grid
        //Při výběru dat vždy vybereme id
        $source = new \NiftyGrid\DataSource\NDataSource($this->products->select('id, name, description, quantity, price, image, active, discount, category_id'));

	//Předáme zdroj
        $this->setDataSource($source);

        $this->addColumn('name', 'Název', '100px', 30)
              ->setTextEditable();

        $this->addColumn('quantity', 'Ks', '100px')
              ->setTextEditable();

        $this->addColumn('price', 'Cena', '100px')
              ->setCellRenderer("text-align:right;")
              ->setTextEditable();


       $self = $this;
        $this->addButton(Grid::ROW_FORM, "Rychlá editace")
            ->setClass("fast-edit");

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

            $this->products->exec('UPDATE products SET ? WHERE id=?', $vals, $values["id"]);

            $self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");

            }
        );


    }

}

Nevíte kde by mohl být problém ? Děkuji.

Skywalk3r
Člen | 8
+
0
-

Když upravím ukládací callback pouze na

$this->setRowFormCallback(function($values){
    // prazdno, nedela zadnou akci
});

Tak mi to dělá stejnou chybu.

Skywalk3r
Člen | 8
+
0
-

Také mi nefunguje „setConfirmationDialog“ pokud přidám mazací tlačítko.. záznam se smaže, ale neptá se mě to na potvrzení. Do zdrojového kódu mazacího tlačítka se ale přidá css třída grid-confirm a atribut confirm. Jako by nefungoval ajax, ale includuji

<link href="/nifty-grid/css/jquery-ui/jquery-ui.css" rel="stylesheet">
<script src="/nifty-grid/js/grid.js"></script>
<script src="/nifty-grid/js/jquery-ui.js"></script>
<script src="/nifty-grid/js/netteForms.js"></script>
$this->addButton("delete", "Smazat")
    ->setClass("delete")
    ->setLink(function($row) use ($self){return $self->link("delete!", $row['id'], $row['image']);})
    ->setConfirmationDialog(function($row){return "Určitě chcete záznam odstranit?";});

Nemůže to nějak souviset ? Někde jinde na fóru jsem našel že ta chyba „Please select a valid option.“ může souviset s Ajaxem, ale ajax jsem v nette nikdy nezkoušel a ten kód co mám mi na asi rok starém webu funguje.

Sedlakos
Člen | 3
+
0
-

Mám úplně stejný problém …

$this->addButton(Grid::ROW_FORM)
        ->setLabel("Rychlá editace")
        ->setClass("fast-edit");

$this->setRowFormCallback(function($values){

});
Jan Lender
Člen | 2
+
0
-

Na problém „Please select a valid option“ po uložení řádkové editace v NiftyGrid popisovaný Skywalk3r jsem včera také narazil.
Zjistil jsem, že akci sestřelí validátor v Nette\Forms\Controls\SelectBox::validate(). Dumpem proměnné  $this v této metodě jsem odhalil, že se validace spouší na selectu „action_name“, který ve formuláři GridForm patří do kontejneru „action“ určeného k provádění hromadných akcí nad více řádky tabulky. Problém je v tom, že tento kontejner třída NiftyGrid\Grid v metodě createComponentGridForm přidává do formuláře bez ohledu na to, zda jsou takové akce v metodě configure potomka vytvořeny. Jestliže nejsou, což byl můj případ, šablona grid.latte tento kontejner nevyrenderuje. A po odeslání formuláře AJAXem metodou POST dojde k selhání validace.
Problém jsem vyřešil úpravou zdrojového souboru NiftyGrid/Grid.php. Řádky 747 – 752 generující kontejner „action“ jsem obalil podmínkou kontolující, zda jsou nějaké hromadné akce definovány, stejnou, jaká je použita v šabloně. Inkriminovaná část kódu po mém zásahu vypadá takto:

if ($this->hasActionForm()) {
    $form[$this->name]->addContainer("action");
    $form[$this->name]['action']->addSelect("action_name","Označené:");
    $form[$this->name]['action']->addSubmit("send","Potvrdit")
	    ->setValidationScope(FALSE)
	    ->getControlPrototype()
	    ->addData("select", $form[$this->name]["action"]["action_name"]->getControl()->name);
}

Komponenta se po tomto zásahu v případě řádkových editací chová korektně, dopady do stávajících funkčností jsem zatím nepozoroval. Ještě musím vyzkoušet ty hromadné akce, s těmi ještě nemám zkušenost (s Nette experimentuji týden, s NiftyGrid druhý den).

Moje konfigurace:
Apache 2, PHP 5.4.24
Nette 2.1.2
NiftyGrid jsem 9.5.2014 pullnul z GitHubu, master, last commit 5163290d160b04288ec4d6f440dd373946abd828

Jan Lender
Člen | 2
+
0
-

Takže moje úprava způsobila v případě, že jsou použity hromadné akce (metoda addAction), pád v metodě attached. Metoda createComponentGridForm se totiž zavolá při prvním volání metody addColumn v metodě configure. Podmínka, kterou jsem přidal do metody createComponentGridForm, se totiž vyhodnotí jako false a kontejner „action“ se nevytvoří. To, že se začne komponenta skládat během své konfigurace, považuji za chybu návrhu, ale budiž. Workaround, který uvedenému selhání zabrání, je definice akcí před definicí sloupců (nezkoumal jsem to podrobně, prostě jsem addAction přesunul na začátek metody configure).