TwiGrid – omlouvám se :-(

kralik
Člen | 230
+
0
-

Ahoj,
hledám vhodný DataGrid a tento se mi na první pohled líbí.
Ještě jsem jej nezkoušel.

Chtěl bych se pozeptat na filtrování:

  • možnost „našeptávače“ při zadávání kritéria?
  • filtrování dle rozmezí, typycky datum od – do ?

Je toto možné?

Díky

amik
Člen | 118
+
0
-

Vestavěné to pokud vím twigrid nemá, musíš si to napsat sám, ale půjde to celkem snadno, jelikož formulář pro filtrování si můžeš poskládat, jak chceš. Mrkni na http://twigrid.1991.cz/full, jak udělat filtr na rozsah, tedy 2 inputy ve filtru 1 sloupce.

jan.vince
Člen | 8
+
0
-

Ahoj,

potřeboval bych poradit s překladem u TwiGridu.

Nedaří se mi přeložit text v patičce pomocí Kdyby/Translation. Originál v DataGrid.latte je:

{_'%d items', $grid->itemCount}

Když ho změním za:

{_'%count% items', $grid->itemCount}

tak mi překlad funguje (podle dokumentace Symphony se přebírá %count% automaticky).

Určitě se to ale dá rozběhnout i s %d – tak už jen z principu bych chtěl vědět, co dělám špatně :)

Díky !

Edit: Já jsem si vlastně sám odpověděl :)

Tím, že používám Kdyby/Translation, musím používat zápis podle Symfony:

Funguje (třeba) tohle:

{_'%count% items', $grid->itemCount}
{_'%d% items', array('d' => $grid->itemCount)}

BTW velký dík za TwiGrid (a Nextras/Datagrid, ze kterého vychází)!

Editoval jan.vince (30. 11. 2014 8:03)

tttpapi
Člen | 100
+
0
-

Ahoj, mám Nette 2.2.7 a twigrid 5.0.1 a nechce se mi grid vůbec vykreslovat. Problém zřejmě je, že se mi vůbec nevolají callbacky (zkusil jsem debugg a callback jsem dal i jako anonymní funkci a stejně se nikdy neprovedla).

uestla
Backer | 796
+
0
-

Ahoj, v tomhle musíš být sdílnější – minimálně poslat kód, kterým grid vytváříš.

ludek
Člen | 83
+
0
-

Zdravím. http://twigrid.1991.cz/ nejede. Asi už od vydání Nette 2.3. Je s tím nějaký problém?

uestla
Backer | 796
+
0
-

Po updatu Nette mi na lokálu padá Apache, bohužel jsem ještě neodhalil příčinu. Jakákoli pomoc je vítána (zdrojáky dema jsou k dispozici).

jarks
Člen | 94
+
0
-

To je zvláštní. Když v rychlosti udělám instalaci na lokál, jak jsem popsal výše, všechno se zdá úplně v pořádku – demo funguje, jak má.

na windows 8.1, Server Apache/2.2.25 (Win32) PHP/5.4.30, Nette Framework 2.3.1 (released on 2015–03–27),

na Ubuntu 14.10, Server Apache/2.4.10 (Ubuntu) PHP/5.5.12–2ubuntu4.3, Nette Framework 2.3.1 (released on 2015–03–27): z nějakého důvodu nefungují podstránky. Např. /simple, /filtering atd. dává Not Found on this server. Ale i tak se hlavní stránka zobrazí a Apache na to nic.

uestla
Backer | 796
+
0
-

Konečně jsem se k tomu dostal, popravdě nevím, v čem byl předtím problém, zřejmě v selhání deploy nástroje, za což se omlouvám :/

Demo by mělo být teď už opět plně funkční.

Mares
Člen | 3
+
0
-

Super grid, ale potřeboval bych docílit přidávání css třídy řádku dle hodnoty jednoho z prvků.

Pokud mám definováno

$this->addColumn('order_type', 'Typ objednávky');
...

tak nějak docílit

if($this->getRow()->order_type == 'xy') $this->setRowClass('bg-info');

Dále, je možné nějak během definování gridu změnit formát buňky? Opět třeba

$this->addColumn('order_id', 'ID')->setContent(function($row){
	<a href="//google.com" title="Objednávka z " . $row["order_date"]>$row["order_id"]</a>
});

