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.
Kryšpin
Člen | 27
+
0
-

Kryšpin napsal(a):

Nápad pro přidání:

metodu setNoRecords, která by nastavovala hlášku, když nejsou žádné záznamy (soubor grid.latte:111). Jako výchozí ponechat „Žádné záznamy“.

Tak jsem to udělal a pullnul. Takže záleží na Niftyxovi.

PaajaE
Člen | 5
+
0
-

Ahoj, prosím o radu:

Mám problém se získáním dat s využitím DibiFluentDataSource z oracle db (Nette 2.0.4, Dibi 2.0). Dotaz na počet záznamů v tabulce se vykoná správně, ale následný dotaz, který by měl natáhnout prvních dvacet záznamů se už neprovede a zahlásí:

oci_execute(): ORA-00933: příkaz SQL není řádně ukončen

SQL příkaz, který se posílá, vypadá takto:
SELECT * FROM "AREALY" LIMIT 20 OFFSET 0

Můj grid vypadá takto:

<?php
use \NiftyGrid\Grid;

class ArealyGrid extends Grid{
	private $db;

    public function __construct(\DibiConnection $connection)
    {
        parent::__construct();
		$this->db = $connection;
    }

    protected function configure($presenter)
    {
		$fluent = $this->db->select('KODAREALU, NAZEVAREALU, DATUM_EDITACE, NAZ_SO, NAZ_MC')->from('AREALY');
		$dataSource = new \NiftyGrid\DibiFluentDataSource($fluent, 'KODAREALU');
		// $dataSource = new \NiftyGrid\DibiFluentDataSource($this->db->select('*')->from('AREALY'), 'kodarealu');
        $this->setDataSource($dataSource);

		$this->addColumn('KODAREALU', 'Titulek', '250px');
		$this->addColumn('NAZEVAREALU', 'Autor', '100px');
		$this->addColumn('DATUM_EDITACE', 'Datum', '100px');
		$this->addColumn('NAZ_SO', 'Status', '100px');
		$this->addColumn('NAZ_MC', 'Zobrazení', '100px');
    }
}
?>

Nemohu objevit chybu, ale jsem začátečník a řešení jsem nikde nenašel.. Díky za pomoc nebo navedení :-)

Nifty
Člen | 45
+
0
-

Ahoj, popravdě mě moc nenapadá, kde by mohl být problém.
Schválně to zkus vypsat někam mimo grid, jestli to bude fungovat.
Ten název tabulky v dotazu, kterej ti to vytvoří, by asi neměl být v uvozovkách a vybírá ti to všechny sloupce(*), i když si tam v selectu vyjmenoval, které chceš.
S dibi ani s oracle jsem nikdy moc nepracoval, ale nemohl by být problém třeba ve velkých písmenech tabulek/sloupců? Popř. problém v dibi driveru pro oracle?
Třeba někdo moudřejší poradí :)

PaajaE
Člen | 5
+
0
-

Nifty napsal(a):

Ahoj, popravdě mě moc nenapadá, kde by mohl být problém.
Schválně to zkus vypsat někam mimo grid, jestli to bude fungovat.
Ten název tabulky v dotazu, kterej ti to vytvoří, by asi neměl být v uvozovkách a vybírá ti to všechny sloupce(*), i když si tam v selectu vyjmenoval, které chceš.
S dibi ani s oracle jsem nikdy moc nepracoval, ale nemohl by být problém třeba ve velkých písmenech tabulek/sloupců? Popř. problém v dibi driveru pro oracle?
Třeba někdo moudřejší poradí :)

Díky za odpověď.
Kombinaci dibi a oraclu už mám vyzkoušenou, malá/velká písmena u sloupců by neměly být problém, naopak u tabulky musí být velká. Tabulka v uvozovkách snad také pro oracle není problém.. Ohledně toho výpisu (*) je to moje chyba – vypsal jsem špatnou chybovou hlášku.. Správně mělo být:
SELECT kodarealu, nazevarealu, datum_editace, naz_so, naz_mc FROM "AREALY" LIMIT 20 OFFSET 0
Mně to přijde, že se špatně vyskládá sql dotaz – měla by tam asi být nějaká where podmínka pro ten limit a offset namísto LIMIT 20 OFFSET 0 Leč bohužel netuším, jak tu chybku odstranit…

