NiftyGrid – Datagrid pro Nette 2 s velkou škálou funkcí

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
muflix
Člen | 92
+
0
-

Pingy, Nifty: Jste úžasní už mi to funguje, díky :-)

Filip111
Člen | 244
+
0
-

Ahoj, jak by měla/mohla vypadat definice datasourcu pro Doctrine?
Díky.

MW
Člen | 626
+
0
-

Zdravím,

díky za grid, skvělá práce !
Už si s tím nějaou dobu hraju a ted jsem trochu narazil:

Jel jsem dle návodu:

public function __construct($cars)
    {
        parent::__construct();
        $this->cars = $cars;
    }

protected function configure($presenter)
    {
        //Vytvoříme si zdroj dat pro Grid
        //Při výběru dat vždy vybereme id
        $source = new \NiftyGrid\NDataSource($this->cars->select('cars.*, branches.name AS branch_name'));
        //Předáme zdroj
        $this->setDataSource($source);

	$this->addColumn('spz', 'SPZ', '100px');
	$this->addColumn('name', 'Název', '100px');

	$this->addButton("edit", "Editovat")
	->setClass("edit")
	->setLink(function($row) use ($presenter){return $presenter->link("cars:edit", $row['id']);})
	->setAjax(FALSE);


	$self = $this;
	$this->addButton("delete", "Smazat")
	    ->setClass("delete")
	    ->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
	    ->setConfirmationDialog(function($row){return "Určitě chcete odstranit auto $row[spz]?";});


    }

    function handleDelete($id) {
	$this->cars->find('id', $id)->delete();
	$this->flashMessage('Vozidlo bylo smazáno');
    }

Ovsem v handlu delete me to vygeneruje dotaz :

DELETE FROM 'cars' WHERE (id = 5) LIMIT 20 OFFSET 0

Právě ten OFFSET 0 MySQLku vadi…

Možná špatně jen dědím z konstruktoru? Jak na to prosím?
Díky !

MW
Člen | 626
+
0
-

Tak jsem to poresil takto:

Nevim, jestli je to dobre reseni, prosim o nazor:

Upravil jsem konstruktor, kam si posilam jen spojeni, a ne primo tabulku:

public function __construct($database)
    {
        parent::__construct();

	$this->database = $database;
	$this->cars = $database->table('cars');
    }

a pak v handlu:

function handleDelete($id) {
	$this->database->table('cars')->find($id)->delete();
	$this->flashMessage('Vozidlo bylo smazáno');
}
.:M@rt!n:.
Člen | 201
+
0
-

Ahoj,
jak prosím zaokrouhlit hodnoty ve sloupci cena na cela čísla?

MW
Člen | 626
+
0
-

.:M@rt!n:. napsal(a):

Ahoj,
jak prosím zaokrouhlit hodnoty ve sloupci cena na cela čísla?

nebude to stejne jako s datem?

$this->addColumn('price', 'Cena', '100px')
		->setRenderer(function($row){return ROUND($row['price']);});

Editoval MW (25. 9. 2012 12:17)

Andrasin
Člen | 29
+
0
-

Nifty napsal(a):

Andrasin
S tou textareou je to dobrý nápad. Asi bych to přidal jako nepovinný parametr pro setTextEditable.

Ohledně té řádkové editace – na subgridy jsem uplně zapomněl :)
Bude s tim asi trochu problém, ale mělo by to jít vyřešit. Příští víkend bych se na to podíval.

jojo, implementoval jsem si to stejným způsobem, byla to otázka dvou řádků.

Ještě ohledně těch formulářů, pokud edituji nebo vkládám nový záznam a hodnoty neprojdou validací, ve formulářích nezůstanou hodnoty, které jsem zadal a editace se úplně zruší. Člověk pak musí vše dělat odznova.

Editoval Andrasin (26. 9. 2012 1:26)

thunderbuff
Člen | 164
+
0
-

Lze do do niftygridu přidat „umělý“ sloupec? Mám tabulku se seznamy kontaktů a druhou tabulku s kontakty. Do gridu seznamů chci přidat slupec s počtem kontaktů v daném seznamu. (tzn do každého řádku tabulky potřebuji přidat výsledek dotazu „select count(*) from kontakty where seznam_id = XXX“) Lze to udělat nějak elegantě?

