NiftyGrid – Datagrid pro Nette 2 s velkou škálou funkcí
- Tomáš Jablonický
- Člen | 115
Ahoj,
narazil jsem na problém. Potřeboval bych do gridu přidat sloupce, který je nezávislí na sloupci v tabulce – neexistuje. Prostě chci něco jako:
<?php
$this->addSloupec('Obrázek produktu') //není definováno o jaký sloupec jde
->setRenderer(function ($row) {
//zde si vykreslím obrázek
});
?>
Nikde jsem nenašel jestli toto NiftyGrid umí. Zatím jsem to řešil využitím sloupce, který nepotřebuji vykreslit, ale to mě nepřijde jako moc dobré řešení. Jestli to již NiftyGridy umí, tak se omlouvám za zbytečný příspěvek a prosím o ukázku.
- czhyenacz
- Člen | 12
TO: Jablon
Já to dělám například takhle:
$this->addColumn('nahraniobjednavkynabidky', 'Nahrani objednavky nabidky', '110px', 30)
->setRenderer(function($values) use ($presenter){echo \Nette\Utils\Html::el('a')->href( $presenter->link('Admin:Nahraniobj', $values["mail"]))->target('_blank')->setClass("load");})
;
Což mi umožňuje tam přidat sloupec s odkazem na konkrétní akci, aniž by byla jako button v pravém „menu“. Metal
- czhyenacz
- Člen | 12
Vzpomněl jsem si ještě na jednu věc:
$this->addSubGrid("trideni", "třídění")
->setGrid( new SpravaObjednavkyDodavateleGrid( dibi::select('*')->from('dodavateleObjednavka')->where('cisloObj = %s', function($row) {
return string($row['cisloObj']);
}))
) ;
Do podmínky where se snažím dostat hodnotu, co se najde v danném řádku
v sloupci cisloObj, ale dibi vrací "SQL translate error " ; ;
netušíte kde mám chybu ? Dal jsem tam i ten převod na string, ale pořád
nic. Nebo není nějaký trik jak získat hodnotu z aktuálního řádku bez
toho function($row) ? Budu to potřebovat na ještě v jednom případě, kdy
bych to rád použil do výběru pro selectEditable.
Děkuji za případnou pomoc.
- boob
- Člen | 21
Helou, rozhodol som sa vyskusat nakoniec aj tento grid, ale hned na zaciatku som zistil, ze sa neda ako DataSource dat custom pole riadkov. Je potrebne si spravit vlastny DataSource, ktory to nejako obsluzi? Ja data ziskavam requestom na server a vrati sa mi pole, z ktoreho si vyberiem, co potrebujem a chcel by som to naplnit do gridu (rovnako ako ine gridy, napr TwiGrid), ale na tomto gride sa mi velmi pacia SubGridy :)
vie mi niekto pomoct alebo si treba spravit custom DataSource?
dakujem
- Jan Mikeš
- Člen | 771
Ahoj, mam takovy problem.
Chci pouzivat grid v komponente jako subkomponentu, ale tvori se spatne nazvy
inputu (nepredava se jim nazev parenta).
Predpokladejme, ze grid se jmenuje „grid“ a je vytvaren klasicky
v tovarnicce createComponentGrid()
– tato tovarnicka je umisten
v komponente „parent“ ktera te vytvarena v presenteru pomoci
createComponentParent()
– v parent.latte (sablone pro
komponentu parent) se grid vykresluje normalne {control grid}
Po odeslani filteru, nebo strankovani, nebo cehokoliv, chybi u get parametru
prefix parent- takze parametry vypadaji normalne
„grid-filter[something]=value&grid-perPage=20“ coz je ale spatne!!!
Pokud rucne prepisi parametry na
„parent-grid-filter[something]=value&parent-grid-perPage=20“ parametry
se objevi v inputu a grid zareaguje tak jak ma.
Jedna se o bug, nebo jsem nekde neco prehlidl? Je pro me momentalne nevyhnutelne abych mel grid jako subkomponentu. V mem pripade je to jeste trochu komplikovanejsi, grid je az 3ti potomek komponenty (pokud jsem doplnil gety ve tvaru parent1-parent2-grid-filter[]… tak fungovalo), nicmene test s pouze 1 vnorenou komponentou jsem provedl a s naprosto stejnym problemem.
Pravdepodobne bude stacit, kdyz se upravi pojmenovani inputu, aby tam byl zahrnut cely strom komponent az po hlavniho predka. Nejake rady?
- Tomáš Jablonický
- Člen | 115
@czhyenacz: asi jsme si špatně rozuměli nebo jen na půl :-). Potřebuji přidat sloupec takový, který neexistuje v tabulce. To řešení co jsi navrhl, je sice funkční ale trochu jako drbání pravou rukou za levým uchem :-) (také to používám, ale …).
Prostě bych potřeboval přidat sloupce nezávislý na existenci sloupce v tabulce a to NiftyGrid asi zatím neumí (přemýšlím, že si to tam doprogramuji).
- Jan Mikeš
- Člen | 771
Popisu nazorne zkracene a zjednodusene, vynecham nedulezite veci (zavislosti atd)
XxxPresenter:
protected function createComponentDashboard(){
return new Components\Dashboard(...);
}
Xxx.latte:
{control dashboard}
Components/Dashboard.php:
protected function createComponentBoxX($name){
return new BookingsBoxX(...);
}
protected function createComponentBoxXx($name){
return new BookingsBoxXx(...);
}
protected function createComponentBoxWithGrid($name){
return new BookingsBoxWithGrid(...);
}
Components/Dashboard.latte:
{if $user->isInRole('x'}
{control boxXxxx}
{control boxXx}
{control boxWithGrid}
{elseif $user->isInRole('xx'}
{control boxXxxx}
{control boxXxx}
{else}
{control boxX}
{/if}
Components/BoxWithGrid.php:
protected function createComponentGrid(){
return new Grids\GridXxx(..., $this->models->getTable()->select("...") );
}
Components/BoxWithGrid.latte:
{if $rowsInGrid > 0}
{control grid}
{else}
Dumb message
{/if}
Zadne prasarny se nekonaji, vse jsem kontroloval, kod je cisty, problem je v primo v gridu, ze nevytvari spravne nazvy inputu, ktere jsou pak predavany do do $_GETu – je potreba predat cely strom predku, ale grid na to prdi a pojmenuje je pouze xxxGrid-ColumnName=value
Cela cesta ke gridu je tedy takovato:
DashboardPresenter > DashboardComponent > BoxXComponent > Grid
Duvod proc mam takto rozdeleny kod je, ze puvodne pred refactorem (vse bez komponent v jednom presenteru), mel presenter cca 1500 radku a byl „trochu“ neprehledny, navic mame nadefinovane „balicky“ komponent dle user role a je hodne pekne vypisovat pak v sablone presenteru pouze {control dashboard} a vse ostatni nechat v komponentach
Asi si to zkusim fixnout sam.
- ondra310
- Člen | 25
Zdravím, omlouvám se, jestli jsem někde přehlédl. Potřeboval bych
udělat, aby se tlačítko „+“ pro subgrid zobrazovalo jen tehdy, pokud
subgrid obsahuje nějaké záznamy. Pokud neobsahuje, tak aby tam nebylo, lze to
nějak jednoduše udělat?
A ještě jeden dotaz, můžu řádku ve výpise přiřadit vlastní css
třídu? Potřeboval bych je různě „obarvit“ na základě vnějších
podmínek.
Editoval ondra310 (16. 7. 2013 18:26)
- doublemcz
- Člen | 15
Ahoj,
řešili jste už někdo persistentní parametery v odděděné komponentě?
use NiftyGrid\Grid;
class BaseGrid extends Grid {
/** @persistent */
public $status;
}
V této chvíli je v URL adrese status nastaven (například na new). Když následně dám například změnu stránkování z 20 na 50 tak se parameter vytratí. Máte tušení kde je chyba? :-)
Pokud dám persistentní parameter do presenteru, kde je komponenta použitá tak je to OK, nicméně následně se nedá komponenta jednoduše přesnášet. Například v tomto případě datasource reaguje na na filtr, který je ovládán přes URL. Všude bych chtěl komponentu přenést, tak přijdu o persistentní parametry a musím je jít zkopírovat.
EDIT: možná, že problém je v controlleru při přesměrování viz obrázek Screen
Editoval doublemcz (17. 7. 2013 12:28)
- doublemcz
- Člen | 15
jiri.pudil napsal(a):
Bohužel to nepomohlo. Nicméně i tento systém IMHO není správný. Musím na to myslet v případě použití komponenty. Pokud nějaký jiný vývojář použije komponentu a zapomene to do presenteru napsat, tak se grid bude chovat nekorektně (a ten daný vývojář nebude tušit proč).
- Semik
- Backer | 135
Při instalaci přes composer dostávám chybu:
`php.exe C:/Users/msemerak/WWW/Test3/composer.phar require
nifty/nifty-grid:dev-juznovo -n –no-progress
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
– Installing nifty/nifty-grid (dev-juznovo 06a2d06)
Cloning 06a2d06d787dbe4d2fd742a6bce702018e61c365
[ErrorException]
Argument 1 passed to Composer\Autoload\AutoloadGenerator::__construct() mus
t be an instance of Composer\EventDispatcher\EventDispatcher, none given, c
alled in C:\Users\msemerak\WWW\Test3\libs\nette\addon-installer\src\Nette\A
ddons\Installer.php on line 207 and defined
require [–dev] [–prefer-source] [–prefer-dist] [–no-progress]
[–no-update] [packages1] … [packagesN]
`
Nevím proč, potřebné závislosti mám nainstalované.
- Oli
- Člen | 1215
Zdravím,
používám řádkovou editaci. Pokud ukládám něco, co vyhodí výjimku
zobrazuju flash message uživateli.
Problém je, že při uložení zmizí formulářové prvky i při vyhození oné výjimky. Potřeboval bych říct niftygridu, že se uložení nepovedlo a ať jen zobrazí flash a nechá formulář jinak bejt. Jde to nějak?
ukládání mám takhle:
try
{
$self->database->editOrAdd($values['id'], $values);
} catch (\Exception $exc)
{
$self->flashMessage('Email již v databázi existuje. Údaje nomohli být uloženy.', 'error');
}
díky
- ryvova
- Člen | 9
Zdravím,
nefunguje mi řádková editace/přidávání v subgridu. Nepomohlo ani
$form[$this->name]['rowForm']->addSubmit("send","Uložit")
->setValidationScope(FALSE);
Podle debugu to vypadá, že to vůbec nevleze do setRowFormCallbacku v gridu ani do processGridFrom v Grid.php. V hlavním gridu editovatelné položky nejsou, subgrid by měl být editovatelný a měly by tam jít přidávat záznamy.
- revoke
- Člen | 36
czm4rty uložení řádkové editace enterem nefunguje tehdy, pokud jsou v záhlaví tabulky filtry. Lze to otestovat i v demo s filtry vs. demo bez filtrů. Nifty to vysvětloval před rokem zde.
Tvé řešení jsem však nepochopil (nevím, jak jej aplikovat na grid). Vymyslel jsem tedy toto:
$('input[type="text"][name*="rowForm"]').live('keypress', function(e){
if ( e.which === 13 ){
e.preventDefault();
$(this).closest('tr').find($('input[type="submit"]')).click();
}
});
Editoval revoke (9. 12. 2013 15:17)
- kbtm
- Člen | 22
Přeji dobrý den,
ve standardní instalaci to není.
Protože podpora od autora (asi) už neexistuje, budete si to muset doplnit.
Pro každou řádku gridu lze doplnit údaj „id“ a tak se v průběhu
vykreslování dostanete kdykoliv (kód/šablona) na aktuální data.
Pak je už ovlivnění způsobu vykreslení jednoduché.
Podobně (pomocí doplněného „id“) jsem si do gridu doplnil (třeba) kontextové menu, závislé na konkrétních datech 1 řádku.
S pozdravem kbtm
- n.u.r.v.
- Člen | 485
Ahoj, zkouším použít NiftyGrid, ale potřebuji nakopnut – jak zapsat tento sql dotaz:
'SELECT g.ID, g.NAME, g.HASH,
(SELECT count(ID) FROM user WHERE FID = "nějaké číslo" AND GROUP_ID = g.ID AND ELETE IS NULL) AS NUMBER
FROM group AS g
WHERE g.FID = "nějaké číslo" AND g.DELETE IS NULL
ORDER BY g.NAME ASC'
Jde mi o vypsání tabulky se skupinami + výpis počtů userů v danné skupině…
Dostávám chybovou hlášku Call to undefined method Nette\Database\ResultSet::getPrimary()
Třída pro tvoření NiftyGridu:
<?php
use \NiftyGrid\Grid;
class ClassNGrid extends Grid {
protected $articles;
//1109445
public function __construct($articles) {
parent::__construct();
$this->articles = $articles;
}
protected function configure($presenter){
$source = new \NiftyGrid\DataSource\NDataSource($this->articles->getConnection()->query('SELECT g.ID, g.NAME, g.HASH,
(SELECT count(ID) FROM user WHERE FID = "nějaké číslo" AND GROUP_ID = g.ID AND ELETE IS NULL) AS NUMBER
FROM group AS g
WHERE g.FID = "nějaké číslo" AND g.DELETE IS NULL
ORDER BY g.NAME ASC'));
$this->setDataSource($source);
$this->addColumn('NAME', 'Název skupiny');
$this->addColumn('NUMBER', 'Počet uživatelů');
}
}
?>
Editoval n.u.r.v. (7. 1. 2014 15:01)
- n.u.r.v.
- Člen | 485
Aha, tak jsem zjistil, že NiftyGrid potřebuji klasickou nette DB , ne getConection… Takže potřebuji poradit, jak zapsat následující sql dotaz do nette db …
SELECT g.ID, g.NAME, g.HASH,
(SELECT count(ID) FROM user WHERE FID = "nějaké číslo" AND GROUP_ID = g.ID AND ELETE IS NULL) AS NUMBER
FROM group AS g
WHERE g.FID = "nějaké číslo" AND g.DELETE IS NULL
ORDER BY g.NAME ASC
Moc děkuji.
- honos
- Člen | 109
Pokud si to pamatuji dobre tak musis ji predat neco jako
\Nette\Database\Selection
.
Ja jsem to vyresil pomoci (pardon, pisi z hlavy)
$control->addColumn('name','Label')
->setRenderer(function(ActiveRow $row){
return $row->(ref|related)(<key>)->name; // nebo misto name agregacni funkci nebo select('COUNT(*)').... no proste chapej
});
ref(<key>)
related(<key>)
proste
odkazuje na tabulku s foreign_key a tam uz pracujes normalne jako s ActivRow
od ND. Je to vice dotazu na DB ale ucel to splnilo. Pouzivam to v administraci
a tam mi to nevadi..
Jinak by me to taky zajimalo jak to udelat pomoci jedineho dotazu. Resit to
pomoci
$this->connection->select('table.column, table2:column,..)
?
Ale v podstate uz prechazim na DIBI tak to nudu muset nejak resit,
zase :-/
- zapp
- Člen | 32
ryvova napsal(a):
Zdravím,
nefunguje mi řádková editace/přidávání v subgridu. Nepomohlo ani
$form[$this->name]['rowForm']->addSubmit("send","Uložit") ->setValidationScope(FALSE);
Podle debugu to vypadá, že to vůbec nevleze do setRowFormCallbacku v gridu ani do processGridFrom v Grid.php. V hlavním gridu editovatelné položky nejsou, subgrid by měl být editovatelný a měly by tam jít přidávat záznamy.
Vyřešil/a jsi tento problém? Já na to teď taky narazil a nevím co s tím.
- Sedlakos
- Člen | 3
zapp napsal(a):
ryvova napsal(a):
Zdravím,
nefunguje mi řádková editace/přidávání v subgridu. Nepomohlo ani
$form[$this->name]['rowForm']->addSubmit("send","Uložit") ->setValidationScope(FALSE);
Podle debugu to vypadá, že to vůbec nevleze do setRowFormCallbacku v gridu ani do processGridFrom v Grid.php. V hlavním gridu editovatelné položky nejsou, subgrid by měl být editovatelný a měly by tam jít přidávat záznamy.
Vyřešil/a jsi tento problém? Já na to teď taky narazil a nevím co s tím.
Přidávám se k tomuhle dotazu, nevíte prosím někdo jak to vyřešit ?
- ryvova
- Člen | 9
Ahoj,
mám následující problém. V gridu mám 2 sloupečky – datum pracovního poměru od a datum pracovního poměru do. Používám řádkovou editaci. A potřebovala bych, aby když datum pracovního poměru do bude < datum pracovního poměru od, tak aby se formulář neodeslal. Zatím jsem vymyslela jen jak to otestovat v metodě setRowFormCallback a zobrazit případnou chybovou zprávu (flashMessage), ale při tomto způsobu zmizí in-line editační formulář a uživatel musí zadávat data znovu.
Děkuji za tip jak to co nejjednodušeji vyřešit
- siberit
- Člen | 10
Zdravím,
Lze nějakým způsobem nastavit aby se v případě použití subgridu zobrazovali vypisy vnorenych gridu rovnou po načtení stránky a ne až po kliknutí na tlačítko „+“ ?
Př.
momentálně se mi po načtení stránky zobrazí toto: http://prntscr.com/2z8v5j
ale chtěl bych aby se mi zobrazil rovnou rozbaleny takto: http://prntscr.com/2z8wj0
Další otázkou je zda jde nějak vypnout závislost mezi talčítky „+“ které rozbalují subgrid, tak aby po kliknutí na „+“ zustaval subgrid rozbaleny porad a ne jen do chvile kdy se klikne na „+“ u jineho subgridu…
Předem moc děkuju za rady..
- mildhouse
- Člen | 27
Ahoj,
instalace přes composer hlásí :
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
– The requested package nifty/nifty-grid could not be found in any
version,
there may be a typo in the package name.
- Potential causes
- A typo in the package name
- The package is not available in a stable-enough version according to your min
imum-stability setting
see <https://groups.google.com/…c/discussion>
f
or more details.
Read <http://getcomposer.org/…eshooting.md> for further
common
problems.
- mpis
- Člen | 65
Vypadá to, že vlákno je neříliš živé.
Nicméně zkusím dotaz:
Chci použít tento vynikající grid, ale brání mi v tom jedna chyba,
o které nevím zda je to chyba gridu nebo něčeho jiného.
Jde o špatné třídění – když mám slova začínající na a, b, c, A,
B, C tak výsledek třídění je
a, b, c, A, B, C, což je špatně. Mělo by být a, A, b, B, c, C.
Nevěděl by někdo poradit?
- mpis
- Člen | 65
Šaman napsal(a):
A obyčejný select a order by ti to seřadí správně? Jestli ne, tak bude chyba v nastavení řazení v db.
Obyčejný select a order mi to seřadí správně.
Navíc mi to při použití třídění v záhlaví sloupce zobrazí o jeden
řádek míň.
Asi budu muset použít jiný grid, což se mi ale vůbec nechce.
- Nevinho
- Člen | 77
Zdravím, mám takový dotaz. Mám tabulku Osoba (ID, jmeno, prijmeni,ID_adresa…) kterou mám spojenou s Info (ID, cas, trvaly_pobyt, ID_osoba,ID_role,ID_stanoviste) a Adresou(ID, ulice, cislo_popisne,ID_obec) kterou mám spojenou s Obec(ID,nazev,psc). Tabulku Info mám ještě spojenou s Stanoviste(ID,IDS,ID_adresa)
Do gridu to všechno, ikdyž to byla celkem fuška vypíšu tímto kódem:
$source = new \NiftyGrid\DataSource\NDataSource($this->osoba->select("osoba.id,jmeno,prijmeni,datum_narozeni,Zakodovane_rodne_cislo AS Rodne_cislo,
adresa.ulice,cislo_popisne, adresa.obec.nazev, adresa.obec.psc,
email:email, telefon:telefon,
doplnujici_info_osoba:identifikator_poplatnika, doplnujici_info_osoba:stanoviste.ids, doplnujici_info_osoba:cas_stanoviste,
doplnujici_info_osoba:role.nazev AS role,doplnujici_info_osoba:status.nazev AS status, doplnujici_info_osoba:trvaly_pobyt,
doplnujici_info_osoba:zasilat_informace, doplnujici_info_osoba:poznamka"));
A mám problém s tím, jak tyto záznamy editovat a případně vložit nový záznam tak, aby se uložil do všech těchto tabulek (do každé jednotlivý záznam, který vypisuji)
Ukládání a editaci řeším zde:
$self = $this;
$this->setRowFormCallback(function($values) use ($self, $presenter) {
$osoba=array('Jmeno'=>$values['jmeno'],'Prijmeni'=>$values['prijmeni'],'Datum_narozeni'=>$values['datum_narozeni'],'Zakodovane_rodne_cislo'=>$values['Rodne_cislo'],'Adresa_ID'=>563);
// $email =array('Email'=>$values['email'],'Osoba_ID'=>$values['id']);
// $telefon =array('Telefon'=>$values['telefon'],'Osoba_ID'=>$values['id']);
if(isset($values['id'])){
$presenter->context->database->table('osoba')->where("id", $values["id"])->update($osoba);
//$presenter->context->database->table('email')->where("id", $values["id"])->update($email);
// $presenter->context->database->table('telefon')->where("id", $values["id"])->update($telefon);
$self->flashMessage("Osoba byla upravena", "grid-successful");
}
else{
$presenter->context->database->table('osoba')->insert($osoba);
//$presenter->context->database->table('email')->insert($email);
$self->flashMessage("Byla vložena nová osoba", "grid-info");
}
}
);
Za každou radu předěm velice děkuji, protože si s tim lámu hlavu už strašně dlouho a už si nevím rady…
Editoval Nevinho (12. 6. 2014 1:21)
- Nezmo
- Člen | 7
Zdravím, chtěl bych poprosit o pár rad. Používám Niftygrid a za pomocí dokumentace jsem ho úspěšně zprovoznil, až na pár výjimek.
1. Nejpalčivější je nefunkční filtrování při kódu
$this->addColumn('cele_jmeno', 'Celé jméno', '300px')
->setTextEditable()
->setSortable(FALSE)
->setTextFilter('cele_jmeno'); // bez parametru i s ním
Mi laděnka hází chybu Illegal string offset ‚filter‘ v souboru Niftygrid/Grid.php na řádku 880
2. problémem je nefunkční in-line editace
$this->addButton(Grid::ROW_FORM, "Rychlá editace")
->setClass("fast-edit");
a když přidám na zkoušku, abych vyzkoušel jestli proběhne dotaz v setRowFormCallback
$this->setRowFormCallback(function($values){
$this->databse->query('UPDATE USERS SET prijmeni="hodnota" where username="hodnota"');});
Tak to při jakémkoli kódu (i prázdné) napíše Please select a valid option.
3. problémem je nefunkční funkce ->setConfirmationDialog(„Něco něco“) a nefunkční autocomplete. Mám pocit, že to bude spolu nějak souviset.
Poprosil bych o každou radu. Děkuji :-)
- Lukáš Kadlec
- Člen | 17
Nezmo napsal(a):
…1. Nejpalčivější je nefunkční filtrování při kódu
$this->addColumn('cele_jmeno', 'Celé jméno', '300px') ->setTextEditable() ->setSortable(FALSE) ->setTextFilter('cele_jmeno'); // bez parametru i s ním
Mi laděnka hází chybu Illegal string offset ‚filter‘ v souboru Niftygrid/Grid.php na řádku 880