Grido – DataGrid pro Nette

rumcais1
Člen | 80
+
0
-

Všiml jsem si že u suggestion se volá dotaz bez distinct takže pokud mám velikou tb a on vybere prvních 10 vrátí mi našeptávač jen jeden výsledek. Co tam přidat distinct?

Jan Mikeš
Člen | 771
+
0
-

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

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.

o5
Člen | 416
+
0
-

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

o5
Člen | 416
+
0
-

@Lexi: odpověděl jsem ti v issue, kterou jsi založil.

@Bazi: tady jsi select filtr zkoušel? Pokud ano, chybu máš někde u sebe.

rumcais1
Člen | 80
+
0
-

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

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

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

Oli
Člen | 1215
+
0
-

Připravuje se verze, která bude obsahovat inline editaci, tam by to mohlo byt reseno. Jinak pokud vim, tak to grido neresi

o5
Člen | 416
+
0
-

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

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}
                        &nbsp;
                    {/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)

o5
Člen | 416
+
0
-

@Pipaslot: Něco mi nejde, tak je to hned zajímavý bug viď :)) Co třeba v callbacku pro operation zavolat na konci nějaký $that->redirect(‚this‘)?

Pipaslot
Člen | 19
+
0
-

Díky za připomínku. To mě hned nenapadlo, že se to dá vyřešit i takto.

o5 napsal(a):

@Pipaslot: Něco mi nejde, tak je to hned zajímavý bug viď :)) Co třeba v callbacku pro operation zavolat na konci nějaký $that->redirect(‚this‘)?

Oli
Člen | 1215
+
0
-

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?

o5
Člen | 416
+
0
-

Oli: nejedná se o tohle?

Oli
Člen | 1215
+
0
-

jedná, omlouvám se za „duplicitní dotaz“. Díky ;-)

Jiří Nápravník
Člen | 710
+
0
-

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

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

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)

o5
Člen | 416
+
0
-

@Climber007: Jak si myslel to upravovaná přes JS? Jediný co se tam při ajaxu děje je tohle (nahrazení čtyř znaků)

Climber007
Člen | 105
+
0
-

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

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)

Jiří Nápravník
Člen | 710
+
0
-

o5: super, díky funguje:)

Climber007
Člen | 105
+
0
-

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.

o5
Člen | 416
+
0
-

@Climber007: budeš to muset někam celý někam nahrát, protože takhle mě nic nenapadá

sasule
Člen | 18
+
0
-

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

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

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

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

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

@verex: to vypadá doře. Zkus poslat pull request ;-)

Měl bych pár dotazů:

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

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

Oli napsal(a):

@verex: to vypadá doře. Zkus poslat pull request ;-)

je tam.

verex
Člen | 12
+
0
-

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

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

o5
Člen | 416
+
0
-

@kolsi: je potřeba definovat render pro export přes $column->setCustomRenderExport(). Možná by tam mohla být nějaká metoda $column->disableExport(), ale „samo“ se to rozhodně nevypořádá.

Editoval o5 (16. 4. 2014 16:10)

kolsi
Člen | 131
+
0
-

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)

looky
Člen | 99
+
0
-

kolsi napsal(a):

Takhle na pár místech budu mít zbytečně duplicitu, pokud setCustomRender a setCustomRenderExport budou stejné.

Udělej si na to metodu a použij jí jako callback u obou. :)

macosx69
Člen | 5
+
0
-

Doufam, ze sem nezavedu duplicitu, ale chtel bych se zeptat, jestli bude v dobe historicky blizke podpora nette 2.2? Vim, ze je to jeste beta-1, otazka spise ze zvedavosti… Momentalne to hazi problemy s filtry od latte (a po oprave zase class Column…)

diky

o5
Člen | 416
+
0
-

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)

looky
Člen | 99
+
0
-

Já bych chtěl poděkovat i jen takto komentářem. Díky za tuhle komponentu, používám jí téměř od začátku, a i když se sem tam musím s něčím trochu poprat, celkově hodnotím za 1!

Ja
Člen | 260
+
0
-

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

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)

Ja
Člen | 260
+
0
-

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

sasule
Člen | 18
+
0
-

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

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')
mrataja
Člen | 57
+
0
-

Famózní doplněk, díky za něj.

Jak můžu nastavit jiný odkaz na názvu? Např. jméno uživatele jako odkaz na jeho editaci

<a n:href=„Users:default“>mrataja</a>

Ja
Člen | 260
+
0
-

o5: Cannot read an undeclared column „id_anketa“.

ale tak, to se da udelat tak ze vyberu „id as id_anketa“…

Tomáš Jablonický
Člen | 115
+
0
-

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

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)