// Edit pardon, ptám se na blbosti, stačí dobře napsat datasource :-)

Editoval thunderbuff (30. 9. 2012 15:51)

.:M@rt!n:.
Člen | 201
+
0
-

Ahoj,
jde v niftygridu ve filtračním poli vybírat údaje například za určitý měsíc?
Zkoušel jsem do filtru u datumu použít *.09.2012, ale to nic nevypíše.

revoke
Člen | 36
+
0
-

Mám na stránce dva gridy. Když udělám změnu v jednom, potřeboval bych refreshnout i datagrid druhý. Typicky jde o přesun uživatelů mezi dvěma skupinami. Jde to?

revoke
Člen | 36
+
0
-

Tak třeba takhle :-)

$(".grid-gridForm input[type=submit]:not(.grid-gridForm-clickedSubmit)").closest('form').each(function() {
   var iniciator_id = $(button).closest('form').attr('id');
   if (iniciator_id != $(this).attr('id')) {
      $(".grid-filter-form input[type=submit]", $(this)).click());
   }
});
MW
Člen | 626
+
0
-

Prosím, lze nejak na inline editaci navesit nejakou validaci?
Jako addRule() ?

A neresil jste nekdo nejake ajaxove vkladani a editaci polozek?

Diky !

Editoval MW (2. 10. 2012 22:13)

thunderbuff
Člen | 164
+
0
-

Poradíte mi prosím s mým problémem? Mám následující datasource:

<?php

$dataSource = new NDataSource($connection->table('contacts')->select('contacts.id, contacts.firstname, contacts.surname, contactlists.name'));

?>

…pokud chci grid řadit podle různých sloupců, vše je OK. Pokud to vyhledávátka napíšu hedaný text, našeptávač správně napovídá. Ale jakmile zmáčknu enter, dojde k chybě:

<?php
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'where clause'
?>

Zalogované chybné SQL:

<?php
SELECT COUNT(*) FROM `contacts` WHERE (`name` LIKE ?)
?>

V parametru je vyhledávaný text. Dělám něco špatně, nebo v countu NiftyGrid ignoruje join v Datasource a rve dotazy přímo na tabulku contacts?

Editoval thunderbuff (3. 10. 2012 0:44)

MW
Člen | 626
+
0
-

Pokud JOINujes, zkus pouzit na column

->setTableName("contactlists.name")

Editoval MW (3. 10. 2012 8:55)

thunderbuff
Člen | 164
+
0
-

MW napsal(a):

Pokud JOINujes, zkus pouzit na column

->setTableName("contactlists.name")

Funguje, díky!

.:M@rt!n:.
Člen | 201
+
0
-

.:M@rt!n:. napsal(a):

Ahoj,
jde v niftygridu ve filtračním poli vybírat údaje například za určitý měsíc?
Zkoušel jsem do filtru u datumu použít *.09.2012, ale to nic nevypíše.

Žádná rada?

Měl bych další dotaz:
Jak udělat podmíněný selectbox závislý na jiné buňce? Zkoušel jsem toto:

$this->addColumn('konecnyStav', 'Konečný stav', '120px', 100)
	->setSelectEditable(function ($row){
                    if ($row['stavPopt'] !== 'Hotovo') {
                            return(array("Žádný" => "Žádný", "Objednáno" => "Objednáno"));
                        }
               })

ale laděnka hodí chybu že setSelectEditable musí být pole.

díky

Andrasin
Člen | 29
+
0
-

O validaci se píše zde

MW
Člen | 626
+
0
-

Andrasin napsal(a):

O validaci se píše zde

Diky ! přehlédl jsem.

Má to fungovat ajaxove? Funguje me to, ale bez …

Editoval MW (3. 10. 2012 22:13)

David Ďurika
Člen | 328
+
0
-

bolo by super keby si prijal tento pull na Bootstrap
https://github.com/…Grid/pull/15
nie v zlom ale bootstrap design vyzera lepsie ako ten tvoj
dalsia vyhoda ze potom tam nemusi ma ziadne css-ko a ani obrazky, lebo vsetko je uz v bootstrape

dakujem

repli2dev
Člen | 57
+
0
-

Používám NiftyGrid ve více projektech a dost spokojen, díky za dobrou práci.

