ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- igor.pocta
- Člen | 100
rkor napsal(a):
@igor.pocta
Podle mne to funguje, pokud definuješ filtry pro každý sloupec zvlášť:
…
\--
setFilterText jsem používal jako první. Pak jsem to předělal na addFilterText a to také nepomohlo.
- monty
- Člen | 66
Ahoj.
Dá se nějakým způsobem přes „setDataAttribute($key, $value)“ jako
value definovat hodnota konkrétní buňky?
Aby byl výsledek např.:
$grid->addAction("article", "", "changeState!")->setDataAttribute("state", "%column_state%");
<a ... data-state="hodnota_state">
Díky za objasnění :)
Editoval monty (6. 12. 2017 23:48)
- Pavel Janda
- Člen | 977
@monty Hmm, takhle pěkně jednoduše asi ne. Budeš muset použít vlastní template sloupce, případně vlastní renderer.
- monty
- Člen | 66
@PavelJanda
Pavle mám ještě jeden dotaz.
Narazil jsem na podobný problém, ale jelikož používám jako dataSource
Nette\Database\Context, neměl by to být tenhle případ.
Mám v tabulce dvě akce (mazání a změnu jednoho state).
V handle nastavím překreslení snippetu a ten, i když se správně zpracuje
a překreslí, vrací stále původní data.
V čem by mohl být problém?
Díky
Peťa
- emil54
- Člen | 19
Dobrý den,
předně musím vyseknout poklonu tvůrcům komponenty. Je to fakt úžasný
pomocník. I mne mile překvapilo, že základní filtry švihají i na dost
velkých datových objemech v tabulkách. Fakt dobrej počin, díky
za něj.
Potřebuju teď inline editovat sloupec datetime, ale když přidám třídu a nějaký základní JQuery kod pro datepicker, nefunguje to, poněvadž se form odesílá už v momentě, kdy kliknu mimo editované pole.
Předpokládám, že by mělo postačit pár řádek JS/JQuery a myslím, že už to někdo určitě řešil, tak jen abych zbytečně nevymýšlel kolo :)
- emil54
- Člen | 19
Chvilku jsem si s tím hrál. Je to dost prasečina, ale na dva kliky to pro moje osobní potřeby fuguje:
<script>
$(function () {
$('.datepicker').datepicker({
}).on('changeDate', function () {
$(this).click();
$(this).children('textarea').val($(this).data('datepicker').getFormattedDate('yyyy.mm.dd'));
$(this).children('textarea').blur();
});
});
</script>
- igor.pocta
- Člen | 100
Pavel Janda napsal(a):
@igor.pocta Používáš nejnovější assety i knihovnu
ublaboo/datagrid
?
Jj mám, čerstvě stáhnutou z boweru… :(
- Pavel Janda
- Člen | 977
@emil54
1, Děkujeme za poklonu. :)
2, Hmm, to je zajímavé téma. Ano, submit se volá při
on('blur')
eventu u inputů v inline editaci. Klidně můžeš
poslat PR, který přidá nastavítko, které to bude povolovat (by-default)
nebo zakazovat. :)
- emil54
- Člen | 19
Pavel Janda napsal(a):
Klidně můžeš poslat PR, který přidá nastavítko, které to bude povolovat (by-default) nebo zakazovat. :)
Nějakej přepínač by byl luxusní.
Pokud PR = pull request, tak do toho mne, ve vlastním zájmu radši netlač.
GIT téměř nepoužívám, jedeme už léta paranoidně na vlastním
Subversion. Nejspíš bych vám tam, při svojí stařecký demenci, něco
polámal… ;)
- raketoplan2005
- Člen | 147
Zdravím. Mám v datasource (Doctrine QB) atribut „nickname“ který je nullable a chtěl bych na něm umožnit filtrovat. Mám na tom sloupci vlastní render takový, že null hodnoty transformuji ve výpisu na „nevyplněno“ (+překladatelné do angličtiny).
Přidal jsem tedy setFilterText() což funguje správně. Problém mám ale s tím, že bych chtěl mít možnost vyfiltrovat samostatně i ty záznamy, které mají nickname null. Jde toho nějak docílit? Prázdný filtr je logicky „vše“.
$grid->addColumnText('nickname', 'header.nickname')
->setRenderer(
function (User $user) {
return $user->getNickname() ?? $this->translator->translate('value.noNickname');
}
)
->setFilterText();
Přemýšlel jsem že bych přidal třeba dva filtry, ale nepřišel jsem na to jak togo docílit aniž bych musel přidat další sloupec nad stejným atributem který neumím zcela skrýt (tzn. ne přes setDefaultHide()) a tak aby byl filtr vidět.
Díky moc za rady
Editoval raketoplan2005 (28. 12. 2017 14:28)
- Petr Parolek
- Člen | 455
Ahoj, poradil by mi někdo, jak mám udělat součet sloupců prosím?
<?php
$grid->setColumnsSummary(['cashIncome'], function($item, $column) {
if ($item->getType() == 'income' && $item->getPaymentType() == 'cash') {
return $item->getAmount();
}
});
$grid->setColumnsSummary(['cashExpense'], function($item, $column) {
if ($item->getType() == 'expense' && $item->getPaymentType() == 'cash') {
return $item->getAmount();
}
});
?>
nefunguje, asi může být jen jeden setColumnsSummary() .
Používám Doctrine ORM
Díky moc
Editoval ppar (31. 12. 2017 1:36)
- zoool
- Člen | 89
Ahoj dá se nějak lehce sečíst sloupec všech vyfiltrovaných řadku a
zobrazit dole.
Zkoušel jsem
$grid->addColumnText('price','price')->setRenderer(function($item){
return $this->helpers->formatPrice($this->helpers->getPriceTotal($item,'VAT'));
});
$grid->setColumnsSummary(['price']);
ale nějak to nejde stále to hlásí,že sloupec price neni definovaná.
Děkuji
- Petr Parolek
- Člen | 455
Ahoj, jak mám posím sečíst všechny čísla ve sloupci celkem, ne jenom součet zobrazených? Nejlépe přes SUM v SQL. Metoda setColumnsSummary() je fajn, ale sečte jen zobrazená čísla ve sloupci. Potřebuju ještě do toho přidat addColumnDateTime->setCondition()
Editoval ppar (7. 1. 2018 18:17)
- Petr Parolek
- Člen | 455
ppar napsal(a):
Ahoj, poradil by mi někdo, jak mám udělat součet sloupců prosím?
<?php $grid->setColumnsSummary(['cashIncome'], function($item, $column) { if ($item->getType() == 'income' && $item->getPaymentType() == 'cash') { return $item->getAmount(); } }); $grid->setColumnsSummary(['cashExpense'], function($item, $column) { if ($item->getType() == 'expense' && $item->getPaymentType() == 'cash') { return $item->getAmount(); } }); ?>
nefunguje, asi může být jen jeden setColumnsSummary() .
Používám Doctrine ORM
Díky moc
Vyřešeno:
<?php
$grid->setColumnsSummary(['cashIncome','cashExpense','bankTransferIncome','bankTransferExpense'], function($item, $column) {
return call_user_func([$item,"get" . ucfirst($column)]);
});
?>
- maraerben
- Člen | 1
Zdravím,
nepodařilo se někomu úspěšně přidat DateTimePicker
(GitHub) jako součást inline-editu pole v DataGridu?
Aktuálně vím pouze o přidání DatePicker
:
$grid->addInlineEdit()
->onControlAdd[] = function($container) {
$container->addText('name', '');
$container->addText('created', '')
->setAttribute('data-provide', 'datepicker')
->setAttribute('data-date-format', 'd. m. yyyy');
};
Potřeboval bych však vložit spolu s datem i čas.
Děkuji.
- theo
- Člen | 57
@PavelJanda Používání jsem narazil na takovýto problém:
používám DG jako běžný prvek na vyjádření vazeb, které má konkrétní
hodnota k dalším (například na kterých projektech pracuje zaměstnanec) a
používám při tom ToolbarButton jako tlačítko pro přidání další
položky (ostatně na to se vyloženě nabízí). Potíž je v tom, že mu
potřebuji předat nějaký parametr pro odkaz který takový ToolbarButton
reprezentuje (např. employee => 4
). V dokumentaci se píše
o tom, že toho lze dosáhnout pomocí volání
->setAttributes(['foo' => 'bar'])
, což ale nefunguje a po
konzultaci s dokumentací a kódem (ToolbarButton) je i jasné proč: tato metoda nastavuje
atributy odkazu, nikoliv parametry pro URL adresu (tzn. že v dokumentaci je
napsán nesmysl – viz. zde na konci stránky).
Takové pole v komponentě ToobarButton existuje (params
), ale
lze ho nastavit pouze v konstruktoru celé komponenty. Bohužel, při volání
konstruktoru ještě tento parametr neznám, (jasně, můžu to samozřejmě
přepsat tak, že si udělám komponentu a ToobarButton
přidám
až když už znám tento parametr), takže je to tím pádem docela problém.
Celé by to vyřešila jediná triviální metoda
addParams(['foo' => 'bar'])
v ToolbarButton
u:
function addParams(array $params)
{
$this->params = $this->params + $params;
}
Chápu to správně, nebo to lze i nějak jinak (podle kódu to moc nevypadá) a pokud ne, doplnil bys tam takovou metodu?
- Pavel Janda
- Člen | 977
@theo
0, Hodí :) , zrovna včera jsem ho použil, akorát o trochu složitější
s renderer callbackem
1, Dík za upozornění. Fixnu typu z „parameters“ na „attributes“
2, Můžeš poslat PR? :)
- Petr Parolek
- Člen | 455
Ahoj, jak mám prosím udělat v CSS nebo JS, aby mi při větším počtu řádků v gridu zůstala vidět hlavička tabulky s názvy sloupců? Díky moc.
Editoval ppar (11. 1. 2018 16:06)
- pavel_4
- Člen | 13
Ahoj, řeším problém a zatím jsem nenašel žádné řešení. Pokud si data seřadím podle nějakého sloupce, následně použiju hledání ve filtru, které pak smažu, tak se data seřadí zase podle defaultního řazení i když šipka u názvu slouce říká, že ne. Dá se tohle nějak vyřešit? Používám 5.x-dev.
- Petr Parolek
- Člen | 455
Nebo další nápad mám, jak to udělat, místo neustále viditelné hlavičky gridu udělat opakování hlavičky po třeba 20 záznamech, ale to taky nevím, jak na to. Poradil by mi někddo? @PavelJanda
- Pavel Janda
- Člen | 977
@ppar To první by bylo pěkné. Taková fixed hlavička jako w excelu nebo google spreadsheetu. Ale nejsem asi takový css mág, abych to během chvilky zbastlil. Ale taky by se mi to líbilo. :)
Opakování docílíš asi nejjednodušeji úpravou šablony.
- Petr Parolek
- Člen | 455
a co bych měl mít v latte šabloně při opakování hlavičky?
Editoval ppar (11. 1. 2018 20:44)
- Pavel Janda
- Člen | 977
@pavel_4 Popsané chování se mi nedaří replikovat. MOhl bys někam (např na github) hodit sandbox-like ukázku popsaného chování? Díky!
- pavel_4
- Člen | 13
@PavelJanda Dělá to i v examplu (https://ublaboo.org/datagrid/filter), zkus si seřadit hodnoty podle Name, hodnoty se správně seřadí. Potom vyhledat „0c“, správně to najde hodnoty, potom smazat to „0c“ a hodnoty budou seřazeny opět podle původního řazení. Po kliku na seřazení podle jména, nebo po refreshi stránky se to opět správně seřadí podle jména. Po aplikování filtru se prostě odstraní persistentní parametr sort.
- Petr Parolek
- Člen | 455
Vyřešeno:
{extends $original_template}
{block tbody}
<tbody n:snippet="tbody" {if $control->isSortable()}data-sortable data-sortable-url="{plink $control->getSortableHandler()}" data-sortable-parent-path="{$control->getSortableParentPath()}"{/}>
{snippetArea items}
{if $inlineAdd && $inlineAdd->isPositionTop()}
{include inlineAddRow, columns => $columns}
{/if}
{var $i = 0}
{foreach $rows as $row}
{if $i % 10 == 0 && $i != 0}
{include header}
{/if}
{var $item = $row->getItem()}
{if !isset($toggle_detail)}
{if $inlineEdit && $inlineEdit->getItemId() == $row->getId()}
{php $inlineEdit->onSetDefaults($filter['inline_edit'], $item); }
<tr data-id="{$row->getId()}" n:snippet="item-{$row->getId()}" n:class="$row->getControlClass()">
<td n:if="$hasGroupActions" class="col-checkbox"></td>
{foreach $columns as $key => $column}
{var $col = 'col-' . $key}
{var $td = $column->getElementForRender('td', $key, $row)}
{var $td->class[] = 'datagrid-inline-edit'}
{$td->startTag()|noescape}
{if isset($filter['inline_edit'][$key])}
{input $filter['inline_edit'][$key]}
{elseif $inlineEdit->showNonEditingColumns()}
{include column-value, column => $column, row => $row, key => $key}
{/if}
{$td->endTag()|noescape}
{/foreach}
<td class="col-action col-action-inline-edit">
{input $filter['inline_edit']['cancel'], class => 'btn btn-xs btn-danger'}
{input $filter['inline_edit']['submit'], class => 'btn btn-xs btn-primary'}
{input $filter['inline_edit']['_id']}
{input $filter['inline_edit']['_primary_where_column']}
</td>
</tr>
{else}
<tr data-id="{$row->getId()}" n:snippet="item-{$row->getId()}" n:class="$row->getControlClass()">
<td n:if="$hasGroupActions" class="col-checkbox">
{if $row->hasGroupAction()}
<input n:class="$control->useHappyComponents() ? 'happy gray-border' , primary" type="checkbox" data-check="{$control->getName()}" data-check-all-{$control->getName()|noescape} name="{$control->getName()|lower}_group_action_item[{$row->getId()}]">
{/if}
</td>
{foreach $columns as $key => $column}
{php $column = $row->applyColumnCallback($key, clone $column)}
{var $td = $column->getElementForRender('td', $key, $row)}
{$td->startTag()|noescape}
{include column-value, column => $column, row => $row, key => $key}
{$td->endTag()|noescape}
{/foreach}
<td n:if="$actions || $control->isSortable() || $items_detail || $inlineEdit || $inlineAdd" class="col-action">
{foreach $actions as $key => $action}
{if $row->hasAction($key)}
{if $action->hasTemplate()}
{include $action->getTemplate(), item => $item, (expand) $action->getTemplateVariables(), row => $row}
{else}
{$action->render($row)|noescape}
{/if}
{/if}
{/foreach}
<span class="handle-sort btn btn-xs btn-default" n:if="$control->isSortable()">
<i n:block = "icon-arrows-v" class="{$icon_prefix}arrows-v"></i>
</span>
{if $inlineEdit && $row->hasInlineEdit()}
{$inlineEdit->renderButton($row)|noescape}
{/if}
{if $items_detail && $items_detail->shouldBeRendered($row)}
{$items_detail->renderButton($row)|noescape}
{/if}
</td>
</tr>
{/if}
{/if}
{**
* Item detail
*}
{if $items_detail && $items_detail->shouldBeRendered($row)}
<tr class="row-item-detail item-detail-{$row->getId()}" n:snippet="item-{$row->getId()}-detail">
{if isset($toggle_detail) && $toggle_detail == $row->getId()}
{var $item_detail_params = ['item' => $item, '_form' => $filter] + $items_detail->getTemplateVariables()}
{if isset($filter['items_detail_form'])}
{var $item_detail_params['items_detail_form'] = $filter['items_detail_form']}
{/if}
{ifset #detail}
<td colspan="{$control->getColumnsCount()}">
<div class="item-detail-content">
{include #detail, (expand) $item_detail_params}
</div>
</td>
{elseif $items_detail}
<td colspan="{$control->getColumnsCount()}">
<div class="item-detail-content">
{if $items_detail->getType() == 'template'}
{include $items_detail->getTemplate(), (expand) $item_detail_params}
{else}
{$items_detail->render($item)|noescape}
{/if}
</div>
</td>
{/ifset}
{/if}
</tr>
<tr class="row-item-detail-helper"></tr>
{/if}
{php $i++}
{/foreach}
{if $inlineAdd && $inlineAdd->isPositionBottom()}
{include inlineAddRow, columns => $columns}
{/if}
<tr class="datagrid-row-columns-summary" n:if="!empty($rows) && ($columnsSummary || $control->hasSomeAggregationFunction())" n:snippet="summary">
<td n:if="$hasGroupActions" class="col-checkbox"></td>
{if $columnsSummary && $columnsSummary->someColumnsExist($columns)}
{include columnsSummary, columns => $columns}
{/if}
{if $control->hasSomeAggregationFunction()}
{include aggregationFunctions, columns => $columns}
{/if}
<td n:if="$actions || $control->isSortable() || $items_detail || $inlineEdit || $inlineAdd" class="col-action"></td>
</tr>
{block noItems}
<tr n:if="!$rows">
<td colspan="{$control->getColumnsCount()}">
{if $filter_active}
{='ublaboo_datagrid.no_item_found_reset'|translate} <a class="link ajax" n:href="resetFilter!">{='ublaboo_datagrid.here'|translate}</a>.
{else}
{='ublaboo_datagrid.no_item_found'|translate}
{/if}
</td>
</tr>
{/block}
{/snippetArea}
</tbody>
{/block}
Ale když tam mám:
{if $i % 10 == 0 && $i != 0}
{include header}
{/if}
přestane fungovat správně omezování počtu řádků přes dolní select box
EDIT
nahrál jsem ukázku na https://github.com/…der-datagrid
Editoval ppar (12. 1. 2018 13:27)
- Petr Parolek
- Člen | 455
tak jsem problém vyřešil:
<script type="text/javascript">
$('#frm-someGrid-filter-per_page').change(function() {
window.setTimeout('location.reload()', 300);
});
</script>
- pavel_4
- Člen | 13
@PavelJanda Fix je super, ale našel jsem podobný problém. Pokud seřadíš grid podle sloupce name, potom něco vyhledáš, je to ok. Jakmile ale potom přejdeš na jinou stránku a vrátíš se zpět (klikem v menu, ne přes tlačítko zpět v prohlížeči) a smažeš hledání, objeví se stejný problém (hodnoty nejsou seřazené i když záhlaví říká, že ano). Testnul jsem to na demu a chová se to stejně. Šlo by tohle prosím fixnout?
- Petr Parolek
- Člen | 455
@pitr82
já to kdysi vyřešil takhle:
<?php
...
$grid->addColumnText('title', 'Název')
->setTemplate(__DIR__ . '/templates/components/datagrid/grid.img.latte');
...
?>
v grid.img.latte:
<img src="/{$basePath}{$item->photo_url}" style="height: 100px;"> <a href="{plink Somw:showDetail $item->id}">{$item->title}</a>
Editoval ppar (15. 1. 2018 17:15)
- iNviNho
- Člen | 352
@PavelJanda Ahoj :) Chcel by som sa opýtať 2 veci:
- Čo sa týka Datagrid Tree View. Je možné ho zobraziť tak ako klasický datagrid(filtre, paginator…) s tým, že budem vidieť iba vľavo tú šipočku? Potrebujem iba jedno urovnove zanorenie.
- Možno netypický problém. 1 uroven sú data z tabuľky X a 2 uroven ked si rozkliknem sú data z tabulky Y. Čiže nie je to výpis z jednej tabuľky. Všetko funguje až pokiaľ nemám v 2 urovni rovnake ID ako v 1 urovni. Vtedy mi to datagrid prekresli a oba riadky vyzera identicky. Napadá ťa nejaky fix?:)
Ďakujem :)
- iNviNho
- Člen | 352
@PavelJanda ahoj :)
Chcel by som vylepšiť ublaboo datagrid a jeho tree view. Všimol som si,
že neobsahuje filtrovanie, sorting, paginator.
Kedže ho k aktuálnemu väčšiemu projektu potrebujeme ako soľ, rozhodol som
sa, že by som kľudne tieto feature implementoval a ak by to bolo úspešne
môžeme ho mergnuť do datagridu.
Chcel by som sa opýtať, prečo tam tieto funkcie nie sú? Nemyslím to kriticky, chcel by som iba vedieť či ste narazili na nejaké problémy, alebo issues, na ktoré sa nenašla odpoveď a preto to tam ešte nie je, alebo iba nebol čas?
Čiže missing: FILTERS, PAGINATOR, SORTING.
Bugs: pri rovnakych ID parent rows a child rows sa oba rovnako prekreslia a zobrazia sa vizuálne ako child rows. Rovnaké ID nastáva vtedy, ked mám napríklad parent z tabuľky Test Set a on môže mať 1:N Test Cases, ktoré vypisujem ako children.
Čo ty na to?
- Pavel Janda
- Člen | 977
@iNviNho
1, Proč to dosud nebylo implementováno: Asi to nikdo nepotřeboval. Rozhodně
ne já. :) Například kategorie e-shopů byly zanořeny do X úrovní a tedy se
vždy nevykreslovalo zas tak moc položek.
2, Implementace: Klidně ukaž, co máš a můžeme to tam přihodit, budu rád.
Udělejme to jako 3. druh šablony. Mohla by tedy existovat šablona pro velký
tabulkový grid, velký (paginator, sorting, filtering) tree-view grid a malý
tree-view grid.
3, Překreslení řádků se stejným ID: Njn, to mě ze začátku
nenapadlo – bug. V datagridu se jednoduše hledá element podle
[data-id="xyz"]
, což v případě, že máš víc položek se
stejným ID, znamená, že se najde to první z nich a to se překreslí.
Můžeš vymyslet robustnější postup. :)
- Pavel Janda
- Člen | 977
@H0w4rd DataGrid podporuje složitější agregace. Jako jediná featura datagridu není zdokumentovaná.
$grid->addAggregationFunction(
new Ublaboo\DataGrid\AggregationFunction\FunctionSum('price', IAggregationFunction::DATA_TYPE_FILTERED)
)
Druhým parameterm konstruktoru třídy FunctionSum
určuješ,
zda se mají brát v potaz data všechny, nebo jen vyfiltrované výsledky, a
nebo pouze jedna stránka.
Můžeš si s tím zkusit pohrát. Všechno je v traitě
Ublaboo\DataGrid\AggregationFunction\TDataGridAggregationFunction
.
FunctionSum
je jediná – ukázková – implementace interfacu
IAggregationFunction
. Můžeš si napsat své a pak je předat
datagridu.
Editoval Pavel Janda (22. 1. 2018 10:58)
- iNviNho
- Člen | 352
@PavelJanda Ahoj :) Podarilo sa mi všetko spojazdniť a sfunkčniť.
Troška to mám ešte customizované na náš systém a len na 2urovnové zanorenie. Cez víkend to vo voľnom čase doladím a skúsim pull request.
- Zakomponoval som tam aj možnosť zadať nadpis datagridu, čo povieš?
- Upravil som trocha aj štýlovanie datagridu
- momentálne v5.x je podľa mna bug COLUMN API getSortNext() ten sorting nefunguje správne a dá sa mi radiť iba ASC. Skopíroval som preto COLUMN API getSortNext() a už to pracuje správne
PS: Som asi blbec, ja som si clonol v5.x a nie master, aký veľký je to problém? :D
Editoval iNviNho (23. 1. 2018 10:13)
- Pavel Janda
- Člen | 977
@iNviNho Nejsi, v5.x
je aktuálně hlavní vývojová
větev. Master je částečně připraven pro nette 3.0. Až vyjde, vydám
verzi 6.0, kterou bude zastupovat master. A taky půjde do háje podpora
php 5.6.
Na ublaboo.org/datagrid to také nefunguje? (Tam jede poslední verze
z větve v5.x
).
- Petr Parolek
- Člen | 455
Pavel Janda napsal(a):
@H0w4rd DataGrid podporuje složitější agregace. Jako jediná featura datagridu není zdokumentovaná.
$grid->addAggregationFunction( new Ublaboo\DataGrid\AggregationFunction\FunctionSum('price', IAggregationFunction::DATA_TYPE_FILTERED) )
Druhým parameterm konstruktoru třídy
FunctionSum
určuješ, zda se mají brát v potaz data všechny, nebo jen vyfiltrované výsledky, a nebo pouze jedna stránka.Můžeš si s tím zkusit pohrát. Všechno je v traitě
Ublaboo\DataGrid\AggregationFunction\TDataGridAggregationFunction
.FunctionSum
je jediná – ukázková – implementace interfacuIAggregationFunction
. Můžeš si napsat své a pak je předat datagridu.
Díky @PavelJanda , tothle jsem hledal taky, jen moje otázka tu zapadla.
- Petr Parolek
- Člen | 455
@PavelJanda nechce mi fungovat:
<?php
$grid->addAggregationFunction(
new \Ublaboo\DataGrid\AggregationFunction\FunctionSum('bankTransferIncome', \Ublaboo\DataGrid\AggregationFunction\IAggregationFunction::DATA_TYPE_ALL)
);
?>
Php vrací vyjímku: ArgumentCountError
Too few arguments to function
Ublaboo\DataGrid\DataGrid::addAggregationFunction(), 1 passed in
app/components/Datagrids/CashBookControl.php on line 242 and exactly
2 expected
Editoval ppar (23. 1. 2018 13:29)
- Petr Parolek
- Člen | 455
Vyřešno napůl:
<?php
$grid->addAggregationFunction('bankTransferExpense',
new \Ublaboo\DataGrid\AggregationFunction\FunctionSum('amount', \Ublaboo\DataGrid\AggregationFunction\IAggregationFunction::DATA_TYPE_FILTERED)
);
?>
Musel jsem ještě smazat:
<?php
$grid->setColumnsSummary(['cashIncome', 'cashExpense', 'bankTransferIncome', 'bankTransferExpense', 'cashInTransitIncome', 'cashInTransitExpense', 'acceptableIncomeTax', 'acceptableExpenseTax', 'nonacceptableIncomeTax', 'nonacceptableExpenseTax'], function($item, $column) {
return call_user_func([$item, "get" . ucfirst($column)]);
})
?>
Jak mám udělat podmíněný součet prosím? Sloupce generuju přes podmínku, když je určitý typ záznamu, nedělám další sloupce v db. V entitě nemám cashIncome, cashExpense, bankTransferIncome, bankTransferExpense, cashInTransitIncome, cashInTransitExpense, acceptableIncomeTax, acceptableExpenseTax, nonacceptableIncomeTax, nonacceptableExpenseTax.
Teď mě napadl nástřel – přidat virtuální sloupec přes getter v entitě nebo ještě jinak?
Editoval ppar (23. 1. 2018 16:50)
- Pavel Janda
- Člen | 977
@ppar Jak jsem psal, můžeš si napsat vlastní implementaci
FunctionSum
. Inspiruje se tím. :)
- MW
- Člen | 626
Zdravím,
prosím, umí grid nebo jak by jste řešili SUM nad aliasovým sloupcem ?
Uvedu příklad.
V db mám
id|nazev|cena|dph
Sum grid umí, ale já si dopočítám sloupec s DPH např.:
$this->database->table('produkty')
->select('produkty.*, cena/CONCAT("1.",dph) AS cena_dph);
Potřebuji pak zobrazit v gridu vysoučtované oba sloupce.. bez i s DPH.
Díky