aniž bych musel definovat desítky bloků?

uestla
Backer | 796
+
+1
-

Na dané věci stačí přetížit bloky dva, obvykle tohle dělám tak, že zkopíruju obsah defaultní šablony a podle potřeb upravím, konkrétně v tvém případě tedy

{define body}

	{* ... *}

		<tr n:class="$isInlineEdited ? success, $value === 'xy' ? bg-info">

	{* ... *}

{/define}


{define body-cell-order_id}
	<td>
		<a href="//google.com" title="Objednávka z {$record->order_date}">{$value}</a>
	</td>
{/define}

Jsou to prostě věci, které patří do šablony, ať už z koncepčního, tak i z praktického hlediska – v tvém příkladě máš např. XSS zranitelnost.

ludek
Člen | 83
+
0
-

uestla napsal(a):
@ludek:

  • ad počeštění:
    • můžeš využít překladač $grid->setTranslator($translator) a jednotlivé popisky přeložit…

Jednoduchý způsob lokalizace, když jinak v projektu nic jiného překládat nepotřebuju:

1. Třída primitivního překladače:

namespace App\Model;
use Nette;

class TranslatorModel implements Nette\Localization\ITranslator
{
    public function translate($message, $count = NULL) {
        $t = array(
            'Filter' => 'Filtr',
            '%d items' => $count . ' položek',
            'Previous' => 'Předchozí',
            'Next' => 'Další',
        );

        if (isset($t[$message])) { $trans = $t[$message]; }
        else { $trans = $message; }
        return $trans;
    }
}

2. zaregistrovat v config.local.neon

services:
	- App\Model\TranslatorModel

3. zpřístupnit v Presenteru, kde je grid (továrna gridu)

private $translator;

public function injectTranslator(\App\Model\TranslatorModel $translator)
{
    $this->translator = $translator;
}

4. nastavit gridu překladač:

public function renderDefault() {
     $this['mujGrid']->setTranslator($this->translator);
 }

 protected function createComponentMujGrid() {
     return $this->mujGrid->create();
 }
Pavel Kravčík
Člen | 1182
+
0
-

Zkoušel jste někdo nasadit s YetORM? :) Třeba @uestla.

Nebo je potřeba si logiku přepsat do dataLoaderu? I když koukám na ten zbytek, tak asi bude problém v těch filtrech na Selection. :(

Editoval kzk_cz (1. 7. 2015 17:28)

Džůny
Člen | 19
+
0
-

Výborný grid, první, který jsem rozchodil rychle a snadno (a který funguje s novým nette/web-project přes Composer!). Tutoriál je super.

Jen mi u Row Actions nefunguje setConfirmation()? Skripty mám přilinkované správně, zkoušel jsem i starší verzi jQuery. Zkusil jsem to i na čistém tutoriálu, na ten jsem nalepil příklad s row actions a neptá se to.

Prozatím jsem si na to v šabloně namontoval vlastní confirm. Nejsem moc JS/jQuery zdatný, tak jsem se ve zdrojích moc nerýpal.

Editoval Džůny (27. 7. 2015 14:09)

uestla
Backer | 796
+
0
-

@kzk_cz Zkoušel, v podstatě to většinou používám právě s YetORM :) V Repository mám univerzální metodu, které předám filtry a řazení a která mi vrátí EntityCollection. Pak už jen stačí v gridu správně nastavit valueGetter. Kdyby ti to nešlo, napiš.

@Džůny Vypisuje se nějaká chyba v konzoli? Je u buttonu s řádkovou akcí atribut data-tw-confirm?

Editoval uestla (28. 7. 2015 5:22)

Džůny
Člen | 19
+
0
-

@uestla Chyba v konzoli není žádná, atribut data-tw-confirm na tlačítku je.

Skripty:

	<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
	<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
	<script src="//nette.github.io/resources/js/netteForms.min.js"></script>
	<script src="{$basePath}/js/nette.ajax.js"></script>
	<script src="{$basePath}/js/twigrid.datagrid.js"></script>

Jak jsem psal, zkoušel jsem to na nette/web-project, tak je možné, že tomu něco chybí? :)