Nicméně narazil jsem na podivné chování když udělám přibližně takovouto hierarchii:

+ Presenter
  + ComponentA
    + MyGrid

Grid jako takový funguje. Co na něm nefunguje jsou veškeré dotazy (stránkování + filtry). Po každé aktualizaci se to vrátí na výchozí parametry. Když se snažím vypsat filtry gridu tak dostávám NULL. Přitom když ho vynořím a připojím přímo k Presenteru tak je to OK (což ale v mém návrhu nejde :-()

Stopka
Člen | 4
+
0
-

Zdravím, mohu se zeptat jak je na tom aktuálně grid s možnostmi lokalizace? Bylo by perfektní kdyby šlo podobně jako formulářům předat pouze translator a bylo by přeloženo. Je to plánováno? Nebo na čem to stojí? Nebo jsem tu možnost přehlédl? Četl jsem o několik příspěvků výše, že je v tomto směru nějaký pokrok, ale v oficiální verzi na gitu to zatím chybí (pokud se nemýlím)

David Ďurika
Člen | 328
+
0
-

@Stopka presne to sa riesi v tom commite o kt. pisem https://forum.nette.org/…kalou-funkci?p=3

Stopka
Člen | 4
+
0
-

Jo to jsem nevěděl. Já myslel že v tom skutečně jen tlačíte tu bootstrap šablonu.

  • Jen otázka bokem k bootstrapu: to si přepisujete i renderování formulářů aby to fungovalo s bootstrapem?
David Ďurika
Člen | 328
+
0
-

Stopka napsal(a):

  • Jen otázka bokem k bootstrapu: to si přepisujete i renderování formulářů aby to fungovalo s bootstrapem?

ja nie ale hosiplan ano :) https://componette.org/search/?…

MW
Člen | 626
+
0
-

Zdravím,

Potřebuji mít na radce dva subgridy, ktere potrebuji nejak popsat… vypsat alespon label gridu – rozlisit je…

Mozna jsem neco prehledl nebo poradite me prosim, jak to nejlepe resit?

Diky !

.:M@rt!n:.
Člen | 201
+
0
-

Šlo by k nifty gridu doplnit vybírání pouze určitých sloupců na základě zaškrtnutého checkboxu?

Tomáš Jablonický
Člen | 115
+
0
-

Ahoj,
právě jsem upravil šablonu Gridu pro Bootstrap Twitter … bude o to zájem třeba jako o rozšíření nad tímto gridem?

Andrasin
Člen | 29
+
0
-

já bych určitě zájem měl, už se chystám delší dobu že si to upravím pro bootstrap, ale nějak jsem se k tomu ještě nedostal…

iguana007
Člen | 970
+
0
-

jablon napsal(a):

Ahoj,
právě jsem upravil šablonu Gridu pro Bootstrap Twitter … bude o to zájem třeba jako o rozšíření nad tímto gridem?

Já ti nevím, ale nedělal si to zbytečně? Mě se zdá, že to už bylo vyřešeno někým jiným. Viz.: https://github.com/…Grid/pull/15

Pokud tvé řešení spočívá v něčem jiném, tak moji zprávu prosím ignoruj.

MW
Člen | 626
+
0
-

Zdravim,

narazil jsem na problem a prosim o radu:

Pokud pridam validaci na inline editaci:

$this->addColumn('name', 'Název', '100px')
		->setTextEditable()
		->setTableName("cars.name")
		->setTextFilter()
		->setAutocomplete('10');

$this->getColumnInput('name')->addRule(\Nette\Application\UI\Form::FILLED, 'Nezadali jste název.');

a pak mam subgrid:

$this->addSubGrid("data", "Zobrazit náklady")
		->setGrid(new CarsCostsGrid($presenter->context->database, $this->activeSubGridId))
		->settings(function($grid){
		    $grid->setWidth("500px");
		    $grid['columns-name']->setWidth("200px");
		})
		->setCellStyle("background-color:#f6f6f6; padding:20px;");

ALE v tomto subgridu je stejny nazev sloupce „name“ jako je v hlavnim gridu a tedy me to neprojde pri editaci validací…

V subgridu nemam nastavenou zatim zadnou validaci. Ale presto, ze mam name vyplnene, tak to hlasi chybu ‚Nezadali jste název.‘ …

