NiftyGrid – Datagrid pro Nette 2 s velkou škálou funkcí
- Oggy
- Člen | 306
Nestihl jsem projít ještě celé vlákno, ale lze nějak nastavit, aby filtr použil podmínku HAVING pro alias?
..mám v selectu
CONCAT_WS(" ",product_color.product.code, product_color.color.code) as product .. a podle aliasu product bych potřeboval filtrovat.
Neřešil už někdo něco podobného?
Editoval Oggy (20. 12. 2012 12:51)
- Oli
- Člen | 1215
Zdravím, v rychlosti jsem tohle vlákno prošel, ale nenašel jsem odpověď na mou otázku.
Umí pracovat Niftygrid s primárními klíče přes víc sloupců? V Nette 2.0.7 je implementovaná podpora primárních klíčů přes víc sloupců a vrací primární klíč jako array. Je tohle nejak implementovane, nebo necha se to nejak pouzit?
Diky
- Lukáš Kadlec
- Člen | 17
Oggy napsal(a):
Můžeš si v DB vytvořit pohled (view), kde budeš mít sloupce spojené, a grid nechat pracovat s ním.
- Oggy
- Člen | 306
Lukáš Kadlec napsal(a):
Oggy napsal(a):
Můžeš si v DB vytvořit pohled (view), kde budeš mít sloupce spojené, a grid nechat pracovat s ním.
Jasně, to je řešení, které jsem udělal.. ale jen jsem se chtěl zeptat, zda to grid umí a já to neumím použít :-)
Ještě mám otázku ohledně ukládání stavu. Lze to nějak dělat? Nebo vypínáte ajax?
- ajda2
- Člen | 66
Zdravím, mám problém s ajaxovou inline editací.
Po odeslání formuláře s řádkem, dostanu nejprve odpověď
{"redirect":"http: ... }
a poté
{"state":[],"snippets":{"snippet--flashMessages":""}}
Tím pádem se neinvaliduje snippet s datagridem a pořád visím na inline
formuláři, který se ale odeslal.
Pokud např. změním pořadí a snippet se překreslí, tak už se inline
editace provede v pořádku.
Nevíte prosím, kde by mohla být chyba?
Editoval ajda2 (14. 1. 2013 18:54)
- ajda2
- Člen | 66
ajda2 napsal(a):
Zdravím, mám problém s ajaxovou inline editací.
Po odeslání formuláře s řádkem, dostanu nejprve odpověď{"redirect":"http: ... }
a poté
{"state":[],"snippets":{"snippet--flashMessages":""}}
Tak jsem nyní zjistil, že problém se projevuje pouze pokud je vyplé stránkování.
- raketoplan2005
- Člen | 147
Ahoj! Narazil jsem to, že když chci do gridu propsírovat data ze složitějšího
dotazu, který v modelu obsluhuji pomoci
NDB->connection->query()
, tak si knihovna pak chce zavolat
Nette\Database\Statement::getPrimary()
a na tom mi to spadne. Je
nějaká možnost jak to obejít aniž bych dělal pohled v DB a dotaz poslal
na něj? Děkuji.
Editoval raketoplan2005 (18. 1. 2013 18:36)
- Kryšpin
- Člen | 27
ajda2 napsal(a):
ajda2 napsal(a):
Zdravím, mám problém s ajaxovou inline editací.
Po odeslání formuláře s řádkem, dostanu nejprve odpověď{"redirect":"http: ... }
a poté
{"state":[],"snippets":{"snippet--flashMessages":""}}
Tak jsem nyní zjistil, že problém se projevuje pouze pokud je vyplé stránkování.
Ano … stačilo zjistit na Gitu: https://github.com/…id/issues/18
- matoni555
- Člen | 40
Ahoj,
používám Nette\Database. Mám tabulku products a jejich
variant products_variants. U každého produktu mám kód. Pokud má
produkt varianty, jsou záznamy v tabulce products_variants a tyto
varianty mají svůj kód.
V gridu vypisuji kódy produktu, ale nemůžu nastavit textový filtr (setTextFilter) a autocomplete (setAutocomplete), aby to fungovalo. Jak na to?
Takto definuji sloupec s kódy:
$this->addColumn('code', 'Kód', NULL, NULL, TRUE)
->setRenderer(function($row) {
$variants = $row->related('products_variants')->fetchPairs('id', 'code');
if (count($variants) == 0) {
return $row->code;
} else {
return implode(', ', $variants);
}
});
Díky
- raketoplan2005
- Člen | 147
Ahoj,
mám vytvořenou komponentu NiftyGridu, ve které si v konstruktoru nastavím
protected proměnné pro přístup do modelu.
Mám ale problém s tím, že v PHP 5.3 se k nim nemůžu dostat uvnitř setRenderer (v PHP 5.4 ano).
$that = $this;
$this->addColumn('kategorie')
->setRenderer(function($row) use ($that) {
$hlavni = $that->kategorie->getRoot($row['category']);
return $hlavni['nazev'];
}
);
To mi vrátí
Cannot read an undeclared property Grid::$kategorie
Zatím jsem to upravil tak, že jsem si na na to přidal getter, takže kód vypadá takhle:
$that = $this;
$this->addColumn('kategorie')
->setRenderer(function($row) use ($that) {
$hlavni = $that->getKategorie()->getRoot($row['category']);
return $hlavni['nazev'];
}
);
Řeší se to podle vás nějak jinak, prosím?
Druhý dotaz: Lze nějak nastavit výchozí sloupec pro řazení? Když ho nastavím v datasource tak pak nejde sloupec pro řazení změnit kliknutím.
Editoval raketoplan2005 (29. 1. 2013 21:46)
- ajda2
- Člen | 66
Zdravím,
mám stejný problém. Potřebuji Použít data source z query a skončí to
stejně. Nevíte jak toto řešit, případně jak se dá výsledek query, tedy
statement „přetypovat“ na „Selection“?
Díky za rady.
raketoplan2005 napsal(a):
Ahoj! Narazil jsem to, že když chci do gridu propsírovat data ze složitějšího dotazu, který v modelu obsluhuji pomoci
NDB->connection->query()
, tak si knihovna pak chce zavolatNette\Database\Statement::getPrimary()
a na tom mi to spadne. Je nějaká možnost jak to obejít aniž bych dělal pohled v DB a dotaz poslal na něj? Děkuji.
- ajda2
- Člen | 66
Tak už jsem to vyřešil. Podařilo se mi dotaz poskládat pomocí
<?php
$table->select($columns);
?>
Což sem myslel, že snad ani nezvládnu :)
Stejně, ale zvláštní, že metoda query na Nette\Database\Connection vrací Nette\Database\Statement a
<?php
$table->select($columns)
?>
- Blujacker
- Člen | 89
Zdravm, snažím se použít NiftyGrid společně s doctrine, ale narazil jsem na problém s metodou setRender.
$this->addColumn('p_creationTime', 'Čas')
->setRenderer(function($row){return date('j. n. Y', strtotime($row['p_creationTime']));});
Jenomže toto vrací chybu:
Cannot use object of type stdClass as array
Pravděpodobně bych tedy měl přetypovat $row na nějakou Doctrince třídu, ale nevím na jakou.
Děkuji za Váš čas
- Blujacker
- Člen | 89
Blujacker napsal(a):
Zdravm, snažím se použít NiftyGrid společně s doctrine, ale narazil jsem na problém s metodou setRender.
$this->addColumn('p_creationTime', 'Čas') ->setRenderer(function($row){return date('j. n. Y', strtotime($row['p_creationTime']));});
Jenomže toto vrací chybu:
Cannot use object of type stdClass as array
Pravděpodobně bych tedy měl přetypovat $row na nějakou Doctrince třídu, ale nevím na jakou.
Děkuji za Váš čas
Problém vyřešen, stačilo to změnit na array (nicméně mi to nepřijde jako elegantní řešení, neměl by $row být rovnou typu array)?
->setRenderer(function($row){$array = (array) $row; return $array['p_creationTime']->format('j. n. Y H:i');});
Ale rovnou jsem narazil na další problém. Potřebuji v Gridu zobrazit jméno autora, na kterého vede reference z hlavní tabulky přes author_id. V query builderu jsem tedy najoinoval informace o autorovi:
$qb = $this->em->createQueryBuilder();
return new \Grid\RequestsGrid($qb
->select('p')
->from('Entities\Clanek', 'p')
->leftJoin('p.author', 'Entities\User')
);
a potom v kodu gridu:
$this->addColumn('p_author_id', 'Autor')->setTableName("Entities\User.lastName");
ale to skončí na chybě:
Undefined index: p_author_id (zkoušel jsem i p_author)
Nevíte, kde dělám chybu?
Děkuji
- Glottis
- Člen | 129
cao, mam tu zadrhel s ajaxem. pridam si do gridu ajaxove tlacitko. to ma class=ajax a podle toho grid tlacitko zajaxuje a obslouzi sam. to je v pohode. kdyz na tlacitko kliknu, zavola se ajax akce a neco mi zobrazi. kdyz v tom obsahu jsou ale dalsi ajaxove odkazy, uz nefunguji ajaxove. vypada to jako by ajaxove volani gridu uz pak nad vracenym contentem uz nic nedelalo. da se tohle chovani nejak obejit?
na obecne ajaxovani pouzivam nette.ajax.js a to mi funguje. ale jak mi neco prekresli grid, tak uz se nic nedeje :/
dik
Glo
- raketoplan2005
- Člen | 147
Ahoj, měl bych ještě dva dotazy, prosím:
- Jde nějak přednastavit u DateFilteru aby bral automaticky např.
<=
? Mám v gridu dva sloupce (od, do) na což je tahle funkce zřejmá. Napsat to do inputu s vyskakujícím DatePickerem není nic veselého :-) - Standardně se (asi) aplikuje filtr podle hodnoty v DB. Jak filtrovat podle
výstupu
->setRenderer()
?
Díkes.
Editoval raketoplan2005 (9. 2. 2013 23:35)
- jiri.sykora83
- Člen | 2
Mohl by sem někdo dat ukázku použití setSelectFilter()?
Nějak jsem ji někde nenašel.
- raketoplan2005
- Člen | 147
@jiri.sykora83:
$this->addColumn('active', "Active")
->setSelectFilter(array(0=>"No", 1=>"Yes"), '---');
- vojty
- Člen | 19
Ahojte,
přimlouvám se za sjednocení proměnných $row a v callback u Doctrine DataSource, jak už namítnul achtan a blujacker.
Zároveň stejne jako blujacker nemůžu přijít na způsob jak pracovat s daty asociovaných tabulek. Má prosím někdo větší zkušenosti s gridem a Doctrine2?
Díky V.
- raketoplan2005
- Člen | 147
Pomocí setShow()
nastavuji jestli se má tlačítko zobrazit
(podle hodnoty jednoho sloupce), nenapadlo by vás ale jak podmínit přidání
confirmation dialogu? Třeba pokud sloupec X je nižší než 35 pak není
nutné zobrazit na odkazu confirm dialog? neváím jak udělat callback okolo
celého ->add
. Díky.
Editoval raketoplan2005 (17. 2. 2013 19:36)
- forkman
- Člen | 72
Ahoj, taky přispěju svým dotazem :-) NiftyGrid je je opravdu bomba, moc dobře se mi s ním dělá, ale mám tak trochu problém s ajaxem a invalidací. V akcích gridu mám akci na smazání a na ní je pověšený confirmation dialog (ajaxově) všechno proběhne, flash message o smazání se zobrazí, ale grid se nepřekresluje, pomůže až F5. Nějaký tip jak invalidovat NiftyGrid? Díky
- akadlec
- Člen | 1326
Zajímavý addon, právě jej zkouším a narazil jsem na problém při použití filtru. Datagrig mám v podstatě v základu jak je uvedeno na nette stránce, datagrid mám aktuálně stažen z master větve. Když přidám filtry a kliknu na button filtrovat tak se generuje špatný link.
Při sortování je takovýto:
?grid-cs-order=p_name+ASC&grid-cs-perPage=20
a při filtrování zase takový:
?cs-filter[c_name]=2&grid-cs-order=p_name+ASC&grid-cs-perPage=20
Jen ještě dodám že na ten grid mám použitý multiplier který to možná způsobuje, zatím jsem to neinvestigoval.
- Taufic
- Člen | 31
Zdravím,
nikde jsem to tu nenašel, tak bych se chtěl zeptat. Zjednodušeně mám
uloženou entitu sofware s počtem licencí a názvem a druhou entitu použití
softwaru s názvem softwaru a počítáčem na který se váže. Pokud chci
počet licencí z entity software vypsat v gridu, tak to není problém.
Udělal jsem si metodu, která mi přepočítá, kolik licencí mi ještě
zbývá, ale zaboha nejsem schopný to do gridu dostat. Nemohl by mi někdo
trochu poradit? Předpokládám, že by to mohlo jít přes metodu
setRenderer()
Předem děkuji
- Taufic
- Člen | 31
A ještě bych měl jeden dotaz. Když v subgridu přes handle delete smažu řádek, tak mě subgrid vypíše žádné záznamy a musím ho rozkliknout aby se zbylé zobrazily. Dá se to nějak ošetřit?
EDIT: nic jsem neřekl, nic jsem nenapsal :) Jen chybějící redirect ;)
Editoval Taufic (11. 3. 2013 15:09)
- forkman
- Člen | 72
Nifty: Stránkování mám zapnuté, ale prostě se mi to neinvaliduje, nemám s tím moc zkušeností, ale jiné invalidace při ajaxových akcích mi fungují. Jak se to tedy správně má invalidovat? Když to bude o trochu kódu navíc, to mi nevadí, ale je to trochu matoucí, když vyskočí flashMessage, ale data v gridu se nezmění. Ještě dodám že to jsou mé akce, není to inline editace. Díky
- deter
- Člen | 5
Ahoj,
nejprve diky za super grid.
Vim, ze jde pridat filtrovani (setSelectFilter) a filtrovat i podle sloupce z jine tabulky (setTableName), ale jde filtrovat podle jineho sloupce? Neco jako „v gridu si vypisuju description“, ale filtrovat chci podle hodnoty id, kde „id“ <⇒ „description“. Je to mozne? Diky.
- michal.lohnisky
- Člen | 64
Ahoj,
chci se zeptat, zda se musí pro každý grid znovu dědit celá třída (asi ano, když je abstract), zda to nejde udělat tak, že bych si vytvořil pouze továrničku, jako se to dá dělat s formuláři. Pokud to ve stávající verzi nejde, napadlo mě následující řešení:
Cílem je možnost používat Grid v presenteru následujícím způsobem:
protected function createComponentGuestControl()
{
/* staré použití:
return new GuestControl($this->context->guests);
*/
// nové použití:
$presenter = $this;
$control = new Grid($this, 'guestControl'); // *** pozn. 1
$control->setDataSource(
new \NiftyGrid\DataSource\NDataSource(
$this->context->guests->findAll()
)
);
$control->setDefaultOrder("name ASC");
$control->addColumn('name', 'Jméno')
->setTextFilter();
$control->addButton("delete", "Odstranit")
->setClass("delete")
->setLink(function($row) use ($presenter){return $presenter->link("guestControlDelete!", $row['id']);})
->setConfirmationDialog(function($row){return "Opravdu chcete smazat hosta $row[firstname] $row[surname]?";});
$control->afterConfig(); // *** pozn. 2
return $control;
}
public function handleGuestControlDelete($id)
{
$this->context->guests->delete($id);
}
*** pozn. 1: Část kódu před řádkem
$this->configure($presenter);
ve funkci attached
by
se přesunula do kontruktoru a proto by musel být rodič znám již
v konstruktoru.
*** pozn. 2: Část kódu po řádku
$this->configure($presenter);
ve funkci attached
by
se přesunula do funkce afterConfig
(pracovní název) a nebo by se
to nějak řešilo přes render
nebo beforeRender
nebo
tak něco.
Výhody které z toho plynou jsou:
- Není potřeba vždy vytvářet nový soubor a do kontruktoru nové třídy předávat všechny potřebné modely. Což je zvlášť výhodné, pokud grid použijete pouze na jednom místě.
Zdá se Vám toto vylepšení přínosné? Případně jaké vidíte nevýhody? Pokud by se to zahrnulo do oficiální verze, kdy by to asi tak bylo na GitHubu?
- MW
- Člen | 626
Zdravím,
poradte me prosim. Mam dva sloupce v gridu OD a DO.
Potrebuji vyselektovat aktivni dle těchto dvou datumu, pricemz DO muze byt
prazdny.. tedy také aktivni.
Jak to nejlepe na tomto gridu resit?
Prednastavene filtry jsem zatím resil v sablone a poslanim pole $args, ale v tomto pripade asi potrebuju upravit tu variantu s prazdnym DO …
Diky!
- mfajfr
- Člen | 26
Ahoj,
měl bych dva dotazy ohledně této komponenty.
Za 1.) Nastavím tabulku do NDataSource (používám notORM) a hlásí mi to
chybu:
Call to undefined method NotORM_Result::getPrimary()
Vyřešil jsem zkomentováním v metodě public function getPrimaryKey()
řádku:
return $this->table->getPrimary();
Za 2.) Poté chci na jednotlivé sloupce nasadit filtry a napíše mi to:
Undefined index:
Vím, co problémy „znamenají“, ale nejsem schopný přijít na řešení.
Předem díky za rady.
btw hledal jsem to tady a nenašel. Kdyby to tu bylo, tak se omlouvám, že to píši znovu.
- mfajfr
- Člen | 26
Nasadím na jakýkoliv sloupec jakýkoliv filter a vyhodí to chybu.
Filtr zadám např. takto:
<?php
$this->addColumn('sellPriceTAX', 'PC (vč. DPH)')
->setRenderer(function($row){
$sellPriceTAX = new VersioPrice($row['sellPriceTAX']);
return $sellPriceTAX->getFormattedPriceWithTax() . ' Kč';
})
->setNumericFilter();
?>
`
Notice
Undefined index:
File: …\libs\NotORM\Row.php Line: 159
149:
150: /** Get value of column
151: * @param string column name
152: * @return string
153: */
154: function offsetGet($key) {
155: $this->access($key);
156: if (!array_key_exists($key, $this->row)) {
157: $this->access($key, true);
158: }
159: return $this->row[$key];
160: }
`
Vidím, že se to zadrhne v notORMu, ale nedokážu si to nějak spojit. Nemůže to mít návaznost s problémem č.1?
- mfajfr
- Člen | 26
Verze je nejnovější. Ještě jsem to pro jistotu znovu stáhl a
nahrál.
Co se týče dotazování, tak by mělo být asi v pořádku, protože, když
udělám výpis (nikoliv do NiftyGrid) stejného dotazu, tak to projde.
Pro jistotu:
<?php
$source = new NiftyGrid\DataSource\NDataSource($this->_priceProducts->select('product.id, catNumber, buyPriceTAX, (buyPriceTAX/1.21) AS buyPrice, sellPriceTAX, (sellPriceTAX/1.21) AS sellPrice, markUp, name, QU, catNumber, address, provider_id, provider.namePder'));
$this->setDataSource($source);
?>
- MW
- Člen | 626
MW napsal(a):
Zdravím,
poradte me prosim. Mam dva sloupce v gridu OD a DO.
Potrebuji vyselektovat aktivni dle těchto dvou datumu, pricemz DO muze byt prazdny.. tedy také aktivni.Jak to nejlepe na tomto gridu resit?
Prednastavene filtry jsem zatím resil v sablone a poslanim pole $args, ale v tomto pripade asi potrebuju upravit tu variantu s prazdnym DO …
Diky!
Nikdo nevi?
- boob
- Člen | 21
zdar,
chcel by som skusit tento datagrid, ale nejako si neviem poradit s instalaciou cez Composer, dostavam vacsinou tuto hlasku
Problem 1
- The requested package nifty/nifty-grid could not be found in any version, there may be a typo in the package name.
skusal som rozne verzie (nasiel som ich kade-tade – packagist, addons.nette, github), ale ani jedna nesla
"nifty/nifty-grid": "*",
"nifty/nifty-grid": "master",
"Niftyx/NiftyGrid": "*",
...
a ak pridam Nette repozitar do Composeru, tak sa neda stiahnut
https://componette.org/search/?q=packages.json
vie mi niekto pomoct?
Dakujem
EDIT // este jedna vec.. na githube je najnovsia verzia alebo ju mam hladat
niekde inde? pretoze vidim, ze je tam 7 months ago
Editoval boob (22. 5. 2013 17:09)
- lovec
- Člen | 13
Z packagist mi to taky nešlo. I když ho tam vidím
https://packagist.org/…y/nifty-grid
Ale funguje z nového addon portálu. Stačí přidat nový addon portál jako repozitory
"repositories": [
{
"type": "composer",
"url": "https://addons2.nette.org/"
}
]
Pak už jen standardně
"nifty/nifty-grid": "dev-master"
- majkl324
- Člen | 13
Mám menší problém NiftyGrid vůbec zprovoznit nechat ho vykreslit nějakou tabulku.
Skončím na této chybě:
Call to undefined method NiftyGrid\DibiFluentDataSource::getPrimary().
HomepagePresenter.php
class HomepagePresenter extends ...
{
....
public function createComponentUsersGrid()
{
return new \AdminModule\UsersGrid(new \NiftyGrid\DibiFluentDataSource(\dibi::select('id, first_name, last_name, nick_name')->from('users'), 'id'));
}
}
UsersGrid
class UsersGrid extends \NiftyGrid\Grid
{
protected $users;
public function __construct($users)
{
parent::__construct();
$this->users = $users;
}
protected function configure($presenter)
{
$source = new \NiftyGrid\NDataSource($this->users);
$this->setDataSource($source);
$this->addColumn('id', 'ID', '150px');
$this->addColumn('first_name', 'First name', '150px');
$this->addColumn('last_name', 'Last name', '150px');
$this->addColumn('nick_name', 'Nick name', '150px');
$this->addColumn('email', 'E-mail', '150px');
$this->addColumn('registration_date', 'Registration Time', '150px');
}
}
Proces ale skončí na $this->setDataSource($source);
Jak se dá tento problém prosím vyřešit? Nikde jsem nenarazil na řešení používající dibi, i když je v dokumentaci v DibiFluent podporováno. Díky
- ryvova
- Člen | 9
MW napsal(a):
Je prosím nějaka možnost, aby validace na vkladaní/editaci probihala stejně, jako u klasickeho formu?
Tedy aby se nezaviral form, jen to vyhodilo hlasku? Ted me to dela to, ze to zavre form a do flashmsg to vypise, ze jste nezadali, ale ostatni spravne vyplneny pole jsou taky pryc…Pouzivam to takto:
$this->getColumnInput('name')->addRule(\Form::FILLED, 'Nezadali jste název.');
Mám stejný problém, víte někdo jak na to?
Díky
- Bedna
- Člen | 7
Prosím Vás, jak je to tedy s ukládáním stavu? Řeším problém, že mám grid ve kterém přejdu na 2 stránku. Poté se překliknu na stránku, kde grid není a vrátím se zpět a chtěl bych, aby byla zobrazená druhá stránka. Moc děkuji za popošťouchnutí.
S uložením všech věcí ohledně gridu nemám problém, problém mám jen se stránkou, snažil jsem se i takto $this->etPaginator()->setPage(2); v attached metodě, ale pak nefungují odkazy na stránkování…
- kbtm
- Člen | 22
Na odkazu : http://www.kbtm.cz/…oad/Grid.zip je „můj“ upravený Grid.php. Příslušná volání session jsou (třeba) kolem 60. řádku, je to tam plné volání debuggeru/firelogu.
Třeba to pomůže …
Neupravoval jste i soubor „grid.js“ pro použití pod „jquery-1.9.1.js“ (tj. pročistit od funkce „live“) ? To mě ještě čeká.
Škoda, že to autor zřejmě pustil – poslední změna je před cca 8 měsíci.
kbtm
- hiny
- Člen | 35
Zdravím, zrovna dnes jsem zmiňovaný soubor grid.js upravoval pro jQuery ve verzi 1.10.1 (1.9+).
Pročistil jsem jej od funkce .live viz. Changes of Note in jQuery 1.9
Zatím to dle testů vypadá, že vše funguje jak má :-)
Tak snad to někomu pomůže a ušetří trochu času. Zde je ke stažení