Edit: A ještě na jednu věc bych se rád zeptal, když z tabulky do gridu tahám city_id a v šabloně si to upravím na $record->city->name… to je super, ale jak (při použití Nette\Database\Table) dostanu city->name snadno i do řazení, filtrování a inline editace; jde to vůbec řešit, nebo mám s NDT smůlu?

Editoval Džůny (27. 7. 2015 19:34)

uestla
Backer | 796
+
0
-

@Džůny Zvláštní … Zkus prosím tady přidat console.log(question); a koukni, jestli se něco zaloguje (ten request rychle zabij třeba Escapem :-)).

Jelikož se vše řeší dataLoaderem, není vůbec těžké dostat podmínku z vazební tabulky, právě naopak ;)

function loader($grid, $columns, $filters, $orderBy)
{
	$selection = $this->database->table('...');

	foreach ($filters as $key => $val) {
		if ($key === 'city_id') {
			$selection->where('city.name', $val);
		} else {
			$selection->where($key, $val);
		}
	}

	return $selection;
}
Pavel Kravčík
Člen | 1182
+
0
-

@uestla: Zatím mi nic extra nenapadá. Jedině si napsat vlastní funkci na getTable(). To myslíš?

Džůny
Člen | 19
+
0
-

@uestla Nezalogovalo se nic. Chmmm, co kde dělám špatně… Za příklad díky! A vůbec, za komunikaci a ochotu. Po dokončení projektu máš u mě PayPalový příspěvek na kafe. :)

uestla
Backer | 796
+
0
-

@kzk_cz To není potřeba, na vše ti stačí univerzální metoda repozitáře.

@Džůny Tak to už mě nic nenapadá. Nemohl bys ten grid někde uveřejnit? Jestli máš vše stejně jako je v příkladech na webu, tak nevím, proč by to nemělo fungovat…

PetrHH
Člen | 49
+
0
-

Snazim se pouzivat TwiGrid a zatim se mi darilo. Jen nevim jak na filtrovani podle poli z navazane tabulky.

Mam tento kod:

		foreach ($filters as $column => $value) {
			if ($column === 'adresy_id') {
				$adresy->where("adresy.firma LIKE ?", "$value%");
			}
			else {
				$adresy->where("$column LIKE ?", "$value%");
			}
		}

Dostanu ale chybu: SQLSTATE[23000]: Integrity constraint violation: 1052 Column ‚id‘ in field list is ambiguous cemuz rozumim, protoze obe tabulky maji field s nazev id, ta hlavni navic adresy_id, ktery je cizi klic do tabulky adres. Nevis, prosim, jak to vyresit?

PetrHH
Člen | 49
+
0
-

Hm, tak jsem to vyresil, ale nevim jestli spravne. dataLoader poskytuje $columns[], hned prvni bylo id, natvrdo jsem jej prepsal na mojetabulka.id a vse zacalo fungovat.

uestla
Backer | 796
+
0
-

Občas se mi to u Nette\Database\Table\Selection stává i u M:N vazeb (pomocných vazebních tabulek), jako další možné řešení je pojmenovat sloupec pro ID ve vazební tabulce jinak, třeba mid.

PetrHH
Člen | 49
+
0
-

Džůny napsal(a):

@uestla Nezalogovalo se nic. Chmmm, co kde dělám špatně… Za příklad díky! A vůbec, za komunikaci a ochotu. Po dokončení projektu máš u mě PayPalový příspěvek na kafe. :)

Taky se mi nic nezalogovalo. Nakonec jsem přišel na to, že jsem zapomněl dát elementu s action třídu tw-ajax. Proto bylo v konzoli ticho. Třeba se tento poznatek bude někomu hodit a ušetří mu čas s bádáním.

Editoval PetrHH (14. 10. 2015 16:12)

ludek
Člen | 83
+
0
-

Zdravím, po update na Nette 2.3.7, začalo hlásit chybu:
User Warning: Did you forgot parentheses after getData in \vendor\uestla\twigrid\src\TwiGrid\DataGrid.php:863?. Na ř. 863 je

$template->dataLoader = $this->getData;

Je to důsledek nové vlastnosti „did you mean“, upozornění na vynechané závorky. Dá se vyřešit přidáním zavináče před ten řádek (ale to raději ne), nebo přepsáním na

