Nový Nette DataGrid pro Bootstrap s možností vypsat strom
- mesour
- Nette Blogger | 236
dj.kure napsal(a):
Ahoj,
můžu se prosím zeptat jak?
v Presenteru mám:
protected function createComponentGridMistaPripojeniZakaznika($name) { $grid = new Grid($this, $name); ... }
V šabloně volám:
{control gridMistaPripojeniZakaznika}
Děkuji za vysvětlení a omlouvám se za svou hloupost :-)
Ahoj, kde je problém? Potřebuji trochu víc :)
Editoval mesour (17. 3. 2016 22:01)
- mesour
- Nette Blogger | 236
Důležité!
Vytvořil jsem novou diskusi k verzi gridu 3.0: https://forum.nette.org/…om-pro-nette zde prosím pište pouze o Verzi 2 :)
- Phalanx
- Člen | 310
Ahoj, myslím že jsem našel bug. Mám vytvořený vlastní filtr formulář, kde mám jednu položku např. název automobilu s jquery autocomplete.
Takže mám políčka:
- input text – brand_text – kde se vybírá text s autocomplete
- input hidden – brand_id – kde se při výběru z autocomplete doplní id
První filtrování proběhne správně, ale když kliknu na tlačítko filtrovat podruhé, pak se mi zobrazí všechny (bez filtru).
Setkal se s tím už někdo prosím? (verze 2.0.7.1 i 2.0.5)
Jelikož se nevyplňuje hodnota hidden inputu (po vyvolání filtru) zvolil jsem místo addHidden normálně addText a pak jen skryju input pomocí css…
Editoval Phalanx (16. 2. 2017 13:03)
- dj.kure
- Člen | 70
Ještě bych se chtěl zeptat, zda lze nějak docílit toho, aby byl obrázek v gridu „klikací“. Aby se po kliknutí otevřel odkaz a nemusel jsem přes dropDown.
Něco ve smyslu:
->addLink('Detail', new Link(':neco:nekam:', array(
'id' => '{' . $key . '}'
)))
Bohužel, tohle obrázek nepodporuje.
Edit:
Zatím jsem to vyřešil tak, že jsem tomu obrázku přidal atribut class
->setAttribute('class', 'thumb');
a pomocí jQuery vyhledám první odkaz v tomto řádku.
$("td.thumb").click(function(){
var url = $(this).parent().find("a:first").get(0).href;
window.location.href = url;
});
Po kliknutí na obrázek se stránka přesměruje na mnou požadovaný odkaz (tj. první v dropDownu).
Editoval dj.kure (25. 4. 2016 12:52)
- jake
- Člen | 3
cecko napsal(a):
mesour napsal(a):
Zdravím všechny :-)
Takže do dev-master jsem hodil nové úpravy ;-) Jedná se o dlouho očekávané nové featury. Zatím to je pouze v dev-master, není tam žádný BC break. Takže to nechám do konce příštího týdne pouze takto, prosím testujte a pokud vás napadne ještě nějaká vychytávka, kterou tam přidat, tak dejte vědět. Kolem toho konce příštího týdne z toho udělám 2.0.7 ;-)
Co je nového a co testovat:
1. Přidal jsem možnost nastavit relace plus k nim také inline edit (select s daty z číselníku). Pro info, DibiDataSource to neumí, kvůli tomu, že se posílá pouze \DibiDataSource a ne \DibiFluent :( Názorně se používá takto, pouze nastavím na DataSourcu, ostatní vše už se vyřeší automaticky:
//\Mesour\DataGrid\IDataSource::setRelated($table, $key, $column, $as = NULL, $primary = 'id') $source->setRelated('group', 'group_id', 'name', 'group_name');
Ta relace tam přidá sloupec „group_name“, ale kdyby se nespecifikovaly ostatní, tak by vybral jen ten „group_name“ a grid by řval, že ID v datech neexistuje. Už jsem tam i pro ten případ upravil exceptionu, aby řekla že se mají nastavit sloupce v SELECTu, pokud jsou nastavené nějaké relace, pokud nejsou, tak řve to samé jako dřív.
$source = new NetteDbDataSource( $this->db->table('user') ->select('user_id,user.name,action,surname,email') ->select('last_login,amount,avatar,order,timestamp,group_id'), $this->db );
Také je potřeba poslat v konstruktoru jako druhý parametr \Nette\Database\Context. U ArrayDataSource je to zase trochu jiné, pak popíši v dokumentaci. Pokud by bylo hodně požadavků, aby toto uměl DataSource pro DIBI, tak by bylo možné udělat něco jako DibiFluentDataSource, tím by se zachovala zpětná kompatibilita a bylo by možné to mít i pro DIBI.
2. Pořád jste chtěli implementovat nette.ajax.js od @VojtěchDobeš. Nakonec jsem ale místo nějakého nastavení a dalších blbostí udělal to, že reload snippetů je nyní součástí gridu, takže už nebude potřeba mít jakýkoliv nette.ajax nebo jquery.nette, ale vše bude fungovat samo. Tím jsem také odstranil jednu položku z required ;-)
3. Protože přibyly relace, tak nastal problém s tím, že třeba tabulka group měla sloupec name a tabulka user také. Na sloupcích, které dědí od \Mesour\Column\Filter přibyla metoda setRealColumnName.
$grid->addText('name', 'Name') ->setRealColumnName('user.name');
Ahoj,
zkousel jsem pouzit propojeni na relaci dle tveho navodu:
<?php // relacni klic sloupec vlastni primarni // tabulka nazev klic $source->setRelated('pokoje', 'pokoj_id', 'nazev','pokoj_nazev','pokoj_id'); ?>
nette my ovsem vraci exception
No reference found for $rezervace->pokojepritom, kdyz se podivam do debuggeru, tak dotaz
SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = ‚rezervace‘skutecne vraci referenci:
constraint_name rezervace_ibfk1
column_name pokoj_id
referenced_table_name pokoje
referenced_column_name pokoj_idobe tabulky jsou ulozeny na INNODB a z composeru mam stazeny dev-master
Muzes mi prosim poradit, co delam spatne? Mockrat dekuji
Ahoj, můžu se prosím zeptat jak jste to vyřešili? Mám uplně stejný problém, používám verzi 2.0.7.1
Editoval jake (27. 4. 2016 14:55)
- mesour
- Nette Blogger | 236
jake napsal(a):
cecko napsal(a):
mesour napsal(a):
Zdravím všechny :-)
Takže do dev-master jsem hodil nové úpravy ;-) Jedná se o dlouho očekávané nové featury. Zatím to je pouze v dev-master, není tam žádný BC break. Takže to nechám do konce
……
Ahoj, můžu se prosím zeptat jak jste to vyřešili? Mám uplně stejný problém, používám verzi 2.0.7.1
Updatuj na 2.0.7.2 a použij toto ;-)
Vytvoř vlastní source:
<?php
class NetteGridSource extends Mesour\DataGrid\NetteDbDataSource
{
public function setRelated($table, $key, $column, $as = NULL, $primary = 'id')
{
if (is_null($this->context)) {
throw new Grid_Exception('Related require set Nette database context in constructor.');
}
$this->related[$table] = array($table, $key, $column, $as, $primary);
return $this;
}
}
?>
Joinuj přímo na selection:
<?php
$selection = $context->table('tasks')
->select('tasks.*')
->select('project.name AS project_name');
$source = new NetteGridSource($selection, $context);
?>
A pak stejně zavolej:
<?php
$source->setRelated('projects', 'project_id', 'name', 'project_name', 'id');
?>
Je to z jiného návodu, když to přepíšeš na tvou databázovou strukturu, pojede to ;-)
Editoval mesour (13. 5. 2016 21:24)
- MVT
- Člen | 2
Ahoj, předně děkuji za tenhle skvělej datagrid.
Dále mám nejspíš začátečnickej problém:
Mám kód v presenteru, vytvářím grid a v něm používám Action prvky podle documentace (http://grid.mesour.com/…umn/actions/), přidávám dropDown:
<?php
$dropDown->addLink('Administráror',
new Link('promoteUser!',
array(
'id' => '{' . $table_id . '}',
'rights' => 'admin')
))
->setAttribute('class', 'dd-authority-admin')
->setConfirm('Opravdu tomuto uživateli chcete nastavit nejvyšší práva?');
?>
Tady se snažim v případě stiknutí linku odeslat do Handleru promoteUser pole s položkama id a rights, kde id je id uživatele a rights je string.
Mám handler který kód přijímá:
<?php
public function handlePromoteUser($pole)
{
$userId = $pole['id'];
$userAuthorityWant = $pole['rights'];
$userToEdit = $this->database->table('users')->get($userId);
...
Debugger::dump($pole);
}
?>
No a tady si nejsem jistý, jestli přijme pole jak já chci. Protože když
tam volám Debugger::dump($pole);
tak vypisuje NULL.
Je to tak správně, nebo tam dělám něco špatně? Nebo to jenom špatně chápu celý? Myslim si, že díky tomu NULL nemůžu pak pracovat s tim strigem rights, abych porovnal práva s databází. :)
Díky za odpověď.
- Phalanx
- Člen | 310
Ahoj, chci se zeptat, jak můžu navěsit na tvůj ajax reload pro datepicker, který mám ve filtru. Když kliknu na filtrovat nebo reset, tak mi zmizí kalendáře.
Chtěl jsem to udělat přes nette.ajax.js
<script>
$.nette.ext('onAjaxReloads', {
complete: function (payload) {
$(".dateInput").datepicker();
}
});
</script>
ale psal jsi, že máš nějaký vlastní vykreslovač.
edit:
už jsem na to asi přišel – dal jsem ho přímo do formuláře filtru
Editoval Phalanx (22. 7. 2016 8:29)
- Phalanx
- Člen | 310
Našel jsem bug. Do NetteDBDataSource jsem si přidal group by
return $data->group(‚sloupec‘);
bohužel se group by propisuje pouze do selectu dat a ne do count
SELECT COUNT(*) FROM tabulka
– chybí GROUP BY sloupec
Zkoušel jsem ladit, ale netuším kde by to mohlo být. S DibiDataSource to naštěstí funguje.
- Phalanx
- Člen | 310
@CZechBoY Máš pravdu, je hloupost chtít dotaz takhle – musí tam být subselect a DibiDataSource tam právě ten subselect dělá, ale NetteDBDataSource ne.
SELECT COUNT() FROM tabulka – chybí GROUP BY sloupec
SELECT COUNT() FROM (SELECT … FROM tabulka WHERE … GROUP BY
sloupec)
Nahlásím bug Matoušovi.
- Phalanx
- Člen | 310
Zjistil jsem další hodně nepříjemnou věc – při překliknutí na další stranu v paginatoru se mi úplně vyhodí navěšené události pro nette ajax – zobrazuju formuláře v bootstrap dialog.
<script>
$( document ).ready(function() {
$.nette.ext('snippets').after(function ($el) {
console.log('after');
});
});
</script>
Dokonce překlik na další stránku zruší i bootstrap tooltipy…
<?php
<a href="#" title="test">abc</a>
?>
edit: vyřešil jsem na prasáka, dal jsem přímo do vendor knihovny:
<script>
mesour.snippets = {
updateSnippet: function (id, html, top) {
jQuery(document.getElementById(id)).html(html);
$(window).scrollTop(top);
initTooltips(); // tento radek
$('.data-grid').netteAjax(); // + reinicializace ajaxu pro grid
},
</script>
kdyby někdo věděl, jak to napsat jinak, ať mi prosím napíše
Editoval Phalanx (31. 1. 2017 7:37)
- tom
- Člen | 171
Ahoj, řeším problém s datumy. V gridu zobrazím pole pro datum, např. …
<?php
$grid->addDate('last_login', 'Last login')->setFormat('j.n.Y H:i:s');
?>
a dám si na něj inline editaci. V databázi se to ukládá jako text? Když potřebuji dělat SELECT a seřadit to potom podle těchto datumů, tak ten text je nešikovný … jak toto řešíte?
Díky
- Phalanx
- Člen | 310
Chtěl bych se zeptat, jestli někdo neví, jak zobrazit na začátku prázdný filtr a defaultní pořadí prvků. Lidi docela irituje, že jim ve filtru zůstávají hodnoty. Například si před hodinou hledali nějakého uživatele a ten se jim pořád zobrazuje, když jdou zpátky do tohoto view.
Nevíte prosím někdo, jak to jednoduše řešit?
edit: bezva, mám to, stačilo jenom vyresetovat hodnoty při prázdném $_GET
<?php
private function fixSettingsForForm() {
$values = $this->settings;
if (isset($values['submittedBy'])) {
$submittedBy = str_replace('_', '', $values['submittedBy']);
unset($this->settings['submittedBy'], $this->getSession()->settings['submittedBy']);
if ($submittedBy === 'reset') {
$this->settings = array();
$this->getSession()->settings = array();
$this->parent->reset(TRUE);
}
}
if (empty($_GET)) {
$this->settings = array();
$this->getSession()->settings = array();
$this->parent->reset(TRUE);
}
}
?>
Editoval Phalanx (8. 11. 2017 16:25)