Nifty
Člen | 45
+
0
-

Dotaz se vyskládá správně. V základnim stavu gridu nejsou žádné podmínky nutné. Limit 20 je defaultní hodnota, takže to tam je také správně.
Chyba vzniká na straně SQL serveru, takže problém bude někde mezi datasource/dibi/oracle. Jestli oraclu nevadí název tabulky v uvozovkách, tak nevim, co se tomu na tom dotazu nelíbí.

Tady jsem sepsal, co se postupně s tim fluentem děje

//vytvoření a předání zdroje dat
$fluent = $this->db->select('KODAREALU, NAZEVAREALU, DATUM_EDITACE, NAZ_SO, NAZ_MC')->from('AREALY');
$dataSource = new \NiftyGrid\DibiFluentDataSource($fluent, 'KODAREALU');
$this->setDataSource($dataSource);

DibiFluentDataSource

class DibiFluentDataSource extends Nette\Object implements IDataSource
{
	//zdroj dat
	public $fluent;

	//primární klíč
	public $pKeyColumn;

	//v konstruktoru se fluent naklonuje a uloží
	public function __construct(DibiFluent $fluent, $pKeyColumn)
	{
		$this->fluent = clone $fluent;
		$this->pKeyColumn = $pKeyColumn;
	}

	//z gridu se zavolá limitování počtu řádků
	public function limitData($limit, $offset)
	{
		$this->fluent->limit($limit)->offset($offset);
	}

	//Potom se už jen předá do gridu
	public function getData()
	{
		return $this->fluent->fetchAssoc($this->pKeyColumn);
	}
}

Zjednodušeně se provede jen toto

$fluent = $this->db->select('KODAREALU, NAZEVAREALU, DATUM_EDITACE, NAZ_SO, NAZ_MC')->from('AREALY');
$fluent->limit(20)->offset(0);
$fluent->fetchAssoc('KODAREALU');

Už mě vubec nenapadá, co by mohlo být špatně, je to záhada :)

Editoval Nifty (22. 8. 2012 16:08)

PaajaE
Člen | 5
+
0
-

Ještě je zajímavé, že mi to hlásí pouze warning.. Nikoli error..

Tady je warning:

File: ...\libs\dibi\drivers\oracle.php Line: 106
oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT);

Callstack vypadá takto:

…\libs\dibi\drivers\oracle.php:106 source ► oci_execute (arguments ►)

…\libs\dibi\libs\DibiConnection.php:343 source ► DibiOracleDriver-> query (arguments ►)

…\libs\dibi\libs\DibiConnection.php:261 source ► DibiConnection-> nativeQuery (arguments ►)

…\libs\dibi\libs\DibiFluent.php:439 source ► DibiConnection-> query (arguments ►)

…\libs\dibi\libs\DibiFluent.php:379 source ► DibiFluent-> query (arguments ►)

…\libs\NiftyGrid\DataSource\DibiFluentDataSource.php:58 source ► DibiFluent-> fetchAssoc (arguments ►)

…\libs\NiftyGrid\Grid.php:869 source ► NiftyGrid\DibiFluentDataSource-> getData ()

…\temp\cache\_Nette.FileTemplate\_Homepage.default.latte-e653fe012b94307998fa03d3498ac8ba.php:14 source ► NiftyGrid\Grid-> render ()

…\libs\Nette\Latte\Macros\UIMacros.php:468 source ► _lb2ae51c8d4f_content (arguments ►)

…\temp\cache\_Nette.FileTemplate\_templates._layout.latte-1c3100889014a17f83abea3e932269ea.php:73 source ► Nette\Latte\Macros\UIMacros:: callBlock (arguments ►)

…\libs\Nette\Utils\LimitedScope.php:73 source ► include (arguments ►)

…\libs\Nette\Templating\FileTemplate.php:119 source ► Nette\Utils\LimitedScope:: load (arguments ►)

…\temp\cache\_Nette.FileTemplate\_Homepage.default.latte-e653fe012b94307998fa03d3498ac8ba.php:36 source ► Nette\Templating\FileTemplate-> render ()