$template->dataLoader = [$this, "getData"];

Něco k tomu:
https://forum.nette.org/…thod-gettery
https://phpfashion.com/…-komfotrneji#…

Editoval ludek (20. 10. 2015 14:57)

uestla
Backer | 796
+
0
-

Děkuju za upozornění, opraveno ve verzi 6.0.6.

jan.vince
Člen | 8
+
0
-

Ahoj,

chci hlavně poděkovat – tohle je výborný Grid! Používám ho už dlouho a v podstatě umí vše, co jsem kdy potřeboval (chybí mi asi jen možnost dynamicky měnit počet zobrazených řádků, ale to je drobnost :).

Na co jsem ale narazil – při opravdu velkém počtu stran se mi translátor snaží přeložit všechna čísla stránek v selectu, kterým se vybírá pod gridem stránka, na kterou chci přejít.

Dá se nějak zakázat překlad obsahu konkrétního prvku ? On to myslím už někde řešil David obecně pro formuláře, ale myslím, že tam to nešlo.

Díky !

marty666
Člen | 26
+
0
-

Ahoj, nejak si nevim rady s tim exportem. Jde mi o to, ze se ten pozadavek posila ajaxem, coz se mi zrovna nehodi. Chci exportovat do excelu, tim, ze to je ajax, tak to nefunguje. Vrati se jen binarni data v ajax response. Jde nejak rict tomu gridu aby tuto akci neposilal ajaxem?
Diky.

uestla
Backer | 796
+
0
-

@jan.vince Na prvky jde navěsit prázdný translator přes $control->setTranslator(NULL). Problém je, že prvky hlavního formuláře se do formu přidávají lazy, čili v tuhle chvíli by asi šlo vypnout překlad paginatoru až v šabloně těsně před vykreslením…

@marty666 Teď nevím, jaký export máš na mysli, ve TwiGridu žádná defaultní podpora pro exporty není…

marty666
Člen | 26
+
0
-

Aha vychazel jsem z dema, kde jako groupAction je exportMany. Myslel jsem, ze to pouziju k exportu do excelu, ale ajax me jaksi zarazil :D> uestla napsal(a):
>

@jan.vince Na prvky jde navěsit prázdný translator přes $control->setTranslator(NULL). Problém je, že prvky hlavního formuláře se do formu přidávají lazy, čili v tuhle chvíli by asi šlo vypnout překlad paginatoru až v šabloně těsně před vykreslením…

@marty666 Teď nevím, jaký export máš na mysli, ve TwiGridu žádná defaultní podpora pro exporty není…

uestla
Backer | 796
+
0
-

@marty666 Máš pravdu, něco jako „no-ajax“ mechanismus by se hodil. Bohužel teď nemám času nazbyt, pullíky vítány :)

GEpic
Člen | 562
+
0
-

Ahoj, TwiGrid používám již delší dobu, ale nikdy mi nedošlo, že filtrování klávesou Enter mi nefunguje, vše funguje v pořádku, po kliknutí na Filtrovat se vše vyfiltruje, Ajax je v pohodě. Ale zdá se mi, že po vyplnění pole a stisknutí klávesy Enter se mi odesílají 2 Ajaxové požadavky a filtrování se neprovede, čím to může být? :)

jan.vince
Člen | 8
+
+1
-

@GEpic – Ahoj, zrovna mám otevřený projekt s TwiGridem, ale filtrování přes Enter funguje a odesílá mi jen jeden AJAX request. Zkus stáhnout čistý demo projekt TwiGridu a vyzkoušej v něm: https://github.com/…twigrid-demo

GEpic
Člen | 562
+
0
-

jan.vince napsal(a):

@GEpic – Ahoj, zrovna mám otevřený projekt s TwiGridem, ale filtrování přes Enter funguje a odesílá mi jen jeden AJAX request. Zkus stáhnout čistý demo projekt TwiGridu a vyzkoušej v něm: https://github.com/…twigrid-demo

Helplo, moje chyba. Pro mě stále grid N1.

Editoval GEpic (30. 4. 2016 23:37)

japijana
Člen | 11
+
0
-

@uestla ahoj, vyborny datagrid, no chcem upozornit ze medzi 6.0.8 a 6.0.9 je BC break kvoli zavislosti na nette/utils 2.4

