NiftyGrid – Please select a valid option
- Skywalk3r
- Člen | 8
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
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.
- Jan Lender
- Člen | 2
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
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).