Pokud dam validaci z hlavniho gridu pryc, grid i subgrid jinak funguje dobre.. ale validaci tam potrebuju..

Jak na to prosim?

Diky !

Andrasin
Člen | 29
+
0
-

MW: Občas by možná neuškodilo projít si tohle téma ;) Už jsem o téhle chybě psal, musíš počkat na opravu… https://forum.nette.org/…kalou-funkci?p=2

K tvému přechozímu dotazu ohledně popisu subrgidů, pro popsání subgridů funkce není, musel bysis to doprogramovat.

MW
Člen | 626
+
0
-

Když je nekdo slepej ;)
Diky a omlouvam se …

Nifty
Člen | 45
+
0
-
  • Opraveno řazení
  • V TextEditable() lze nyní nastavit i textarea
$this->addColumn('column', 'Label')
	->setTextEditable(TRUE, $rows, $cols);

Nepovinný první parametr značí, že se má použít textarea. Dají se také nastavit řádky a sloupce.

  • Přidaná možnost pojmenovat grid
$this->setGridName('Články');
  • Validace řádkové editace & přidávání řádku zatim pořád nefunguje v subGridu.
  • Přidal jsem možnost nastavit Translator, autor Kurtas
protected function configure($presenter)
{
	$this->setTranslator($this->translator);
}
  • Zkoušel jsem zprovoznit tu upravenou šablonu pro bootstrap, ale měl jsem to celé rozházené. Funguje vám někomu správně? Kdyby to někdo dal dohromady, bylo by to fajn.
  • Přidal jsem pár vylepšení od juzna, nejdůležitější viditelné změny:
    • podpora composeru
    • pro DataSource se změnil namespace
$source = new NiftyGrid\DataSource\NDataSource($this->articles);

.:M@rt!n:.

  • Vybírat údaje pouze za určítý měsíc nejde. Napadá mě asi jediné řešení (ne moc elegantní). Přidal bych si dvakrát stejný sloupec s datem, v jednom by se do filtru vepsal datum >= začátku měsíce, v druhym datum <= konci měsíce.
  • Podmíněný selectbox v současné verzi taky nelze, ale mělo by to jít udělat. Až bude čas, tak se na to kouknu.
  • Ty checkboxy by šly udělat, ale je to asi věc, která by se tak často nepoužívala. Spíš bych to viděl na vlastní úpravu. Nebo je dát mimo grid a předávat si parametry do gridu a podle toho by se sloupec přidal/nepřidal.

MW

  • Validace by měla fungovat ajaxově. Kdyžtak zkus stáhnout poslední verzi na githubu.
Andrasin
Člen | 29
+
0
-
  • Zkoušel jsem zprovoznit tu upravenou šablonu pro bootstrap, ale měl jsem to celé rozházené. Funguje vám někomu správně? Kdyby to někdo dal dohromady, bylo by to fajn.

Původně jsem taky zkoušel použít tu z pull requestu, ale měl jsem s ní problémy… nakonec jsem si tu šablonu přepsal sám, takže bych ji mohl poskytnout, ale je závislá na mých úpravách celé komponenty, takže až budu mít chvíli, mohl bych jí upravit pro původní verzi…

Editoval Andrasin (14. 10. 2012 2:41)

Nifty
Člen | 45
+
0
-

Na mojí stránku jsem přidal rozpracovanou verzi gridu v bootstrapu. Ještě to neni dodělané, ale můžete psát připomínky. Jedná se o upravenou šablonu od Andrasina.

Jednotlivým buttonům se daji nastavit třídy (btn-danger, ..), ikonky (icon-user, ..) a můžou obsahovat i text.

Andrasin
Člen | 29
+
0
-

Nejsem si moc jistý tím, jestli je dobrý nápad, aby tlačítka akcí + tlačítka subgridů měli třídy btn, původně jsem tam radši dal jen samotné ikonky. Vypadá to takhle sice hezky, ale na slabších strojích bude asi dost problém to vykreslit do prohlížeče, obzvlášť třeba při stovce záznamů. Zítra to zkusím trochu otestovat.

EDIT:

Do js bych ještě přidal funckci, která přidá do alert messages tlačítko pro jejich schování…

