Grido – DataGrid pro Nette

CZechBoY
Člen | 3608
+
0
-

@PavelKravčík já mám třeba v 90% HTML tříd danou třídu zduplikovanou.
Třeba mám class=„active active active“
Je to zvláštní a nevím čím to je.

raketoplan2005
Člen | 147
+
0
-

Není prosím možné nějak vypnout triggerUserNotice při „Page is out of range“ aby mi monitorovací skript nehlásil zvýšený error rate? Pokud se mi v gridu se setRememberState mění data a uživatel měl naposledy stránku 10, stačí mi „tichý reset“ na default.

o5
Člen | 416
+
+1
-

@raketoplan2005: zkus $grid->strictMode = FALSE.

raketoplan2005
Člen | 147
+
0
-

@o5: Bezva, děkuji moc – funguje. Máte prosím časový odhad kdy by mohl vyjít release 2.0.9 který by to obsahoval?

hury
Člen | 56
+
0
-

funguje vam aktualni grido example s ajaxem?
kdykoli strankuju, nebo filtruju pise to v URL: http://grido.bugyik.cz/example/?…
takze se pokazde prenacte stranka…

google chrome/mac osx

diky za odpoved

CZechBoY
Člen | 3608
+
0
-

@hury na tom odkazu, co si poslal, se mi nepřenačte celá stránka, jen grido a změní se url.

hury
Člen | 56
+
0
-

Mas pravdu, to jsem si nevsiml… diky :-)
Alespon vim, ze problem je fakt jen u me
U sebe v aplikaci mi to vubec ajaxove prave nefunguje (ani url nemeni), tak porovnavam s grido-example a hledam chybu, uz jsem z toho zoufaly…

CZechBoY
Člen | 3608
+
0
-

@hury: instalujes pres composer? Máš prilinkovany všechny js?

Pavel Kravčík
Člen | 1195
+
0
-

@hury: A samozřejmě musíš rozchodit Ajax v Nette (https://componette.org/search/?…).

hury
Člen | 56
+
0
-

diky kluci, cele grido jsem nasadil znovu a zacalo fungovat :-)

freely111
Člen | 41
+
+1
-

Ahoj, předem děkuji za skvělý grid, začínám s nette, zkouším a bojuji. Mám dotaz, je možnost po inline editaci textového pole reloadnout přes AJAX např. celý grid, nebo reloadnout konkrétní sloupec či konkretní buňku? :)

Zkouším něco takového, ale tudy cesta asi nepovede:

<?php
$grid->setEditableColumns(function($id, $newValue, $oldValue, $column) {
	// update...
	$column->grid->reload();
	return TRUE;
});
?>

A potom jsem ještě zkoušel celý grid obalit do vlastního snippetu:

{snippet mygrid}{control grid}{/snippet}

A potom nastavil:

<?php
$presenter = $this;
$grid->setEditableColumns(function($id, $newValue, $oldValue, $column) use ($presenter) {
	// update...
	$presenter->redrawControl('mygrid')
	return TRUE;
});
?>

Pokud je to možné, předem děkuji za každou radu :)

lenoch
Člen | 1
+
0
-

Zdravim. Nainstaloval jsem si nette/sandbox a zkusil pridat grido: composer require o5/grido
Instalace skoncila s chybou. Co delam spatne?

Vypis z konzole:

c:\wamp\www\webviper>composer require o5/grido
Using version ^2.0 for o5/grido
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
 – o5/grido 2.0.4 requires nette/nette 2.2.4 → satisfiable by nette/nette[v2
.2.4].
 – nette/nette v2.2.9 requires nette/application 2.2.6 → no matching package
found.
 – nette/nette v2.2.8 requires nette/application 2.2.5 → no matching package
found.
 – nette/nette v2.2.7 requires nette/application 2.2.4 → no matching package
found.
 – nette/nette v2.2.6 requires nette/application 2.2.3 → no matching package
found.
 – nette/nette v2.2.5 requires nette/application 2.2.3 → no matching package
found.
 – nette/nette v2.2.4 requires nette/application 2.2.3 → no matching package
found.
 – nette/nette v2.2.3 requires nette/application 2.2.2 → no matching package
found.
 – nette/nette v2.2.2 requires nette/application 2.2.1 → no matching package
