TwiGrid – omlouvám se :-(
- amik
- Člen | 118
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
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)
- ludek
- Člen | 83
Zdravím. http://twigrid.1991.cz/ nejede. Asi už od vydání Nette 2.3. Je s tím nějaký problém?
- jarks
- Člen | 94
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.
- Mares
- Člen | 3
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 | 799
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
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 | 1195
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
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 | 799
@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
@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 | 799
@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 | 1195
@uestla: Zatím mi nic extra nenapadá. Jedině si napsat vlastní funkci na getTable(). To myslíš?
- PetrHH
- Člen | 49
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
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
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)
- jan.vince
- Člen | 8
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
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 | 799
@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
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í…
- GEpic
- Člen | 566
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
@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 | 566
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)
- uestla
- Backer | 799
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 | 566
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)
- petrf
- Člen | 15
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 | 799
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
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)
- GEpic
- Člen | 566
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)