Grido – DataGrid pro Nette
- raketoplan2005
- Člen | 147
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.
- raketoplan2005
- Člen | 147
@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
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
- Pavel Kravčík
- Člen | 1195
@hury: A samozřejmě musíš rozchodit Ajax v Nette (https://componette.org/search/?…).
- freely111
- Člen | 41
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
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.
- ryder
- Člen | 17
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 :-)
- George
- Člen | 8
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
@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
@Š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
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
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í?
- fronty
- Člen | 16
@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.
- Pavel Kravčík
- Člen | 1195
@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
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
@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
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
@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.
- kolsi
- Člen | 131
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
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
@kolsi: Aha. Tím se to asi uzavírá samo. Doporučil bych se řídit radou @o5. :)
- Pavel Janda
- Člen | 977
@kolsi Pokud chceš podmínku psát pro více gridů, ale nechceš ji psát dvacetkrát, volil bych tuto cestu:
- Podědíš si Grido
- Klasicky nastavíš filtr
- 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
}
- 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éž.
- Pavel Janda
- Člen | 977
@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
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
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
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)
- serten
- Člen | 55
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
@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.
A 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
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
To samozrejme jde, ale myslel jsem neco, kdy nebudu muset upravovat vse po upgradu grida
- o5
- Člen | 416
@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
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()] . '.';
});