found.
 – nette/nette v2.2.11 requires nette/application 2.2.8 → no matching packag
e found.
 – nette/nette v2.2.10 requires nette/application 2.2.7 → no matching packag
e found.
 – nette/nette v2.2.1 requires nette/application 2.2.0 → no matching package
found.
 – nette/nette v2.2.0 requires nette/application 2.2.0 → no matching package
found.
 – Conclusion: remove nette/application v2.3.5
 – Conclusion: don't install nette/application v2.3.5
 – nette/nette v2.3.0 requires nette/application 2.3.1 → satisfiable by nett
e/application[v2.3.1].
 – nette/nette v2.3.1 requires nette/application 2.3.2 → satisfiable by nett
e/application[v2.3.2].
 – nette/nette v2.3.2 requires nette/application 2.3.3 → satisfiable by nett
e/application[v2.3.3].
 – nette/nette v2.3.3 requires nette/application 2.3.3 → satisfiable by nett
e/application[v2.3.3].
 – nette/nette v2.3.4 requires nette/application 2.3.4 → satisfiable by nett
e/application[v2.3.4].
 – Can only install one of: nette/application[v2.3.1, v2.3.5].
 – Can only install one of: nette/application[v2.3.2, v2.3.5].
 – Can only install one of: nette/application[v2.3.3, v2.3.5].
 – Can only install one of: nette/application[v2.3.4, v2.3.5].
 – nette/nette v2.0.10 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.11 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.12 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.13 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.14 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.15 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.16 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.17 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.18 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.2 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.3 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.4 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.5 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.6 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.7 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.8 conflicts with nette/application[v2.3.5].
 – nette/nette v2.0.9 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.0 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.1 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.10 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.11 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.2 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.3 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.4 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.5 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.6 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.7 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.8 conflicts with nette/application[v2.3.5].
 – nette/nette v2.1.9 conflicts with nette/application[v2.3.5].
 – Installation request for nette/application == 2.3.5.0 → satisfiable by ne
tte/application[v2.3.5].
 – o5/grido 2.0.8 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.7 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.6 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.5 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.3 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.2 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.1 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – o5/grido 2.0.0 requires nette/nette ~2.0 → satisfiable by nette/nette[v2.
1.10, v2.1.11, v2.1.9, v2.0.10, v2.0.11, v2.0.12, v2.0.13, v2.0.14, v2.0.15, v2.
0.16, v2.0.17, v2.0.18, v2.0.2, v2.0.3, v2.0.4, v2.0.5, v2.0.6, v2.0.7, v2.0.8,
v2.0.9, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8,
v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7
, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.2, v2.3.3, v2.3.4, v2.3.5].
 – Conclusion: don't install nette/nette v2.3.5|install nette/nette v2.1.10|i
nstall nette/nette v2.1.11|install nette/nette v2.1.9|install nette/nette v2.0.1
0|install nette/nette v2.0.11|install nette/nette v2.0.12|install nette/nette v2
.0.13|install nette/nette v2.0.14|install nette/nette v2.0.15|install nette/nett
e v2.0.16|install nette/nette v2.0.17|install nette/nette v2.0.18|install nette/
nette v2.0.2|install nette/nette v2.0.3|install nette/nette v2.0.4|install nette
/nette v2.0.5|install nette/nette v2.0.6|install nette/nette v2.0.7|install nett
e/nette v2.0.8|install nette/nette v2.0.9|install nette/nette v2.1.0|install net
te/nette v2.1.1|install nette/nette v2.1.2|install nette/nette v2.1.3|install ne
tte/nette v2.1.4|install nette/nette v2.1.5|install nette/nette v2.1.6|install n
ette/nette v2.1.7|install nette/nette v2.1.8|install nette/nette v2.3.0|install
nette/nette v2.3.1|install nette/nette v2.3.2|install nette/nette v2.3.3|install
nette/nette v2.3.4
 – Installation request for o5/grido ^2.0 → satisfiable by o5/grido[2.0.0, 2
.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.0.7, 2.0.8].

Potential causes
A typo in the package name
The package is not available in a stable-enough version according to your min

imum-stability setting
see <https://groups.google.com/…c/discussion> f
or more details.

Read <https://getcomposer.org/…eshooting.md> for further commo
n problems.

Installation failed, reverting ./composer.json to its original content.

