ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Hlava
- Člen | 19
Ahoj, strávil jsem celou noc nad tím, proč mi submit u perPage je „button“ a nikoliv „input“. Pak nefunguje automatický submit v datagridu. Asi to nebude s datagridem jako takovým, ale netušíte někdo, proč se mi místo inputu kreslí button? S nette pracuji pár dnů, tak je možné, že mi uniká nějaká základní vlastnost. Díky za odpověď.
- radypala
- Člen | 6
Ahojte,
robim COUNT nad tabulkou, pricom zgroupujem podla acl_user_id a z neho si urobim aj count ako usage. Len pri strankovani mi vystrankovalo pocet riadkov bez groupu
$grid->setDataSource( $this->usageModel->getTable()
->select('report_comparator_usage.acl_user_id, COUNT(*) AS usage, acl_user.*')
->joinWhere('acl_user', '1=1')
->group('acl_user_id')
->order('acl_user_id ASC') );
Original kod v Datagride „API“:https://ublaboo.org/…aSource.html#…
Moja uprava:
/**
* Get count of data
* @return int
*/
public function getCount()
{
try {
$primary = $this->data_source->getPrimary();
} catch (\LogicException $e) {
return $this->data_source->count('*');
}
$dataSourceSqlBuilder = $this->data_source->getSqlBuilder();
if($dataSourceSqlBuilder->getGroup() != '') {
return $this->data_source->count(
'DISTINCT '.$dataSourceSqlBuilder->getGroup()
);
} else {
return $this->data_source->count(
$this->data_source->getName() . '.' . (is_array($primary) ? reset($primary) : $primary)
);
}
}
Zatial funguje, ale podla mna nie je najvhodnejsia, ako by to malo byt spravne (potom pripadne by som to commitol alebo niekto iny na github)?
- Hlava
- Člen | 19
V případě, že je DataSource Array a je zapnutý filter, tak se paginator nerefreshuje jak má.
je to nad aktuální verzí:
<?php
public function createComponentTester()
{
$grid = new DataGrid();
for ($i=0;$i<500;$i++) {
$data[$i]['id'] = $i;
$data[$i]['anything'] = rand(10,100);
}
$grid->setDataSource($data);
$grid->addColumnText('anything','FilterCol')->setFilterText();
return $grid;
}
?>
- igor.pocta
- Člen | 100
Ahoj,
nenapadá vás co je tohle za chybu? Místo komponenty s gridem mám Server Error. V místě, na které odkazuje laděnka je standardní kód na odkaz, který funguje v celé aplikaci.
- igor.pocta
- Člen | 100
sikulam napsal(a):
@igor.pocta Zkusil bych promazat cache, jinak mě nic nenapadá ;-)
To nepomůže, už jsem to zkoušel několikrát… :D
Editoval igor.pocta (22. 3. 2017 22:02)
- Petr Parolek
- Člen | 455
Ahoj, je prosím v datagidu funkce, po dvojkliku na řádek se zobrazí inline editace?
- jan-stanek
- Člen | 9
Ahoj,
funguje group action multiselect? V poslední době se mi v některých
prohlížečích občas nezobrazí a zmizel i z ukázek na webu.
- Pavel Janda
- Člen | 977
@jan-stanek Tam někdy byl? Asi ho můžeš použít, ale nebudou pro něj existovat styly, tuším.
- igor.pocta
- Člen | 100
Ahoj,
mám problém s refreshem řádku. Po vytvoření záznamu se mi neobnoví obsah datagridu ani se nic nepředává ve snippetu (kromě flashmessage, která je v onSave). Totožný kód mám i pro editaci, ta ale funguje dobře.
Napadává vás, kde je chybka?
Díky
$grid->addInlineAdd()->onControlAdd[] = function ($container) {
$container->addSelect('investment', '', $this->investmentFacade->getInvestmentList());
$container->addSelect('plant', '', $this->employeeFacade->getPlantsList());
$container->addText('title', '');
$container->addText('invoiceNr', '');
$container->addText('deliveryNote', '');
$container->addSelect('currency', '', ["CZK" => "Kč", "EUR" => "Euro"]);
};
$grid->getInlineAdd()->onSetDefaults[] = function ($container) {
/** @var Entry $entry */
$container->setDefaults([
'title' => (new \DateTime())->format("d.m.y") . " - ",
'currency' => 'CZK'
]);
};
$grid->getInlineAdd()->onSubmit[] = function ($values) {
// Uložení nového příjmu
$entry = new Entry;
try {
$this->entryFacade->saveEntryForm($entry, $values);
$this->onSave($this, $entry);
} catch (ORMException $e) {
$this->onException($this, $e);
}
};
- Pavel Janda
- Člen | 977
@igor.pocta Zkus v tom
$grid->getInlineAdd()->onSubmit[]
refreshnout grid
($this['grid']->redrawControl))
).
- igor.pocta
- Člen | 100
Pavel Janda napsal(a):
@igor.pocta Zkus v tom
$grid->getInlineAdd()->onSubmit[]
refreshnout grid ($this['grid']->redrawControl))
).
Takhle to funguje. Chceš to do issue? Když v inline-edit to funguje a v inline-add ne? Nebo je to moje chybka?
- jan-stanek
- Člen | 9
@PavelJanda Díky za vrácení příkladu, chyba tedy bude někde u mne.
EDIT: Vypadá to jako by se u něj jen nezrušilo
display: none;
, pokud jej ručně odstraním, zbytek už
funguje.
EDIT2: Špatně jsem se díval, příklad je tam celou dobu, jen není na stránce group-action, ale overview.
EDIT3: Tak to asi bylo špatným pořadím javascriptů, pořád to ale jde jen ve firefoxu…
Editoval jan-stanek (29. 3. 2017 0:49)
- jan-stanek
- Člen | 9
@PavelJanda Vypadá to, že vše funguje, pokud upravím tuto část:
$(this).on('loaded.bs.select', function(e) {
$(this).parent().attr('style', 'display:none;');
return $(this).parent().find('.hidden').removeClass('hidden').addClass('btn-default');
});
return $(this).on('rendered.bs.select', function(e) {
return $(this).parent().attr('id', id);
});
Takto:
return $(this).on('loaded.bs.select', function(e) {
$(this).parent().attr('style', 'display:none;');
$(this).parent().attr('id', id);
return $(this).parent().find('.hidden').removeClass('hidden').addClass('btn-default');
});
Editoval jan-stanek (30. 3. 2017 1:19)
- Blujacker
- Člen | 89
@PavelJanda
Ahoj,
da se nejak v addAction predat cely row? Router prijima parameter
$article
, kteremu normalne predavam parameter jako
<?php
{foreach $modelArticle->getAllArticles() as $article}
<a n:href="view, article => $article>...</a>
{/foreach}
getAllArticles vraci dibi->query('SELECT * from articles')->fetchAll()
?>
Lze neceho podobneho docilit v datagridu? Potreboval bych neco jako:
<?php
$grid->addAction('view', 'View', ':Article:view', ['article' => $row]);
?>
Diky!
- chap
- Člen | 81
Ahoj, je prosím nějak jednoduše možné ovlivnit zda se zobrazí statusColumn jen při splnění podmínky (obdoba allowRowsAction). Chtěl bych v tabulce mít možnost volit zda se zobrazí jen v některých řádcích. Nebo ještě lepší, pokud by byla možnost ovlivňovat položky v selectu na základě vlastností řádku (např. pro záznamy, které mají nějak definovaný stavový diagram).
- Pavel Janda
- Člen | 977
@chap Asi by mělo fungovat toto:
Column::setRendererOnCondition()
. Pokud je splněna podmínka,
použije se renderer callback, jinak defaultní akce, tedy vyrenderování
ColumnStatus
.
- Pavel Janda
- Člen | 977
@chap Od takovýchto složitějších výpočtů je interface
Ublaboo\DataGrid\AggregationFunction\IAggregationFunction
. Tím si
vytvoříš vlastní sql cally, které se pak zobrazí na výstupu. Jako
příklad nechť poslouží tato
třída FunctionSum.
- Pavel Janda
- Člen | 977
@chap Díky za pull requesty!
:D Neumí spousty věcí, které jsem zatím nepotřeboval..
- Petr Parolek
- Člen | 455
jean_cz napsal(a):
Ahoj,
řeším problém s metodou addAction. Nepřišel jsem na způsob jak předat „action“ s jinými parametry než jsou data ve sloupcích.
Dejme tomu, že chceme zavolat action „print“ z presenteru „Printer“, která přijíma dva parametry id a velikost stránky – Printer:print(12, self::PAGE_SIZE) kde druhý parametr je konstanta a tedy se v datasource nenachází.
Nevěděl by někdo?
Díky.
Pavel Janda napsal(a):
@jean_cz
Action
zatím neumí přidání „externích“ parametrů. Ale můžeme to přidat, jelikož se po tom ptal i někdo jiný. Mohl bys založit issue pls?
Ahoj, rád bych se zeptal, jestli je tato funkce přidaná do datagridu. Díky moc.
- Petr Parolek
- Člen | 455
Pavel Janda napsal(a):
@rumcais1
$grid->addAction('edit', '', 'Users:edit', ['userId' => 'id', 'deleted'])
:)
Nakonec vyřešeno přes správně nastavený čtvrtý parametr metody addAction. Díky všem-
- kralik
- Člen | 230
Ahoj,
měl bych prosbičku k super DG.
Je možné při např. handleDelPolozka nějak provést RESET filtru na
gridem?
Pokus si totiž vymažu poslední položku ve tak obdržím chybu, že položka v seznamu pro select option není.
De facto filtr zůstane zapnutý, potřeboval bych jej resetoval?
Případně dělám chybu v interpretaci DG když si hodnoty pro filtr nahrávám z DB takto. Případně jak to dělat jinak?
<?php
...
$grid->addFilterSelect('sektorcz', 'Sektor', $data['sek'],'sektor.name');
...
?>
Takto to funguje dokud není ve filtru poslední položka a tu se rozhodnu smazat, poté obdržím chybu.
Moc díky
Tom
- Pavel Janda
- Člen | 977
@kralik To máš pěkně provzané všechno.. Zkus v tom handleru odebrat filtr, přidat filtr (již s méně položkami) a překreslit grid.
- kralik
- Člen | 230
mohl bys mě trochu více nakopnout?
Přemýšlel jsem, že bych v handle odebral filtr, při
$this->redirect();
Ideální by bylo zjistit,při handlu na smazání, zda je vyfiltrovaná jedna
položka a kdyžtak odebrat celý filtr.
Myslíš, že to nějak jde?
Díky
Pavel Janda napsal(a):
@kralik To máš pěkně provzané všechno.. Zkus v tom handleru odebrat filtr, přidat filtr (již s méně položkami) a překreslit grid.
Editoval kralik (18. 4. 2017 14:11)
- Pavel Janda
- Člen | 977
@kralik Já jsem myslel, že by se to celé provedlo v jednom ajax callu. Zkus pls popsat, jak to máš provázané (řádky tabulky vs položky filtru).
- kralik
- Člen | 230
Pavel Janda napsal(a):
@kralik Já jsem myslel, že by se to celé provedlo v jednom ajax callu. Zkus pls popsat, jak to máš provázané (řádky tabulky vs položky filtru).
Ahoj,
dal jsem část zdrojového kódu zde na pastebin
Prosím mrkni na to.
Moc díky
- skyfall174
- Člen | 5
Dobrý den,
narazil jsem na problem, že když udelam redirect např
<?php
...
...
$this->redirect("this", ["some_param"=>"some_val"]);
?>
pak, pokud na stránce je datagrid, on automatický přesměruje na stránku
a smaže v url ?some_param=some_val a udelá redirect na
stranku bez GET parametru.
Nevite jak by se dalo zakazat automatický přesměrování v datagridu?
Předem děkuji.
- Pavel Janda
- Člen | 977
@skyfall174 Prosím, pročti si celou diskuzi, už se to řešilo hodněkrát. Jelikož máš k dispozici komponentu, která chce měnit url stránky, musíš to nastavit jako persistentní parametr.
- Pavel Janda
- Člen | 977
@kralik Je to tak nějak, jak jsem myslel. Zkus v handle metodě odstranit filtr a nastavit ho znovu s aktuálními daty. Potom datagrid překreslit.
- kralik
- Člen | 230
Pavel Janda napsal(a):
@kralik Je to tak nějak, jak jsem myslel. Zkus v handle metodě odstranit filtr a nastavit ho znovu s aktuálními daty. Potom datagrid překreslit.
Ano to bych přesně chtěl.
Jenže jsem bohužel nepřišel na to jak?
Mohl bys alespoň nastínit jak a nebo odkázat na část dokumentace?
Moc díky
- Pavel Janda
- Člen | 977
@kralik
1, Klidně můžeš přistupoval ke gridu jako k normální komponentě (je to
asi jednodušší): $this['grid']
.
2, Se koukni do kódu, tě nekousne. :)
DataGrid::getFilter($key)
.
- kralik
- Člen | 230
Pavel Janda napsal(a):
@kralik
1, Klidně můžeš přistupoval ke gridu jako k normální komponentě (je to asi jednodušší):$this['grid']
.
2, Se koukni do kódu, tě nekousne. :)DataGrid::getFilter($key)
.
Ahoj,
stále se nějak nemohu dostat na to abych vymazat(resetoval) filtr.
zkouším to takto
<?php
/* HANDLE */
..
// zkouším toto
$this['gridLinky']->removeFilter('sektorcz');
// nebo toto
$this['gridLinky']->setFilter(array('sektorcz' => ''));
$this->redirect('linky');
?>
Bohužel stejně nemohu vysněného efektu docílit.
V laděnce vidím toto:
<?php
...\www\bubaci\vendor\others\Ublaboo\src\DataGrid.php:1457 source Ublaboo\DataGrid\DataGrid->setFilterContainerDefaults(arguments)
$container
Nette\Forms\Container #01
$values
array (2)
linkacz => ""
sektorcz => "IT"
?>
Určitě to dělám špatně. Bohužel nevím co.
Moc díky
- Pavel Janda
- Člen | 977
@kralik Ještě ti možná zůstaly vyfiltrované hodnoty v session.
Je tam na to nastavovátko, něco jako
DataGrid::$strict_session_values
. Zkus pohledat. Kontroluje hodnoty
filtru a potom podle nastavovátka buď vyhodí exception nebo
nedělá nic.
- kralik
- Člen | 230
Pavel Janda napsal(a):
@kralik Ještě ti možná zůstaly vyfiltrované hodnoty v session. Je tam na to nastavovátko, něco jako
DataGrid::$strict_session_values
. Zkus pohledat. Kontroluje hodnoty filtru a potom podle nastavovátka buď vyhodí exception nebo nedělá nic.
Filtr zůstaval nastavený v session.
Takto smažu filtr v session.
<?php
...
/* V HANDLE linkaDel */
$this['gridLinky']->deleteSesssionData('sektorcz');
...
?>
Poté již grid chybu nehlásí.
Ještě mě napadá je možné získat v handlu informace z gridu kolik je
vyfiltrovaných položek?
Kdyby ano, tak bych si nastavil, že smažu data z Session pouze pokud pří
použití filtru jen jedna položka.
Díky
- Pavel Janda
- Člen | 977
@kralik Spíš bych být tebou změnil ty public static
$strict_session_filter_values
na false
. Ať se o to
nemusíš starat.
- nocturne32
- Člen | 21
Zdravím.
Procházel jsem si tu příspěvky i dokumentaci, ale pořád mi to není
jasné.
Rád bych se zeptal, jestli jde v ItemsDetail udělat nový výběr podle ID
záznamu. Případně jak by to bylo vypadalo? Dokázal jsem vybrat pouze podle
staticky daného ID.
- Pavel Janda
- Člen | 977
@nocturne32 Úplně nerozumím tomu, co myslíš tím novým výběrem. Můžeš popsat trošku víc polopatě tvůj myšlenkový pochod?