…\libs\Nette\Utils\LimitedScope.php:73 source ► include (arguments ►)

…\libs\Nette\Templating\FileTemplate.php:119 source ► Nette\Utils\LimitedScope:: load (arguments ►)

…\libs\Nette\Application\Responses\TextResponse.php:59 source ► Nette\Templating\FileTemplate-> render ()

…\libs\Nette\Application\Application.php:142 source ► Nette\Application\Responses\TextResponse-> send (arguments ►)

…\app\bootstrap.php:41 source ► Nette\Application\Application-> run ()

…\www\index.php:16 source ► require (arguments ►)

Editoval PaajaE (22. 8. 2012 16:43)

Nifty
Člen | 45
+
0
-

Teď jsem z toho trochu zmatenej – předtim to byla chyba v SQL dotazu, teď je to warning v PHP.
Můžeš někam uploadnout celej výpis laděnky nebo poslat přes PM?(odstraň z ní hesla a citlivá data)

EDIT: Ten zjednodušený kód ti mimo grid funguje?

Editoval Nifty (22. 8. 2012 17:22)

PaajaE
Člen | 5
+
0
-

Tady je Odkaz na laděnku

SNad jsem zvládnul všechno upravit a snad to opravdu uvidíš zvenčí.. Mizím na prodloužený víkend, tak ted nebudu moct reagovat.. Každopádně díky za pomoc..

thunderbuff
Člen | 164
+
0
-

Callbacky a anonymní funkce v php moc neznám, obracím se na vás s prosbou o radu:

Lze toto upravit tak, abych do té funkce mohl předat vlastní parametr (Například formát data na základě uživatelova nastavení)?

<?php
$this->addColumn('published', 'Datum', '100px')
            ->setRenderer(function($row){return date('j.n.Y', strtotime($row['published']));})
?>

Zjistil jsem, že $row se do té funkce cpe z templatu a vlastní logiku dělají dvě funkce z Column.php, ale nejsem z toho moc chytrý…

Nifty
Člen | 45
+
0
-
$format = 'j.n.Y';
$this->addColumn('published', 'Datum', '100px')
	->setRenderer(function($row) use ($format){
		return date($format, strtotime($row['published']));
	});
thunderbuff
Člen | 164
+
0
-

Děkuji Nifty :-) Po třech dnech tvorby vlastního gridu jsem se rozhodl použít ten Tvůj. Je opravdu EPICKÝ

Milo
Nette Core | 1283
+
0
-

PaajeE: Chyba je v SQL dotazu. Oracle nezná klauzule LIMIT a OFFSET. Vyzkoušej upravený datasource. Nemám poruce Oracle, netestoval jsem.

Editoval Milo (23. 8. 2012 14:44)

Saja
Člen | 7
+
0
-

Dá se nějak vypnout ajax u hromadných operací? Potřebuji provézt například editaci více záznamu a přesměrovat na formulář

PaajaE
Člen | 5
+
0
-

Milo: Díky moc za pomoc, už se mi grid zobrazuje v plné kráse!

muflix
Člen | 92
+
0
-

Chtěl bych se zeptat, bylo by možné dát někam zdrojový kód Demo stránky ? Jako začátečníkovi by mi to hodně pomohlo, z dokumentace jsem přece jen narazil na několik komplikací, které nejsem schopen vyřešit.

Nifty
Člen | 45
+
0
-

Saja
V současné verzi to nejde, ale píšu si na seznam TODO :)

muflix
Ty zdrojové kódy demo stránky jsou už z dost staré verze(jinak se tam pracuje se sloupcema). Ukázková aplikace ke stažení pod dokumentací nestačí? Je tam využito všechno, co v tom demu. Akorát tam chybí přidávání globálních tlačítek a přidávání řádků(návod najdeš v tomto tématu), to je zatím pouze na githubu.

Editoval Nifty (28. 8. 2012 11:13)

muflix
Člen | 92
+
0
-

Nifty: jezis to sem si vubec nevsiml, to je perfektni diky moc :)

rp
Člen | 20
+
0
-

Pěkná komponenta. Chybí mi možnost uchovat stav:

protected function configure($presenter)
{
	...
	$this->rememberState = TRUE;
	$this->rememberTimeout = '+ 2 minutes';
}

Zkoušel jsem to tak, že při každém požadavku na vykreslení ukládám odkaz na komponentu:

if($this->rememberState)
{
	// save state to session
	$this->remember('state', $presenter->link('//this'));
}

což je funkční a opravdu ukládá odkaz na aktuální stav (absolutní URL) do session. Problém je v obnovení – redirectu na URL. Při připojování komponenty do presenteru (metoda attached) se pokouším o:

protected function attached($presenter)
{
	...
	$state = $this->recall('state');
	$this->redirectUrl($state);
	...
}

Absolutní URL ze session vytáhnu úspěšně, ale redirectUrl nefunguje – k přesměrování nedochází. To se asi nedělá přesměrovávat v attached, že? Kde to ale správně udělat? Nebo na to jít úplně jinak?

thunderbuff
Člen | 164
+
0
-

Lze nějak nastavit omezení pro konkrétní položky v addButton? Mám například tabulku s uživateli, jako admin se mohu za nějakého z nich přihlásit, ale u řádku se svým záznamem ikonku „Login User“ nechci. Je to nějak jednoduše proveditelné?

<?php

		$this->addButton("edit", "Login user")
			->setClass("loginicon smallicon")
			->setLink(function($row) use ($presenter) {
			return $presenter->link("Users:Loginuser", $row['userid']);
		})
			->setAjax(FALSE);

?>

Editoval thunderbuff (29. 8. 2012 19:47)

rp
Člen | 20
+
0
-

Pokud tvoje user_id=1, potom bych vyzkoušel:

return (user_id != 1) ? $presenter->link("Users:Loginuser", $row['userid']) : NULL;
Nifty
Člen | 45
+
0
-

rp
V attached by měl jít redirect. Např. v metodě filterData, která je volaná z attached, je redirect a funguje. Nenapadá mě, co by tam mohlo být za problém.

thunderbuff
Tuto úpravu už navrhoval Kurtas, dokonce poslal i pull request, ale já na to zapomněl :)
https://github.com/…Grid/pull/12
Parametrem je callback, který má vracet boolean hodnotu a podle toho se button vykreslí/nevykreslí.
Akorát přemýšlím, jestli místo setShow() by nebylo vhodnější např. setVisibility().

kubiq
Člen | 6
+
0
-

Ahoj,

Ve třídě DoctrineDataSource chybí implementace metody getPrimaryKey z interfacu IDataSource:

Class NiftyGrid\DoctrineDataSource contains 1 abstract method and must therefore be declared
abstract or implement the remaining methods (NiftyGrid\IDataSource::getPrimaryKey)

Nejsem si uplně jistý jesti to je chyba u mě, nebo někde jinde, ale přijde mi logické ji tam implementovat.

Editoval kubiq (30. 8. 2012 14:56)

Nifty
Člen | 45
+
0
-

Ahoj, DoctrineDataSource je už z trochu starší verze gridu, tak je možné, že tam něco chybí. Sice nejsem autor, ale snad poradím.
Mělo by stačit přidat:

public function getPrimaryKey()
{
	return $this->primary;
}

Kdyžtak dej vědět, jestli to funguje a hodim to na github.

Editoval Nifty (30. 8. 2012 16:26)

kubiq
Člen | 6
+
0
-

Ano takle to funguje. Chtěl jsem mít gatadrid jako submodul, proto sem si to nechtěl opravovat sám. :-)

Kryšpin
Člen | 27
+
0
-

Milo: Mohl by ses vyjádřit k tomuto problému? https://github.com/…id/issues/19

ZZromanZZ
Člen | 87
+
0
-

Kus dobre prace, smekam klouboucek…

Vsiml jsem si ze grid podporuje filtraci boolean hodnot ale nevsiml jsem si ze by podporoval zobrazovani checkboxu v boolean sloupci… je takova feature v planu ?

Nifty
Člen | 45
+
0
-

Stačí přidat k definici sloupce setBooleanEditable() a zapnout řádkovou editaci.