Kaliver
Člen | 12
+
0
-

Ahojte, mam problem so strankovanim v gride. Paginator funguje okey, len sa vobec nemeni url. Verim, ze mam nalinkovane vsetky scripty ako maju byt. Riesi to niektory zo skriptov, alebo kde by mohol byt problem?

Diki za rady.

ryder
Člen | 17
+
0
-

Zdravím,
je možné nějak do gridu přidat odkaz na signál? Grid mám jako samostatnou komponentu pro znovupoužitelnost, pokud použiju $grid->addActionHref, kde jako $destination uvedu např. ‚delete!‘, tak mi vykreslení skončí chybou, že presenter neobsahuje metodu handleDelete, která je ve skutečnosti umístěná v třídě s komponentou. To volání handleDelete v komponentě bych potřeboval kvůli tomu, že používám jako ochranu proti CSRF knihovnu https://github.com/…ecured-links
Možná to chci dělat zbytečně složitě, jak řešíte ochranu před CSRF?

Děkuji moc za radu :-)

CZechBoY
Člen | 3608
+
0
-

@ryder Ochranu před csrf jsem dělal stejně jako v obyč formuláři. K formuláři editace jsem přidal csrf políčko a potom ho validoval při odeslání.

ryder
Člen | 17
+
0
-

@CZechBoY Pokud jsem dobře pochopil, tak tím myslíš formulář inline editace? Mě jde primárně třeba o tlačítko na smazaní záznamu apod. To do gridu nyní přidávám pomocí $grid->addActionEvent('delete', 'Odstranit', [$this, 'delete']); což vygeneruje obyčejný odkaz..

CZechBoY
Člen | 3608
+
+1
-

@ryder aha, tak to si přepiš generování odkazu v Grido\Components\Actions\Event::getElement

George
Člen | 8
+
0
-

Zdravim,

chci se zeptat zda se nahodou nechysta podpora sub-gridu.
Pouzival jsem Grido jiz v nekolika projektech a je to skvely grid, ale ted bych v jednom projektu potreboval podporu subgridu.
Sahl jsem po Mesour gridu, ale bohuzel jsem narazil na nekolik chyb, ktere mi tam az prilis vadi a subgridy nejsou zcela podle mych predstav. Vyvoj se tam taky nejak zadrhl.
Pokud bych mohl zustat u Grida, tak bych to uvital.

Diky

Šaman
Člen | 2659
+
0
-

@lenoch Úplně si smaž z composeru všechny Nette balíčky, Grido ti nainstaluje Nette z jiného repozitáře. Není to od něj vůbec hezké, ale funguje to.

@o5 Bylo by možné upravit composer grida tak, aby byl kompatibilní s aktuálním sandboxem/web-projectem? Je tam stále nějaká závislost na Nette\Deprecated při volání Callbacku. A bylo by pak možné vydat stabilní verzi? Díky.

o5
Člen | 416
+
+1
-

@Šaman Ve středu jsem si po čase udělal čas na Grido, pořešil některé issues/pull-requesty a vytvořil roadmapu. To odebrání závislosti na nette/nette bude ve verzi 3.0 2.1. Na otázky typu kdy to bude nebudu reagovat.

EDIT: Když teď na to tak koukám, tak to odebrátní závislosti na nette/nette by možná mohlo být už součástí 2.1. Blokuje to ale pořešení exportu. Pokusy co tam jsou ve formě pull-requestů nejsou dostačující. Je potřeba na to jít jiným směrem než se to dělá teď.

EDIT2: Bude to součástí 2.1 :)

Editoval o5 (16. 10. 2015 10:44)

Vokrik
Člen | 15
+
0
-

Ahoj, nevím, co dělám špatně, ale nedaří se mi grid zprovoznit nějak rozumně na doctrine.

Když udělám tohle, tak to nefunguje

<?php
	$qb = $repository->createQueryBuilder('u')
			->select('u, role', 'p')
			->innerJoin('u.person', 'p')
			->innerJoin('u.role', 'role');
		$grid->model = new \Grido\DataSources\Doctrine($qb, ['firstName' => 'p.firstName']);
		$grid->setPrimaryKey('id');

		$grid->addColumnText('firstName', 'label.firstName')
			->setColumn('p.firstName');
?>

Když ale nahradím p za person, tak to funguje

