Má někdo zkušenost s globálními tlačítky NiftyGrid?
- Nevinho
- Člen | 77
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
- Nevinho
- Člen | 77
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)
- MartinitCZ
- Člen | 580
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
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
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
@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
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
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
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)