Nový Nette DataGrid pro Bootstrap s možností vypsat strom

mesour
Nette Blogger | 236
+
0
-

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
+
0
-

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 :)

CZechBoY
Člen | 3608
+
0
-

@mesour odkaz v uvodni prispevku vede na dokumentaci pro verzi 3

mesour
Nette Blogger | 236
+
0
-

CZechBoY napsal(a):

@mesour odkaz v uvodni prispevku vede na dokumentaci pro verzi 3

Upraveno :)

Phalanx
Člen | 310
+
0
-

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:

  1. input text – brand_text – kde se vybírá text s autocomplete
  2. 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
+
0
-

mesour napsal(a):
Ahoj, kde je problém? Potřebuji trochu víc :)

Ahoj, nakonec jsem to vyřešil, stačilo doplnit v presenteru toto:

	/** @persistent */
public $id;

A tím parametr „ID“ zůstává stále přítomen, takže funkční :-)

Editoval dj.kure (25. 4. 2016 12:16)

dj.kure
Člen | 70
+
0
-

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
+
0
-

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->pokoje

pritom, 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_id

obe 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
+
0
-

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
+
0
-

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ěď.

MVT
Člen | 2
+
0
-

Tak můj dotaz vyřešen. Problém byl v parametrech handleru: handlePromoteUser($id,$rights).

Tedy vyřešeno.

Phalanx
Člen | 310
+
0
-

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)

mesour
Nette Blogger | 236
+
0
-

Nette 2.4

Pro Nette 2.4 byla vytvořena verze 2.4 :-)

Phalanx
Člen | 310
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

@Phalanx
No v countu nemas agregovany data tak nema smysl tam group by davat… Nemas na mysli select distinct?

Phalanx
Člen | 310
+
0
-

@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
+
0
-

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
+
0
-

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

tom
Člen | 171
+
0
-

Funguje vám inline editace na mobilu?

tom
Člen | 171
+
0
-

Dá se nastavit, aby subgridy byly defaultně otevřené?

Díky

Phalanx
Člen | 310
+
0
-

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)