<?php
$qb = $repository->createQueryBuilder('u')
			->select('u, role', 'person')
			->innerJoin('u.person', 'person')
			->innerJoin('u.role', 'role');
		$grid->model = new \Grido\DataSources\Doctrine($qb, ['firstName' => 'person.firstName']);
		$grid->setPrimaryKey('id');

		$grid->addColumnText('firstName', 'label.firstName')
			->setColumn('person.firstName');
?>

Ja bych s tim i dokazal zit, kdyby ->setSortable() pak nehazelo tohle

<?php
[Syntax Error] line 0, col 118: Error: Expected end of string, got '.'

SELECT u, r, person
FROM DB\App\Model\Entities\User u
INNER JOIN u.person person
INNER JOIN u.role r
ORDER BY u.person.firstName ASC
?>

uz jsem zkousel snad vsechny kombinace…
např. ->setColumn('firstName') a ['firstName' => 'p.firstName'], apod. ale vypadá to, že Grido vůbec nebere ['firstName' => 'p.firstName'] v potaz

Vám grido normálně na doctrině s joiny tabulek funguje? Co dělám špatně?

kolsi
Člen | 131
+
0
-

Ahoj, možná to už někdo řešil, ale když mám textový filtr ->setFilterText() a používám buď NetteDatabaseSource nebo ArraySource, jde nějak jendoduše zařídit filtrování podle prázdné hodnoty? Tzn. zobraz všechny řádky, které nemají hodnotu nebo naopak jenom řádky, které něco obsahují?

Pavel Janda
Člen | 977
+
+1
-

setWhere

Editoval Pavel Janda (21. 10. 2015 10:47)

fronty
Člen | 16
+
0
-

@o5 Díky za úžasný doplněk!
Pokud potřebujete pracovat se sloupci vytvořenými CONCATem v Nette DB source:

<?php
$column = $grid->addColumnText('fullname', 'Celé jméno')
->setColumn("CONCAT_WS(' ', name, surname)")
->setSortable()
->setCustomRender(function($row) {
	return "{$row->name} {$row->surname}";
});
?>

Dosud funguje vše skvěle, teď filtr a suggest:

<?php
$column
	->setFilterText()
		->setSuggestion()
		->setSuggestionCallback(function($query, array $filter, array $conditions, $self) {
			$col = $self->getColumn();
			if (is_array($col)) $col = current($col);
			$colName = $self->getName();

			$selection = clone $self->getGrid()->getModel()->getSelection();
			$selection->select('DISTINCT ' . $col . ' AS ' . $colName);
			$conditions[] = $self->__getCondition($query);


			foreach ($conditions as $condition) {
				if ($condition->callback) callback($condition->callback)->invokeArgs(array($condition->value, $selection));
				else call_user_func_array(array($selection, 'where'), $condition->__toArray());
			}

			$items = array();
			foreach ($selection as $item) {
				$items[] = \Nette\Templating\Helpers::escapeHtml($item->{$colName});
			}

			return $items;
		});
?>

Je to v podstatě upravená metoda \Grido\DataSources\NetteDatabase::suggest(), stěžejní je pojmenování sloupce který vzniká CONCATem. Osobně jsem si metodu implementoval přímo do poděděného textového filtru jako defaultní callback při zavolání setSuggestion(), funguje i na standardních sloupcích.

kolsi
Člen | 131
+
0
-

Pavel Janda napsal(a):

setWhere

To mi pomůže jak? Kromě toho, že tak primitivní záležitost jako je filtrování prázdných hodnot budu muset implementovat zvlášť pro každej sloupec v celé aplikaci? A že zadání něčeho jako je prázdná hodnota mi filtr stejně nesežere.

Pavel Kravčík
Člen | 1195
+
0
-

@kolsi: To Ti pomůže hodně. :) Zkus si s tím callbackem pohrát. Pro každý sloupec, který má prázdné hodnoty ano. Já to používám se selectem prakticky v každém gridu na speciální filtrování.

->addFilterSelect(['' => 'Vše', 'blank' => 'Prázdné'])
	->setWhere()...

if($value == 'blank' && $entity->column === NULL)
{
	return TRUE;
}

Editoval Pavel Kravčík (22. 10. 2015 9:31)

kolsi
Člen | 131
+
0
-

