ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- skyfall174
- Člen | 5
Dobry den,
Mam multiplier, ktery mi vytvori nekolik datagridu.
{foreach $items_info as $item}
{control grid-$item->ID $item}
{/foreach}
Pote co zavolam nejaky filter, mne se metoda nespusti.
Tady vytvarim control, ve kterem vytvarim grid
<?php
public function createComponentGrid($name) {
return new \Nette\Application\UI\Multiplier(
function ($id) {
return new \GridControl($this->database, $this->id);
});
}
?>
Pokud tomu dobre rozumim metoda napr Grid-1 neexistuje a proto se ten filter
nevykona.
Jak by se to dalo resit?
Dekuji za odpoved;
- nocturne32
- Člen | 21
@PavelJanda pardon.
Myslel jsem tak, že mám dvě tabulky. Z té první beru třeba firmy,
z druhé beru historii nějakých stavů (například založení firmy,
přejmenování firmy, zrušení firmy,…)
Chtěl bych, aby mi právě ten itemdetail ukázal tu historii stavů, která se
váže na každou firmu.
- Pavel Janda
- Člen | 977
@nocturne32 Předej si data do šablony, traverzuj nad nimi pomocí ORM, atp. Těch způsobů, jak tohoto docílit, je vícero. :)
- skyfall174
- Člen | 5
@PavelJanda Dobrý den,
Chtel byvh si zeptat, jak by se dálo použit víc datagridu na jedné stránce.
Vytvařem je takhle
{foreach $items_info as $item}
{control info-$i $item}
{var $i = $i+1}
{/foreach}
A pak přes multiplier vytvarim N gridu.
<?php
public function createComponentInfo($name){
return new Multiplier(function ($id, $name){
$grid = new DataGrid();
...
...
return $grid;
});
}
?>
Ale pri změně filtru, paginace… nevzkreslí se tabulka.
Jak by se to dalo řešit?
Děkuji za odpoveď
- Pavel Janda
- Člen | 977
@skyfall174 Asi budeš muset téma víc rozvést. Takto vytvářené datagridy normálně fungují. :)
- skyfall174
- Člen | 5
Pavel Janda napsal(a):
@skyfall174 Asi budeš muset téma víc rozvést. Takto vytvářené datagridy normálně fungují. :)
Takže ja vytvařim componentu přes foreach
{foreach $items_info as $item}
{control Info-$i $item}
{var $i = $i+1}
{/foreach}
pak v presenteru mam componentu
<?php
public function createComponentInfo($name){
return new \Nette\Application\UI\Multiplier(function ($id, $name) {
if($id== 2 || $id == 4){
$grid = new DataGrid();
$grid->setDataSource(...);
...
...
return $grid;
}else{
return new MyComponent($id);
}
}
}
?>
Všechno se zobrazí, ale pri změne, treba paginace, grid se vrati
prazdný.
Diky.
Editoval skyfall174 (3. 5. 2017 12:49)
- Pavel Janda
- Člen | 977
@skyfall174 :D Tos moc informací nepřidal. Zkus někam na github nahrát sandbox-like projekt (např se sqlite databází), který se bude takto chovat.
- jannemec
- Člen | 78
Chyba při prvním filtru.
Nevím proč, ale u jednoho (jenom u jednoho, další datagridy v aplikaci
fungují korektně) datagridu mi první zadání filtru vyhodí výjimku
Uncaught TypeError: Cannot read property ‚left‘ of undefined
Ale další zadání už funguje normálně … nesetkal se s tím někdo?
A zároveň se neobnovuje spodní lišta s Od do a stránkováním …
- skyfall174
- Člen | 5
@PavelJanda Takže posilám odkay na github s demo projektem. Chzba nastava na adrese localhost/reporting/report-info?report_id=2 .
Odkaz na github https://github.com/…74/testNette
.
Děkuji za odpověd.
- nocturne32
- Člen | 21
Ještě jednou zdravím.
Chtěl bych se zeptat, jestli jde u small inline edit nastavit validace
například emailu. Se samotným JS nejsem moc kamarád.
Děkuju předem.
- Pavel Janda
- Člen | 977
@skyfall174 Jak jsem psal, vhodná by byla ukázková sandbox-like aplikace se sqlite databází. Já bohužel nemám k dispozici žádnou oracle db a momentálně ani sbuulděné php s potřebnou oci8 php extension.
- Hug0
- Člen | 35
jAkErCZ napsal(a):
Lidi mohu se zeptat když používám překlad.. kde mohu udělat aby když si člověk vybere EN tak by ten datagrid byl v EN a když někdo CZ tak aby byl v CZ?
Díky
Datagrid má (mimo jiné) perfektní dokumentaci.
- jAkErCZ
- Člen | 321
Ano to vím ale jak mohu přepínat mezi CZ a EN…
Plus když mám…
$grid->addColumnText('Name', 'Name')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
Jak udělám aby se tento parametr byl aktualizován v db?
- Pavel Janda
- Člen | 977
@jAkErCZ Přepínání mezi jazyky je v režii tvé aplikace, nikoliv datagridu. To tu mu musíš říct, jak/kdy/kde se má přepínat. Graficky to klidně můžeš zakomponovat do datagridu. Akce může být samozřejmě ajaxová. Ale musíš si to implementovat sám.
- jAkErCZ
- Člen | 321
@PavelJanda
Udělal sem si…
$manager->saveCompany($id, $value);
public function saveCompany($id, $value)
{
return $this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID, $id)->update($value);
}
A chyba je…
Use $presenter->sendPayload() instead of terminate() to send payload.
Co dělám špatně?
- Pavel Janda
- Člen | 977
@jAkErCZ Ještě jednou: V moment, kdy ti Tracyna zařve, uvidíš
v call stacku místo, kde se ten terminate()
volá. Nebo to
v projektu vygoogli fulltextově.
- jAkErCZ
- Člen | 321
Lidi nechápu proč mi funkce public function handleDelete($id)
Hází problém…
Column operator does not accept NULL argument. search►
Source file
Call stack
...\nette\database\src\Database\Table\SqlBuilder.php:296 source Nette\Database\Table\SqlBuilder->addCondition(arguments)
...\nette\database\src\Database\Table\Selection.php:358 source Nette\Database\Table\SqlBuilder->addWhere(arguments)
...\nette\database\src\Database\Table\Selection.php:320 source Nette\Database\Table\Selection->condition(arguments)
...\Modules\CoreModule\presenters\CompanyPresenter.php:188 source Nette\Database\Table\Selection->where(arguments)
178:
179: ]);
180: $grid->setTranslator($translator);
181:
182: return $grid;
183: }
184:
185: public function handleDelete($id)
186: {
187: $this->database2->table('Company')
188: ->where('ID = ?', $id)
189: ->delete();
190:
191: $this->flashMessage("Položka byla smazána [$id]", 'info');
192:
Podle informací se z tlačítka delete nepředává hodnota ID ale jak ji od tam získat?
$grid->addAction('delete', '', 'delete!')
->setTitle('Vymazat')
->setClass('icon-trash btn btn-xs btn-danger ajax')
->setConfirm(function($item) {
return 'Opravdu chcete smazat řádek s id ' . $item->ID . ' a jménem ' . $item->Name . '?';
});
Jak získám tu hodnotu ID kterou pak převedu do $id?
- jAkErCZ
- Člen | 321
Chtěl bych se zeptat zda-li je možné v datagrid vytvořit nějakým způsobem cyklus?
Zkoušel jsem typický foreach ale ten nejde…
Mám něco takového--->
public function getCompaniesLanguage()
{
$result = $this->database2->table('Country')
->select('ID', 'TwoLetterISOCode');
//$connection->query('SELECT a, b, c FROM table'); // $connection = Nette\Database\Connection
foreach ($result as $row) {
Debugger::dump($row);
}
/* $row = $this->database2->table('Country')
->select('ID')
->order('ID ASC')
->fetchPairs('ID', 'ID');
return ($row) ? $row : NULL;*/
}
A chtěl bych aby to v gripu používalo něco jako
$tmp = $manager->getCompaniesLanguage();
$grid->addColumnStatus('CountryID', 'Test')
->addOption($tmp->ID, $tmp->TwoLetterISOCode)
->setClass('btn-success')
->endOption()
->onChange[] = [$this, ];
A bylo tam možno uložení → ->onChange[] = [$this, ]; ← má to vracet něco jako $tmp->ID a $tmp->TwoLetterISOCode
A má to dělat že to vrátí ID řádku a pak text který je v řádku TwoLetterISOCode
Editoval jAkErCZ (18. 5. 2017 16:01)
- jAkErCZ
- Člen | 321
@CZechBoY že to datagrid nebere prostě… Ale nevím proč píše mi to že -->
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''TwoLetterISOCode'' at line 1 search►
Caused by PDOException
SQL
SELECT ID
FROM `Country` 'TwoLetterISOCode'
Source file
...\app\Modules\CoreModule\model\CompanyManager.php:64 source Nette\Database\Table\Selection->rewind()
54: $data = [$name => $value];
55: $this->saveComponies($ID, $data);
56: }
57:
58: public function getCompaniesLanguage()
59: {
60:
61: $result = $this->database2->table('Country')
62: ->select('ID', 'TwoLetterISOCode');
63: //$connection->query('SELECT a, b, c FROM table'); // $connection = Nette\Database\Connection
64: foreach ($result as $row) {
65: Debugger::dump($row);
66: }
67:
68:
- CZechBoY
- Člen | 3608
Máš špatně sql dotaz resp. volání knihovny.
správně
$result = $this->database2->table('Country')
->select('ID')
->select('TwoLetterISOCode');
A tohle teda vůbec nesouvisí s datagridem…
edit: jsem zapomněl doplnit název metody select
(…)
Editoval CZechBoY (18. 5. 2017 17:04)
- jAkErCZ
- Člen | 321
CZechBoY napsal(a):
Máš špatně sql dotaz resp. volání knihovny.
správně$result = $this->database2->table('Country') ->select('ID') ->('TwoLetterISOCode');
A tohle teda vůbec nesouvisí s datagridem…
Oprava--->
$result = $this->database2->table('Country') ->select('ID') ->select('TwoLetterISOCode');
Editoval jAkErCZ (18. 5. 2017 16:34)
- jAkErCZ
- Člen | 321
Dobře tak jinak jak mohu do datagrip vložit funkci aby to načítalo věci z té funkce?
$grid->addColumnStatus('CountryID', 'Test')
$tmp = $manager->getCompaniesLanguage()
->addOption($tmp->ID, $tmp->TwoLetterISOCode)
->setClass('btn-success')
->endOption()
->onChange[] = [$this, ];
syntax error, unexpected '$tmp' (T_VARIABLE) search►
Source file
File: ...\Modules\CoreModule\presenters\CompanyPresenter.php:85
75: $grid->getInlineEdit()->onCustomRedraw[] = function() use ($grid) {
76: $grid->redrawControl();
77: };
78:
79: $grid->addColumnNumber('ID', '#')
80: ->setSortable();
81:
82:
83:
84: $grid->addColumnStatus('CountryID', 'Test')
85: $tmp = $manager->getCompaniesLanguage()
86: ->addOption($tmp->ID, $tmp->TwoLetterISOCode)
87: ->setClass('btn-success')
88: ->endOption()
89: ->onChange[] = [$this, ];
Editoval jAkErCZ (18. 5. 2017 16:36)
- Pavel Janda
- Člen | 977
@jAkErCZ
1, Je to datagrid, ne datagrip (grid == anglicky „mříž“ → datová
tabulka).
2, Rozmysli se, prosím, nad svým dotazem, než ho sem napíšeš. Spousta
lidí přemýšlí a než sem příspěvek vloží, pořádně si svůj kód
projdou. Ty sem dáváš dotazy, které vůbec s datagridem nesouvisí.
Například tvůj poslední dotaz je chyba v syntaxi v PHP (Tracy ti to dává
jasným způsobem najevo) a nemá co dělat s ublaboo/datagrid. Pokud máš
problémy s PHP, zkus napsat některým lektorům v čele s
@TomášVotruba. Myslím, že ti dokážou spoustu věcí vysvětlit.
Edit: Nebo se můžeme domluvit spolu. Rád ti poskytnu za úplatek pár lekcí php/nette/datagrid aspol.
Editoval Pavel Janda (18. 5. 2017 16:58)
- Tomáš Votruba
- Moderator | 1114
Díky za zmínku Pavle.
@jAkErCZ Kdybys to chtěl hledat, tak tady najdeš přehled všech mentorů, pěkně podle měst, online dostupnosti, skillů a kontaktů.
(Jinak tyhle chyby jsou docela klasika. Před delším časem jsem hledal
3 hodiny, proč se mi nenačítá jedná třída. Spoléhal jsem se na IDE.
Zobrazovalo soubor jako PHP. Všechno OK, tak co dělám blbě? Po 3 hodinách
nervů a psaní na fórum jsem zjistil, že nemá *.php
koncovku
:facepalm: )
- jAkErCZ
- Člen | 321
Tomáš Votruba napsal(a):
Díky za zmínku Pavle.
@jAkErCZ Kdybys to chtěl hledat, tak tady najdeš přehled všech mentorů, pěkně podle měst, online dostupnosti, skillů a kontaktů.
(Jinak tyhle chyby jsou docela klasika. Před delším časem jsem hledal 3 hodiny, proč se mi nenačítá jedná třída. Spoléhal jsem se na IDE. Zobrazovalo soubor jako PHP. Všechno OK, tak co dělám blbě? Po 3 hodinách nervů a psaní na fórum jsem zjistil, že nemá
*.php
koncovku :facepalm: )
Díky :)
Jinak mám dotaz je nějak možné abych filter dal mimo datagid?
Mám šablonu list.lette kde volám datagrid ale chtěl bych nahoře mít možnost vyhledávat a ne přímo v datagridu? Je to možné?
- kralik
- Člen | 230
Ahoj,
rád používám tento, dle mého, skvělý datagrid.
Měl bych takové vylepšení :-) i když asi úzce použitelné.
Když mám zobrazený datagrid s položkami. A chtěl bych vložit
k těmto položkám obrázek(y).
Představa je taková, že bych vzal obrázek a přes drag & drop
bych jej pustil na konkrétní položce(řádku). V komponentě(?) bych si
nastavil co se má s obrázkem poté dít. Nejčastěji by se uložit na disk a
do DB se uložili nějaká metadata.
Rád bych získal názor zda je to reálné vytvořit a zda by se to šiklo třeba více lidem nž jen mě:-)
Díky
- Pavel Janda
- Člen | 977
@kralik Cool nápad, rozhodně se mi líbí.
A teď – kdo to napíše? :D
Možná by bylo vhodné se zeptat, v jakých konkrétních případech by to šlo použít? Je to vhodné pro správu obrázků produktu? Dalo by se to použít pouze bez inline editace/přidávání?
Zkus pár takových otázek rozvést, třeba to začne vážně dávat smysl. :)
- petak23
- Člen | 16
Ahoj,
chcel by som sa opýtať nasledovné: Ak si v datagride zapnem možnosť
usporiadania položiek, tak sa mi v časti akcii pridá ikonka na zmenu
poradia. Ako môžem túto ikonku zmeniť?
Pri ostatných akciách to ide jednoducho:
$grid->addAction('edit', '')
->setIcon('pencil-square fa-2x'); //Tu si ju zmením...
Prechádzal som dokumentáciu, ale nič som nenašiel…
Vďaka.
- Pavel Janda
- Člen | 977
@petak23 Asi jsi hledal blbě. :P
Všechny ikonky lze měnit přes latte block
. Viz https://ublaboo.org/…rid/template#…
- petak23
- Člen | 16
Pavel Janda napsal(a):
@petak23 Asi jsi hledal blbě. :P
Všechny ikonky lze měnit přeslatte block
. Viz https://ublaboo.org/…rid/template#…
Ok. asi som sa nevyjadril celkom presne. Tak to skúsim ešte raz:
Podľa https://ublaboo.org/datagrid/action#… je možné zapnúť
možnosť „prehadzovania“ položiek medzi sebov s tým že sa mi
v príslušnom riadku na konci zobrazí ikonka ktorá je v html
reprezentovaná:
<span class="handle-sort btn btn-xs btn-default ui-sortable-handle">
<i class="fa fa-arrows-v"></i>
</span>
A ja by som potreboval zmeniť class pre html element i.
To čo si ty spomínal na https://ublaboo.org/…rid/template#…
mi zmenilo ikonku v hlavičke tabulky, ale nie v riadkoch…
- Hlava
- Člen | 19
Ahoj, proč v následujícím kódu v souboru Row.php:
/**
* @return string
*/
public function getControlClass()
{
if (!$class = $this->control->class) {
return '';
}
return implode(' ', array_keys($class));
}
používáš funkci array_keys. Asi něco nechápu, ale pak při callbacku, viz:
$grid->setRowCallback(function(array $row, Html $el) use ($presenter) {
$code = $row['code'];
if ($presenter->getComponent('order')->isInOrder($code)) {
$el->setAttribute('class', ['in_order'=>'nesmysl']);
}
});
musím nastavovat attributy fakt zvláštně, místo abych si jen naplnil pole. Je to blbost, ale já kvůli tomu tady vzteky debugoval a dumpoval snad úplně všechno, nevšiml jsem si toho array_key v implode… Tak se musím zeptat :)
Editoval Hlava (27. 5. 2017 18:04)
- kralik
- Člen | 230
Pavel Janda napsal(a):
@kralik Cool nápad, rozhodně se mi líbí.
A teď – kdo to napíše? :DMožná by bylo vhodné se zeptat, v jakých konkrétních případech by to šlo použít? Je to vhodné pro správu obrázků produktu? Dalo by se to použít pouze bez inline editace/přidávání?
Zkus pár takových otázek rozvést, třeba to začne vážně dávat smysl. :)
Kdo to napíše, já bych rád, ale bohužel JS totálně neznám.
Mé zkušenosti nedosahují na tvorbu této featury.
Ano, prakticky bych to použil pro správu obrázků.
V poslední době jsem narazil na to, že bych tuto featuru několikrát
použil.
Pro klienta by to bylo naprosto super, jednoduché, přehledné,
příjemné.
Dovolím si uvést několik příkladů.
Web krejčovský salón: při správě webu si klient
přidá položku, např. nějaké šaty, které ušil a chce je vystavit na
webu.
Takto mu vznikne x položek produktů, metadat.
A teď by jen přesouval fotografie nad jednotlivé položky a fotografie by se
ukládaly na disk a zapisovaly do DB.
Pak si klient jen klikne na detail položky a vidí metadata a fotografie které
nahrát a může je případně smazat, super.
Anketa, články ap.:
Existuje seznam článků nebo položek anket. K nim je třeba přidat
nějakým způsobem fotografie, soubory. Opět pomocí této vlasnosti si klient
přetahá obrázky/soubory pro jednotlivé položky a nad nějakým detailem
vidí fotografie/soubory/dokumenty a metadata pro konkrétní položku.
Stavebnicví, a daší weby.
Typická fotogalerie, či reference u firmy.
Vytvořím si seznam položek. Reference, alba, a další a pak bych si takto
jednoduše, opět přes tuto vlastnost, nahával, jako klient, fotografie
na web.
Myslím, že tato funkčnost by tento datagrid katapultovala do topu.
I když bych řekl, že už tam datagrid určite je.
Byl by to takový další výrazný level. :-)
- jAkErCZ
- Člen | 321
Zdravím mám takový dotaz nebo radu,
Chtěl bych využít že když kliknu na
$grid->addActionCallback('custom_callback', '')
->setTitle('Získat ID')
->setClass('icon-search btn btn-xs btn-default ajax')
->onClick[] = function($ID) use ($manager) {
$manager->getComponiesWebPages($ID);
$this->flashMessage('Vyhledávání stránky dle identifikátoru firmy: ' . $ID);
$this->redrawControl('flashes');
};
tak by se měla zvolat funkce kde v se přenese ID do druhého datagridu a v něm by mi to vypsalo informace o daném ID které by získal z toho prvního datagridu… Je to nějak možné lámu si s tím hlavu na nic mě nenapadá…
$grid->setDataSource($manager->getComponiesAll('Pokud jsem dosadím ID tak mi to vypíše přesně to co chci. Jak udělám aby se mi z vrchní funkce do této přeneslo ID'));
Všem děkuji za pomoc či radu :)
- Pavel Janda
- Člen | 977
@jAkErCZ Budeš se muset vydat vlastní JS cestou. Callback při kliknutí na řádek/akci, handler v presenteru, který třeba překreslí snippet s jiným gridem na stránce
Editoval Pavel Janda (29. 5. 2017 20:02)
- jAkErCZ
- Člen | 321
Tak jsem si nad tím lámal hlavu a zkusil sem to nějak takto…
public function handleSearchIdentification($ID) {
$companyID = $ID;
$this->flashMessage("Informace o firmě [ $ID ] nalezeny!", 'success');
if ($this->isAjax()) {
$this->redrawControl('flashes');
$this['componiesLocalizedGrid']->reload();
$this['webPagesGrid']->reload();
}
return $companyID;
}
a grid
$grid->setDataSource($manager->getComponiesDescription($this->companyID));
Když jsem si zjišťoval tak do $grid->setDataSource($manager->getComponiesDescription($this->companyID)); se mi ID dostane ale prostě z nějakého hlediska se nenačtou znovu ty 2 gridy componiesLocalizedGrid a webPagesGrid
A prostě snažím se to vyřešit ale nic… Co stále dělám blbě nebo nějak mi to prosím vysvětlit nebo ukázat…
Díky