ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Blujacker
- Člen | 89
Hraju si s API-data-source a narazil jsem na problem. API potrebuje, aby mu bylo zaslan seznam sloupcu ktere ma vratit. Pokud se neposle ten seznam tak to vrati prazdny seznam. Slo by nejak Datagrid prizpusobit tomu, aby tento seznam umel predavat api-data-source?
Ve svem starem vlastnim gridu jsem to mel udelane tak, ze pred odeslanim se prosel seznam sloupcu + bylo mozne mimo definovat dalsi default hodnoty (ktere se nezobrazily ale API je muselo vratit protoze byly potreba k vypoctum apod.)
- Pavel Janda
- Člen | 977
@Blujacker Když se podíváš na konstruktor třídy
ApiDataSource
, tak druhý argument je seznam query parametrů,
které se posílají při každém requestu na vzdálené API. Stačí
takto? :)
Bohužel datasourcy nemají povědomí o datagridu, takže nelze jednoduše proiterovat sloupce, jak píšeš.
Editoval Pavel Janda (19. 5. 2016 11:43)
- Blujacker
- Člen | 89
@PavelJanda Nakonec jsem to vyresil nehezky tak, ze si predavam
$grid
do data-source a z toho uz si seznam sloupcu vytahnu z
array_keys($grid->columns)
.
Ale jeste mi neni uplne jasne jak pracovat s parametrem
getResponse($params)
. Je tam klic sort
, ale ten je
vzdy NULL
, protoze se sort()
vola az po
getResponse()
– viz screen http://imgur.com/dK87FJe
Delam neco spatne nebo je to tam nekde prohozene?
Edit: stejne je to s limit()
, jedine filter()
se
vola pred getResponse()
.
Edit2: Vyreseno, bylo to kvuli tomu, ze getData()
si vysledek
getResponse()
cachuje, stacilo odstranit cache a vyreseno.
Editoval Blujacker (19. 5. 2016 13:37)
- Darkling
- Člen | 35
Ahoj,
po přechodu na verzi 4.1 mi přestali fungovat group actions:
<?php
// Tracy
// strtolower() expects parameter 1 to be string, object given
// GroupActionCollection.php:114
$http_ids = $form->getHttpData(Form::DATA_LINE|Form::DATA_KEYS, strtolower($this->datagrid) . '_group_action_item[]');
?>
Plus mě ještě napadlo:
- bylo by super mít možnost ::setTranslateOptions() na select group action, stejně jako tomu je u filtrů.
- taky by se hodilo ::addGroupMultiSelectAction
Může se pokusit implementovat a poslat PR. Jinak naprosto super grid.
- Pavel Janda
- Člen | 977
@Blujacker Kde se volá ::getData()
před sortěním a
limitěním? :-o
Všechny ty cally jdou od DataModel::fitlerData()
a tam se to
volá postupně. Co udělá ApiDataSource
v sortění a limitění
je pouze to, že nastaví sám sobě nějaké property a vrátí
$this
. Neměl by tahat rovnou data.. To až
::getData()
.. Nebo co přehlížím?
- Blujacker
- Člen | 89
Pavel Janda napsal(a):
@Blujacker Kde se volá
::getData()
před sortěním a limitěním? :-oVšechny ty cally jdou od
DataModel::fitlerData()
a tam se to volá postupně. Co uděláApiDataSource
v sortění a limitění je pouze to, že nastaví sám sobě nějaké property a vrátí$this
. Neměl by tahat rovnou data.. To až::getData()
.. Nebo co přehlížím?
getData se poprve vola ve filter()
– https://github.com/…taSource.php#L136
a vysledek se rovnou ulozi do $this->data
. A pak kdyz se
getData
vola znovu zde https://github.com/…ataModel.php#L124
nebo zde https://github.com/…ataModel.php#L121
tak se vrati $this->data
a uz se znovu nevola
getResponse()
s nastavenym sort()
a
limit()
protoze $this->data
neni empty.
Snad to chapu dobre..
- Blujacker
- Člen | 89
Misto fa pouzivam glyphicony pro zobrazovani icon. Koukal jsem, ze existuji pred-definovane zakladni bloky (sort up/down), ale chybi to pro pokrocilejsi icony napr. u zobrazovani / schovavani sloupcu. Ekvivalentni icony se u bootstrapu jmenuji jinak nez u font-awesome a tedy nedojde k jejich zobrazeni. Napr: https://github.com/…tagrid.latte#L85, https://github.com/…tagrid.latte#L91, …
- Pavel Janda
- Člen | 977
@Darkling v4.1.1
@Blujacker Ale ta metoda ::fitler()
se volá až po
sortění a limitění.. Je to vidět v té třídě DataModel
.
Udělá se sort, limit a pak filter. V filtru se rovnou stáhnout data a
jakmile se zavolá z DataModelu ->filter()->getData()
, tak
to getData() vrátí již stáhnutá data..
Leda že bys to někde stahoval ještě jednou. A nebo fakt něco přehlížím.
- Pavel Janda
- Člen | 977
@Blujacker Odpověděl sis sám… Proměnnou
DataGrid::$icon_prefix
si změň na ‚glyphicon glyphicon-‘.
- Blujacker
- Člen | 89
@PavelJanda To jsem udelal na zacatku, ale to nepomuze, protoze v fa
se ta icona jmenuje gear
ale takova icona v bootstrapu neexistuje,
ekvivalent teto icony se jmenuje cog
. Takze staci pridat
n:block
<i n:block="icon-gear"class="{$icon_prefix}gear"></i>
a vlastni definici do latte do setTemplateFile
{block icon-gear}<span class = "glyphicon glyphicon-cog"></span>{/}
Delam to spravne? Mam zkusit poslat PR?
- Pavel Janda
- Člen | 977
@Blujacker Jasne, uz jsem v obraze s obojim. :D
Mas pravdu a mas pravdu. Muzes poslat PR na ty ikony? Opravim vecer tn ApiDataSource. Cachovat by se to melo, ale jinde.
- Blujacker
- Člen | 89
@PavelJanda PR je tam. Ted jeste koukam na ten ApiDataSource a zda se
mi, ze getCount() [DataModel:114] se take vola pred getData()
[DataModel:121/124]. Ja mam API navrzene tak, ze jednim volanim ziskam jak
vysledek (filter, limit, sort) a zaroven i celkovy pocet vysledku (bez limit).
Idealni by tedy bylo kdyby ApiDataSource
vedel filter/limit/sort
data pred volanim getData()
/ getCount()
– aby se
to vsechna data dala ziskat pouze jednim dotazem na API.
Da se tohoto vysledku dosahnout beze zmeny DataModel.php, pripadne jak na to?
Diky moc!
- Pavel Janda
- Člen | 977
@FJP V té verzi 4.1.1 (tuším) vyšly i nové styly. Takže jestli jsi s nimi nic nedělal, tak to bude třeba update.
@kedarus Už je na to issue a momentálně je to v milestone 4.2. Jelikož už jsi druhý, kdo se na to ptá, zkusím to stihnout tento víkend.
@Blujacker Kde je ten PR? :-o Zapřemýšlím. Udělám si testovací api, které bude vypadat tak, jak říkáš a prozkoumám možnosti.
- Pavel Janda
- Člen | 977
@EchoZulu Jelikož celý datagrid je jeden velký formulář, další formuláře v něm nejsou možné – specifikace html. Co bys tam chtěl přidat?
- Pavel Janda
- Člen | 977
@rumcais1 http://ublaboo.paveljanda.com/datagrid/column#… Hmmm, musíš to udělat asi přes ColumnText a odkaz v template neb custom renderer. Jeď je tím polem parametrů myšlena změna asociace klíč ⇒ hodnota dat položky.
- romiix.org
- Člen | 343
@PavelJanda Nie v <td>
, ale v detaile by sa
zobrazil nový grid.
Konkrétne: V hlavnom gride si nastavím zoznam cenových hladín a v detaile
sa mi zobrazí grid pre s pravidlami pre cenové hladiny. To je vlastne
riešiteľné cez vnorenú komponentu už teraz.
- Pavel Janda
- Člen | 977
@romiix.org Zas to naráží na to, že by se objevil formulář ve formuláři. Asi bude lepší udělat si nějaký gridík, který nebude obsahovat formulář (nebude mít filtr, změnu počtu položek na stránku apod) a ten používat v detailu.
- romiix.org
- Člen | 343
EchoZulu napsal(a):
Existuje možnost jak v detailu itemu zobrazit více formulářů, případně strom komponent s formuláři?
Používam na to toto.
- romiix.org
- Člen | 343
Pavel Janda napsal(a):
@romiix.org Zas to naráží na to, že by se objevil formulář ve formuláři. Asi bude lepší udělat si nějaký gridík, který nebude obsahovat formulář (nebude mít filtr, změnu počtu položek na stránku apod) a ten používat v detailu.
Tieto problémy form in form
by riešilo oddelenie formulárov
do vlastných logických celkov.
- filter
- počet položiek
- hromadné akcie
- add/edit row
Problém nastáva pri checkboxoch pri hromadných akciách. Toto by bolo riešiteľné asi iba cez JS – checkboxy by boli v riadkoch mimo formulára, ale nastavovali by sa nimi hidden inputy v samostatnom formuláre hromadných akcií, ktoré by sa aj odosielali.
To, že detail by aktuálne nemal obsahovať formulár, je reálne dosť veľký problém.
@PavelJanda Čo myslíš?
Editoval romiix.org (25. 5. 2016 10:16)
- Pavel Janda
- Člen | 977
@romiix.org Přesně proto, že existují hromadné akce, to nelze vyřešit jednoduše. A nechci to nějak očůrávat přes JS.
Možná by šla vytvořit nějaká továrnička, která by naplňovala form v detailu. Ale jak definovat tlačítka, která znamenají submit formuláře v detailu? Jak to má datargid poznat?
- _rasel^
- Člen | 59
Ahojte, mám zopár otázok:
- Viete mi prosím poradiť prečo sa mi v datagride pri hromadných akciách nezobrazí možnosť pre vybranú akciu a tlačidlo pre vykonanie? Skúšal som aj na inom projekte/prehliadačoch, či niekde nerobím nejakú chybu, ale neviem kde by mohol byť pes zakopaný…
- Ak sa edituje viacero riadkov v inline móde (viacero je ich otvorených na úpravu), tak po kliknutí na „Save“ na prvom riadku sa riadky ukladajú vždy od posledného.
- Je možné $container->setDefaults naplniť foreachom?
addInlineEdit je jednoduchý:
$grid->addInlineEdit()->onControlAdd[] = function($container) {
foreach ($this->stlpce as $stlpec) {
$container->addText($stlpec->column_name, '');
}
};
… ale vôbec netuším ako vložiť foreach do tohto, aby to fungovalo.
$grid->getInlineEdit()->onSetDefaults[] = function($container, $item) {
$container->setDefaults([
'id' => $item->id,
'name' => $item->name,
'inserted' => $item->inserted->format('j. n. Y'),
'link' => $item->name,
]);
};
Editoval _rasel^ (25. 5. 2016 15:48)
- Pavel Janda
- Člen | 977
@_rasel^
1, Protože máš něco blbě ve scriptech. Buď ti chybí netteForms.js, nebo
to načítáš pozdě, nebo něco v tom smyslu. Koukni se do konzole, jak je
červená..
2, Hodíš prosím issue na github?
3, Je. Použij v té anonymní funkci instanci datagridu a zeptej na se
všechny sloupce: DataGrid::getColumns()
.
- Pavel Janda
- Člen | 977
Nová verze – v4.2.0
- Bug fixes
- Malá inline editace může být též select (http://ublaboo.paveljanda.dev/datagrid/edit#…)
- Přidán event
InlineEdit::$onCustomRedraw
– pokud je v něm nějaký listener, sám user se postará o překrelení čeho chce (například celého gridu), jinak se překresluje jeden jediný řádek (http://ublaboo.paveljanda.com/datagrid/edit#…) - Přidána možnost povolit velkou inline editaci pouze některým řádkům (http://ublaboo.paveljanda.com/datagrid/row#…)
- Velká inline editace nyní nelze otevřít na více než jedné row
- Velkou inline editaci lze submitnout enterem
- Mart78
- Člen | 31
Mohl by mi někdo prosím poradit jak předat datagridu pole? V metodě která zpracovává formulář vygeneruji pole které má kolem 100 řádků, to chci poté vypsat datagridem v jiném pohledu. Zkoušel jsem předávat pomocí session, jako persistentní parametr, jako privátní parametr presenteru, ale vždy funguje maximální prvotní zobrazení, při snaze o seřazení gridem to píše že je pole nulové nebo nedefinované. Ani u té session to nejde, což nechápu.
/** @var Nette\Http\SessionSection */
private $seasonSection;
public function __construct(Nette\Http\Session $session)
{
$this->seasonSection = $session->getSection('mySection');
}
public function testFormSucceeded(Form $form, $values)
{
// vytvoreni pole
$this->seasonSection->items = $items;
$this->setView('list');
}
public function createComponentListGrid($name)
{
$grid = new DataGrid($this, $name);
$grid->setDataSource($this->seasonSection->items);
$grid->setPagination(false);
$grid->addColumnNumber('id', 'ID');
$grid->addColumnText('name', 'Name');
}