Grido – DataGrid pro Nette
- Jan Mikeš
- Člen | 771
Nefunguje mi checkbox filter, zkouseno na sandboxu bez modifikaci, testovani s nasledujicim kodem v sandboxu (array datasource):
$grid->addFilterCheck("ok", "Ok?"); // NEFUNGUJE
$grid->addFilterSelect("ok", "Ok?", array("" => "", 0 => "NOK", 1 => "OK")); // FUNGUJE
Url se meni v zavislosti na filtru, ale data jsou stale stejna.
Url pri pouziti select filtru i check filtru je shoda → zde problem neni,
pokud je check filter, data se proste nefiltruji
- koprkuba
- Člen | 24
Hi I am looking for someone who will help me to implement Issue #70 I am struggling with dibi and Doctrine implementation. Please contact me on my mail (you can find it on my GitHub profile) or comment on my fork I would like to have this done and be able to test it. Then I will add some more features in javascript. Now inline edit works fine with Nette\Database. But it's not properly tested so it is more like alpha release.
- rumcais1
- Člen | 80
o5 napsal(a):
@rumcais1: na to už existuje nějakou chvíli issue, ovšem stojí to na tom, že jsem nezjistil jak se to dělá v Doctrine.. Jestli znáš Doctrine, tak to tam doplň.
No já teď válčím z mssql2005 a fluent dibi. Ale to je kapitola sama pro sebe přepisuji dibi driver i grido. Jen mi zaujalo tohle. Že to nemůže fungovat i jinde. Ale do „issue“ jsem nekoukal. Díky
- Climber007
- Člen | 105
Potřeboval bych Grido jako znovupoužitelnou komponentu injektovanou do presenteru viz. planette. Bohužel pokud ho takto připojím přestane fungovat zápis do URL? Předpokládám, že když Grido potřebuje v konstruktoru presenter a já mu předám onu obalovací komponentu, ztrácí se komunikace s URL tady. Jak to ale opravit, aby Grido vidělo až na presenter? Díky za info!
- tom
- Člen | 171
Jakým způsobem řešíte button pro vkládání nových záznamů? Možná jsem to přehlídl, ale nikde to nevidím. Samozřejmě můžu dát někam mimo grid link na stránku s formulářem pro vložení, ale zajímalo by mě, jestli to nějak řeší Grido – třeba přes odkaz v patičce nebo něco podobné … Díky
- o5
- Člen | 416
tom napsal(a):
Jakým způsobem řešíte button pro vkládání nových záznamů?
Tohle si řeší každý sám. Zkus se podívat na šablony nějakých placených administrací, jak si to tam řeší. Neviděl jsem žádnou, která by to měla přidané k tabulce, která se stará o výpis. A z toho důvodu ani žádnou metodu $grid->addToolbarButton() jak tu někdo kdysi navhroval Grido nemá a ani v dohledné době mít nebude.
Oli napsal(a):
Připravuje se verze, která bude obsahovat inline editaci, tam by to mohlo byt reseno.
To tam opravdu řešeno nebude.
- Pipaslot
- Člen | 19
Mám zajímavý postřeh při použití Doctrine.
Jen pro představu jsem si udělal továrnu:
protected function createComponentUserGrid($name)
{
$model = $this->context->security->user->createQueryBuilder("u");
$grid = new DNweb\Component\Grid($this, $name);
$grid->setModel($model);
$grid->addColumnText("firstname", "Firstname")
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText("surname", "Surname")
->setFilterText()
->setSuggestion();
/*
Další kód pro nastavení datagridu
*/
$that=$this;
$grid->setOperation(array("smazat"), function($op, $ids)use($that){
foreach($ids as $id)
{
$that->handleRemoveUser($id);
}
});
return $grid;
}
Pozn: Primárním klíčem entit je sloupec o názvu ‚id‘.
Problém nastane, když teď provedu hromadnou akci datagridu na smazání
některých záznamů. Pokud přímo na doctríně nepoužiji po detachování a
flushi entit manageru taky $em->clear(); , tak se datagrid pokusí znovu
vykreslit všechny entity, jenže u těch právě smazaných doktrína
nastavila primární klíč na NULL ale stále v systému existují. Takže
při vykreslování a pokusu získat primární klíč záznamu dojde
k neočekávané nezachycené chybě v třídě: ArrayObjectAccessor
public static function getProperty($object, $name)
{
if (is_array($object)) {
if (!array_key_exists($name, $object)) {
throw new PropertyAccessorException("Property with name '$name' does not exists in datasource.");
}
return $object[$name];
} elseif (is_object($object)) {
/* Vrátí NULL */
return $object->$name;
} else {
throw new \InvalidArgumentException('Please implement your own property accessor.');
}
}
Následně dojde ke selhání v šabloně při vykresolvání:
{foreach $data as $row}
{? $checkbox = $operation
? $form[Operation::ID][/* Zde jest chyba oným vráceným NULL*/$propertyAccessor->getProperty($row, $control->getComponent(Operation::ID)->getPrimaryKey())]
: NULL;
$tr = $control->getRowPrototype($row);
$tr->class[] = $checkbox && $checkbox->getValue()
? 'selected'
: NULL;
}
{$tr->startTag()|noescape}
<td n:if="$checkbox" class="checker">
{$checkbox->getControl()}
</td>
{foreach $columns as $column}
{?$td = $column->getCellPrototype($row)}
{$td->startTag()|noescape}
{if is_string($column->getCustomRender()) && $column->getCustomRenderVariables()}
{include $column->getCustomRender() control => $control, presenter => $control->getPresenter(), item => $row, column => $column, (expand) $column->getCustomRenderVariables()}
{elseif is_string($column->getCustomRender())}
{include $column->getCustomRender() control => $control, presenter => $control->getPresenter(), item => $row, column => $column}
{else}
{$column->render($row)|noescape}
{/if}
{$td->endTag()|noescape}
{/foreach}
<td n:if="$showActionsColumn" class="actions center">
{foreach $actions as $action}
{control $action $row}
{/foreach}
{if !$actions}
{/if}
</td>
{$tr->endTag()|noescape}
{/foreach}
Dá se tedy fixnout:
(foreach $data as $row)
$primaryKey = $propertyAccessor->getProperty($row, $control->getComponent(Operation::ID)->getPrimaryKey());
if(!$primaryKey)continue;
$checkbox = $operation ? $form[Operation::ID][$primaryKey] : NULL;
/* atd */
Editoval Pipaslot (31. 3. 2014 16:03)
- Oli
- Člen | 1215
Nevím jestli je to bug přímo giro, ale mam chybu v actionEvent confirm pokud je zpracováván ajaxem (nette.ajax.js).
Pokud vypnu ajaxaci, tak to funguje v pořádku. Pokud event nechám zpracovat ajaxem, tak se prvně provede ten ajax a až pak se mě to ptá, jestli teda chci ten event provést nebo ne.
Doufám teda, že to nepoužívám špatně.
$grid->addActionEvent('remove', 'Odstranit', function($item, \Grido\Components\Actions\Event $event){
$this->articleFacade->getArticleModel()->delete($item);
$event->grid->reload();
})
->setIcon('remove')
->setConfirm(function($item) {
return "Opravdu chcete odstranit položku {$item->title}?";
});
->getElementPrototype()->class[] = 'ajax';
Je to bug, nebo nějakej tip jak to fixnout?
- Jiří Nápravník
- Člen | 710
Je možné na action nějak nabindovat, aby šlo přes ajax. Když tam dám class ajax, jako nette.ajax vyžaduje, tak se to stejně provede přes „reload“. Problém je nejspíše tady Protože tam se podle mě odbindují všechny clicky a pak se nabinduje jen případný confirm.
- o5
- Člen | 416
OMG! Chtělo by to JS testy, nechce je někdo napsat? :D
@Jiří Nápravník: Zkus to takto (psáno z hlavy)
initActions: function()
{
var that = this;
$('.actions a', this.$table)
.off('click.grido')
.on('click.grido', function(event) {
var hasConfirm = $(this).data('grido-confirm');
if (hasConfirm) {
$(this).off('click.nette');
if (confirm(hasConfirm) && $(this).hasClass('ajax') && that.ajax) {
that.ajax.doRequest(this.href);
event.preventDefault();
event.stopImmediatePropagation();
} else {
event.preventDefault();
event.stopImmediatePropagation();
}
}
});
}
Editoval o5 (2. 4. 2014 0:58)
- Climber007
- Člen | 105
Chci se jen připomenout, kde by mohl být zakopaný pes.
Nedošlo mi, že URL je upravovaná přes JS. Nicméně Pokud je Grido jako komponenta v presenteru, vše jede v pohodě a když ji schovám do komponenty, kterou injektuji, URL nechodí.
Climber007 napsal(a):
Potřeboval bych Grido jako znovupoužitelnou komponentu injektovanou do presenteru viz. planette. Bohužel pokud ho takto připojím přestane fungovat zápis do URL? Předpokládám, že když Grido potřebuje v konstruktoru presenter a já mu předám onu obalovací komponentu, ztrácí se komunikace s URL tady. Jak to ale opravit, aby Grido vidělo až na presenter? Díky za info!
Editoval Climber007 (2. 4. 2014 1:12)
- Climber007
- Člen | 105
Myslel jsem, že všechno co je za hashem je tam předáváno přes JS. V tom případě když nepředám rodiče hned do konstruktoru, tak se URL ani nehne. Resp. rodič je obalovací komponenta nikoliv presenter.
o5 napsal(a):
@Climber007: Jak si myslel to upravovaná přes JS? Jediný co se tam při ajaxu děje je tohle (nahrazení čtyř znaků)
Editoval Climber007 (2. 4. 2014 7:54)
- o5
- Člen | 416
Climber007 napsal(a):
Myslel jsem, že všechno co je za hashem je tam předáváno přes JS. V tom případě když nepředám rodiče hned do konstruktoru, tak se URL ani nehne. Resp. rodič je obalovací komponenta nikoliv presenter.
A vracíš vůbec dole v továrně objekt Grido, když nepředáváš rodiče přes konstuktor?
Editoval o5 (2. 4. 2014 10:53)
- Climber007
- Člen | 105
o5 napsal(a):
Climber007 napsal(a):
Myslel jsem, že všechno co je za hashem je tam předáváno přes JS. V tom případě když nepředám rodiče hned do konstruktoru, tak se URL ani nehne. Resp. rodič je obalovací komponenta nikoliv presenter.
A vracíš vůbec dole v továrně objekt Grido, když nepředáváš rodiče přes konstuktor?
Nevracel jsem, ale i když ho vrátím, URL se nemění.
Jen abychom si rozuměli, komponentu mám takto:
class GridControl extends ...
{
protected function createComponentGrido($name)
{
$grid = new \Grido\Grid($this, $name);
...
return $grid;
}
}
A pracuju s ní viz. planette.
- sasule
- Člen | 18
Ahoj,
kdosi tady chtěl (nedávno) podporu pro MultiSelect selectionBox. Včera jsem
ji taky potřeboval, takže se můžete mrknout na tento commit
a třeba použít. (Trochu je jiné odsazování NetBeans, ale snad to moc
nevadí)
Závislost je na tomto pluginu (a bootstrap 3) a do client-side jsem přidal i grido.ext, kde je multiselect zapojen.
Na bootstrap 2.3.2 nějak nechce chodit událost zavření dropdown-menu…
Použití je:
<?php
$grid->addColumn...(...)->setFilterMultiSelect('multiselect', 'Název', $items);
?>
Je to jen taková rychlovka, ale třeba to někomu k něčemu bude :-)
Editoval sasule (3. 4. 2014 9:25)
- Climber007
- Člen | 105
o5 napsal(a):
@Climber007: budeš to muset někam celý někam nahrát, protože takhle mě nic nenapadá
Měl by ses v tom hned vyznat.
Editoval Climber007 (3. 4. 2014 12:51)
- kolsi
- Člen | 131
sasule napsal(a):
Ahoj,
kdosi tady chtěl (nedávno) podporu pro MultiSelect selectionBox. Včera jsem ji taky potřeboval, takže se můžete mrknout na tento commit a třeba použít. (Trochu je jiné odsazování NetBeans, ale snad to moc nevadí)Závislost je na tomto pluginu (a bootstrap 3) a do client-side jsem přidal i grido.ext, kde je multiselect zapojen.
Na bootstrap 2.3.2 nějak nechce chodit událost zavření dropdown-menu…
Použití je:
<?php $grid->addColumn...(...)->setFilterMultiSelect('multiselect', 'Název', $items); ?>
Je to jen taková rychlovka, ale třeba to někomu k něčemu bude :-)
Výborně, zrovna jsem se chtěl zeptat, jestli jde nějak jednoduše udělat MultiSelect filter :-) jenom koukám, že to nefunguje pro ArraySource, tak se musím podívat, jak to vlastně funguje :)
- sasule
- Člen | 18
kolsi napsal(a):
Výborně, zrovna jsem se chtěl zeptat, jestli jde nějak jednoduše udělat MultiSelect filter :-) jenom koukám, že to nefunguje pro ArraySource, tak se musím podívat, jak to vlastně funguje :)
ArraySource prověřím jak bude chvilka – sám ArraySource nevyužívám, prioritou pro mě bylo Doctrine a Nette\Database.
Editoval sasule (4. 4. 2014 20:24)
- verex
- Člen | 12
Koukal jsem do sandboxu, jak je řešeno zobrazení dat z joinovaných
tabulek.
Je tam použito customRendereru
<?php
$renderer = function($row) {
return $row->contact->firstName;
};
$grid->addColumnText('firstName', 'Jméno')
->setSortable()
->setColumn('contact.firstName')
->setCustomRender($renderer)
->setCustomRenderExport($renderer)
->setFilterText()
->setSuggestion($renderer);
?>
Napadlo mě, zda by nebylo lepší použít tečkové notace a sloupec definovat takto:
<?php
$grid->addColumnText('firstName2', 'Jméno')
->setSortable()
->setColumn('contact.firstName')
->setFilterText();
?>
A nálzežitě k tomu upravit ArrayObjectAccessor->getProperty, kde v místě zpracování objektu, projít tečkovou notaci a zanořit se do subobjektů:
<?php
public static function getProperty($object, $name) {
{...
} elseif (is_object($object)) {
/* Pridana cast kodu */
if (\Nette\Utils\Strings::contains($name, '.')) {
$arNames = preg_split('|\.|', $name);
$obj = $object;
foreach ($arNames as $item) {
if (is_object($obj)) {
$obj = $obj->$item;
}
}
return $obj;
}
/* /Pridana cast kodu */
return $object->$name;
} ...
}
?>
Určitě to není dokonalý a nevím jak to ovlivní jiné typy DataSource,
mě to zatím posloužilo a přijde mi definice sloupce takto přímější a
kratší.
Používám NDB a Grido 1.0.6
- Oli
- Člen | 1215
@verex: to vypadá doře. Zkus poslat pull request ;-)
Měl bych pár dotazů:
- Jde nějak zjistit v setIcon nějaká informace z databáze? Potřeboval
bych tlačítko pro funkci true/false. To není problém. K tomu bych ale
potřeboval aby se ikonka zobrazovala podle té hodnoty (např:
thumbs-up/thumbs-down). Jde to nějak? Pokud to zatím nejde, tak bych to
dodělal, ale potřeboval bych vědět jak dostanu
$item
do případné anonymní funkce uvnitř té setIcon. Nebo jak se tomu aspoň nadává. Dost mě to zajímalo, ale ani nevím pod jakým názvem to mám hledat. - tohle je asi takovej dost noobovskej dotaz. Jak plníte data pro select filter z databáze? Umím to naplnit tak aby byla vždy vybraná první hodnota. Pokud chci nějakej prompt, tak to zmarguju s ['' ⇒ ''], ale to mě rozhodí inexy toho druhýho pole. Pokud jen přidám nazačátek 0, tak to defaultně hledá s parametrem 0 a tudíž to nic nenajde.
Díky ;-)
- o5
- Člen | 416
@Oli:
ad 1: koukal si na ArraySource example?
ad 2: co třeba takto?
$items = ['' => ''] + $this->getList()->fetchPairs($key, $value)
Editoval o5 (10. 4. 2014 17:01)
- verex
- Člen | 12
přišel jsem na jeden námět jak vykreslovat actions
Trochu jsem se tu ztrácel v jejich definici a lámal si hlavu jak lépe
řešit disable a přidání ajax do class a jak mít větší kontrolu nad
vykreslením až mě napadlo to udělat takto:
<?php
...
$grid->addActionHref('acountGridActions', '')
->setCustomRender($this->acountGridActions());
}
private function acountGridActions() {
return function ($item, Nette\Utils\Html $el) {
$tpl = $this->createTemplate();
$tpl->setFile(__DIR__ . '/../templates/acount/acountGridActions.latte');
$tpl->acount = $item;
// tahle cast resi renderovani pri ajax requestu / bez ni se render cykli
$tmp = $this->snippetMode;
$this->snippetMode = false;
$html = $tpl->__toString();
$this->snippetMode = $tmp;
return $tpl->render();
};
}
?>
No a v té šabloně mám k dispozici vše důležité.
$user pro kontrolu oprávnění
$acount pro přístup k právě zobrazované řádce
$el tam nepotřebuji – html mi vytvoří šablona a je to obsah jednoho td
v tabulce gridu
V gridu vlastně vyvářím fiktivní action, kterou pak ani nevykreslím. Takže by se možná hodilo přidat do gridu actionsCustomRenderer callback s jedním parametrem $row a nebo možná rovnou actionsTemplate kam přířadím cestu k latte souboru.
Editoval verex (11. 4. 2014 22:09)
- kolsi
- Člen | 131
Nevím, jestli se to už neřešilo, ale neřešil někdo problém s exportem dat, pokud je v Gridu sloupec, který není z modelu, ale používá setCustomRender?
Rychlý příklad je tento:
<?php
$grid->setExport();
$grid->addColumnText('test', 'Test')->setCustomRender(function($item) { return 'test';});
?>
Místo aby se to nějak s exportem vypořádalo (buď sloupec úplně vynechalo, nebo to aplikovalo výsledek customRender), tak to hodí Cannot read an undeclared column „test“. Chyba je logická, protože v modelu skutečně takový sloupec není, ale výsledné chování je prostě chybné.
- kolsi
- Člen | 131
Tuhle metodu jsem přehlídnul, díky. Já bych čekal nějaké výchozí chování, že pokud setCustomRenderExport nebude definovaný, tak se použije to, co je v customRender (případně to z výsledku např. ořeže HTML tagy apod.). Takhle na pár místech budu mít zbytečně duplicitu, pokud setCustomRender a setCustomRenderExport budou stejné.
Editoval kolsi (16. 4. 2014 10:54)
- o5
- Člen | 416
Release 2.0
Intro:
Před skoro měsícem mi přišel email od @Jakub Kopřiva, že si má v rámci předmětu ve škole vybrat projekt, do kterého bude v průběhu semestru přispívat. Jsem rád, že si vybral právě Grido a pustil se do implementace inline editace, po které bylo tolik voláno. Ještě před rokem a půl jsem se na možnou inline editaci v Gridu díval skepticky, ale zřejmě díky Admineru (kde ji často využívám) jsem změnil názor a tak jsem tomu mohl dát volný průběh. Současná implementace je výsledkem ‚párového programování‘, protože jsem si neustále vymýšlel něco nového anebo to Jakubovi rozbíjel pod rukama :))
Inline editace:
Hlavní novinka verze, přejděme na use case. Vypadá váš grid nějak takto? Tedy používá výchozí sloupce, Nette Database a rádi byste přidali inline editaci? Pohodlně se usaďte, protože tenhle běžný požadavek uděláte v Grido 2.0 takhle jednoduše: $grid->setEditableColumns()! Pokud totiž jako datasource používate NDB je to skutečně takto jednoduché, protože metoda update() je implementovaná přímo v Grido\DataSources\NetteDatabase. V rámci jednoduchosti jsem se rovněž rozhodl, že ve většině případů při inline editaci dostačuje input type text. Občas je ale potřeba použít něco jednoznačnějšího, třeba selectbox, pro tuto situaci je tu $column->setEditableControl(). Inline editace tedy pokračuje v trendu, který charakterizuje celé Grido – minimum kódu, pro naprosto běžné požadavky při tvorbě výpisu položek.
Pro ostatní datasource se nám takto jednoduše metoda update() nepodařila naimplementovat, takže vám nezbyde nic jiného než nastavit vlastní callback a to jako první parametr metody $grid->setEditableColumns(). Toť asi vše, na další dotazy by měla odpovědět dokumentace nebo demo. Raději ještě upozorňuji, že je potřeba udělat update i klientské části (grido.js, grido.css).
Další minor věci:
- Columns: Label nyní může být i objekt \Nette\Utils\Html (Issue 116)
- Columns: Odebral jsem „cool url sorting representation“ (↑/↓) protože to v Safari nefungovalo (Issue 123)
- Client-side script: Snad už konečné vyřešení problému s nette.ajax.js vs grido confirm (Issue 114)
- DataSources\Doctrine: vylepšení Doctrine Paginator (Issue 125)
- Podpora Nette 2.2
Outro:
Od doby co jsem zveřejnil Grido, se objevilo pár lidí, co chtěli přispět na vývoj. Stěžovali si na absenci donate buttons apod. Nyní by již neměl být problém, donate buttons jsem přidal na stránky projektu :)) Vyjádřít dík se ale dnes nechá i pomocí Github star, takže rovněž můžete učinit i třeba takto :P
Enjoy!
Editoval o5 (29. 4. 2014 15:51)
- Ja
- Člen | 260
Zdary,
na uvod – komponenta je skvela! I'm lovin it :)
Ted k dotazu, da se nejak vytvorit u addActionHref jiny odkaz nez s defaultnim ?id=x? Delam jakousi anketu a potrebuju se z gridu dostat na jeho vlastni otazky skrze parametr ?id_anketa=x, ale grido mi tam defaultne cpe to ‚id‘, resil to nekdo?
<?php
$grid->addActionHref('otazky', 'Otázky')->setIcon('question-sign'); // zde vytvorit odkaz s parametrem 'id_anketa' a ne 'id'
$grid->addActionHref('edit', 'Editovat')->setIcon('pencil');
$grid->addActionHref('delete', 'Smazat', 'delete!')->setIcon('trash')->setConfirm("Opravdu?");
?>
Diky! :)
- sasule
- Člen | 18
Ja napsal(a):
Ted k dotazu, da se nejak vytvorit u addActionHref jiny odkaz nez s defaultnim ?id=x? Delam jakousi anketu a potrebuju se z gridu dostat na jeho vlastni otazky skrze parametr ?id_anketa=x, ale grido mi tam defaultne cpe to ‚id‘, resil to nekdo?
<?php $grid->addActionHref('otazky', 'Otázky')->setIcon('question-sign'); // zde vytvorit odkaz s parametrem 'id_anketa' a ne 'id' $grid->addActionHref('edit', 'Editovat')->setIcon('pencil'); $grid->addActionHref('delete', 'Smazat', 'delete!')->setIcon('trash')->setConfirm("Opravdu?"); ?>
Diky! :)
Co třeba takto:
<?php
$grid->addActionHref('showProjects', 'Zobrazit')
->setCustomRender(function($item, \Nette\Utils\Html $el) {
$data = $el->getText();
$el->removeChildren();
$el->addAttributes(array(
'href' => $this->link(':Module:Presenter:action', ['id_cokoli' => $item->getIdCokoli()]),
'class' => 'btn btn-xs btn-default grido-action-button',
'title' => 'Zobrazit',
))
->create('span', array(
'class' => 'glyphicon glyphicon-search',
));
$el->add($data);
return $el;
});
?>
Editoval sasule (3. 5. 2014 10:16)
- sasule
- Člen | 18
Ja napsal(a):
To je hodne divoky! Ale diky :) Napadlo me udelat actionDummyOtazky($id), na ktery povede odkaz z gridu, a kde bude pouze redirect na actionOtazky($id_anketa). Takze ted zvazuju co je vlastne „hezci“ reseni :)
Myslím, že to, co píšeš je trochu zbytečné, protože takhle máš 2 přesměrování (actionDummyOtazky) a poté na actionOtazky. Grido to zvládne na jedno přesměrování.
- o5
- Člen | 416
Ja napsal(a):
Zdary,
na uvod – komponenta je skvela! I'm lovin it :)Ted k dotazu, da se nejak vytvorit u addActionHref jiny odkaz nez s defaultnim ?id=x? Delam jakousi anketu a potrebuju se z gridu dostat na jeho vlastni otazky skrze parametr ?id_anketa=x, ale grido mi tam defaultne cpe to ‚id‘, resil to nekdo?
<?php $grid->addActionHref('otazky', 'Otázky')->setIcon('question-sign'); // zde vytvorit odkaz s parametrem 'id_anketa' a ne 'id' $grid->addActionHref('edit', 'Editovat')->setIcon('pencil'); $grid->addActionHref('delete', 'Smazat', 'delete!')->setIcon('trash')->setConfirm("Opravdu?"); ?>
Diky! :)
Zkus to takto:
$grid->addActionHref('otazky', 'Otázky')
->setPrimaryKey('id_anketa')
- Tomáš Jablonický
- Člen | 115
Ahoj kluci,
mám problém se sortováním sloupce, který sice neexistuje v datech ale je vložen přes callback setColumn. Data jsou do gridu vkládána jako array.
<?php
$grid->addColumnText('es_user', 'Odhadce')
->setColumn(function ($item) use ($em) {
if (!empty ($item['es_id'])) {
$estimateEntity = $em->find('\Es', $item['es_id']);
if ($entity!==NULL && $entity->getUser()!==NULL) {
return $entity->getUser()->getProfile()->firstlastname;
}
}
})->setSortable()
->setFilterText();
?>
Při sortování dostanu tuto chybu
Illegal offset type
na řádku je
833: $sort[$component ? $component->column : $column] = $dir == Column::ORDER_ASC ? ‚ASC‘ : ‚DESC‘;
Když si to „vydumpuji“ tak zjistím, že $component->column je callback který vkládám přes setColumn
Díky za rady.
- dryb
- Člen | 8
Nevíte někdo, prosím, jak můžu změnit výchozí datovou množinu pro grid?
- V definici gridu nastavím výchozí množinu dat v setmodel($this->connection->query($mujdotaz_sql)->fetchAll();).
- Pak vnějším filtrem množinu dat změním, ale jak ji potom přenastavím v modelu gridu?
Nejde mi na to rozum, protože po změně se nová data načetla správně, ale po setřídění podle nějakého sloupce se načetla opět výchozí množina dat a ne ta nová.
Díky.
Editoval dryb (7. 5. 2014 11:55)