Nový Nette DataGrid pro Bootstrap s možností vypsat strom
- mesour
- Nette Blogger | 236
Verze 2.0.5 je venku :-)
Změny:
- Opraveno množství chyb v DataSourcech. Hlavně Dibi a Array.
- Opraven bug v defaultním filtru (mizení checkboxů po AJAXu)
- Pro grid byly přidány eventy: onRenderRow, onRenderBody a onRenderHeader, takže je možné nastavit HTML attribut třeba pro <tr> nebo <thead>, <tbody>.
- Přidána možnost nastavit column pro selection. Lze vrátit metodou $grid->getSelectionColumn().
- Opravena chyba se zavíráním defaultních filtrů po vybrání checkboxu
- Opravný bug v custom filtru
- Přidána možnost nastavit rychlé volby pro výběr checkboxů u enableSelection()
- Přidána většina nejdůležitějších testů pro DataSourcy
Rychlé volby pro selection checkboxy je možné vidět zde http://grid.mesour.com/version2/full/#…. Má také metodu addDivider. Výsledek se zobrazí po kliku na šipečku u main checkboxu v hlavičce gridu.
Zde je přehled všech onRender… eventů i s ukázkou dat, která přijdou v parametrech: http://grid.mesour.com/…on2/setting/#…
PS: Sandbox i API byly také aktualizovány.
Editoval mesour (7. 3. 2015 22:08)
- FJP
- Člen | 124
Ahoj, stáhl jsem si 2.0.5 ale pořád mi nejde filtrování.
Je možný, že to je pořadím scriptů?
<script src="{$basePath}/3rd-party/jquery-2.1.3.min.js"></script>
<script src="{$basePath}/3rd-party/bootstrap-3-2-0-dist/js/bootstrap.min.js"></script>
<script src="{$basePath}/3rd-party/jquery.nette.js"></script>
<script src="{$basePath}/3rd-party/jquery.ui.js"></script>
<script src="{$basePath}/js/netteForms.js"></script>
<script src="{$basePath}/js/main.js"></script>
Firebug hlásí ReferenceError: $ is not defined :
…iv').width()+(a.find(‚a‘).length*4))})};$(document).on(‚ready‘,function(){$('.tr…
- mesour
- Nette Blogger | 236
FJP napsal(a):
Ahoj, stáhl jsem si 2.0.5 ale pořád mi nejde filtrování.
Je možný, že to je pořadím scriptů?
<script src="{$basePath}/3rd-party/jquery-2.1.3.min.js"></script> <script src="{$basePath}/3rd-party/bootstrap-3-2-0-dist/js/bootstrap.min.js"></script> <script src="{$basePath}/3rd-party/jquery.nette.js"></script> <script src="{$basePath}/3rd-party/jquery.ui.js"></script> <script src="{$basePath}/js/netteForms.js"></script> <script src="{$basePath}/js/main.js"></script>
Firebug hlásí ReferenceError: $ is not defined :
…iv').width()+(a.find(‚a‘).length*4))})};$(document).on(‚ready‘,function(){$('.tr…
Ahoj, jj, jde o to, že je potřeba načítat jQuery už v hlavičce stránky, pokud požíváš defaultní renderování javascriptů gridu. Takhle to funguje už od počátku věků gridu :-)
- FJP
- Člen | 124
Čau čau,
grid mi jede neskutečně pomalu – ordering i custom filtr, spíš vůbec,
chová se to divně. Nevíte čím to může být?
Většinou se kousne prohlížeč a vyhodí to chybu skriptu …/scripts/jquery.js:452
Používám NetteDbDataSource a v té konkrétní tabulce je cca 400 položek, stránka po 20. Přijde mi, že to by nemělo být až tak náročné.
EDIT: Ještě jedna věc – stalo se mi, že nefunguje btn status – odkaz se vygeneruje, ale nic se po kliknutí neděje. Tak jsem to musel pořešit vcelku prasácky následovně:
$that = $this;
$grid->addText('confirmed', 'Potvrzeno')
->setCallback(function($row) use($that) {
if($row['confirmed'])
return '<a href="?termId=' . $that->termId . '&ident=' . $row['id'] . '&confirmed=0&do=changeConfirmed" class="btn btn-success"><b class="glyphicon glyphicon-ok-circle"></b></a>';
else
return '<a href="?termId=' . $that->termId . '&ident=' . $row['id'] . '&confirmed=1&do=changeConfirmed" class="btn btn-danger"><b class="glyphicon glyphicon-ban-circle"></b></a>';
});
Editoval FJP (2. 4. 2015 8:20)
- ruppy
- Člen | 2
Na začátek, jsem lama a v php nedělám od dob stvoření kola.
Nicméně mám asi podobny problém.
S nette začínám a k php jsem se vrátil po x letech (nebojte neživím se
tím :) Možná by chtělo trochu lepší tutoriál, dva dny jsem strávil na
použití modelu, použití usermanager do teď moc nechápu.. jak si vytvořím
třeba zkušební heslo do db přes ty všechny hashe, mixi a tak?). Grid jsem
ale nakonec rozchodil vcelku snadno. Přidávání, editaci taky. Jen mám
většinu sloupců v něm přes cizí klíč. Zkusil jsem dle jedné části
zde na fóru
<?php protected function createComponentHomeGrid($name) {
$selection = $this->database->table(‚tasks‘)
->select(‚user.user_surname user_id, location.name location_id,
category.cat_name category_id, subtext, lasttime, nexttime‘); ?>
funguje, spojí a vypíše, jen ale nefiltruje přes filter u těchto
sloupců:(
Editoval ruppy (2. 4. 2015 0:04)
- mertljara
- Člen | 4
toto:
$grid->addText('groups_id', 'Skupina')->setCallback(function($row) {
return $this->groupsRepository->get($row['groups_id'])->name;
});
funguje to jak má, jen to přidává zbytečně dotazy do dtb pokaždý. to se mi moc nelibi. jediny co me napadlo je vytáhnout si jednou skupiny, hodit do pole a pak si to zobrazovat.
A nevím jak to zobrazit ve filtru aniž bych si musel delat vlastni sablonu
Editoval mertljara (2. 4. 2015 11:28)
- mesour
- Nette Blogger | 236
mertljara napsal(a):
toto:
$grid->addText('groups_id', 'Skupina')->setCallback(function($row) { return $this->groupsRepository->get($row['groups_id'])->name; });
funguje to jak má, jen to přidává zbytečně dotazy do dtb pokaždý. to se mi moc nelibi. jediny co me napadlo je vytáhnout si jednou skupiny, hodit do pole a pak si to zobrazovat.
A nevím jak to zobrazit ve filtru aniž bych si musel delat vlastni sablonu
Bohužel grid zatím nemá podporu zobrazování názvů z číselníků přes klíč. Takže u filtru je zatím potřeba mít minimálně vlastní formulář.
Je možné si data uložit jak píšeš, například do property presenteru a následně to pak použít v callbacku, asi takto.
$this->all_groups = $this->groupsRepository->getAllPairs(); // returns array where: ID => name
$grid->addText('groups_id', 'Skupina')->setCallback(function($row) {
return $this->all_groups[$row['groups_id']];
//tohle by fungovalo pro PHP >= 5.4
});
//pro PHP <= 5.3
$this->all_groups = $this->groupsRepository->getAllPairs();
$grid->addText('groups_id', 'Skupina')
->setCallback(function($row, $that) {
return $that->all_groups[$row['groups_id']];
})
->setCallbackArgs(array($this));
Editoval mesour (2. 4. 2015 14:17)
- FJP
- Člen | 124
Ahoj, jak můžu udělat z text column odkaz jinak než pomocí callbacku?
$lecturers = $this->context->people->getAllLectors();
$grid->addText('lecturer_id', 'Lector')
->setCallback(function($row) use ($lecturers) {
if (array_key_exists($row['lecturer_id'], $lecturers))
return '<a href="/www/administrace/people/edit/' . $row['lecturer_id'] . '">' . $lecturers[$row['lecturer_id']] . '</a>';
else
return $row['lecturer_id'];
});
Je tam nevýhoda, že nelze použít nettí n:href.
Další pokus byl: V dokumentaci jsou fce setAttributes (už není v api) a setAttribute – ale tu jsem asi špatně pochopil, domníval jsem se, že funguje podobně jako u addButton (ale i tak bych nevěděl, jak tam vepsat id lektora – pouze id daného řádku jako $table_id.
- FJP
- Člen | 124
bezsebesam napsal(a):
svobodai napsal(a):
bezsebesam napsal(a):
svobodai napsal(a):
bezsebesam napsal(a):
Můžu se ještě připomenout s těmi ostatními dotazy, které jsem měl? Bylo to ohledně načtení dat z jiné tabulky přes cizí klíč, šířky sloupců a filtrů.
Ohledně načtení dat z jiné tabulky je to jednoduché pokud používáš NetteDatabase a pokud máš právně udělané tabulky viz database-selection.
Co se týče šířky sloupců tam to musíš řešit přes CSS.Můžeš sem prosím hodit nějakou jednoduchou ukázku ohledně toho provázání tabulek? Díky.
Toto je kód v PHP
$selection = $this->database->table('PlayLists'); $selection->select( 'PlayCount, Pieces.IdPiece IdPiece, Pieces.Name PieceName, Pieces.ISRC , Pieces.OZ ,Pieces.Interprets.Name InterpretName, ' . 'Broadcasts.IdBroadcast IdBroadcast, Broadcasts.Name BroadcastName, ' . 'Broadcasts.Stations.IdStation IdStation, Broadcasts.Stations.Name StationName, ' . 'Broadcasts.Stations.Payers.IdPayer IdPayer, Broadcasts.Stations.Payers.Name PayerName');
a tomu odpovídající SQL
SELECT [PlayCount],[Pieces].[IdPiece] [IdPiece], [Pieces].[Name] [PieceName], [Pieces].ISRC , [Pieces].OZ ,[Interprets].[Name] [InterpretName], [Broadcasts].[IdBroadcast] [IdBroadcast], [Broadcasts].[Name] [BroadcastName], [Stations].[IdStation] [IdStation], [Stations].[Name] [StationName], [Payers].[IdPayer] [IdPayer], [Payers].[Name] [PayerName] FROM [PlayLists] LEFT JOIN [Pieces] ON [PlayLists].[Pieces_IdPiece] = [Pieces].[IdPiece] LEFT JOIN [Interprets] ON [Pieces].[Interprets_IdInterpret] = [Interprets].[IdInterpret] LEFT JOIN [Broadcasts] ON [PlayLists].[Broadcasts_IdBroadcast] = [Broadcasts].[IdBroadcast] LEFT JOIN [Stations] ON [Broadcasts].[Stations_IdStation] = [Stations].[IdStation] LEFT JOIN [Payers] ON [Stations].[Payers_IdPayer] = [Payers].[IdPayer]
To by asi šlo. Díky.
Mě jen zajímalo, jestli neexistuje něco, jako je v Grido metoda setColumn(), viz http://o5.github.io/…tion.cs.html#…
Trošku jsem se tebou inspiroval. Ale složený sql příkaz přes selection select se mi nepovedlo složit. Nakonec jsem to udělal takto:
$selection = $this->db->query('SELECT * FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();
Ale pohořel jsem na následující chybě: Found duplicate columns in
database result set.
Lze to nějak obejít? V tabulce product_lang můžu mít víc stejných
položek se stejným id jako v product. A „id“ měnit už nemůžu.
- svobodai
- Člen | 136
FJP napsal(a):
bezsebesam napsal(a):
svobodai napsal(a):
bezsebesam napsal(a):
svobodai napsal(a):
bezsebesam napsal(a):
Můžu se ještě připomenout s těmi ostatními dotazy, které jsem měl? Bylo to ohledně načtení dat z jiné tabulky přes cizí klíč, šířky sloupců a filtrů.
Ohledně načtení dat z jiné tabulky je to jednoduché pokud používáš NetteDatabase a pokud máš právně udělané tabulky viz database-selection.
Co se týče šířky sloupců tam to musíš řešit přes CSS.Můžeš sem prosím hodit nějakou jednoduchou ukázku ohledně toho provázání tabulek? Díky.
Toto je kód v PHP
$selection = $this->database->table('PlayLists'); $selection->select( 'PlayCount, Pieces.IdPiece IdPiece, Pieces.Name PieceName, Pieces.ISRC , Pieces.OZ ,Pieces.Interprets.Name InterpretName, ' . 'Broadcasts.IdBroadcast IdBroadcast, Broadcasts.Name BroadcastName, ' . 'Broadcasts.Stations.IdStation IdStation, Broadcasts.Stations.Name StationName, ' . 'Broadcasts.Stations.Payers.IdPayer IdPayer, Broadcasts.Stations.Payers.Name PayerName');
a tomu odpovídající SQL
SELECT [PlayCount],[Pieces].[IdPiece] [IdPiece], [Pieces].[Name] [PieceName], [Pieces].ISRC , [Pieces].OZ ,[Interprets].[Name] [InterpretName], [Broadcasts].[IdBroadcast] [IdBroadcast], [Broadcasts].[Name] [BroadcastName], [Stations].[IdStation] [IdStation], [Stations].[Name] [StationName], [Payers].[IdPayer] [IdPayer], [Payers].[Name] [PayerName] FROM [PlayLists] LEFT JOIN [Pieces] ON [PlayLists].[Pieces_IdPiece] = [Pieces].[IdPiece] LEFT JOIN [Interprets] ON [Pieces].[Interprets_IdInterpret] = [Interprets].[IdInterpret] LEFT JOIN [Broadcasts] ON [PlayLists].[Broadcasts_IdBroadcast] = [Broadcasts].[IdBroadcast] LEFT JOIN [Stations] ON [Broadcasts].[Stations_IdStation] = [Stations].[IdStation] LEFT JOIN [Payers] ON [Stations].[Payers_IdPayer] = [Payers].[IdPayer]
To by asi šlo. Díky.
Mě jen zajímalo, jestli neexistuje něco, jako je v Grido metoda setColumn(), viz http://o5.github.io/…tion.cs.html#…Trošku jsem se tebou inspiroval. Ale složený sql příkaz přes selection select se mi nepovedlo složit. Nakonec jsem to udělal takto:
$selection = $this->db->query('SELECT * FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();
Ale pohořel jsem na následující chybě: Found duplicate columns in database result set.
Lze to nějak obejít? V tabulce product_lang můžu mít víc stejných položek se stejným id jako v product. A „id“ měnit už nemůžu.
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as
- FJP
- Člen | 124
svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem as
Pokrok :) díky. Akorát jsem nikde nenašel, jak tohle:
$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();
převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must
be an instance of Nette\Database\Table\Selection, array given, called
in …
Editoval FJP (15. 4. 2015 12:20)
- svobodai
- Člen | 136
FJP napsal(a):
svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem asPokrok :) díky. Akorát jsem nikde nenašel, jak tohle:
$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();
převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …
je to třeba takhle
$selection = $this->database->table('product');
$selection->select(
'product.id, product.code, ' .
'product_lang.id product_lang_id, product_lang.title product_lang_title');
Hodně záleží jak máš navržené tabulky, protože se to tam joinuje automaticky na základě určitých pravidel. Když tak se podívej na NotORM nebo na dokumentaci NeteDatabase
Editoval svobodai (15. 4. 2015 12:29)
- FJP
- Člen | 124
svobodai napsal(a):
FJP napsal(a):
svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem asPokrok :) díky. Akorát jsem nikde nenašel, jak tohle:
$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();
převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …je to třeba takhle
$selection = $this->database->table('product'); $selection->select( 'product.id, product.code, ' . 'product_lang.id product_lang_id, product_lang.title product_lang_title');
Hodně záleží jak máš navržené tabulky, protože se to tam joinuje automaticky na základě určitých pravidel. Když tak se podívej na NotORM nebo na dokumentaci NeteDatabase
No reference found for $product->product_lang … a přitom tam tu vazbu mám. Mohl bys mě prosím konkrétněji nasměrovat v té dokumentaci?
- svobodai
- Člen | 136
FJP napsal(a):
svobodai napsal(a):
FJP napsal(a):
svobodai napsal(a):
Myslím, že budeš muse vypsat v selectu, které sloupce se mají použít. Předpokládám, že máš v každé tabulce ID a to může být problém. budeš muset v select upravit product_lang.id as product_lang_id a pak v gridu budeš pracovat s tím názvem asPokrok :) díky. Akorát jsem nikde nenašel, jak tohle:
$selection = $this->db->query('SELECT product.id, product.code, product_lang.id AS product_lang_id, product_lang.title FROM product LEFT JOIN product_lang ON product.id = product_lang.id')->fetchAll();
převést do selection, teď dostávám tenhle error:
Argument 1 passed to Mesour\DataGrid\NetteDbDataSource::__construct() must be an instance of Nette\Database\Table\Selection, array given, called in …je to třeba takhle
$selection = $this->database->table('product'); $selection->select( 'product.id, product.code, ' . 'product_lang.id product_lang_id, product_lang.title product_lang_title');
Hodně záleží jak máš navržené tabulky, protože se to tam joinuje automaticky na základě určitých pravidel. Když tak se podívej na NotORM nebo na dokumentaci NeteDatabase
No reference found for $product->product_lang … a přitom tam tu vazbu mám. Mohl bys mě prosím konkrétněji nasměrovat v té dokumentaci?
Jak by měly vypadat vbazby mezi tabulkami je popsané v Database table a potom Database Selection. Jinak ti určitě poradí strýček Google.
Editoval svobodai (15. 4. 2015 13:47)
- FJP
- Člen | 124
Ahoj,
udělal jsem si vlastní filtr form:
protected function createComponentUserFilter() {
$form = new Form;
$form->addText('code', 'Kód')->setAttribute('placeholder', 'Kód');
$form->addText('title_cs', 'Název ČJ')->setAttribute('placeholder', 'Název ČJ');
$form->addCheckbox('accreditation', 'Akreditovaný')->setDefaultValue(false);
$form->addCheckbox('certification', 'Certifikovaný')->setDefaultValue(false);
$form->addCheckbox('is_new', 'Nový')->setDefaultValue(false);
$form->addSelect('status_id', 'Status', $this->status)->setPrompt('Status');
$form->addSubmit('filter', 'Filtrovat')->setAttribute('class', 'btn-sm');
$form->addSubmit('reset', 'Reset')->setAttribute('class', 'btn-sm');
return $form;
}
trochu mě zlobí checkboxy – když jsou zaškrnuty, změny se projevují až po F5, jinak to šlape normálně.
- mesour
- Nette Blogger | 236
FJP napsal(a):
Ahoj, jak můžu udělat z text column odkaz jinak než pomocí callbacku?
$lecturers = $this->context->people->getAllLectors(); $grid->addText('lecturer_id', 'Lector') ->setCallback(function($row) use ($lecturers) { if (array_key_exists($row['lecturer_id'], $lecturers)) return '<a href="/www/administrace/people/edit/' . $row['lecturer_id'] . '">' . $lecturers[$row['lecturer_id']] . '</a>'; else return $row['lecturer_id']; });
Je tam nevýhoda, že nelze použít nettí n:href.
Další pokus byl: V dokumentaci jsou fce setAttributes (už není v api) a setAttribute – ale tu jsem asi špatně pochopil, domníval jsem se, že funguje podobně jako u addButton (ale i tak bych nevěděl, jak tam vepsat id lektora – pouze id daného řádku jako $table_id.
1.
Odkaz uděláš nejlíp tak, že použiješ Column\Text, který bude
v callbacku vracet instanci Buttonu. V tom případě bys tam musel nějak
dostat presenter, což bys musel i tak, když by jsi chtěl dělat link. Což
je možné, ale přemýšlím, že by se na to dal upravit sloupec Actions, pak
by jen Buttonu vždy stačilo pro každý řádek měnit text a link :-)
2.
Třeba classu podle ID řádku nastavíš přes onRender metody: http://grid.mesour.com/…on2/setting/#…. Ale pozor je
tam vždy jen jedna instance sloupce. Takže to co změníš na jednom řádku
se promítne do dalších následujících, pokud to neošetříš.
Editoval mesour (17. 4. 2015 15:35)
- kralik
- Člen | 230
Ahoj,
používáte někdo označování řádku přes $grid->onRenderRow[]
v závislosti na hodnotě proměnné?
Snažím se jej použít, ale nedaří se mi.
Dostávám hlášku
<?php
Argument 1 passed to App\Presenters\HomePresenter::App\Presenters\{closure}() must be an instance of App\Presenters\Mesour\DataGrid\Render\Row, instance of Mesour\DataGrid\Render\Table\Row given
?>
Nemáte prosím někdo funkční řešení, na webu MesourGridu jsem
nenašel.
Moc díky
Díky
- mesour
- Nette Blogger | 236
kralik napsal(a):
Ahoj,
používáte někdo označování řádku přes $grid->onRenderRow[] v závislosti na hodnotě proměnné?
Snažím se jej použít, ale nedaří se mi.
Dostávám hlášku<?php Argument 1 passed to App\Presenters\HomePresenter::App\Presenters\{closure}() must be an instance of App\Presenters\Mesour\DataGrid\Render\Row, instance of Mesour\DataGrid\Render\Table\Row given ?>
Nemáte prosím někdo funkční řešení, na webu MesourGridu jsem nenašel.
Moc díkyDíky
Ahoj někde tam máš špatný namespace, takže ti asi chybí alespoň „use Mesour;“. App\Presenters\Mesour\DataGrid\Render\Row je špatně, je to \Mesour\DataGrid\Render\Row, potom to půjde, protože Mesour\DataGrid\Render\Table\Row dědí od Redner\Row.
- mesour
- Nette Blogger | 236
Po delší prodlevě je v2.0.6 venku :-)
Změny:
- Fixnutý default filter – otevření dropdownu se nyní ukládá do cookies přes JS → byl odstraněn zbytečný request na server
- Trochu poupraveny default filtry, například skrytí při kliku kdekoliv na stránku
- Přidán button pro reset default filtru
- Pager se nyní zobrazuje jen pokud je více stránek než 1
- Přidána metoda setDisabled pro DropDown a Button
- Fixnutá hodnota 0 v defaultním filtru – 0 se nezobrazovala
- Pro vlastní sloupce s filtrem a sortováním stačí pouze podědit od Columns\BaseOrdering nebo Columns\Filter. Columns\Filter je abstraktní a její potomci musejí mít metodu getTemplateFile.
- Přidán strip_tags pro exportované hodnoty
- Upraveny názvy JS a přesunuto do složky public/
- Celé JS zrevidovány a trochu upraveny
Byl také přidán Travis CI: https://travis-ci.org/mesour/DataGrid
PS:
Zvažuji pro verzi 2.1.+ oddělit DropDown a Button jako samostatný composer
package a DataGrid ho bude pouze požadovat. Stejně tak ArrayManager pro
ArrayDataSource se bude nejspíš instalovat zvlášť.
DropDown a Button by pak mělo být možné použít i mimo Nette. Pro Nette tam bude pouze implementace Linku.
Dnes byl grid nainstalován po tisícé :-)
Editoval mesour (6. 5. 2015 23:49)
- mesour
- Nette Blogger | 236
FJP napsal(a):
mesour napsal(a):
FJP napsal(a):
Ahoj,
udělal jsem si vlastní filtr form:// ...
trochu mě zlobí checkboxy – když jsou zaškrnuty, změny se projevují až po F5, jinak to šlape normálně.
Na ty checkboxy se podívám.
Ahoj, nekoukal jsi na to?
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.
- FJP
- Člen | 124
mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.
Supr, díky mrknu na to.
mesour napsal(a):
Odkaz uděláš nejlíp tak, že použiješ Column\Text, který bude v callbacku vracet instanci Buttonu. V tom
případě bys tam musel nějak dostat presenter
Mohl bys prosím nastínit, jak na to? Včetně dostání presenteru do sloupce. Nebo jestli to je někde v dokumentaci asi jsem to z toho nepochopil.
Editoval FJP (7. 5. 2015 17:05)
- mesour
- Nette Blogger | 236
FJP napsal(a):
mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.Supr, díky mrknu na to.
mesour napsal(a):
Odkaz uděláš nejlíp tak, že použiješ Column\Text, který bude v callbacku vracet instanci Buttonu. V tom
případě bys tam musel nějak dostat presenterMohl bys prosím nastínit, jak na to? Včetně dostání presenteru do sloupce. Nebo jestli to je někde v dokumentaci asi jsem to z toho nepochopil.
Asi takto v PHP 5.4+. Můžu normálně použít this nebo přes use
$grid->addText('name', 'Name')
->setCallback(function() {
$button = new Components\Button(array(), $this);
$button->setButtonClasses(''); // nastavím žádnou nebo vlastní classu
// případně další nastavení
return $button; // má metodu __toString, takže mohu vrátit instanci
});
V PHP 5.3 takto:
$grid->addText('name', 'Name')
->setCallback(function($data, $that) {
$button = new Components\Button(array(), $that);
$button->setButtonClasses(''); // nastavím žádnou nebo vlastní classu
// případně další nastavení
return $button; // má metodu __toString, takže mohu vrátit instanci
})
->setCallbackArguments(array($this));
Jen pro info tak předběžně. Od verze 2.1 už asi Grid nebude podporovat PHP 5.3 ale pouze 5.4 a vyšší. Je to jen předpoklad, takže ještě přesné info napíši při vydání 2.1 :-)
- kralik
- Člen | 230
Ahoj,
lidi prosím nesetkali jste se s problémem při řazení s používáním
NetteDatabase a MS SQL.
Při kliknutí v MesourDataGridu na sloupec pro řazení se objeví tato
hláška.
<?php
SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]A column has been specified more than once in the order by list. Columns in the order by list must be unique.
?>
Query
<?php
SELECT [Actions].[Id],[Sector].[Name] [Sector],[Problems].[Id] [ProblemId],[Problems].[Subject]
[Subject],[Actions].[DescriptionCz],[Actions].[DescriptionEn],[Actions].[Pilot],
[Actions].[ALevel],[Actions].[WeekDeadline], [Status].[Id] [StatusId], [Status].[Name]
[Status],[Actions].[Created],[User].[SureName] [UserAddName], ABS([Workload].T20) [Nar]
FROM [Actions]
LEFT JOIN [Sector] ON [Actions].[Sector_Id] = [Sector].[Id]
LEFT JOIN [Problems] ON [Actions].[Problems] = [Problems].[Id]
LEFT JOIN [Status] ON [Actions].[Status] = [Status].[Id]
LEFT JOIN [User] ON [Actions].[AddUser] = [User].[Id]
LEFT JOIN [Workload] ON [Actions].[Workload_Id] = [Workload].[Id]
WHERE (YEAR([Actions].[DateDeadline]) = '2015') AND ([Actions].[Pilot] IN (1)) AND
([Actions].[Status] IN (1, 2))
ORDER BY [WeekDeadline], [WeekDeadline] ASC
?>
Zjistil jsem, že v QUERY je navíc v ORDER BY ten sloupec, na který se klikne pro řazení.
Query která je plně funkční
<?php
SELECT [Actions].[Id],[Sector].[Name] [Sector],[Problems].[Id] [ProblemId],[Problems].[Subject]
[Subject],[Actions].[DescriptionCz],[Actions].[DescriptionEn],[Actions].[Pilot],
[Actions].[ALevel],[Actions].[WeekDeadline], [Status].[Id] [StatusId], [Status].[Name]
[Status],[Actions].[Created],[User].[SureName] [UserAddName], ABS([Workload].T20) [Nar]
FROM [Actions]
LEFT JOIN [Sector] ON [Actions].[Sector_Id] = [Sector].[Id]
LEFT JOIN [Problems] ON [Actions].[Problems] = [Problems].[Id]
LEFT JOIN [Status] ON [Actions].[Status] = [Status].[Id]
LEFT JOIN [User] ON [Actions].[AddUser] = [User].[Id]
LEFT JOIN [Workload] ON [Actions].[Workload_Id] = [Workload].[Id]
WHERE (YEAR([Actions].[DateDeadline]) = '2015') AND ([Actions].[Pilot] IN (1)) AND
([Actions].[Status] IN (1, 2))
ORDER BY [WeekDeadline] ASC
?>
Asi to nebude problém v MesourDataGridu, ale někde v samotném Nette, ale
zkoušel jsem různé verze 2.2.3, 2.2.9 i aktuální 2.3.2.
Verze PHP je 5.4.16.
Pokaždé se to chová stejně, tedy výše uvedená chyba.
Prosím poraďte.
Díky
Tom
EDIT: Zjistil jsem, že SqlBuilder.php složí správnou query „SELECT TOP 60 id,name,role,skupina,manufactory FROM [users] ORDER BY name ASC“, ale pravděpodobně JS někde v mesaour datagridu přidá do order ještě ten samý sloupec a tím způsobí chybu.
Bohužel jsem nenašel kde je funkce ketrá se volá pro ordering v mesouru.
Řešil jste někdo podobný bug?
Díky
Editoval kralik (26. 6. 2015 13:22)
- FJP
- Člen | 124
mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.
Pustil jsem se do updatu a zjistil jsem, že checboxy se nyní nezobrazují a filtr vůbec nereaguje (cookies i cache jsem promazal, 2.0.5ka mi filtrovala ok). Stránkování, ordering etc. šlape dobře
Editoval FJP (12. 5. 2015 11:10)
- mesour
- Nette Blogger | 236
FJP napsal(a):
mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.Pustil jsem se do updatu a zjistil jsem, že checboxy se nyní nezobrazují a filtr vůbec nereaguje (cookies i cache jsem promazal, 2.0.5ka mi filtrovala ok). Stránkování, ordering etc. šlape dobře
A updatoval jsi JavaScripty? Právě, že přesně u checkboxů a filtru jsem měnil celou inicializaci a u stránkování a orderingu to zůstalo stejné.
- FJP
- Člen | 124
mesour napsal(a):
FJP napsal(a):
mesour napsal(a):
Ahoj, verze 2.0.6 by to měla řešit :-) Kdyby se i tak vyskytl problém, tak piš.Pustil jsem se do updatu a zjistil jsem, že checboxy se nyní nezobrazují a filtr vůbec nereaguje (cookies i cache jsem promazal, 2.0.5ka mi filtrovala ok). Stránkování, ordering etc. šlape dobře
A updatoval jsi JavaScripty? Právě, že přesně u checkboxů a filtru jsem měnil celou inicializaci a u stránkování a orderingu to zůstalo stejné.
Skripty by měly být ok. Hlásí to tuhle chybu: "":https://onedrive.live.com/redir?…
- mesour
- Nette Blogger | 236
FJP napsal(a):
Skripty by měly být ok. Hlásí to tuhle chybu: "":https://onedrive.live.com/redir?…
Jasně, byl tam bug. Díky za report :-) Je to opravené v dev-master.
Určitě jsi měl tu chybu na gridu, kde byl použitý custom filter form ne?
- FJP
- Člen | 124
mesour napsal(a):
FJP napsal(a):
Skripty by měly být ok. Hlásí to tuhle chybu: "":https://onedrive.live.com/redir?…
Jasně, byl tam bug. Díky za report :-) Je to opravené v dev-master.
Určitě jsi měl tu chybu na gridu, kde byl použitý custom filter form ne?
Taky díky, už to funguje ;) jj custom filter tam byl.
- kralik
- Člen | 230
Ahoj lidi,
podařilo se někomu rozjet filtrování?
Bohužel mě se rozjet filtrování nedaří.
Mám tím na mysli custom filter.
Dostávám chybu:
<?php
TypeError: mesour.dataGrid.gridUsers is undefined
<script>mesour.dataGrid["gridUsers"].filterValues = [];</script>
?>
Kód jsem vůči webu http://grid.mesour.com/version2/full/ kontroloval, ale
nemůžu na to přijít.
Stáhnul jsem si i grid skrze composer a nic.
Díky za pomoc
- mesour
- Nette Blogger | 236
kralik napsal(a):
Ahoj lidi,
podařilo se někomu rozjet filtrování?Bohužel mě se rozjet filtrování nedaří.
Mám tím na mysli custom filter.Dostávám chybu:
<?php TypeError: mesour.dataGrid.gridUsers is undefined <script>mesour.dataGrid["gridUsers"].filterValues = [];</script> ?>
Kód jsem vůči webu http://grid.mesour.com/version2/full/ kontroloval, ale nemůžu na to přijít.
Stáhnul jsem si i grid skrze composer a nic.Díky za pomoc
Zkus si stáhnout dev-master.
- kralik
- Člen | 230
mesour napsal(a):
kralik napsal(a):
Ahoj lidi,
podařilo se někomu rozjet filtrování?Bohužel mě se rozjet filtrování nedaří.
Mám tím na mysli custom filter.Dostávám chybu:
<?php TypeError: mesour.dataGrid.gridUsers is undefined <script>mesour.dataGrid["gridUsers"].filterValues = [];</script> ?>
Kód jsem vůči webu http://grid.mesour.com/version2/full/ kontroloval, ale nemůžu na to přijít.
Stáhnul jsem si i grid skrze composer a nic.Díky za pomoc
Zkus si stáhnout dev-master.
Ahoj,
ano dev-master pomohla, plně funkční.
Díky
Tom
- kralik
- Člen | 230
Ahoj,
chtěl bych požádat jak elegantně řešit (řešíte) inline editaci záznamu
ID další tabulky.
Tabulka akce: id,nazev,sektor_id (1,Test,1)
Tabulka sektor: id,nazev (1,Kuchyně)
Mám DataGrid s pohledem na Akce, tedy 1,Test, Kuchyně a chtěl bych inline
editovat sloupec Sektor.
Aby jsem záznam rozklikl a objevil se select box s hodnotami pro výběr.
Toto by bylo super.
Řešíte to nějak?
Díky
- fronty
- Člen | 16
Ahoj,
prvně velké díky @mesour za výborný plugin, vadila mi na něm ale
absence podpory nette.ajax.js
od @VojtěchDobeš, nad kterým mám postavených několik extensions,
jako např. zobrazení loaderu, který chci zobrazovat i při přenačítání
tabulky.
Řešením je úprava inicializace nette.ajax.js, prvně je potřeba odepnout
defaultní handler a pak připnout handler z nette.ajax.
Jednoduše místo:
<script>
$.nette.init();
</script>
inicializujte:
<script>
$.nette.init(function (ajaxHandler) {
$(document)
.off('click.mesour-ajax') // Unbind default handler
.off('.nette') // Unbind previously binded .nette handler
.on('click.nette', 'a.ajax,a.mesour-ajax', ajaxHandler); // Bind nette.ajax handler
});
</script>
Ještě hezčím řešením je v továrničce komponenty vypnutí CSS a JS, které jsou vkládány přímo do HTML <body>, což se mi minimálně v případě CSS vůbec nelíbí. Bootstrap styl zůstane zachován, ve vlastním CSS je potřeba si jen pohrát se zobrazováním ikon smyslu seřazení v hlavičce tabulky. Po vypnutí JS není potřeba odepínat defaultní .mesour-ajax handler. Odstaněním JS se zruší podpora pokročilejších funkcí gridu (drag'n'drop apod.), ale pro jednoduchý setříditelný a stránkovatelný grid to stačí.
<?php
Mesour\DataGrid\Grid::disableJsDraw();
Mesour\DataGrid\Grid::disableCssDraw();
?>
- Phalanx
- Člen | 310
Ahoj, chtěl bych se zeptat jak je možné udělat odkaz na jiný server v Actions. Potřebuju tam použít $row a setCallback u metody addButton není.
Ukázka: http://www.jinyserver.cz/{$row[‚identifier‘]}
V dokumentaci jsem řešení nenašel
http://grid.mesour.com/…umn/actions/
- mesour
- Nette Blogger | 236
Phalanx napsal(a):
Ahoj, chtěl bych se zeptat jak je možné udělat odkaz na jiný server v Actions. Potřebuju tam použít $row a setCallback u metody addButton není.
Ukázka: http://www.jinyserver.cz/{$row[‚identifier‘]}
V dokumentaci jsem řešení nenašel
http://grid.mesour.com/…umn/actions/
Ahoj link má metodu setUseNetteLink nebo konstantu USE_NETTE_LINK. Tím pádem se pak link nepřekládá pomocí metody link na presenteru.
- mesour
- Nette Blogger | 236
fronty napsal(a):
Ahoj,
prvně velké díky @mesour za výborný plugin, vadila mi na něm ale absence podpory nette.ajax.js od @VojtěchDobeš, nad kterým mám postavených několik extensions, jako např. zobrazení loaderu, který chci zobrazovat i při přenačítání tabulky.
Řešením je úprava inicializace nette.ajax.js, prvně je potřeba odepnout defaultní handler a pak připnout handler z nette.ajax. Jednoduše místo:<script> $.nette.init(); </script>
inicializujte:
<script> $.nette.init(function (ajaxHandler) { $(document) .off('click.mesour-ajax') // Unbind default handler .off('.nette') // Unbind previously binded .nette handler .on('click.nette', 'a.ajax,a.mesour-ajax', ajaxHandler); // Bind nette.ajax handler }); </script>
Ještě hezčím řešením je v továrničce komponenty vypnutí CSS a JS, které jsou vkládány přímo do HTML <body>, což se mi minimálně v případě CSS vůbec nelíbí. Bootstrap styl zůstane zachován, ve vlastním CSS je potřeba si jen pohrát se zobrazováním ikon smyslu seřazení v hlavičce tabulky. Po vypnutí JS není potřeba odepínat defaultní .mesour-ajax handler. Odstaněním JS se zruší podpora pokročilejších funkcí gridu (drag'n'drop apod.), ale pro jednoduchý setříditelný a stránkovatelný grid to stačí.
<?php Mesour\DataGrid\Grid::disableJsDraw(); Mesour\DataGrid\Grid::disableCssDraw(); ?>
Ahoj. nette.ajax.js je v plánu zapracovat, jen jsem se k tomu zatím nedostal a zatím nebudu slibovat, kdy se dostanu.
- mesour
- Nette Blogger | 236
kralik napsal(a):
Ahoj,
chtěl bych požádat jak elegantně řešit (řešíte) inline editaci záznamu ID další tabulky.Tabulka akce: id,nazev,sektor_id (1,Test,1)
Tabulka sektor: id,nazev (1,Kuchyně)Mám DataGrid s pohledem na Akce, tedy 1,Test, Kuchyně a chtěl bych inline editovat sloupec Sektor.
Aby jsem záznam rozklikl a objevil se select box s hodnotami pro výběr.Toto by bylo super.
Řešíte to nějak?
Díky
Tohle už mám udělané v nové plánované verzi 2.2. Zapracuji i do současné verze, viz komnetář pod tímto. Bude to pak fungovat tak, že na DataSourcu se nastaví přes metodu setRelation relace na daný sloupec + tabulka a tak. Grid pak už sám pozná, že se jedná o relaci, zobrazí správně data z číselníku a rovnou funguje i inline editace. Funguje to pak i pro ArrayDataSource.
Editoval mesour (7. 7. 2015 14:12)
- mesour
- Nette Blogger | 236
Zdravím všechny, jen pro info. Plánuji verzi 2.2.0 Už je skoro připravená, chybí mi pouze udělat sloupec Template, zapracovat SubGridy a udělat deprecated classu dědící od Nette\…\Control.
Jde o to, že od verze 2.2 už nebude grid vůbec závislý na Nette a bude rozdělený na více composer balíčků. Pro link a session přibudou nějaké bridge, časem pak minimálně ještě pro Symphony, ale půjde použít i na čistém PHP 5.4+ s ext json. Pak plánuji ještě (bug fixy a menší nové nejnutnější featury) verze 2.1.x minimálně ještě půl roku, možná rok, ale to se ještě uvidí, v každém případě dám včas vědět, jak to přesně bude.
Snad na každé části gridu bude něco vylepšené, přidané a někde i opravené maličkosti, kterých si doteď ani nikdo nevšiml nebo o nich nenapsal.
Ještě bych se chtěl omluvit všem za aktivitu v poslední době. Dost mě už urgujete i na mailu a já prostě nestíhám občas ani všem odepisovat, za to se omlouvám. Mám ale všechny maily označené a zpětně odpovím na všechny. Měl jsem teď takové hodně hektické období, ale už se to pomalu uklidnilo, takže v průběhu července už bych to chtěl zase trochu posunout. Neříkám, že do konce července vyjde nová desetinková verze, ale alespoň nějaké opravy a menší nové featury na současné verzi by teoreticky mohly přijít, ale nic neslibuji :-)
Hlavně tedy budu jako první zapracovávat podporu nette.ajax.js od @VojtěchDobeš a podporu relací na číselníky pro editaci a vykreslení do sloupce Text.
Díky všem za trpělivost :)
Editoval mesour (7. 7. 2015 14:18)
- jEhLa
- Člen | 70
Ve verzi 2.0.6 asi stejná chyba:
https://forum.nette.org/…vypsat-strom?p=6
FJP napsal(a):
Ahoj,
čučím do toho jako vůl… vidíte někdo chybu? Filtrování vůbec nechce reagovat. Díky za pomoc.
protected function createComponentUsersDataGrid($name) { $selection = $this->context->users->findAll(); $source = new NetteDbDataSource($selection); $table_id = 'id'; $grid = new Grid($this, $name); $grid->setLocale('cs'); $grid->setPrimaryKey($table_id); $grid->setDataSource($source); $grid->enableFilter($this['userFilter']); // here set your form component $filter_values = $grid->getFilterValues(); // get values from filter // using custom filtering if (empty($filter_values) === FALSE) { if (isset($filter_values['name_surname']) && !empty($filter_values['name_surname'])) { $source->where('CONCAT(first_name, " ", last_name) LIKE ?', '%' . $filter_values['name_surname'] . '%'); } if (isset($filter_values['email']) && !empty($filter_values['email'])) { $source->where('email LIKE ?', '%' . $filter_values['email'] . '%'); } if (isset($filter_values['id']) && !empty($filter_values['id'])) { $source->where('id = ?', $filter_values['id']); } } (...) } protected function createComponentUserFilter() { $form = new Form; $form->addText('id', 'ID')->setAttribute('placeholder', 'ID'); $form->addText('name_surname', 'Jméno, příjmení')->setAttribute('placeholder', 'Jméno, příjmení'); $form->addText('email', 'E-mail')->setAttribute('placeholder', 'E-mail'); $form->addSubmit('filter', 'Filtrovat'); $form->addSubmit('reset', 'Reset'); return $form; }
A u defaultního filtru se mi nerozbalují dropdowny a nereaguje ani tlačítko RESET.
Po použití defaultního filtru, nedojde k vyhledání. Ani následně filter nejde znovu otevřít. Nefunguje RESET.
Když jsem si zkusil udělat UserFilter, neodesílá se ajaxem a proměnná $filter_values zůstává prázdným polem.
- mesour
- Nette Blogger | 236
jEhLa napsal(a):
Ve verzi 2.0.6 asi stejná chyba:
https://forum.nette.org/…vypsat-strom?p=6FJP napsal(a):
Ahoj,
čučím do toho jako vůl… vidíte někdo chybu? Filtrování vůbec nechce reagovat. Díky za pomoc.
protected function createComponentUsersDataGrid($name) { $selection = $this->context->users->findAll(); $source = new NetteDbDataSource($selection); $table_id = 'id'; $grid = new Grid($this, $name); $grid->setLocale('cs'); $grid->setPrimaryKey($table_id); $grid->setDataSource($source); $grid->enableFilter($this['userFilter']); // here set your form component $filter_values = $grid->getFilterValues(); // get values from filter // using custom filtering if (empty($filter_values) === FALSE) { if (isset($filter_values['name_surname']) && !empty($filter_values['name_surname'])) { $source->where('CONCAT(first_name, " ", last_name) LIKE ?', '%' . $filter_values['name_surname'] . '%'); } if (isset($filter_values['email']) && !empty($filter_values['email'])) { $source->where('email LIKE ?', '%' . $filter_values['email'] . '%'); } if (isset($filter_values['id']) && !empty($filter_values['id'])) { $source->where('id = ?', $filter_values['id']); } } (...) } protected function createComponentUserFilter() { $form = new Form; $form->addText('id', 'ID')->setAttribute('placeholder', 'ID'); $form->addText('name_surname', 'Jméno, příjmení')->setAttribute('placeholder', 'Jméno, příjmení'); $form->addText('email', 'E-mail')->setAttribute('placeholder', 'E-mail'); $form->addSubmit('filter', 'Filtrovat'); $form->addSubmit('reset', 'Reset'); return $form; }
A u defaultního filtru se mi nerozbalují dropdowny a nereaguje ani tlačítko RESET.
Po použití defaultního filtru, nedojde k vyhledání. Ani následně filter nejde znovu otevřít. Nefunguje RESET.
Když jsem si zkusil udělat UserFilter, neodesílá se ajaxem a proměnná $filter_values zůstává prázdným polem.
Použij dev-master viz: https://forum.nette.org/…vypsat-strom?p=7