Pokud ti jde o to vidět ten checkbox i mimo editaci, použij metodu setRenderer() a pomocí \Nette\Utils\Html::el() tam ten checkbox dej. Ale myslim si, že to bude akorát zbytečně plést uživatele (ledaže by byl checkbox disabled).

$this->addColumn('published', 'Publikováno?')
	->setRenderer(function($row){
		return \Nette\Utils\Html::el('input')
			->type('checkbox')
			->disabled('disabled')
			->checked((boolean) $row['published']);
	})
	//checkbox můžeme zarovnat na střed
	->setCellRenderer("text-align:center;");

Editoval Nifty (31. 8. 2012 17:45)

ZZromanZZ
Člen | 87
+
0
-

Plánuješ rozšíření o zneaktivnění tlačítek(nebo celého gridu) při čekání na odpověď ze serveru? Mohlo by se to hodit při časově náročnočnějších požadavcích…

TheNEoo
Člen | 75
+
0
-

Ahoj,
Chtel bych se optat, kde naleznul odkaz na fast-edit. Rád bych místo image měl text. V latte gridu jsem ho nenašel.

marten_cz
Člen | 10
+
0
-

Komponenta vypada opravdu dobre a pracuje i rychle. Mel bych jen par otazek:

  • Je mozne volat dalsi akce pri zmene group akce? Tedy chci hromadne zmenit autora zaskrtnutych clanku, kdyz kliknu na „Zmena autora“, rad bych po prave strane ukazal dalsi selectbox s autorama.
  • Nebylo by spatne pridelat validaci na radkovou editaci. Tedy napr. kdyz se nepovede ulozit do DB, nemam moznost dat o otm vedet uzivateli jinak nez pres flash message, coz je nepohodlne.
Saja
Člen | 7
+
0
-

Jak je možné pracovat s překlady? Pokud použiji v šabloně gridu {_}Text{/_} tak vyskočí error Call to undefined method Nette\Templating\FileTemplate::translate()

David Ďurika
Člen | 328
+
0
-

nema niekto spravene tie templaty do bootstrapu ?

Editoval achtan (8. 9. 2012 10:25)

Nifty
Člen | 45
+
0
-

ZZromanZZ
Mělo by stačit přidat handler v js souboru při startu a na konci ajaxu. Do oficiální verze to zatim neplánuju.

TheNEoo
Odkaz na se generuje v třídě Button v metodě render. Buttony jsou koncipovány jako obrázková tlačítka, takže bez zásahu do kódu to lehce provést asi nepůjde. Do budoucna bych to možná předělal, aby se s tim dalo lépe manipulovat.

marten_cz
1)To je docela komplexní požadavek, myslim že bez vlastního rozšíření to nepůjde.
2)Mělo by to jít takhle

$this['gridForm'][$this->name]['rowForm']['columnName']->addRule(..);

V šabloně ale bude potřeba přidat výpis pro chyby z formuláře. V dalším updatu bych to tam přidal, možná i zjednodušil ten přístup k formulářovým prvkům.

Saja
Překlady ještě nejsou v oficiálni verzi. Kurtas poslal pull request na přidání podpory translatu i šablonu (nemusí být z aktuální verze), ale ještě jsem se k tomu nedostal.

achtan
Tady jsou nějaké úpravy pro bootstrap (nezkoušel jsem). O ničem jiném nevim.

David Ďurika
Člen | 328
+
0
-

Nifty napsal(a):
Tady jsou nějaké úpravy pro bootstrap (nezkoušel jsem). O ničem jiném nevim.

a nechcel by si mergnut tie commity vyzera to dobre… a nebudes musiet robit vlastne css, bootstrap uz aj tak pouziva skoro kazdy…

ZZromanZZ
Člen | 87
+
0
-

Nifty,

jenom drobný dotaz, proč je konfigurace gridu v metodě configure a předává se do ní aktuální presenter ?

Nešlo by to řešit takto ?

<?php
class NejakyPresenter extends \Nette\Aplication\UI\Presenter
{

	protected function createComponentGrid($name)
	{
		return new \Nekde\Nejaky\Grid($this, $name)
	}
}
?>

A v samotném gridu by funkce configure vůbec nemusela být…

