ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid

rkor
Člen | 62
+
0
-

@igor.pocta
Podle mne to funguje, pokud definuješ filtry pro každý sloupec zvlášť:

$grid->addColumnNumber('id', 'article.id')
	->setFilterText();
$grid->addColumnLink('title', 'article.title', 'Article:show', 'article.title')
	->setFilterText();

Editoval rkor (3. 12. 2017 20:18)

igor.pocta
Člen | 100
+
0
-

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.

Pavel Janda
Člen | 977
+
0
-

@igor.pocta Používáš nejnovější assety i knihovnu ublaboo/datagrid?

monty
Člen | 66
+
0
-

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

@monty Hmm, takhle pěkně jednoduše asi ne. Budeš muset použít vlastní template sloupce, případně vlastní renderer.

monty
Člen | 66
+
+1
-

Pavel Janda napsal(a):

@monty Hmm, takhle pěkně jednoduše asi ne. Budeš muset použít vlastní template sloupce, případně vlastní renderer.

@PavelJanda

Renderer funguje skvěle
Díky Pavle ;)

monty
Člen | 66
+
0
-

@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
+
+1
-

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

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

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

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

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… ;)

Pavel Janda
Člen | 977
+
0
-

@emil54 :D Ok. Zvládneš založit issue na GitHubu, aby se to neztratilo?

Čamo
Člen | 798
+
0
-

Môže mi niekto poradiť ako zachytím v javascripte prekreslenie datagridu konkrétne po resete filtrov? Mám v groupedActions datatimepicker a ten sa po resete prestane zobrazovať. Je ublaboo ajax napísaný nad nette ajaxom, že by sa dali použiť extensions?

raketoplan2005
Člen | 147
+
0
-

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

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

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

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

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

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

@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 ToolbarButtonu:

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

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

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

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

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

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

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

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

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

Pavel Janda
Člen | 977
+
0
-

@pavel_4 Pravda. Fixed ve v5.5.2.

pavel_4
Člen | 13
+
0
-

@PavelJanda Paráda, díky!

Petr Parolek
Člen | 455
+
0
-

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

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

@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?

pitr82
Člen | 121
+
0
-

Zdravím,
řešili jste někdo jak použít datagrid pro správu obrázku?
Jak nejlépe vytvořit sloupec s náhledem obrázku ?

Petr Parolek
Člen | 455
+
+2
-

@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;"> &nbsp; <a href="{plink Somw:showDetail $item->id}">{$item->title}</a>

Editoval ppar (15. 1. 2018 17:15)

Pavel Janda
Člen | 977
+
0
-

@pavel_4 Díky za report. Fixed v 5.5.4.

iNviNho
Člen | 352
+
0
-

@PavelJanda Ahoj :) Chcel by som sa opýtať 2 veci:

  1. Č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.
  2. 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
+
+1
-

@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
+
+1
-

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

H0w4rd
Člen | 96
+
0
-

Umi tenhle datagrid udelat sumu sloupce pro vsechny stranky?

Zkousel jsem

$grid->setColumnsSummary(...)

ale to scita hodnoty pouze na jedne strance. Hned prvni vec, co po mne bude zakaznik chtit, aby to scitalo hodnoty ze vsech stranek.

Pavel Janda
Člen | 977
+
0
-

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

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

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

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 interfacu IAggregationFunction. 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
+
0
-

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

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

@ppar Jak jsem psal, můžeš si napsat vlastní implementaci FunctionSum. Inspiruje se tím. :)

Petr Parolek
Člen | 455
+
0
-

díky, vyřešeno

MW
Člen | 626
+
0
-

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