NiftyGrid vykresleni tabulky
- muflix
- Člen | 92
Dobrý den, zkoušel jsem doplňek NiftyGrid, podle tohoto postupu
- nejdříve jsem NiftyGrid.zip rozbalil a zkopíroval do app/components
- do AdminPresenter.php jsem vložil
protected function createComponentNovinkyGrid()
{
return new NovinkyGrid($this->context->database->table('novinky'));
}
3. do app/models jsem přidal NovinkyGrid.php
<?php
use \NiftyGrid\Grid;
class NovinkyGrid extends Grid{
protected $novinky;
public function __construct($novinky)
{
parent::__construct();
$this->novinky = $novinky;
}
protected function configure($presenter)
{
//Vytvoríme si zdroj dat pro Grid
//Pri výberu dat vždy vybereme id
$source = new \NiftyGrid\NDataSource($this->novinky->select('novinky.id, perex, text, datum_vlozeni'));
//Predáme zdroj
$this->setDataSource($source);
$this->addColumn('perex', 'Perex', '100px');
$this->addColumn('text', 'Text', '100px');
$this->addColumn('datum_vlozeni', 'Datum', '100px');
}
}
4. teď bych potřeboval poradit, jak to mohu zobrazit v mé .latte
šabloně ?
zkoušel jsem
{control createComponentNovinkyGrid}
ale to mi píše „Component with name ‚createComponentNovinkyGrid‘ does not exist.“
Jinak používám Dibi, ale ten postup zapsání SQL by snad měl být
ok.
Předem, děkuji za pomoc. Muflix
Editoval muflix (23. 8. 2012 18:45)
- David Matějka
- Moderator | 6445
napis pouze
{control novinkyGrid}
podle toho nazvu komponenty to najde tovarnicku s prefixem createComponent
- muflix
- Člen | 92
Díky moc za odpověď, teď mi to akorát ještě píše
„Service ‚database‘ not found.“
u AdminPresenteru na řádce
return new NovinkyGrid($this->context->database->table('novinky'));
přičemž v AdminPresenter.php mám něco takového, ale nevím jestli to má souvislost
class AdminPresenter extends SecuredPresenter {
/** @var Novinky */
private $novinky;
protected function startup()
{
parent::startup();
$this->novinky = $this->context->novinky;
a v config.neon
common:
parameters:
database:
driver: mysql
host: localhost
database: nette
username: root
password: 123456
lazy: TRUE #s db se pracuje az kdyz je potreba
profiler: TRUE #debug panel
services:
connection:
class: DibiConnection(%database%)
novinky:
class: Model\Novinky(@connection)
tady to asi nebude úplné ?
- David Matějka
- Moderator | 6445
za 1. definujes service connection, pak se snazis ziskat sluzbu database
a za 2. dibi nepouzivam, ale nepletes si metodu table() (a potom i select)
s nette\database?
- muflix
- Člen | 92
jo máš pravdu, ale mě prostě normální Dibi syntaxe nefunguje, pouze Dibi Fluent, která se mi plete s Nette Database..
mám v models/Novinky.php
public function getTable()
{
return $this->db->select('*')->from('novinky');
//return $this->db->query("SELECT * FROM novinky"); // Nefuguje proc ?:/
}
a teď sem upravil AdminPresenter.php na
protected function createComponentNovinkyGrid()
{
return new NovinkyGrid($this->novinky->getTable());
}
jenže mi to píše
„You have an error in your SQL syntax;“
což neni divu, protože mi to vygenerovalo
SELECT COUNT(*)
FROM (
SELECT * , novinky.id, perex, text, datum_vlozeni GET PRIMARY
FROM `novinky` ) AS `data`
což nevím proč :/
- MartyIX
- Člen | 217
muflix: https://componette.org/search/?…
← rikas, ze pouzivas Dibi, tudiz bys mel pouzivat
NiftyGrid\DibiFluentDataSource
a ne
NiftyGrid\NDataSource
.
- muflix
- Člen | 92
Ještě bych se rád zeptal, přidal jsem do tabulky tlačítko pro smazání
$self = $this;
$this->addButton("delete", "Smazat")
->setClass("delete")
->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
->setConfirmationDialog(function($row){return "Určitě chcete odstranit novinku $row[perex]?";});
vytvořil jsem v komponentě událost(signál)
public function handleDelete($id){
$this->modelNovinky->deleteRow($id);
}
a do modelu metodu deleteRow
public function deleteRow($id)
{
$this->db->query("DELETE FROM novinky WHERE id = $id");
}
ono mi to správně po kliku na delete ikonku smaže záznam v tabulce, ale nezeptá se mě to jestli opravdu chci, jako kdyby to přeskočilo
->setConfirmationDialog(function($row){return "Určitě chcete odstranit novinku $row[perex]?";});
JQuery includovaný mám (ale žádný jeho doplňěk), nevíte čím by to mohlo být ?
Editoval muflix (24. 8. 2012 13:13)
- muflix
- Člen | 92
Neměl jsem, už to funguje, děkuji :-)
Ještě zkouším jednořádkovou editaci, a upravil jsem
NiftyGrid.php
$this->addColumn('text', 'Text', '300px')
->setTextEditable();
$this->addColumn('datum_vlozeni', 'Datum', '200px')
->setRenderer(function($row){return date('j.n.Y', strtotime($row['datum_vlozeni']));})
->setDateEditable();
$self = $this;
$this->addButton(Grid::ROW_FORM, "Rychlá editace")
->setClass("fast-edit");
a take jsem přidal metodu
$this->setRowFormCallback(function($values){
//db update, flash message, ..
}
);
jelikož, ale nevím co obsahuje proměnná $values, tak jsem si jí chtěl přes print_r() vypsat ve flash zprávě. To se mi, ale nepodařilo.
Takto jde editaci otevřít a zavřít uložením, ale pokuď do Callback upravím
$this->setRowFormCallback(function($values){
$this->flashMessage('Položka byla editována.');
$this->redirect();
//nebo $this->redirect('niftyTb');
//nebo $this->redirect('Admin:niftyTb');
//nebo bez redirectu uplně
}
);
a do .latte šablony přidám
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}
tak se mi již editace nechce uložit (byť bez provedení změn), ale řekl bych, že se mi to sekne v tom callbacku.. na githubu doplňku jsem demo nenašel a v návodu pro flash zprávy také nevím jak vyplnit položku redirect. Co s tím ? Děkuji
Editoval muflix (26. 8. 2012 23:51)
- David Matějka
- Moderator | 6445
ve $values
se nachazi pole s id radku a odeslanyma
hodnotama..
v tom callbacku nemuzes pouzivat $this, protoze uz nejsi v kontextu objektu, necha se to obejit takovym trikem:
<?php
$self = $this;
$this->setRowFormCallback(function($values) use($self){
//... ulozeni atd
});
?>
do toho use napises vsechny promenne, ktere chces pouzivat v te funkci
(museji byt dostupne v nadrazenem kontextu a $this
nejde primo
pouzit, jen nejak jak je to uvedeno)
jelikoz flash zpravu posilas do komponenty a ne do presenteru, nemusis se starat o jeji vykresleni – o to se postara sama komponenta (pokud to teda komponenta ma ve sve sablone, coz nifty grid ma).
redirect na stejnou stranku se dela pomoci
->redirect("this");
, ale v tomhle pripade asi nebude
potreba
- muflix
- Člen | 92
Díky moc, nakonec to mám takto
$this->setRowFormCallback(function($values) use ($self, $presenter){
$vals = array(
"perex" => $values["perex"],
"text" => $values["text"],
"datum_vlozeni" => $values["datum_vlozeni"],
);
$presenter->context->novinky->updateTable($vals,$values["id"]);
$self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");
}
);
- David Matějka
- Moderator | 6445
jen to sahani pres presenter do contextu neni moc city, podle predchozich
ukazek kodu mas to $presenter->context->novinky
v
$this->modelNovinky
, ne?
takze by asi bylo nejlepsi to udelat takhle:
<?php
$this->setRowFormCallback(function($values) use ($self){
$vals = array(
"perex" => $values["perex"],
"text" => $values["text"],
"datum_vlozeni" => $values["datum_vlozeni"],
);
$self->modelNovinky->updateTable($vals,$values["id"]);
$self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");
}
);
?>