[addon datagrid] DataGrid

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
vlki
Člen | 218
+
0
-

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
+
0
-

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)

vlki
Člen | 218
+
0
-

Bohužel ne. Požaduje, aby byl „zdroj“ objekt třídy DibiDataSource nebo nějakého jejího potomka.

Editoval vlki (25. 10. 2009 19:01)

na1k
Člen | 288
+
0
-

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
+
0
-

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í.

krpec
Člen | 1
+
0
-

Ahoj, potřeboval bych docílit toho, abych sloučil dva sloupce z databáze (značka, model) do jednoho sloupce v tabulce DataGridu (název). Jak na to? Předem díky za rady :)

blacksun
Člen | 177
+
0
-

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

http://dev.mysql.com/…nctions.html#…

Klokan
Člen | 47
+
0
-

Nejlepsi je asi je sloucit jiz pri vyberu a pak zobraziz. Tj. např. takhle:
SELECT concat(jmeno," ",prijmeni) as jmeno_primeni .....
a pak v datagridu zobrazit sloupec jmeno_prijmeni

jarks
Člen | 94
+
0
-

U revizí 52 a 53 je asi připojena příliš stará verze Nette, která nobsahuje setDefaultValue(), takže pokus o spuštění příkladu u mě skončil chybou. Když jsem přihrál 0.9.2-dev, 2009–10–22, vše funguje.

romansklenar
Člen | 655
+
0
-

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
+
0
-

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.

Oggy
Člen | 306
+
0
-

jaké revize Datagridu je nyní funkční s dev verzí 0.9.2 ?

Honza Kuchař
Člen | 1662
+
0
-

Zde mi funguje: 1025fea released on 2009-10-22

Editoval honzakuchar (4. 11. 2009 18:46)

Oggy
Člen | 306
+
0
-

honzakuchar napsal(a):

Zde mi funguje: 1025fea released on 2009-10-22

datagrid revize 53 a nette 0.9.2 mi hlásí Cannot override final method PresenterComponent::offsetSet()

revizi z data 22.10. jsem nějak nenašel

yagi
Člen | 3
+
0
-

Da se nejak v DG skryt cely sloupec?

A jeste neco, lze nejak vytvorit v paticce DG souctovy radek vybranych sloupcu?

Editoval yagi (5. 11. 2009 16:54)

Honza Kuchař
Člen | 1662
+
0
-

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
+
0
-

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
+
0
-

Používá tu prosím někdo Datagriid s Nette 0.9.2? šlape Vám?

já se stále nemohu přehoupnout přes ten offsetSet()

romansklenar
Člen | 655
+
0
-

Ano, bez jakehokoli problemu.

Oggy
Člen | 306
+
0
-

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
+
0
-

Ahoj,

já mám uplně stejný problém. :-( Poradí někdo?

Zdenal
Člen | 21
+
0
-

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
+
0
-

Zkus $grid->render() a měl bys vidět kde konkrétně je při tom vykreslování chyba.

romansklenar
Člen | 655
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 :)

romansklenar
Člen | 655
+
0
-

Fixed.

Vývoj byl také přesunut na github.

Honza Kuchař
Člen | 1662
+
0
-

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
+
0
-

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
+
0
-

Ono se tam záměrně nic neposílalo, pokud šlo o ActionColumn. Ale OK je to tam.

Patrik Votoček
Člen | 2221
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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:

http://php.net/…ser-func.php

Editoval ji_ri_k (18. 12. 2009 12:19)

bazo
Člen | 620
+
0
-

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
+
0
-

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=63

a viz php manuál:

http://php.net/…ser-func.php

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
+
0
-

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
+
0
-

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
+
0
-

Tohle vypadá moc hezky :) Ještě by mě zajímalo, jak to vypadá bez Javascriptu.

BTW: Jaké flash zprávičky?

Aurielle
Člen | 1281
+
0
-

ad flash zprávičky: myslím ty, které datagrid používá a konkrétně jejich vizuální vyřešení :) V raných fázích vývoje mé aplikace se mi zdálo, že si uživatelé jGrowlu moc nevšímají/snadno takovou zprávičku přehlédnou.

romansklenar
Člen | 655
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

despiq
Člen | 320
+
0
-

DG jede i pod 1.0 dev

ji_ri_k
Člen | 44
+
0
-

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
+
0
-

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!