Jasný, u selectu to chápu, tam i ta skutečná hodnota filtru je před uživatelem skrytá. Mně jde ale o textový filtr – přece nemůžu chtít po uživatelích, že když chtějí filtrovat podle prázdné, tak tam mají napsat „blank“. Navíc dřív nebo později může dojít k tomu, že ta zástupná hodnota bude skutečnou hodnotou v nějakém řádku. Možná by prošla třeba mezera, ale tu mi filtr ořeže.

A taky se mi nelíbí, že to pak musím dopsat téměř ke každému textovému sloupci, kde je možná prázdná hodnota (tj. vlastně skoro všude). Proto mi přijde zvláštní, že toto už není řešeno na nějaké globální úrovni.

Pavel Kravčík
Člen | 1195
+
0
-

@kolsi: Ten tvůj požadavek mi přijde zvláštní, ale řešit se to myslím dá snadno. Prostě si implementuj tohle \Grido\DataSources\ArraySource či jiný Source a přepiš si to tam tam globálně.

kolsi
Člen | 131
+
0
-

Zvláštní? Já teda nevim, ale mně přijde filtrování podle prázdné hodnoty naprosto běžná věc. Zatím asi nejjednodušší způsob vidím v přepsání textového filtru, kde se nějaká zástupná hodnota přepíše na prázdný řetězec.

Něco jako

protected function formatValue($value)
{
		if($value === '-')
			return '';

		return parent::formatValue($value);
}

Zatím vypadá, že funguje jak pro ArraySource i NDB.

Pavel Kravčík
Člen | 1195
+
0
-

@kolsi: Zvláštní mi přijde filtrování prázdné hodnoty v text inputu. Co bude třeba v suggestion? Na tohle používám select nebo externí filtry před gridem, pokud se to stane. Většinou takové sloupce nedávám do grido, ale asi je to úhel pohledu na návrh. Občas to potřeba asi bude.

Myslel jsem to přepsat tady, to je třída určená pro vlastní implementace, já si na to třeba nasadil YetORM, nemělo by to být nic složitého překládat '' na IS NULL nebo jako potřebuješ funkčnost.

https://github.com/…aySource.php#L48

kolsi
Člen | 131
+
0
-

Tak není to úplně ideální, ale když si vezmu např. seznam zpráv, kde každá zpráva má libovolný předmět (čili textový sloupec s textovým filtrem) a teď chci zobrazit jenom ty zprávy, kde předmět nebyl zadaný. A podobných situací máme víc.

Suggestion to teď nezobrazí žádné, ale vzhledem k tomu, že u Grido v některých situacích suggestion nefunguje vůbec (a místo toho se zaloguje error), tak to zas tak velký problém není.

Implementovat mi přijde lepší přímo ve filtru, protože to pak funguje v jakémkoli modelu.

o5
Člen | 416
+
+1
-

kolsi napsal(a):

Tak není to úplně ideální, ale když si vezmu např. seznam zpráv, kde každá zpráva má libovolný předmět (čili textový sloupec s textovým filtrem) a teď chci zobrazit jenom ty zprávy, kde předmět nebyl zadaný. A podobných situací máme víc.

Suggestion to teď nezobrazí žádné, ale vzhledem k tomu, že u Grido v některých situacích suggestion nefunguje vůbec (a místo toho se zaloguje error), tak to zas tak velký problém není.

Implementovat mi přijde lepší přímo ve filtru, protože to pak funguje v jakémkoli modelu.

Dám ti jednu radu. Nepoužívej Grido a místo toho si to všechno bastli podle svého, alespoň se něco naučíš :)

Pavel Kravčík
Člen | 1195
+
0
-

@kolsi: Aha. Tím se to asi uzavírá samo. Doporučil bych se řídit radou @o5. :)

Pavel Janda
Člen | 977
+
0
-

@kolsi Pokud chceš podmínku psát pro více gridů, ale nechceš ji psát dvacetkrát, volil bych tuto cestu:

  1. Podědíš si Grido
  2. Klasicky nastavíš filtr
  3. Ve své třídě Grida si uděláš něco takového:
public function setWhereXXXX($column)
{
	$this[$column]->setWhere(...); // Za ... si dosaď svoji podmínku
}
  1. Budeš vytvářet instanci svého Grida