$('.alert').livequery(function(){
	  $(this).addClass('fade in');
	  $(this).prepend('<button type="button" class="close" data-dismiss="alert">×</button>');
});

Editoval Andrasin (15. 10. 2012 3:06)

David Zadražil
Člen | 62
+
0
-

@Andreasi nebo Nifty, mohli by jste zveřejnit tu bootstrap šablonu? Přepsal jsem si to, ale to vaše vypadá víc k světu :-) Díky!

iguana007
Člen | 970
+
0
-

David Zadražil napsal(a):

@Andreasi nebo Nifty, mohli by jste zveřejnit tu bootstrap šablonu? Přepsal jsem si to, ale to vaše vypadá víc k světu :-) Díky!

+1

.:M@rt!n:.
Člen | 201
+
0
-

Ahoj,
aplikuji niftygrid do své aplikace,kterou dělám podle nového quickstartu, ale nevím jak změnit tento řádek u rychlé editace:

<?php
 $presenter->context->database->table('pridavek')->where("id", $vals["id"])->update($vals);
?>

Laděnka hlásí chybu:

<?php
Service 'database' not found
?>

Díky

Editoval .:M@rt!n:. (18. 10. 2012 18:48)

MW
Člen | 626
+
0
-

Ja to řeším takto

presenter:

protected function createComponentCarsGrid() {
	return new CarsGrid($this->context->database);
    }

a grid:

public function __construct($database) {
	parent::__construct();

	$this->database = $database;
	$this->cars = $database->table('cars');
    }

Editoval MW (18. 10. 2012 20:07)

.:M@rt!n:.
Člen | 201
+
0
-

Stejná chyba odkazující na řádek z metody na vytvoření gridu:

<?php
 protected function createComponentEncoreGrid() {
        return new \EncoreGrid($this->context->database);
    }
?>
MW
Člen | 626
+
0
-

A mas to v neonu vubec nahozeny?

napr.:

nette:
		database:
			dsn: 'mysql:host=localhost;dbname=db'
			user: xxx
			password: 'xxx'
			reflection: Nette\Database\Reflection\ConventionalReflection

	services:
		database: @nette.database.default
.:M@rt!n:.
Člen | 201
+
0
-

Jo díky ;) Už to jde.

David Ďurika
Člen | 328
+
0
-

iguana007 napsal(a):

David Zadražil napsal(a):

@Andreasi nebo Nifty, mohli by jste zveřejnit tu bootstrap šablonu? Přepsal jsem si to, ale to vaše vypadá víc k světu :-) Díky!

+1

tiez sa pridavam, nechapem preco to nespravite… dokonca uz je na to aj poslany pull request…

Andrasin
Člen | 29
+
0
-

tady je moje verze šablony… Nemám ji úplně dotaženou do konce. Nifty ji má upravenou ještě trochu jinak.

lunak83
Člen | 47
+
0
-

Existuje v Nifty nějaká možnost jak manuálně přidat řádek (nahoru nebo dolů) ve kterém budou jednotlivé sloupce sečteny apod.?

David Ďurika
Člen | 328
+
0
-

Andrasin napsal(a):

tady je moje verze šablony… Nemám ji úplně dotaženou do konce. Nifty ji má upravenou ještě trochu jinak.

hod to na git, aby sme si to mohli prezriet…

David Zadražil
Člen | 62
+
0
-

Andrasin napsal(a):

tady je moje verze šablony… Nemám ji úplně dotaženou do konce. Nifty ji má upravenou ještě trochu jinak.

Díky, jen upozorním, je tam chybějící funkce hasClass a poté getClass, tak si jí akorát dopiště do Column.php. Jinak to funguje perfektně. Budu provádět nějaké úpravy, tak to potom hodím na git.

Editoval David Zadražil (21. 10. 2012 20:56)

MW
Člen | 626
+
0
-

lunak83 napsal(a):

Existuje v Nifty nějaká možnost jak manuálně přidat řádek (nahoru nebo dolů) ve kterém budou jednotlivé sloupce sečteny apod.?

+1

Andrasin
Člen | 29
+
0
-

@achtan: Bohužel github nepoužívám, chystám se na něj už dlouho ale nějak nebyl čas…

@David zadražil: Za to se omlouvám, nějaký pozůstatek mých modifikací, snažil jsem se je všechny odstranit :)