[addon datagrid] DataGrid
- vlki
- Člen | 218
Aktuálně nic víc než DataSource neumí. Nemělo by ale být těžké
vytvořit nějaký adaptér, který by šel nastavit podle potřeby. Respektive
DataSource rozbít na jednotlivé operace count($conds)
a
fetchAll($conds, $orderBy, $offset, $limit)
, které by šly
odchytit na úrovni modelu.
Osobně jsem si vytvořit DataSource, kterému předhodím pole. Funguje parádně až na filtr pomocí wildcard (*).
- paranoiq
- Člen | 392
na1k napsal(a):
Rád bych se zeptal – je možné dodat data pro DG jinak než v dataSource? Resp. je možné pro účel základního gridu (jen listování a řazení) implementovat vlastní dataSource, který by bral data například z vícerozměrného pole anebo využívá DG některé funkce, které bych vlastní implementací nenasimuloval?
přesně k tomu je určen interface IDataSource. (tedy pokud ho DataGrid správně ověřuje. ověřuje?)
Editoval paranoiq (25. 10. 2009 18:22)
- na1k
- Člen | 288
vlki napsal(a):
Bohužel ne. Požaduje, aby byl „zdroj“ objekt třídy DibiDataSource nebo nějakého jejího potomka.
To je právě škoda. A můžu se zeptat jak jsi implementoval ty? Asi podědil a všechno přepsal, ne? Právě bych taky ocenil možnost dodávat data z pole, jen nevím co všechno datasource využívá, resp. co všechno bych musel implementovat, abych rozběhal základ – řazení a filtry. Ale asi to nechám na pozdějc, teď mě tlačí jiné věci a třeba ještě proběhnou nějaké změny v dg, jako třeba že se spokojí s objektem se správným rozhraním :)
- romansklenar
- Člen | 655
Má to svůj důvod a to ten, že pouhé rozhraní IDataSource
nestačí, jelikož nezaručuje žádnou funkčnost a tuším že tam bude
ještě jinde nějaká návaznost na DibiResult
.
Jinak žádné změny se už neplánují.
- blacksun
- Člen | 177
Při definici DataSource můžeš z databáze rovnou tahat jeden sloupec, do kterého spojíš požadované např takto:
SELECT CONCAT_WS(' ',sloupecZnacky,sloupecModelu) as nazev, pocet, hodnota FROM tabulka WHERE bla bla
- romansklenar
- Člen | 655
0.9.2 ještě není v svnku, takže nejde nalinkovat pomocí externals. Až vyjde, bude to automaticky šlapat.
- Jakub Šulák
- Člen | 222
Jeden dotaz k DataGridu – je nějaká možnost nastavit u operací default hodnoty? Tedy že daná operace se má defaultně provést na daných řádcích.
Jedná se mi o případ, kdy máte tabulku s X záznamy a Y (X>=Y) z nich má mít nastaven určitý flag.
- Honza Kuchař
- Člen | 1662
Zde mi funguje: 1025fea released on 2009-10-22
Editoval honzakuchar (4. 11. 2009 18:46)
- Honza Kuchař
- Člen | 1662
method PresenterComponent::offsetSet()
Tohle už se pokud vím od hodně dávné verze datagridu nepoužívá http://www.php.net/…yAccess.html. Finální metoda je nyní
v přímo v Nette. Zajišťuje přístup
pomocí $control["control2"]
- Oggy
- Člen | 306
honzakuchar napsal(a):
method PresenterComponent::offsetSet()
Tohle už se pokud vím od hodně dávné verze datagridu nepoužívá http://www.php.net/…yAccess.html. Finální metoda je nyní v přímo v Nette. Zajišťuje přístup pomocí
$control["control2"]
pokud ale datagrid nevolám.. tahle chyba se nevyskytuje.. neříkám, že to je tedy v kódu DataGridu..ale nějak nevím příčinu.
- Oggy
- Člen | 306
romansklenar napsal(a):
Ano, bez jakehokoli problemu.
a netušíš v čem by mohl být háček? .. zkoušel jsem různé verze Nette a DataGridu.. ale pokud někde vytvářím instanci DataGridu nastane tato chyba
Compile Error
Cannot override final method PresenterComponent::offsetSet()
File: app/components/DataGrid/DataGrid.php Line: 40
Line 40: class DataGrid extends Control implements ArrayAccess,
INamingContainer
- Zdenal
- Člen | 21
tak uz jsem vyresil puvodni chybu, ze jsem presel na jinou verzi datagridu ale ted zas Fatal error: Method DataGrid::__toString() must not throw an exception in
vite nekdo jak vykreslovat datagrid bez šablon primo ve skriptu? Pouzivam <?php echo $grid; ?> ale v tom je asi ta chyba.
Editoval Zdenal (7. 11. 2009 14:41)
- romansklenar
- Člen | 655
Zkus $grid->render()
a měl bys vidět kde konkrétně je
při tom vykreslování chyba.
- romansklenar
- Člen | 655
Důležité: změna označení verzí
Jelikož se množní dotazy, jaká verze/revize datagridu je funkční s jakou verzí Nette a dibi, rozhodl jsem se změnit způsob označení a vydávání verzí datagridu. Nová verze DataGridu příjdě vždy těsně po vydání další stable verze Nette. Proto doporučuji vždy používat s příslušnou stabilní verzí Nette i příslušnou verzi DataGridu, vyhnete se tak problémům.
- pro Nette 0.8 je k dispozici verze DataGrid 0.8, vyžaduje dibi 1.1. Tato verze nahrazuje stařičkou „betu“ a přináší několik bugfixů, takže ti kteří používají betu, mají ji například staženou ze stránek dokumentace, mohou upgradovat.
- pro Nette 0.9.0 je k dispozici verze DataGrid 0.9.0, vyžaduje dibi 1.1 (tato verze DataGridu měla původně před X měsíci vyjít pod označením beta2)
- pro Nette 0.9.1 není k dispozici žádná kompatibilní verze (a ani nebude, na této verzi sice datagrid s pár úpravama funguje, ale jen dokud se nepoužijí formuláře)
- pro Nette 0.9.2 je k dispozici verze DataGrid 0.9.2, vyžaduje dibi 1.2 a vyšší
- pro Nette 0.9.3-dev se dá použít DataGrid z SVN (trunk)
V jednotlivých archívech se vždy nachází i příslušné stable verze Nette i dibi.
Jakmile bude opět funkční web, zdokumentuju nové featury (respektive ony tam jsou, jen zakomentované v texy syntaxi, takže se nezobrazí).
Editoval romansklenar (14. 11. 2009 17:41)
- deric
- Člen | 93
Oggy napsal(a):
honzakuchar napsal(a):
method PresenterComponent::offsetSet()
problém je s final metodami PresenterComponent::offsetSet
,
PresenterComponent::offsetGet
které DataGrid překrývá. Týká
se to určitě verze beta
v SVN
– (beta) v bootstrap.php
je použita nepodporovaná metoda
isDebugging()
– (beta) nefunguje filtrování položek
– u verze 0.9.2 chybí obsah libs
Editoval deric (17. 11. 2009 23:03)
- romansklenar
- Člen | 655
Proto jsou o příspěvek výše linky na archívy vždy s konkrétní verzí Nette. Beta je proste deprecated, brát ji z SVN taky, asi bude lepší ji rovnu zrušit.
EDIT: Smazáno. Upravte si prosím externals, pokud je používáte.
Editoval romansklenar (17. 11. 2009 23:23)
- ondrique
- Člen | 16
ahoj,
možná úplně hloupý dotaz, ale při ajaxovém requestu např. při
stránkování či změně pořadí mi to vrací Failed to load source for: http://localhost/...../tags/?… a znovu se načte celá
stránka. Poraďte prosím, jak zprovoznit.
továrnička na datagrid vypadá takto:
<?php
$model = new DatagridModel('blog_tags');
$grid = new DataGrid;
$grid->bindDataTable($model->findAll()->orderBy('ordering')->toDataSource());
$grid->keyName = 'id';
$grid->multiOrder = FALSE;
$pos = array('up' => 'Move up', 'down' => 'Move down');
$grid->addPositionColumn('ordering', 'Pořadí', 'OrderChange!', $pos);
$grid->addColumn('name', 'Název');
$grid->addActionColumn('Actions');
$icon = Html::el('span');
$grid->addAction('Edit', 'edit', clone $icon->class('icon icon-edit'));
$grid->addAction('Delete', 'delete', clone $icon->class('icon icon-del'));
$this->addComponent($grid, $name);
return;
?>
- Honza Kuchař
- Člen | 1662
Ahoj, když jsem vypustil datagrid na databázi s cca 200 000 řádky, tak jsem objevil jeden takový malinký bug, který ale naprosto zásadním způsobem zpomalí načítání stránky. (když nemá datagrid ručně nadefinované sloupečky) V datagrid.php na řádku 969 bych řádek upravil z
$row = $ds->select('*')->fetch();
na
$row = $ds->select('*')->applyLimit(1)->fetch();
Což způsobí dost zásadní rychlostní rozdíl… Před: 477,371ms Po: 0.895ms :)
- Honza Kuchař
- Člen | 1662
Fixed
Zdá se, že minimálně na GitHubu se to neprojevilo.
https://github.com/…DataGrid.php#L966
//Edit: na SVN taky ne.
Editoval honzakuchar (1. 12. 2009 20:46)
- norbe
- Backer | 405
Ahoj, upravil jsem si událost onCellRender
v
DataGridRenderer
tak, aby bylo možné upravit akce v závislosti
na hodnotách v daném řádku. Celá úprava spočívá v nahrazení
NULL
za $data
.
Upravená řádka potom vypadá následovně:
$this->onCellRender($cell, $column->getName(), !($column instanceof ActionColumn) ? $data[$column->getName()] : $data);
Bylo by možné to dát do distribuce? Myslím, že to je docela žádáná vlastnost :-)
- romansklenar
- Člen | 655
Ono se tam záměrně nic neposílalo, pokud šlo o
ActionColumn
. Ale OK je to tam.
- Patrik Votoček
- Člen | 2221
romansklenar napsal(a):
Důležité: změna označení verzí
- pro Nette 0.9.2 je k dispozici verze DataGrid 0.9.2, vyžaduje dibi 1.2 a vyšší
- pro Nette 0.9.3-dev se dá použít DataGrid z SVN (trunk)
Bodou i PHP 5.3.x edice?
Jakmile bude opět funkční web, zdokumentuju nové featury (respektive ony tam jsou, jen zakomentované v texy syntaxi, takže se nezobrazí).
To už se může udělat né?
- romansklenar
- Člen | 655
vrtak-cz napsal(a):
Bodou i PHP 5.3.x edice?
Bohužel to nemám jako prioritu protože to nepotřebuju. Ani jsem si s jmennými prostory ještě nepotykal a nepřišel jejich implementaci na chuť. Ale myslím, že když se vezme verze Nette pro PHP 5.2 tak i DataGrid pojede na PHP 5.3. takže ostatní vlastnosti vyšší verze půjde používat.
Klidně ale můžeš na githubu forknout a udělat novou branch a já tam ty změny zařadím.
- romansklenar
- Člen | 655
vrtak-cz napsal(a):
romansklenar napsal(a):
Jakmile bude opět funkční web, zdokumentuju nové featury (respektive ony tam jsou, jen zakomentované v texy syntaxi, takže se nezobrazí).
To už se může udělat né?
Dokumentace komponenty aktualizována.
- ClaryAldringen
- Člen | 5
Ahoj, nevím jestli je to obecný bug a nebo se to projevuje jen u mě, protože DG používám poněkud nestandardně. Když odešlu akci přes ikonku ve sloupci action, vše funguje jak má a proběhnou tyto operace: vytvoření DG->požadovaná akce->nové vytvoření DG Naproti tomu když odělu operaci tlačítkem submit, tak následují pouze operace vytvoření DG->akce, tudíž DG se sice překreslí ale ještě s původními daty, což je nepříjemné například u mazání řádku. Toto se děje pouze při použití s AJAXem, bez AJAXu se znovu volá celý presenter a vše je OK. Nevíte někdo co s tím?
- ji_ri_k
- Člen | 44
Zdravím, narazil jsem na problém s DataGridem pro verzi Nette 0.9.2. Píšu to sem, kdyby měl někdo stejný problém, ať ví kde je chyba. Nette vyžaduje PHP 5.2.0 a vyšší ale Datagrid 5.2.3 a vyšší, pokud používáte callback funkce při formátování obsahu buněk.
Je to kvůli funkci call_user_func();
, která na verzích php
rozdílně přijímá třídu a její metodu:
call_user_func('Helpers::price', 1500)
; → funguje až od verze
5.2.3 a výše.
U nižší verze je třeba zadat:
call_user_func(array('Helpers','price'), 1500);
Problémový řádek v datagridu je:
http://code.google.com/…xtColumn.php?r=63
a viz php manuál:
Editoval ji_ri_k (18. 12. 2009 12:19)
- bazo
- Člen | 620
ClaryAldringen napsal(a):
Ahoj, nevím jestli je to obecný bug a nebo se to projevuje jen u mě, protože DG používám poněkud nestandardně. Když odešlu akci přes ikonku ve sloupci action, vše funguje jak má a proběhnou tyto operace: vytvoření DG->požadovaná akce->nové vytvoření DG Naproti tomu když odělu operaci tlačítkem submit, tak následují pouze operace vytvoření DG->akce, tudíž DG se sice překreslí ale ještě s původními daty, což je nepříjemné například u mazání řádku. Toto se děje pouze při použití s AJAXem, bez AJAXu se znovu volá celý presenter a vše je OK. Nevíte někdo co s tím?
ja by som povedal, ze to je zalezitost nette, lebo mne sa presne to iste deje s hociakymi formularmi
- romansklenar
- Člen | 655
ji_ri_k napsal(a):
Zdravím, narazil jsem na problém s DataGridem pro verzi Nette 0.9.2. Píšu to sem, kdyby měl někdo stejný problém, ať ví kde je chyba. Nette vyžaduje PHP 5.2.0 a vyšší ale Datagrid 5.2.3 a vyšší, pokud používáte callback funkce při formátování obsahu buněk.
Je to kvůli funkci
call_user_func();
, která na verzích php rozdílně přijímá třídu a její metodu:
call_user_func('Helpers::price', 1500)
; → funguje až od verze 5.2.3 a výše.U nižší verze je třeba zadat:
call_user_func(array('Helpers','price'), 1500);
Problémový řádek v datagridu je:
http://code.google.com/…xtColumn.php?r=63a viz php manuál:
Zkus ten cyklus upravit tak, že před podmínku dáš
fixCallback($callback)
:
foreach ($this->formatCallback as $callback) {
fixCallback($callback);
if (is_callable($callback)) {
$value = call_user_func($callback, $value, $data);
}
}
Předpokládám, že by to mělo vyřešit situaci pro všechny verze PHP 5.2, dej vědět jestli to opravdu pomohlo, kdyžtak tu opravu zařadím.
Editoval romansklenar (18. 12. 2009 17:15)
- ji_ri_k
- Člen | 44
Ahoj, paráda, funguje to. Zkoušel jsem to na serveru s PHP 5.2.0 i na 5.2.10. Obojí běží. A já trouba se to snažil obejít a tuhle funkci jsem v té rychlosti nenašel … to je tak když jsem potřeboval nutně ihned odprezentovat a za 5 minut 12 jsem zjistil, že to na tom serveru neběží. Díky za tip a samozřejmě i za parádní datagrid.
- Aurielle
- Člen | 1281
Jestli někdo potřebuje confirmer pro smazání, tak je tady (mám ho v datagrid.js):
$("a.confirm").live("click", function(event) {
event.preventDefault(); // preventdefault mi nic nedělá, takže tam ani nemusí být
if (confirm("Jste si jisti?")) return true; // returny je jediná věc co funguje, když chybí v else části return false tak se datagrid odešle i při kliku na ne, a když chybí tady a místo něj tam je $.get(this.href);, tak se dg odešle 2x.
else return false;
});
Zase bych zkusil vytáhnout na povrch toto:
Jak složitá by byla implementace? :)
PS: Děkuji za pěkné flash zprávičky, jsou ještě lepší než jGrowl ;-)
Editoval gmvasek (30. 12. 2009 18:23)
- Ondřej Mirtes
- Člen | 1536
Tohle vypadá moc hezky :) Ještě by mě zajímalo, jak to vypadá bez Javascriptu.
BTW: Jaké flash zprávičky?
- romansklenar
- Člen | 655
gmvasek napsal(a):
Jak složitá by byla implementace? :)
Implementace není příliš složitá, ale je s tím více problémů, než to přináší užitku. Proto se to ani nedostalo ven.
Ondřej Mirtes napsal(a):
Jak to vypadá bez Javascriptu?
Protože je to v administraci, tak jsem si mohl dovolit JS vyžadovat, ale bez něj by se to provedlo jako další request a vykreslilo na novou samostatnou stránku.
- Patrik Votoček
- Člen | 2221
Tak jsem se pokusil sesmolit DG pro Nette 0.9.3RC
Po hodinovém boji s Gitem…
https://github.com/…tte-datagrid
Editoval vrtak-cz (26. 1. 2010 5:54)
- RaR
- Člen | 42
Ahoj
jde nějak jednoduše vykreslit stavový řádek (operations, paginator, info)
datagridu i na začátek datagridu?
Zkusil jsem toto, ale nepřekreslí se právě ten přidaný stavový řádek.
Datagrid funguje v poho. Pokud přidám zavináše před wšechny {widget, tak
nefunguje ani datagrid. Už nevím jak na to, poraďte prosím.
<?php
{widget gridOrders begin}
<table class="datagrid">
<tfoot>
<tr class="footer">
<td>
{widget gridOrders operations}
{widget gridOrders paginator}
{widget gridOrders info}
</td>
</tr>
</tfoot>
</table>
{widget gridOrders end}
@{widget gridOrders}
?>
- Jakub Šulák
- Člen | 222
Nešlo by DataGrid upravit pro nové dibi – hlásí to DibiFluent::clause(…, TRUE) is deprecated; use removeClause() instead.
Jedná se o řádek 63 souboru SelectboxFilter.php
- ji_ri_k
- Člen | 44
Jakub Šulák napsal(a):
Nešlo by DataGrid upravit pro nové dibi – hlásí to DibiFluent::clause(…, TRUE) is deprecated; use removeClause() instead.
Jedná se o řádek 63 souboru SelectboxFilter.php
Při úpravách by to chtělo zahrnout i úpravy týkající se fixCallback();
V Nette verzi 0.9.3 tato funkce vymizela a na serverech s PHP verzi nižší jak 5.2.3 nelze používat callback vůbec. (Nyní již ani po přidání fixCallback() – byla odstraněna)
Bohužel mám tu smůlu, že na našem firemním serveru, kde mi běží už 7 projektů na Nette mám verzi 5.2.0 a tohle mě tam irituje maximálně… :-)
- Jakub
- Člen | 30
Jenom rychlý dotaz – přidal jsem si k tabulce operace, které mi přidaly před první sloupec checkboxy. V hlavičce tabulky však není tlačítko pro „Zaškrtnout vše“. Jak si mohu zobrazení tlačítka zapnout/vynutit? Nebo je možné, že něco dělám špatně, protože tam tlačítko má být defaultně?
Díky!