<?php
class Grid extends \Nïfty\Grid
{

	public function __construct($parent, $name)
	{
		__parent::construct($parent, $name);

		// zbytek konfigurace primo v konstruktoru...
		// nebo zavolame primo $this->configure();
	}
}
?>

Bylo by to myslím víc nette-way a nemuselo by se to řešit metodou attached

Editoval ZZromanZZ (10. 9. 2012 19:26)

Skippous
Člen | 21
+
0
-

achtan napsal(a):

Nifty napsal(a):
Tady jsou nějaké úpravy pro bootstrap (nezkoušel jsem). O ničem jiném nevim.

a nechcel by si mergnut tie commity vyzera to dobre… a nebudes musiet robit vlastne css, bootstrap uz aj tak pouziva skoro kazdy…

Souhlasím a připojuji se k prosbě, bootstrap je dle mého nejlepší řešení pro backend.

talpa
Člen | 44
+
0
-

suprove napsany jen v textinput filtru je problem se sirkou ktera vzdy zmeni sirku pole, maly patch :)

/**
	 * @return Column
	 */
	public function setTextFilter()
	{
		$this->parent['gridForm'][$this->parent->name]['filter']->addText($this->name, $this->label.":")->setAttribute('style', array('width'=>$this->width));
		$this->filterType = FilterCondition::TEXT;

		return $this;
	}

	/**
	 * @return Column
	 */
	public function setNumericFilter()
	{
		$this->parent['gridForm'][$this->parent->name]['filter']->addText($this->name, $this->label.":")->setAttribute('style', array('width'=>$this->width));
		$this->filterType = FilterCondition::NUMERIC;

		return $this;
	}

Editoval talpa (14. 9. 2012 19:11)

talpa
Člen | 44
+
0
-

jak je to s podminenym zobrazenim edit buttonu, prestavoval bych si neco podobneho co renderuje polozky,
strilim to od boku tak me nekamenujte

      		$this->addButton("edit", "Upravit Návštěvu")
			->setClass("edit")
			->setLink(function($row) use ($presenter){
				return $presenter->link("visit:edit", $row['id']);})
			->setAjax(FALSE)
        		->setRenderer(function($row){
        			$inv=\Model\Visit::getVisitStatus();
        			return  $row['status']=="editovatelny"?($control):null;
        		});

--/

Editoval talpa (14. 9. 2012 19:19)

Nifty
Člen | 45
+
0
-

Přidán callback pro zobrazení/schování buttonu nebo subgridu na jednotlivých řádcích:

$this->addButton("publish", "Publikovat")
	->setShow(function($row){
		return $row['status'] == 'Publikované' ? FALSE : TRUE;
	});
$this->addSubGrid("comments", "Zobrazit komentáře k článku")
	->setGrid(new CommentGridByArticleId($comments, $this->activeSubGridId))
	//$row['comments'] je boolean hodnota z db, povolené - nepovolené komentáře
	->setShow(function($row){
		return $row['comments'];
	});

Přidána podpora pro validaci řádkového formuláře a formuláře pro přidávání řádků.

$this->getColumnInput('title')->addRule(...);

Přidána podpora pro textová tlačítka

$this->addButton('delete', 'Smazat')
	//může být i callback
	->setText('Smazat')
	->setClass('delete-textual');

U hromadných akcí lze nyní vypnout ajax. Například pro zobrazení detailů u vybraných produktů:

$this->addAction('detail', 'Zobrazit detaily')
	->setAjax(FALSE)
	->setCallback(function($rows) use ($presenter){
		return $presenter->redirect('Products:details', array('rows' => $rows));
	});

bootstrapu:
Asi bych to přidal jako druhou šablonu. Nebo se to nevylučuje? S bootstrapem jsem si zatim moc nehrál, máte někdo funkční ukázku?

ZZromanZZ
Myslim, že je to víceméně jedno. Takhle by si zase musel psát v gridu novou metodu pro předání modelu nebo přenášet 3 a víc parametrů (parent, name, model, subGridId, ..).

talpa
Moc jsem nepochopil, co je tam přesně za problém. S tvojí úpravou i bez se mi to zobrazuje stejně. Můžeš to kdyžtak rozepsat? Podmíněné buttony viz nahoře tohoto příspěvku.

