Grido – DataGrid pro Nette
- o5
- Člen | 416
kolsi napsal(a):
Jak byste nejlépe vyřešili situaci, kdy máte ve sloupci nějaký HTML kód, který chcete zobrazit? Napadá mě použít setCustomRender, kde ten text přeformátuju, ale problém je, že filtrování a řazení nadále bude počítat i s těmi HTML tagy.
Nevim co presne resis, ale Grido nedela nic jinyho, nez ze sklada sql dotaz ktery se pak odesle do db. Tedy tohle co tady pises nesouvisi s Grido. Opakuji ze z toho co jsi napsal se neda zjistit co resis, ale mozna by stacilo pridat sloupec ktery bude obsahovat surova data (bez html) a podle toho budes filtrovat/radit.
- kolsi
- Člen | 131
No jde mi přesně o toto:
- uživatel může ke každé položce napsat krátký popis
- v tomto popisu může použít i HTML tagy (používám WYSIWYG editor, použít se můžou jen určité tagy)
- náhled tohoto popisu se zobrazuje i v seznamu položek (Grido)
Takže napíšu třeba popis <b>Tučný text</b>. V Gridu pak ale vidím tyto tagy (a ne tučný text), což chápu, takže přes setCustomRender si to naformátuju podle sebe (buď podle tagů „natučním“, nebo tagy odfiltruju). Jenže když pak do filtru napíšu „b“, tak bude vyhovovat i tahle položka, protože tam je <b>.
Chápu, proč to dělá. Spíš mě zajímá, jestli to už někdo neřešil a nemá nějaké elegantní řešení.
- kolsi
- Člen | 131
Tak je v celku fuk jestli použiju HTML, Texy nebo nějaký svoje tagování. To, co jsem se snažil vyřešit bylo, aby filtrování/našeptávání/řazení bralo v úvahu nějak naformátovaný text (např. ořezaný o ty tagy).
btw chybka v Grido.js – pokud mám na jedné stránce vícekrát Grido, kde oba obsahují sloupec se stejným názvem a v tom druhém je zapnutá editace (v prvním není), tak to nefunguje, protože při pokusu o editaci se to pokusí vzít URL handler z toho prvního. Bude to chybka při používání jQuery selectorů (vezme se první nalezený element, nikoli ten, který patří požadovanému objektu).
- abc
- Člen | 92
@LuDe:
Pokud se nepletu, tak by melo stacit prilinkovat:
<script src="https://cdn.rawgit.com/o5/grido/1a4f1e5/client-side/js/grido.js"></script>
<script src="https://cdn.rawgit.com/o5/grido/1a4f1e5/client-side/js/plugins/grido.datepicker.js"></script>
<script src="https://cdn.rawgit.com/o5/grido/1a4f1e5/client-side/js/plugins/grido.typeahead.js"></script>
<script src="https://cdn.rawgit.com/o5/grido/1a4f1e5/client-side/js/plugins/grido.history.js"></script>
<script src="https://cdn.rawgit.com/o5/grido/1a4f1e5/client-side/js/plugins/grido.nette.ajax.js"></script>
- flexroad
- Člen | 117
Ahoj. Funguje inline editace? Koukam na demo a moc to tak nevypada?
Diky za info.
o5 napsal(a):
Release 2.0
Intro:
Před skoro měsícem mi přišel email od @Jakub Kopřiva, že si má v rámci předmětu ve škole vybrat projekt, do kterého bude v průběhu semestru přispívat. Jsem rád, že si vybral právě Grido a pustil se do implementace inline editace, po které bylo tolik voláno. Ještě před rokem a půl jsem se na možnou inline editaci v Gridu díval skepticky, ale zřejmě díky Admineru (kde ji často využívám) jsem změnil názor a tak jsem tomu mohl dát volný průběh. Současná implementace je výsledkem ‚párového programování‘, protože jsem si neustále vymýšlel něco nového anebo to Jakubovi rozbíjel pod rukama :))
Inline editace:
Hlavní novinka verze, přejděme na use case. Vypadá váš grid nějak takto? Tedy používá výchozí sloupce, Nette Database a rádi byste přidali inline editaci? Pohodlně se usaďte, protože tenhle běžný požadavek uděláte v Grido 2.0 takhle jednoduše: $grid->setEditableColumns()! Pokud totiž jako datasource používate NDB je to skutečně takto jednoduché, protože metoda update() je implementovaná přímo v Grido\DataSources\NetteDatabase. V rámci jednoduchosti jsem se rovněž rozhodl, že ve většině případů při inline editaci dostačuje input type text. Občas je ale potřeba použít něco jednoznačnějšího, třeba selectbox, pro tuto situaci je tu $column->setEditableControl(). Inline editace tedy pokračuje v trendu, který charakterizuje celé Grido – minimum kódu, pro naprosto běžné požadavky při tvorbě výpisu položek.
Pro ostatní datasource se nám takto jednoduše metoda update() nepodařila naimplementovat, takže vám nezbyde nic jiného než nastavit vlastní callback a to jako první parametr metody $grid->setEditableColumns(). Toť asi vše, na další dotazy by měla odpovědět dokumentace nebo demo. Raději ještě upozorňuji, že je potřeba udělat update i klientské části (grido.js, grido.css).
Další minor věci:
- Columns: Label nyní může být i objekt \Nette\Utils\Html (Issue 116)
- Columns: Odebral jsem „cool url sorting representation“ (↑/↓) protože to v Safari nefungovalo (Issue 123)
- Client-side script: Snad už konečné vyřešení problému s nette.ajax.js vs grido confirm (Issue 114)
- DataSources\Doctrine: vylepšení Doctrine Paginator (Issue 125)
- Podpora Nette 2.2
Outro:
Od doby co jsem zveřejnil Grido, se objevilo pár lidí, co chtěli přispět na vývoj. Stěžovali si na absenci donate buttons apod. Nyní by již neměl být problém, donate buttons jsem přidal na stránky projektu :)) Vyjádřít dík se ale dnes nechá i pomocí Github star, takže rovněž můžete učinit i třeba takto :P
Enjoy!
- Pavel Kravčík
- Člen | 1195
2.3.1, 2.3.2 a dnes i 2.3.3 fungují bez problémů. Jediná změna, že když chci použít setRemmemberState(), tak to musím připojit k presenteru.
protected function createComponentNeuhrazenoGrido($name)
{
$grid = new \Grido\Grid($this, $name);
}
- oskarmaniak
- Člen | 29
Ahoj, neřešil někdo problém kdy kombinace nejnovějšího nette 2.3.x a Grido poslední nefunguje našeptávání filtru
setSuggestion()?
V nette 2.0.12 mi to fungovalo, jen po výměně nette nefunguje, ani při následovným updatu Grido na nejnovější verzi stále nefunguje.
Zdroj dat je nette datasource
Dík za případné nasměrování.
Update:
- Html kódu chybí skryté inputy
- ID inputu se v novém nette skládá jinak
frmform-filters-fullname
frm-viewUsers-form-filters-fullname
- Zjistil jsem, že v novém nette nedojde k zavolání ajaxu url k vrácení dat pro našeptávání.
Editoval oskarmaniak (27. 6. 2015 23:08)
- Pavel Kravčík
- Člen | 1195
@rumcais1:
->setCustomRender(function($row){
return $row->column1 . ' ' . $row->column2 . ' ' . $row->column3;
});
http://o5.github.io/…tion.cs.html#…
Ale hůře se to používá pro suggestion.
- TomasG
- Člen | 23
Ahoj,
Mám zprovozněné Grido, ale mám problémy s JS soubory.
Mám přilinkované tyto scripty v tomto pořadí:
<script src="{$basePath}/js/jquery.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
<script src="{$basePath}/js/grido/grido.js"></script>
<script src="{$basePath}/js/grido/grido.nette.ajax.js"></script>
Neháže to žádnou chybu, ale nefunguje mi řazení, filtrování,
setConfirm atd.
Ajaxové požadavky se vůbec neposílají.
Tuší/ví někdo čím to může být? :o)
Díky
Editoval TomasG (16. 7. 2015 11:21)
- Šaman
- Člen | 2659
TomasG napsal(a):
Ahoj,
Mám zprovozněné Grido, ale mám problémy s JS soubory.Mám přilinkované tyto scripty v tomto pořadí:
<script src="{$basePath}/js/jquery.js"></script> <script src="{$basePath}/js/nette.ajax.js"></script> <script src="{$basePath}/js/grido/grido.js"></script> <script src="{$basePath}/js/grido/grido.nette.ajax.js"></script>
Neháže to žádnou chybu, ale nefunguje mi řazení, filtrování, setConfirm atd.
Ajaxové požadavky se vůbec neposílají.Tuší/ví někdo čím to může být? :o)
Díky
A AJAX ti mimo Grido funguje, resp. máš ho inicializovaný v nějakém
main.js
?
Mám na mysli
$(function () {
$.nette.init();
});
Editoval Šaman (16. 7. 2015 11:42)
- Pavel Janda
- Člen | 977
Zdravím,
bylo by možné uvádět v composer.json už pouze jednotlivé rozdělené repos? Myslím ze strany o5/grido.
Editoval Beton (17. 7. 2015 11:30)
- pekinen
- Člen | 29
Ahoj,
nefunguje mi setSuggestion() ani
setConfirm.
Pouzivam Nette 2.3.1 a Grido 2.0.8.
Nalinkovane mam tyto soubory
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="//nette.github.io/resources/js/netteForms.min.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
<script src="{$basePath}/js/jquery-ui.min.js"></script>
<script src="{$basePath}/js/grido.js"></script>
<script src="{$basePath}/js/plugins/grido.datepicker.js"></script>
<script src="{$basePath}/js/plugins/grido.daterangepicker.js"></script>
<script src="{$basePath}/js/plugins/grido.typeahead.js"></script>
<script src="{$basePath}/js/plugins/grido.history.js"></script>
<script src="{$basePath}/js/plugins/grido.nette.ajax.js"></script>
Nevite prosim cim by to mohlo byt. Predem diky za odpoved.
- Jan Mikeš
- Člen | 771
@o5 neplanujes pridat podporu pro dalsi formaty exportu? (xls, xml..)
me osobne by se libilo, kdyby byla podpora pro pridani komponenty po vzoru
Grido\Components\Export (muze byt take rozhrani IResponse).
A na gridu nejak volat
$grid->addExportMethod($this["myExportComponent"])
nebo neco
takoveho…
- Pavel Kravčík
- Člen | 1195
@CZechBoY Nejjednodušší bývá vyřešit to o úroveň výše. Třeba VIEW nebo si to předělat do pole a to posílat jako data modelu.
- o5
- Člen | 416
@CZechBoY @kzk_cz : Hodila by se možnost ovlivnit
ORDER
klazuli co? Něco po stylu setWhere()
.
@Lexi: Kdysi jsem psal, že mi připadá blbost jiný formát exportu, protože featury XLS se stejnak nevyužijí. Nedávno mě ale napadla myšlenka, zkusit implementovat export do Google Spreadsheets pokud to jejich API umožňuje.
Export ale obsahuje bug když se exportuje z tabule s větším množstvím záznamů. Udělal jsem si hotfix, kde Grido používáme, ale do officiálního repa se to zatím nedostalo, protože na to prostě nemám motivaci a sílu. Jsou tam na to i některé pokusy v podobě pull-requestů, ale i merge některých pull-requestů vyžaduje úsilí. Jsem už přes rok znovu na full-time a dost těžko se mi hledá čas na vlastní ne-opensource projekt, natož abych se věnoval „z lásky“ gridu. Navíc aktuální stav kolem Nette (Nette Pro) mě spíš demotivuje.
Editoval o5 (31. 7. 2015 11:35)
- Pavel Kravčík
- Člen | 1195
@o5: To myslím určitě, už se to tady párkrát řešilo myslím. Nakonec jsem vždy skončil u toho vyřešit to dříve, než to pošlu do Grido.
@CZechBoY: Ano, přesně takhle. Prostě to logiku přesunout do DB, je jedno jak už. Ještě se mi osvědčilo u některých případů něco podobného:
Mám smlouvu třeba. Ta má v sobě „vozidlo_id“, „klient_id“ a podobné věci. Takže při každém vykreslování řádku by byl dotaz do těch ostatních tabulek. Strukturu jsem upravil na dva sloupce „vozidlo_id“ a „vozidlo_string“. A tam už jde výsledek toho sloupce při založení/úpravě. Protože název toho vozidla se může skládat z modelu, značky, druhu a to všechno má ještě svojí tabulku. Ale zase je potřeba vyřešit tu režii, pokud se změní název vozidla. To se vyplatí u věcí, které se často nemění. Třeba Ti to pomůže. :)
- CZechBoY
- Člen | 3608
@kzk_cz: s db moc nehjbat nepude, maximálně tak si přidat pohled,
ale to je asi zbytečný…
Spíš jsem se na to kouknul z ranního pohledu (víc vyspanýho jak po
půlnoci :D) a můžu dát rovnou na Selection ty groupy a selection vynechat.
Potom tu, ale pořád stojí problém kde nastavit selectování dalšího
sloupce (customRender ok, ale potom nejde sortable).
@o5: nevím, k čemu by nám bylo ovlivnění ORDER klauzule
(setWhere jsem nenašel).
Zatím jsem vymyslel:
setOrder
(nebo string dosetSortable
)- když bude nastaven
setCustomRender
a sortable tak vyžadovat isetCustomSort
Editoval CZechBoY (31. 7. 2015 12:40)
- Pavel Kravčík
- Člen | 1195
@CZechBoY: Já to tam obešel tak, že ten sloupec jsem si prostě složil a nemusím mu ani dávat customRender(). Narážel jsem na stejné problémy jako a na nějaké pěkné řešení jsem nepřišel. Proto je lepší, když si to připravíš mimo Grido. Prostě jeden sloupec a všechny data v něm.
- chap
- Člen | 81
flexroad napsal(a):
Jde pripadne upravit format exportovaneho souboru?
Já si nedávno připravil export do XLS (vycházel jsem z třídy
Grida – Export). Pro funkci je třeba v aplikaci přidat knihovnu
phpoffice/phpexcel … tak pro inspiraci – třeba někdo využije:
použití:
new Chap\Grido\Export($grid,"nejaky nazev");
Třída:
<?php
namespace Chap\Grido;
use Grido\Components\Columns\Column,
Nette\Application\IResponse,
Grido\Components\Component,
Grido\Grid;
/**
* Exporting data to XLS.
*/
class Export extends Component implements IResponse
{
const ID = 'export';
/**
* @param \Grido\Grid $grid
* @param string $label
*/
public function __construct( Grid $grid, $label = NULL)
{
$this->grid = $grid;
$this->label = $label === NULL
? ucfirst($this->grid->getName())
: $label;
$grid->addComponent($this, self::ID);
}
/**
* @return string
*/
protected function generateSource()
{
$excel = new \PHPExcel();
$excel->setActiveSheetIndex(0);
$sheet = $excel->getActiveSheet();
$limit = 100;
$radky = 1;
$datasource = $this->grid->getData(FALSE, FALSE, FALSE);
$iterations = ceil($datasource->getCount() / $limit);
$columns = $this->grid[Column::ID]->getComponents();
foreach ($columns as $column) {
$header[] = $column->getLabel();
}
$sheet->fromArray($header,null,"A".$radky++);
for ($i = 0; $i < $iterations; ++$i) {
$datasource->limit($i * $limit, $limit);
$data = $datasource->getData();
foreach ($data as $item) {
$row = array();
foreach ($columns as $column) {
$row[] = $column->renderExport($item);
}
$sheet->fromArray($row,null,"A".$radky++);
}
unset($data);
}
foreach (range('A', $sheet->getHighestDataColumn()) as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$stylHead = $sheet->getStyle("A1:".$sheet->getHighestDataColumn()."1");
$stylHead->getFont()->setBold(true);
$stylHead->getAlignment()
->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$stylHead->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)
->getStartColor()->setRGB('66FF66');
return $excel;
}
/**
* @internal
*/
public function handleExport()
{
$this->grid->onRegistered && $this->grid->onRegistered($this->grid);
$this->grid->presenter->sendResponse($this);
}
/*************************** interface \Nette\Application\IResponse ***************************/
/**
* Sends response to output.
* @param \Nette\Http\IRequest $httpRequest
* @param \Nette\Http\IResponse $httpResponse
* @return void
*/
public function send(\Nette\Http\IRequest $httpRequest, \Nette\Http\IResponse $httpResponse)
{
$objWriter = new \PHPExcel_Writer_Excel2007($this->generateSource());
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment; filename=\"$this->label.xlsx\"");
header("Cache-Control: max-age=0");
$objWriter->save("php://output");
die;
}
}
Editoval chap (5. 8. 2015 11:23)
- Pavel Kravčík
- Člen | 1195
@yrow: V Nette 2.3.2 a 2.3.4 běží v pohodě. Bez Composeru – to nedělej – je to čirý masochismus. :) Ale pokud máš pár hodin čas a chceš se nervovat, tak si stáhni .zip z GitHubu (https://github.com/o5/grido).
- Oli
- Člen | 1215
o5 napsal(a):
@flexroad http://o5.github.io/….Column.html#…
@o5 Tohle ale umožní jen nezobrazit ten sloupec v exportu, případně ho nějak pozměnit, nebo ne? Může tahle funkce zobrazit i další sloupce, který nejsou zobrazený v gridu? Pokud ano, můžu poprosit o ukázku?
Případně mám napůl do Grido implementovaný export pro Excel. Implementoval jsem si tam zpracování události pro export právě na zobrazení dalších sloupců, který nejsou vidět v gridu na webu.
Vypadá to potom zhruba takhle:
$export = $this->grid->setExport();
$export->onFetchDataExport[] = function ($columns, \Grido\Grid $grid) {
$columns['street'] = $grid->addColumnText('street', 'Ulice');
$columns['streetNumber'] = $grid->addColumnText('streetNumber', 'Číslo popisné');
$columns['city'] = $grid->addColumnText('city_id', 'Město')
->setCustomRenderExport(function ($value) {
return $value->city->name;
});
};
Měl bys zájem o PR něčeho takovýho do Grido?
- oskarmaniak
- Člen | 29
BUMP
Ahoj, jen se posouvám s dotazem, zda někdo neměl po přechodu na nové nette problém s Gridem, kdy přestalo fungovat
setSuggestion()?
jak jsem již zmínil
https://forum.nette.org/cs/13109-grido-datagrid-pro-nette?p=18#p158825
Zatím zde proběhla nějaká zmínka někomu s podobným dotazem komu pomohlo
$.nette.init();
bez toho mi to ale fungovalo před updatem. Pro jistotu jsem vyzkoušel a stejně mi to nechodí ani s tím. Někdo kdo řeší podobnou situaci, nebo by dokázal poradit?
Díky moc
- Pavel Kravčík
- Člen | 1195
@oskarmaniak: Pravděpodobně to bude typeahead.js – možná ho máš v JS nalinkované dvakrát. Nebo pokud se s typeahead pokusíš upgrade. Matně si vzpomínám, že od 1.10 (ty verze si nepamatuju) to s Grido již nefunguje. Zkusil bych se podívat tím směrem.
A můžeš použít (http://getfirebug.com/) na debugování ajaxových požadavků.
- Pavel Kravčík
- Člen | 1195
@o5: Tohle je asi problém, mám to založit jako issue?
Při custom operacích ($grid->setOperation
) se generuje na
každý řádek tento kód (http://pastebin.com/BKj4ditr) – což si normálně
člověk nevšimne v Ajaxu a je to jedno, ale při posílání většího
balíku (~400) to spadne na „too long url error“, protože se tam ta část
operation[id]=on zkopíruje 400x… Možná by to šlo odejít přes
session.
- chap
- Člen | 81
Ahoj,
nějak tu bojuji s ajaxem pro filtry v Gridu. Používám ho v komponentě
kollarovic/admin … vše šlape zdá se ok, jen při změně select filtru se
zavlaji dva ajaxové dotazy (první skončí hned – cancel) a druhý vrátí
komplet html. V tom prvním se to tváří, že odesílá správně a druhý
vypadá, že odesílá s parametrem tlačítka search. Nejde mi ani vybrat
možnost počet záznamů na stránku. Pokud ale dám tlačítko hledat, tak se
provede dotaz ajaxem a zdá se být ok. Přes webloader mám vloženy všechny
JS z client-side. Už s tím laboruju dlouho, ale už fakt nevím. Nemá
někdo prosím podobnou zkušenost? Díky Chap
–
odpovím si editem příspěvku – problém byl ve staré verzi
nette.ajax.js :)
Editoval chap (12. 8. 2015 23:49)