Pokud by to z nějakého důvodu takto nešlo, můžeš stejného efektu docílit vytvořením factory na Grido a někde v metodě create() té factory zavolat Nette\Object::extensionMethod, která bude dělat totéž.

Oli
Člen | 1215
+
0
-

@kolsi a sortování by ti nestačilo? To ti seřadí od nevyplněných po Z. To by mohlo být good enough, ne? Jinak potom leda vlastní řešení…

Pavel Janda
Člen | 977
+
0
-

@kolsi Tak ze zvědavosti: Jak chceš v textovém filtru rozeznat, zda chce uživatel filtrovat prázdnou hodnotu sloupce, nebo jestli chce vyresetovat filtr?

Editoval Pavel Janda (22. 10. 2015 14:39)

kolsi
Člen | 131
+
-2
-

Pavel Janda napsal(a):

@kolsi Tak ze zvědavosti: Jak chceš v textovém filtru rozeznat, zda chce uživatel filtrovat prázdnou hodnotu sloupce, nebo jestli chce vyresetovat filtr?

To je přesně důvod proč jsem se ptal ;-) jestli třeba někdo neřešil něco podobného, nebo neví, jak se toto v praxi řeší. Třeba pro hledání mezery funguje, když napíšu % %, tak jestli není něco i pro prázdný řetězec.

Opravdu nechápu nějaký připomínky ať nepoužívám Grido a bastlím si to podle sebe. To pak nemusíme mít žádný fórum, doplňky ani framework a můžem si každý bastlit všechno podle sebe…

Oli
Člen | 1215
+
0
-

Možná se to tu někdy řešilo, ale nenašel jsem to.
Mám sloupec s časem, používám doctrine a entita mě vrací čas jako DateTime. Potřeboval bych ho ale sortovat a filtrovat. Pokud ale nenastavím setColumn(), tak mě to hlásí chybu

Object of class DateTime could not be converted to string

Pokud nastavím setColumn, tak to vrací closure, což samozřejmě nejde ani sortovat ani filtrovat. Nerad bych to přepisoval aby to vracelo string, protože všude jinde počítám s DateTime.

Nějaký nápady? :-)

Oli
Člen | 1215
+
0
-

Další otázka je: Jakým způsobem sortovat podle jména? Chápu to tak, že editace, filtrování i sortování probíhá podle toho co je v setColumn();. Potřeboval bych, ale filtrovat a editovat podle ID (selectbox) a sortovat podle jména (sortování podle ID nedává smysl). Je to možný?

Mohl by vědět tohle a/nebo předchozí dotaz @pepakriz, @o5. Díky :-)

Editoval Oli (24. 10. 2015 20:13)

CZechBoY
Člen | 3608
+
0
-

@Oli můžeš sortovat podle všech sloupců klidně.

$column = $grid->addColumnText('name');
$column->setSortable();

Případně můžeš nastavit výchozí sort:

$grid->setDefaultSort(array ('name' => 'DESC'));

Editoval CZechBoY (24. 10. 2015 21:09)

serten
Člen | 55
+
0
-

Zdravím, mám trochu problém s inicializací javascriptu na Gridu a hlavně se skriptem pro úpravu URL. Celý kód gridu mi funguje v pohodě, funguje i ajaxové zpracování. Problém je, že se mi do URL nepropíšou změny jako řazení a filtrování. Zkoušel jsem různě popřesunovat natažení skriptů, ale nic nepomáhá. Nakonec jsem zjistil, že bindování skriptů na grid $(‚.grido‘).grido(); se nejspíš vůbec neprovede, protože když jsem zkoušel změnit nějaké formáty nebo takto vypnout ajax, tak mi to vůbec nereaguje. Nevíte, kde by mohla být chyba?
Můj layout vypadá takto: http://pastebin.com/VCRXTHbq
Snažil jsem se to nasadit podle examplu, ale asi se to nepovedlo podle představ. Díky za pomoc.

Oli
Člen | 1215
+
0
-

@CZechBoY Jasně to chápu. Jde mě hlavně o to abych v jednom sloupci sortoval podle name a filtroval a editoval podle ID. To co jsi napsal ty, tak do filtru (selectbox) dá jako klíč name a to nechci…

o5
Člen | 416
+
+1
-

@Oli