Editoval Nifty (15. 9. 2012 16:35)

talpa
Člen | 44
+
0
-

problem byl ze se mi textinput roztahoval columm jak se mu chtelo, nebo naopak byl kratky, mozna mam jen blbe css, juknu na ty podmineny buttons diky, moc je potrebuju :)

talpa
Člen | 44
+
0
-

zda se ze ty buttony chodi, diky za patch :)

ZZromanZZ
Člen | 87
+
0
-

Za bootstrap se taky primlouvam, jako volitelna sablona by to bylo perfektni…

Andrasin
Člen | 29
+
0
-

Parádní komponenta, díky za ní, obzvlášť za ty nejnovější změny. Jen takový nápad, možná by bylo dobré dát do řádkové editace možnost místo text inputu zvolit textareu. V některých případech by to bylo dost užitečné.
Jako je to například v editaci hodnot tabulek v Admineru od Jakuba Vrány.

EDIT: Ještě jsem teď našel bug, pokud odešlu řádkovou editaci v subgridu a v nadřazeném gridu jsou definovány nějaké validační pravidla pro řádkovou editaci, validace se v něm spustí také. Pokud je tam pak nějaké pravidlo setRequired, formulář ze subgridu se neodešle.

Editoval Andrasin (18. 9. 2012 3:53)

talpa
Člen | 44
+
0
-

jedna vec, jak filtrovat podle group pole tj. napr.

	$this->addColumn('celkem', 'Celkem', '70px')
		->setTableName('count(companies_id)')
		->setTextFilter();

primlouval bych se dat u setTableName parametr, ktery by rikal jestli to cirou nahodou neni HAVING tj. ze nema byt ve WHERE :)
Hlavne ne vnorene selecty apod.

Pingy
Člen | 6
+
0
-

Aby mi fungovalo správně nejenom filtrování, ale i řazení u sloupců s nastaveným setTableName(), tak jsem upravil Grid.php a přidal tam do metody orderData() [583] podmínku která mi i řadí dle zadané tabulky.

if(!empty($this['columns-'.$order[0]]->tableName)){
 $order[0] = $this['columns-'.$order[0]]->tableName;
}

Je řazení podle výchozí tabulky bug, nebo feature?

Kurtas
Člen | 109
+
0
-

Prosim hodte nekdo nekam boostrapovskou templatu docela by se mi sikla :-)

Treba na pastebin.com

Diky

Pingy
Člen | 6
+
0
-

Přidal jsem si metodu setTarget($target), protože potřebuju některé action posílat do nového okna/panelu. Pokud by to využil i někdo jiný, tak si myslím, že není tak špatné to implementovat. Jedná se o celkem primitivní změnu v Button.php

Edit: ne addTarget, ale setTarget($target)

Editoval Pingy (22. 9. 2012 21:51)

muflix
Člen | 92
+
0
-

Ahoj, řeším určitě jednoduchou věc, mám tabulku a rád bych po kliku na tlačítko vygeneroval fakturu. Používám doplněk generátor faktur který mi při odkazu v .latte

<a n:href="Eciovni:generate">Vygenerovat fakturu</a>

normálně funguje.

nevím ale jak odkaz přidat do nifty tabulky, zkoušel jsem něco takového

$this->addButton("pdf", "Vygenerovat PDF")
            ->setClass("pdfikonka")
            ->setLink(function($row) use ($self){return $self->link("Eciovni:generate");});
	    //->setLink("http://example.cz/Eciovni/generate");
            //->setLink(function($row) use ($self){return $self->link("Eciovni:generate"/*, $row['id']*/);});
	    //->setAjax(FALSE);

ale už při generování stránky mi to napíše

Nette\InvalidArgumentException
Component with name 'Eciovni' does not exist.

u přímého odkazu mi to zase pošle na pozadí (pro uživatele se nic neděje) GET požadavek jehož odezvou je zdrojový kód vygenerované faktury ale stejně nevím jak bych tam nacpal $row[‚id‘] :-)

->setAjax se zdá nemá na tohle asi vliv :P