uestla
Backer | 796
+
0
-

@japijana Ahoj, po vydání tagu jsem si to uvědomil, a zase ho smazal, takže už v repu není, omlouvám se.

Pokud se ti stahuje pořád 6.0.9, zkus prosím promazat lokální Composer cache ve své uživatelské složce.

uestla
Backer | 796
+
+3
-

verze 7

Ať vám TwiGrid slouží :-)

GEpic
Člen | 562
+
0
-

Ahoj, plánuješ v nové verzi také možnost změnit set ikon? Glyphicon bohužel není free-to-use a proto ho z projektů většinou vyhazujeme.

Editoval GEpic (20. 7. 2016 18:02)

uestla
Backer | 796
+
0
-

Plánuji celý grid rozložit na co nejvíce bloků (ještě více než teď). Řešení ikonek bude ideálně také založené na blocích, i když chápu, že mít možnost globálně změnit elementy a classy ikonek by bylo pohodlnější.

Možná by bylo OK mít obecný block icon, který by vypadal např.:

{define icon}
	<span class="glyphicon {$class}"></span>
{/define}

Nastavovat globálně třídu pro ikonky nepovažuju za správné, protože kromě třídy chci i možnost změnit element – bootstrap uvádí pro ikony <span />, Font Awesome (který osobně používám raději, ale nechci zavádět další závislost do TwiGridu, když už v něm nativní ikonky jsou) zase <i />.

A jelikož souvisí ikonky s view, chtěl bych jejich vykreslování a úpravy držet co nejvíce v šabloně.

GEpic
Člen | 562
+
0
-

uestla napsal(a):

Plánuji celý grid rozložit na co nejvíce bloků (ještě více než teď). Řešení ikonek bude ideálně také založené na blocích, i když chápu, že mít možnost globálně změnit elementy a classy ikonek by bylo pohodlnější.

Možná by bylo OK mít obecný block icon, který by vypadal např.:

{define icon}
	<span class="glyphicon {$class}"></span>
{/define}

Nastavovat globálně třídu pro ikonky nepovažuju za správné, protože kromě třídy chci i možnost změnit element – bootstrap uvádí pro ikony <span />, Font Awesome (který osobně používám raději, ale nechci zavádět další závislost do TwiGridu, když už v něm nativní ikonky jsou) zase <i />.

A jelikož souvisí ikonky s view, chtěl bych jejich vykreslování a úpravy držet co nejvíce v šabloně.

A nebo udělat trošku tricky věc, a to sice dát to do translatoru:

	$dictionary = [
		"twigrid.icon.change" => "glyphicon neco",
		"twigrid.icon.edit" => "glyphicon opetneco,
	]

a pak v šabloně použít klasicky:

	<span class="{_'twigrid.icon.change'}"></span>

PS: Pokud se použije span, či i tak dle mého na tom nezáleží, font-awesome nemá v css závislost na i.

Viz http://fontawesome.io/examples/

You can place Font Awesome icons just about anywhere using the CSS Prefix fa and the icon's name.
Font Awesome is designed to be used with inline elements (we like the <i> tag for brevity, but using a <span> is more semantically correct).

Je to trošku tricky použítí slovníku k jinému účelu, ale podle mě taky nejjednodušší.

Editoval GEpic (20. 7. 2016 23:51)

uestla
Backer | 796
+
0
-

To je víc upřímně tricky než bych chtěl :-)

Kromě classy bych chtěl mít ideálně možnost upravit i element, případně další atributy elementu ikonky. A jednu věc řešit v translatoru, který pro to není určený, a jednu v šabloně, mi přijde nešťastné …

Domki
Člen | 310
+
0
-

Chtěl bych se zeptat jak lze předat source jako repozitar YetOrmu?

petrf
Člen | 15
+
0
-

Zdravím.
Řeším následující problém na Nette 2.3 + NDBT + uestla/twigrid": „^6.0“ (PHP 5.5, MySQL)
Struktura DB: place_reservation ← reservation ← customer , id dle konvencí

Dělal jsem dle QuickStartu, datagrid se vykreslil, ovšem sloupce napojené v tabulce customer prázdné.
CustomerGrid.latte:

{extends $defaultTemplate}
{define body-cell-name}
	<td>
		{foreach $record->related('reservation', 'id') as $res}
			{foreach $res->related('customer', 'id') as $c}
				{$c->name}
			{/foreach}
		{/foreach}
	</td>
{/define}
protected function build() {
     parent::build();

     $this->addColumn(ID, 'ID');
     $this->addColumn(NAME, 'jmeno');
     $this->setPrimaryKey(ID);
     $this->setTemplateFile(__DIR__ . '/PassengersGrid.latte');
     $id = (intval)$this->httpReq->getQuery(ID);
     $this->setDataLoader(function () use ($id) {
         return $this->database->table('place_reservation')
                  ->where(['tabulka3_id' => $id]);
     });
}

Dělám něco špatně? Prosím o radu. Díky

Editoval petrf (22. 8. 2016 21:31)

uestla
Backer | 796
+
0
-

Domki napsal(a):

Chtěl bych se zeptat jak lze předat source jako repozitar YetOrmu?

Implementuj si obecnou metodu repozitáře a tu pak použij jako dataloader.

petrf napsal(a):

Zdravím.
Řeším následující problém na Nette 2.3 + NDBT + uestla/twigrid": „^6.0“ (PHP 5.5, MySQL)
Struktura DB: place_reservation ← reservation ← customer , id dle konvencí

Všiml jsem si, že gridu nastavuješ šablonu PassengersGrid.latte, ale block máš v šabloně CustomerGrid.latte (alespoň to tak tvrdíš).

ludek
Člen | 83
+
0
-

Zdravím, v souvislosti s přechodem na Nette 2.4 (PHP 7) jsem updatnul jeden starší projekt a composer mi vypsal:

- Removing uestla/twigrid (6.0.7)
- Installing uestla/twigrid (10.0.2)

Přitom poslední verze má být podle zdejšího oznámení 7. V composer.json mám někdy z minulosti:

"uestla/twigrid": "*"

tedy hvězdičku, nikoliv nějakou konkrétní verzi. Přišel jsem na to po tom, co mi třídy nastavení gridů začaly hlásit zmatky v předávaných parametrech. Např.:

Argument 3 passed to ItemsGrid::counter() must be of the type array, none given
Argument 4 passed to ItemsGrid::dataLoader() must be of the type array, integer given

Asi došlo k nějaké větší změně ve vývoji. Můžu to opravit tím, že nastavím composer.json: "uestla/twigrid": "~7.0" a provedu composer update? Nebo jaké je doporučené nastavení?

Díky.

Editoval ludek (30. 8. 2016 15:44)

uestla
Backer | 796
+
0
-

@ludek Uvádění nových verzí tady na fóru je asi nejméně spolehlivé. Nejlepší je nemít nikdy v composer.json hvězdičku, to může dost zradit. Při každé změně zanášející BC-break vydávám novou major verzi, čili doporučuju jak píšeš přidat ^7.0 a composer update.

ludek
Člen | 83
+
0
-

Díky.
- Removing uestla/twigrid (10.0.2)
- Installing uestla/twigrid (7.0.2)
a je to. Twigrid pořád skvěle slouží. Až bude čas, prostuduju si změny a přejdu na novější verzi. Skoro to vypadá, že nejlepší bude třídy gridů načisto přepsat.

Editoval ludek (31. 8. 2016 12:41)

GEpic
Člen | 562
+
0
-

Ahoj, plánuješ také přidat podporu pro přidání nového záznamu?

Popřípadě jak je možné docílit toho, že si záznam přidám sám, a překreslím grid tak, abych měl přidaný prvek nastavený jako právě upravovaný? Zkoušel jsem si hrát se snippety uvnitř gridu, ale nějak jsem to nerozchodil.

Díky za odpověď.

Editoval GEpic (6. 9. 2016 15:17)

uestla
Backer | 796
+
0
-

Možná hodně výhledově.

Aktivování položky si můžeš nasimulovat ručně – zkus přesměrovat na stránku s gridem se správnými parametry (vypni javascript v prohlížeči a aktivuj inline edit ručně a koukni, na jakou URL to chodí).

PetrHH
Člen | 49
+
0
-

Zdravím, má Twigrid možnost uložit použité třídění/filtr aby se při refresh stránky nenastavil zase default? Dost mi to chybí…