$grid->addColumn(...)
	->setColumn('name')
	->setFilterText(...)
		->setColumn('ID');

?

Oli
Člen | 1215
+
0
-

@o5 Super díky :-) Víceméně jsem to takhle měl, ale až teď jsi mě nakopl, koukl jsem se na to ještě jednou pořádně a dotáhnul to. Stěžejní bylo jak poskládat dotaz na databázi.

tenhle problém byl způsoben tím, že nebyl nastaven setGridoEditableValue a do grido-editable-value se uložil \DateTime. Zkusím vymyslet, jestli by to nemohlo vracet nějakou hezčí chybovou hlášku a poslat PR ;-)

ZahorskyJan
Člen | 59
+
0
-

Dobrý den,

chci poděkovat za skvělý grid, který mi ušetřil mnoho práce a jednoduše jsem jej mohl integrovat s Doctrinou.

Trochu mne ale zlobí od začátku ajax. Něco dělám špatně a nevím co.

Problém: když ve filtru mám selectbox a změním hodnotu, automaticky se odešle požadavek. To samotné problém není, ale problém je, že se odešle zaráz 2×, první se zruší (status canceled) a druhý v pořádku (status 200), ale neobsahuje požadovaný filtr. Když po tomto kolečku odešlu formuláře pomocí standardního submit tlačítka ve sloupci Akcí, tak se výsledek načte správně a odejde jenom jeden request.

Určitě to bude nějakou kombinací, kterou nejsem schopen odhalit.

Toto je pořadí skriptů (načítám před koncem <body> pomocí webloaderu):

			'jquery.min.js',
			'bootstrap.min.js',
			'jquery.nestable.min.js',
			'mobile-detect.js',

			// specific plugin
			'jquery-ui.custom.min.js',
			'jquery.ui.touch-punch.min.js',
			'jquery.colorbox-min.js',
			'jquery.livequery.js',

			// Ace (design administrace)
			'ace-extra.min.js',
			'ace-elements.min.js',
			'ace.min.js',

			// Nette
			'netteForms.js',
			'nette.ajax.js',
			'spinner.ajax.js',

			// Grido
			'grido.js',
//			'grido/grido.datepicker.js',
//			'grido/grido.daterangepicker.js',
//			'grido/grido.typeahead.js',
//			'grido/grido.history.js',
			'grido/grido.nette.ajax.js',

			// backend custom script
			'main.js',

V main.js je umístěno spuštění Nette:

$(function(){
	// init nette ajax
	$.nette.init();
}

Předem díky za jakékoliv nakopnutí.

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

Jde nějak (klidně i nějaký hack), vypisovat čísla řádků v gridu?

CZechBoY
Člen | 3608
+
+1
-

@JiříNápravník můžeš si změnit šablonu a tam vypisovat čísla z iterátoru :)

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

To samozrejme jde, ale myslel jsem neco, kdy nebudu muset upravovat vse po upgradu grida

o5
Člen | 416
+
0
-

@JiříNápravník: Skutečně nyní jiná možnost než si podědit šablonu a v ní přepsat {block table} není. Je v plánu udělat šablonu snadněji rozšířitelnou a mohl by tam třeba vzniknout i {block data}. Nevím jestli si někdo všiml, nedávno jsem vytvořil milestones (rozklikněte si odkaz more) a tento nový block by mohl být součástí většího překopání které je označeno bodem Grid.latte: make it more extendable (#118)

edit: Ikdyž teď na to znovu koukám a tobě tento blok stačit přepsat nebude. Nenapadá mě teď žádné řešení, aby to bylo snadnější než je tomu teď.

Editoval o5 (30. 10. 2015 20:59)

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

Tak jsem to nakonec trochu ohackoval bez zásahu do šablony apod, kdyby někdo potřeboval:

		$position = [];
		$grid->onRender[] = function($grid) use (&$position){
			$firstPosition = $grid->getPerPage() * ($grid->getPaginator()->getPage() - 1);
			$i = 1;
			foreach($grid->getData() as $answered){
				$position[$answered->getId()] = $firstPosition + $i;
				$i++;
			}
		};
		$grid->addColumnNumber('position', 'Pořadí')
			->setCustomRender(function(AnsweredQuestionnaire $answered) use(&$position){
				return $position[$answered->getId()] . '.';
			});