rád bych aby se po kliku na ikonku, uživateli nabídla faktura ke stáhnutí, nevíte jak na to ?:-)

Editoval muflix (23. 9. 2012 14:00)

Pingy
Člen | 6
+
0
-

muflix napsal(a):

Ahoj, řeším určitě jednoduchou věc, mám tabulku a rád bych po kliku na tlačítko vygeneroval fakturu. Používám doplněk generátor faktur který mi při odkazu v .latte

<a n:href="Eciovni:generate">Vygenerovat fakturu</a>

normálně funguje.

nevím ale jak odkaz přidat do nifty tabulky, zkoušel jsem něco takového

$this->addButton("pdf", "Vygenerovat PDF")
            ->setClass("pdfikonka")
            ->setLink(function($row) use ($self){return $self->link("Eciovni:generate");});
	    //->setLink("http://example.cz/Eciovni/generate");
            //->setLink(function($row) use ($self){return $self->link("Eciovni:generate"/*, $row['id']*/);});
	    //->setAjax(FALSE);

ale už při generování stránky mi to napíše

Nette\InvalidArgumentException
Component with name 'Eciovni' does not exist.

u přímého odkazu mi to zase pošle na pozadí (pro uživatele se nic neděje) GET požadavek jehož odezvou je zdrojový kód vygenerované faktury ale stejně nevím jak bych tam nacpal $row[‚id‘] :-)

->setAjax se zdá nemá na tohle asi vliv :P

rád bych aby se po kliku na ikonku, uživateli nabídla faktura ke stáhnutí, nevíte jak na to ?:-)

Sám používám na generování faktur upravené Eciovni na tcpdf + spousta ještě jiných změn, ale prakticky by to mělo fungovat stejně.

$this->addButton("pdf", "Stáhnout pdf")
	->setClass("gridIcon-pdf")
	->setLink(function($row) use ($presenter) {
		return $presenter->link("Invoices:detail", $row['number']);
	})
	->setAjax(false);

Já osobně to mám udělané tak, že abych šetřil zdroje, ukládám faktury na serveru v nepřístupné složce už při tvorbě objednávky. Pak pomocí třídy Invoices kontroluju jestli má daný uživatel právo k dané faktuře a pokud ano, tak je předána ke stažení pomocí FileResponse. To je v podstatě to, co mi dělá Invoices:detail.
Při tomto nastavení mi to nefungovalo bez vypnutého Ajaxu.

Zkusil bych něco ve stylu

$this->addButton("pdf", "Vygenerovat PDF")
	->setClass("pdfikonka")
	->setLink(function($row) use ($presenter) {
		return $presenter->link("Eciovni:generate", $row["id"]);
	})
	->setAjax(false);

s tím, že bych Eciovni:generate upravil tak aby bral $id a podle toho generoval danou fakturu, nebo to udělal stylem jakým to mám já (tzn. ukládání pdf faktur na server a pak jen jejich nabízení pomocí FileResponse) a nebo si vytvořil nějakou třídu která bude brát parametr $id a bude odkazovat na Eciovni tak, aby se Eciovni nemusel upravovat…
Snad jsem trochu pomohl a není to napsané moc zmatečně, píšu to v nedostatku času.

Nifty
Člen | 45
+
0
-

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.

talpa
Tohle v původní verzi fungovalo, ale byl tam velký problém ohledně rychlosti gridu při většim množství záznamů. Využívaly se tam aliasy, ale složitě se tam počítaly záznamy, takže se to předělalo na setTableName a tohle je asi jediná nevýhoda nové verze.

Pingy
Order – je to bug. V nejbližší době to opravim, díky.

Ohledně targetu to není vůbec špatný nápad. Mohl by si poslat pull request?

muflix
Předpokládám, že $self = $this, takže to je grid.
Ty potřebuješ odkaz z presenteru, takže:

$this->addButton("pdf", "Vygenerovat PDF")
	->setClass("pdfikonka")
	->setAjax(FALSE)
	->setLink(function($row) use ($presenter){
		return $presenter->link("Eciovni:generate", $row['id']);
	});

EDIT: Pingy mě předběhnul :)

Editoval Nifty (23. 9. 2012 14:25)