Grido – DataGrid pro Nette

dj.kure
Člen | 70
+
0
-

Já tu mám takový menší problém, nevím proč, ale Grido mi úplně ignoruje parametr „ID“ v řazení.
Zde na obrázku je vidět, že v URL adresního řádku ID je (1) a v odkazu sortu Gridu není :-( a já prostě nevím za boha proč.

http://cl.ly/1P2u2c3o2Y3V

Edit: A co tak koukám, tak Grido ignoruje naprosto všechny parametry.
Edit: Tak nakonec stačilo jen jednoduché řešení, proč mě to jen nenapadlo dříve:

/** @persistent */
    public $id;

Editoval dj.kure (21. 4. 2016 22:00)

drick
Člen | 61
+
0
-

Mam mensi problem, mozno mi bude vediet niekto poradit. Prednedavnom mi tu CzechBoy poradil vytvorit nejaky takyto selection pri vybere dat z viacerych tabuliek:

$selection = $this->database->table('profiles')->select('profiles' . '.*')->select('user' . '.*');
$grid->setModel($selection);

Funguje to dobre, no problem mam pri filtrovani. Dostavam ajax error – v konzole som si pozrel a problem je v tom, ze stlpec z tabulky users sa nenachadza v profiles. Ako by som to mohol fixnut? Da sa niekde v ->setFilterText() nastavit, z ktorej tabulky dany stlpec je?

Oli
Člen | 1215
+
0
-

Ukaž ještě jak vypadá definice toho tvýho sloupce. mozna by to slo i propojit jako user.name. Nebo pokud je ten sloupec v profiles i v user, tak si tam na něj vytvoř alias.

drick
Člen | 61
+
0
-

Oli napsal(a):

Ukaž ještě jak vypadá definice toho tvýho sloupce. mozna by to slo i propojit jako user.name. Nebo pokud je ten sloupec v profiles i v user, tak si tam na něj vytvoř alias.

No profiles tabulka vyzera v skratke nejak takto: id, user_id, birth_date, avatar. Users vyzera: id, password, email

  • cize prepojit sa to da v profiles iba cez user_id, ktore sa viaze v users na id
  • vies mi prosim ta uviest priklad pod tym co myslis „vytvorit alias“?

Editoval drick (1. 5. 2016 22:39)

Oli
Člen | 1215
+
0
-

No já jsem spíš myslel jak ten slpuec vypadá v grido $grido->addTextColumn()....
Ten alias pro tebe nemá smysl. myslel jsem normálně ->select('name AS user_name') pokud by jsi měl například sloupec name v obou tabulkách.

drick
Člen | 61
+
0
-

Oli napsal(a):

No já jsem spíš myslel jak ten slpuec vypadá v grido $grido->addTextColumn()....
Ten alias pro tebe nemá smysl. myslel jsem normálně ->select('name AS user_name') pokud by jsi měl například sloupec name v obou tabulkách.

No ten stlpec vyzera uplne jednoducho:

$grid->addColumnText('name', 'Name')
                ->setFilterText()
                ->setSuggestion();
TomasG
Člen | 23
+
+2
-

Myslím, že se to dá vyřešit tímto:

$grid->addColumnText('name', 'Name')
                ->setFilterText()
                ->setSuggestion()
				->setColumn('user.name');
drick
Člen | 61
+
0
-

TomasG napsal(a):

Myslím, že se to dá vyřešit tímto:

$grid->addColumnText('name', 'Name')
                ->setFilterText()
                ->setSuggestion()
				->setColumn('user.name');

Pecka, dakujem!

vymak
Člen | 92
+
0
-

Ahoj, měl bych na Vás dotaz.
Lze u tohoto Gridu nějak odchytit, že uživatel změnil počet záznamů na stránku?

Něco jako:

	$grid->onChangeDefaultPerPage[] = function (Grid $grid) {
		// do something
	}

Díky.

Šaman
Člen | 2635
+
0
-

Proč Grido v composeru vyžaduje PHP 5.5? Všiml jsem si toho až teď, provozuji ho na 5.4 a zatím jsem nezaregistroval nějaký problém.

Šaman
Člen | 2635
+
0
-

Bower mi nechce naistalovat závislost "grido": "git@github.com:o5/grido.git#ef677c3", tvrdí mi, že byl přidán RSA klíč a že ‚permission denied (publickey)‘.

Edit: V příspěvku jsem upravil verzi. "grido": "2.1.0" funguje, spouštěl jsem bower v jiném projektu. Ale nefunguje ve verzi, která je uvedená když si composerem nainstaluji grido-examples.

Editoval Šaman (4. 5. 2016 21:02)

o5
Člen | 416
+
+1
-

vymak napsal(a):

Lze u tohoto Gridu nějak odchytit, že uživatel změnil počet záznamů na stránku?

Přímo event tam na to není, ale pokud máš potomka hlavní třídy Grido, můžeš si to přidat někde tady.

Šaman napsal(a):

Proč Grido v composeru vyžaduje PHP 5.5?

PHP 5.4 už nyní nemá oficiálně ani security support. Do současné dev-verze mám v plánu přidat ještě dvě velké novinky a releasnu verzi 3.0.

Šaman napsal(a):

Bower mi nechce naistalovat závislost „grido“: „git@github.com:o5/grido.git#ef677c3“, tvrdí
mi, že byl přidán RSA klíč a že ‚permission denied (publickey)‘.

V Bower lze rovněž definovat závislost takto:

"grido": "https://github.com/o5/grido.git#1351b7978d4822197339c3b7da47e88ab80d4a22"
Šaman
Člen | 2635
+
+1
-

@o5: No, to PHP 5.4 je ještě na velkém procentu serverů a i když sám vyvíjím na 5.6, tak nemám třeba v aktuální zakázce možnost ovlivnit PHP která běží na serveru. 5.4 je docela v pohodě, není to vyloženě archaická verze a je to také verze kterou podporuje Nette (a ještě dlouho bude). Takže by mě zajímalo, jestli a případně v čem Grido vyžaduje 5.5, abych věděl, že ho třeba občas nemohu použít. Zatím jsem nenarazil na problém, jen na tu podmínku v composeru.


Co se týče toho načítání, tak nemluvím o běžném použití Grida (to jedu na stabilní verzi), ale mluvím o balíčku grido-examples, které ji využívá. Takže tohle nefunguje:

composer create-project grido-examples
cd grido-examples
bower install

Poslední řádek vyhodí chybu o které píšu. Pak jsem sice zjistil, že ty závislosti bowerem ani nejsou potřeba, ale i tak je to matoucí. Když už tam ten bower jednou je, tak má koukat aby byl. :)

O tom, proč jsem si instaloval grido-examples se rozepíšu v samostatném příspěvku, to vypadá na větší problém.

Editoval Šaman (9. 5. 2016 11:47)

vymak
Člen | 92
+
0
-

o5 napsal(a):

vymak napsal(a):

Lze u tohoto Gridu nějak odchytit, že uživatel změnil počet záznamů na stránku?

Přímo event tam na to není, ale pokud máš potomka hlavní třídy Grido, můžeš si to přidat někde tady.

Díky za nasměrování, zkoušel jsem ale stále to neřeší můj problém.
Mám grid kde například nastavím 50 záznamů na stránce a stisknu tlačítko, které provede AJAX aktualizaci gridu.

public function handleRefresh()
{
	$this->redrawControl('grid');
}

Po aktualizaci mám ale nastavenu výchozí hodnotu bez ohledu na původní nastavenou hodnotu. Jak to co nejčistěji vyřešit?

Marsme
Člen | 75
+
0
-

Potřeboval bych trošku pomoct s gridem. Mám grid a data k němu z dibi. V modelu si vytáhnu data pro grid ale potřebuji jeden sloupeček jako multihodnotu (rozuměj třeba výpis 15, 16) s tím že ideálně aby 15 a 16 šly ještě upravit tak že to budou odkazy. Použil jsem pro to customRender a tam obalil čísla odkazem. Všechno v pohodě funguje až na jeden detail. Nefunguje nad takto vytvořeným sloupcem filtr.

Nějaký nápad jak ten filtr rozchodit? Kód je níže.

$grid->addColumnText('focus', $this->translator->translate('locale.focuses'))
			->setCustomRender(function ($row) use ($order, $_this) {
				$gridFocuses = $order->getOrderFocusesToGrid($row->id);
				$data = '';
				foreach ($gridFocuses as $gf) {
					$data .= '<a href="' . $_this->presenter->link('Focus:edit', array('id' => $gf['focus_id'])) . '">' . $gf['focus_id'] . '</a>, ';
				}
				return $data;
			})
			->setSortable()
			->setFilterText();
Šaman
Člen | 2635
+
+1
-

Pošlu ti řešení, ale dlužíš mému klientovi pivo za proplacených minimálně 10 hodin, které jsem strávil nad tímto problémem :)

  1. Aby bylo možné používat SQL fci FIND_IN_SET (jiný způsob jsem neobjevil), tak je potřeba mít množinu hodnot oddělených čárkou bez mezery, tedy např 2,5,21,22.
  2. Proto mám pro práci s tímto připravený sql pohled, který mi z vazeb vytvoří dva sloupce – jeden pro zobrazení (dejme tomu CZ, SK, GB, ES), druhý pro filtrování (1,5,21,22). Odkazy jsem v tomto případě neřešil.
  3. Připravím si pole pro filtr ve tvaru $units = ['all' => "Všechno", 'none' => "Nic", '1' => "CZ", '2' => "PL" …]
  4. A pak přidám filtr na sloupec který zobrazuji (u mě unit_code_list), ale filtruji na úrovni SQL podle toho druhého, s IDčkama (unit_id_list).
<?php
$grid->addFilterSelect('unit_code_list', "", $units)
				->setWhere(function($value, DibiFluent $fluent){
					if($value === 'all') {
						return;
					}
					elseif($value === 'none') {
						$fluent->where('[unit_id_list] IS NULL');
					}
					else {
						$fluent->where('FIND_IN_SET(%s, [unit_id_list]) > 0', $value);
					}
				});
?>

P.S. Ukázka pracuje s odděleními, ale jejich kódy jsem nahradil zkratkami zemí. Tak se tím nenech zmást :)
P.P.S. Když o tom tak uvažuji, možná by existovalo řešení bez těch pomocných sloupců. K tomuto jsem se dopracoval když jsem zkoušel používat zdokumentované fce Grida, ale až úplně nakonec jsem ze zdrojáků zjistil, jak zapsat úplně vlastní podmínku, která nectí formát metody setCondition. Jenže tou dobou už jsem řešení založené na pohledech.

Editoval Šaman (23. 5. 2016 11:24)

destrosvet
Člen | 2
+
0
-

Zdravím,
potřeboval bych trošku nakopnout při stylování filtrů grida. Mám je venku Filter::RENDER_OUTER a chtěl bych trošku přestylovat inputy, případně tlačítka. Jsem schopný se dostat přes pole filtrů a ->controlPrototype->class[] k inputům ale potřeboval bych span nad tím. Přes $filter->getWrapperPrototype() zase dostanu th, i když jsem to zkoušel přepisovat, nějak se to nechtělo propagovat do html.. takže nevím, je nějaká možnost?
Díky

kedarus
Člen | 3
+
0
-

Ahoj, nezkoušíte někdo grido s nette 2.4? Po aktualizaci mám problém, že po kliknutí na akci, kdy se má zobrazit modální okno, laděnka háže chybu Cannot send header after HTTP headers have been sent.

Editoval kedarus (14. 6. 2016 10:45)

o5
Člen | 416
+
+6
-

@destrosvet: Použij vlastní šablonu a přepiš si blok outerFilterWrapper

@kedarus: Pokud vím, tak Nette 2.4 je stále v RC verzi a zatím jsem se ještě nedostal k testu. Shodou okolností jsem včera rozpracoval podporu modálních akcí a zbývá to už jen trochu poladit, tak možná tento nebo příští týden bych se mohl dostat na test s Nette 2.4 a vydat konečně Grido 3.0!

destrosvet
Člen | 2
+
0
-

Díky, taky mě to napadlo, ale než se do toho pustím, chtěl jsem vědět jestli neexistuje ještě nějaká možnost ;)
Díky

o5 napsal(a):

@destrosvet: Použij vlastní šablonu a přepiš si blok outerFilterWrapper

kolsi
Člen | 131
+
0
-

Když něco napíšu do inner-filtru zmáčknu Enter, tak to sice odešle požadavek, ale filtr se neaplikuje. Zjistil jsem, že za to nejspíše může pořadí buttonů a při zmáčknutí Enteru ve filtru se odešle tlačítko „Items per page“ a nikoli „Search“.

Chtěl jsem ověřit, zda to dělá i v live demu, ale ten web nefunguje.
Zdá se, že to dělá až od určité verze, protože v SW, kde máme starou verzi Grida, to funguje.

o5
Člen | 416
+
0
-

@kolsi: Děkuji za report včetně zjištění problému :) Opraveno v masteru.

akadlec
Člen | 1326
+
0
-

Nevím zda se to tu již neřešilo (nechce se mě prolézat 21 stránek) ale filtry mají jeden neduh :/ Pokud mám ve filtru dynamická data která se můžou v čase změnit (rozuměj smazat) a zároveň je filtr na ty data zapnut tak to lehne na nettím erroru že se pokouší pracovat s položkou selectu kterou nezná.

Nette\InvalidArgumentException: Value 'XX' is out of allowed set [YY,...]

o5
Člen | 416
+
0
-

@akadlec: Použil bych v tvém případě spíše suggest filtr. Pokud bych trval na selecboxu, v handleru na mazání bych rovněž „smazal“ z gridu aktivní filtr (pokud by ho záznam mohl ovlivnit).

akadlec
Člen | 1326
+
0
-

beru z5 týká se to jiného gridu

Oli
Člen | 1215
+
0
-

Pokud edituju položku pomocí ->setEditableCallback(function ($id, $newValue) {} je nějaká možnost refreshnout celý grid, zobrazit flash zprávu nebo udělat cokoli by uživatel viděl, kromě eidtace samotné buňky?

Mám grid, kde jen jedna položka může být aktivní a aktivování položky se ostatní položky zneaktivní. Problém je, že to uživatel nevidí a ani mu nemůžu napsat hlášku že si má refreshnout stránku…

Ondris
Člen | 37
+
0
-

Ahoj,

mám nastaveno několik filtrů a v jednom mám výchozí hodnotu nastavenou tímto způsobem:

$templateId = $this->getParameter("id");

$grid->addColumnNumber("templateId", "ID šablony")
            ->setFilterNumber()
            ->setDefaultValue($templateId);

Pokud vypnu ajax je vše v pořádku, ale při zapnutém ajaxu nastává jeden problém. Pokud u tohoto filtru hodnotu smažu a dám vyhledat, tak se posílá request i s tím výchozím parametrem. Pokud parametr změním na něco jiného, už je to zase v pořádku.

Landsman
Člen | 152
+
0
-

Hola,

taky mám dotaz.
Jak opodmínkovat toto:

$grid->addActionHref('delete', 'Smazat')
    ->setIcon('trash')
    ->setConfirm(function($item) {
        return "Opravdu chcete odstranit rezervační formulář {$item->id} ?!";
    });

aby se vyrenderovalo pouze pokud je $item->default null?

díky

Editoval Landsman (29. 8. 2016 20:41)

stemba
Člen | 20
+
0
-

Ahoj, mám problém se Editable sloupcem.

Aktivuji ho jako:

<?php
$statusPairs = array(
	"user" => "Uživatel",
	"admin" => "Administrator",
	"redactor" => "Redaktor"
);
$selectBox = new \Nette\Forms\Controls\SelectBox(NULL, $statusPairs);
$grid->getColumn('status')->setEditable($storeChangeStatus, $selectBox);
?>

Potřeboval bych u každého záznamu měnit prvky $statusPairs v select boxu na základě aktuální hodnoty v daném sloupci.
V podstatě, aby se u každého řádku mohli zobrazit jiné prvky v selectboxu.

Díky

libik
Člen | 96
+
0
-

Ahoj,

mam u kazdeho radku nekolik tlacitek (edit/smazat/parametry apod.) a rozhoduju, jestli ho muzu zobrazit uzivateli dle jeho opravneni. Takze setDisable() u kazdeho tlacitka zjistuje, zda ho schovat nebo ne podle ID polozky a jeho prav. Lze nejak toto provest jen jednou v ramci radku pro vsechny tlacitka najednou?

Diky

o5
Člen | 416
+
0
-

@libik: Callback pro vyhodnocování setDisable si ulož do proměnné a použij ho vícekrát.

$disabled = function($row) {
	return $row->status === 'disabled';
};

$grid->addAction('edit', 'Edit')->setDisabled($disabled);
$grid->addAction('delete', 'Delete')->setDisabled($disabled);
libik
Člen | 96
+
0
-

Mno, mam grido 2.0.3 a callback mi vraci:

<?php
        $disabled = function($row)
        {
            dump($row);
            return true;
        };
        dump($disabled);

?>
<?php
Closure #8dae
file => ".........\MenuPresenter.php" (69)
line => 391
variables => array ()
parameters => "$row" (4)

?>

Pricemz dump v callbacku se nevypise vubec.

black1101
Člen | 21
+
0
-

Dobrý deň, prosím Vás mám problém s inline editáciou. Potreboval by som spraviť, aby po dvojkliknutí nevybehla klasická možnosť editovania pomocou textového inputu ale pomocou select boxu a po vybraní možnosti sa dáta aktualizujú.

Niečo podobné ako je pre checkbox:

$control = new \Nette\Forms\Controls\Checkbox;
		$grid->getColumn('rep_option')->setEditableControl($control);

		$grid->getColumn('rep_option')->setEditable()->setEditableCallback(function($id, $newValue, $oldValue, $column) {
			return $this->usersRep->updateUser($id, $newValue, $column);
		});

Je to možné urobiť nejakou jednoduchou cestou? Ďakujem veľmi pekne za Váš tip a pomoc. Prajem pekný deň.

libik
Člen | 96
+
0
-

Tak jeste jinak, vetsinu podminek mam spolecnou, ale u nekterych tlacitek jeste neco navic. Muzu si teda tu vetsinu poresit jednou a vysledek predat v promenne do setDisable() a pouzit jako dalsi ‚return $disabled‘? Kdyz si predam ten callback tak tam vysledek neni.

o5
Člen | 416
+
0
-

libik napsal(a):

Tak jeste jinak, vetsinu podminek mam spolecnou, ale u nekterych tlacitek jeste neco navic. Muzu si teda tu vetsinu poresit jednou a vysledek predat v promenne do setDisable() a pouzit jako dalsi ‚return $disabled‘? Kdyz si predam ten callback tak tam vysledek neni.

Ty mas spis problem se samotnym pochopenim anonymnich fci v PHP.

<?php
        $disabled = function($row)
        {
            dump($row);
            return true;
        };
        dump($disabled);

?>

Nelze ocekavat vysledek prvniho dump kdyz tu fci nevolas.

Editoval o5 (16. 9. 2016 11:00)

Re4DeR
Člen | 71
+
+1
-

nefugnuje ti odkaz na demo (ani zde, ani na webu).

cujan
Člen | 410
+
0
-

aute snazim sa pouzit grido a mam nasledujucu chybu

callback() is deprecated; use native PHP callback.

komponent vytvaram takto…

public function createComponentStanovisteGrid($name) {
    $grid=new \Grido\Grid();
    $grid->setModel($this->database->table('stanoviste'));
    $grid->addColumnText('nazov', 'nazov');
    return $grid;
    }
CZechBoY
Člen | 3608
+
0
-

@cujan jaká verze? V nejnovější by to mělo být už snad ok.

cujan
Člen | 410
+
0
-

CZechBoY napsal(a):

@cujan jaká verze? V nejnovější by to mělo být už snad ok.

vcera som ju instaloval cez composer, myslim grido…takze mala by byt najnovsia
ale nette mam 2.3, tak neviem…

cujan
Člen | 410
+
0
-

Caute, ako zobrazit data slpca prepojeneho cez cudzi kluc? Konkretne idStanoviste mam prepojene na tabulku stanoviste

public function createComponentVcelstvoGrid(){

	$grid = new \Grido\Grid();
	$grid->setModel($this->database->table('vcelstvo')->where('idUsers',  $this->user->getId()));
	$grid->addColumnText('nazov', 'Názov');
	$grid->addColumnText('idStanoviste', 'Stanovište');
	$grid->addActionHref('edit', 'Edituj');
	$grid->addActionHref('delete', 'Zmaž');
	return $grid;
    }
cujan
Člen | 410
+
0
-

Pri zobrazeni datailu o produkte potrebujem do latte detail vlozit grido s urcitymi vlastnostami, ktore vyberam z tabulky, v ktorej kazdy zaznam ma stlpec idProdukt…ako nastavim model grido, aby mi zobrazoval iba vlastnosti daneho konkretneho produktu?

CZechBoY
Člen | 3608
+
+1
-

@cujan No ty asi nechceš idStanoviste, ale nějaký data z tabulky stanoviste, ne?
Takže něco jako

$grid->addColumnText('stanoviste.nazov', 'Stanoviště');

Editoval CZechBoY (24. 10. 2016 15:43)

cujan
Člen | 410
+
0
-

CZechBoY napsal(a):

No ty asi nechceš idStanoviste, ale nějaký data z tabulky stanoviste, ne?
Takže něco jako

$grid->addColumnText('stanoviste.nazov', 'Stanoviště');

super funguje to…este na ten predchadzajuci dotaz mi nevies poradit? Ze vramci detailu potrebujem vytiahnut grid vlastnosti podla id vyrobku ktoreho detail sa prave zobrazuje…

moj grid

public function createComponentLiecenieGrid($id){

	    $grid = new \Grido\Grid();
	    $grid->setModel($this->database->table('liecenie')->where('idVcelstvo',$id));
	    $grid->addColumnDate('datumLiecenia', 'Dátum liečenia');
	    $grid->addColumnText('idLiecivo', 'Názov liečiva')->setColumn(function($item){ return $item->liecivo->nazov;});
	    return $grid;
	}
}

Vdaka

CZechBoY
Člen | 3608
+
0
-

@cujan
No buď si můžeš vzít parametr přímo z parametrů presenteru

$id = $this->getParameter('id');

nebo si ho v action metodě uložit někam do privátní třídní proměnný presenteru

class AbcPresenter extends Presenter
{
	private $id;

	public function actionDetail($id)
	{
		$this->id = $id;
		...
	}

	protected function createComponentGrid()
	{
		$id = $this->id;
		...
	}
}
cujan
Člen | 410
+
0
-

CZechBoY napsal(a):

@cujan
No buď si můžeš vzít parametr přímo z parametrů presenteru

$id = $this->getParameter('id');

nebo si ho v action metodě uložit někam do privátní třídní proměnný presenteru

class AbcPresenter extends Presenter
{
	private $id;

	public function actionDetail($id)
	{
		$this->id = $id;
		...
	}

	protected function createComponentGrid()
	{
		$id = $this->id;
		...
	}
}

super funguje, vdaka

este jedna otazka, da sa pouzit addActionEvent napr. na zmazanie konkretneho zaznamu? uvazujem, ze by som to pouzil napr. na priame mazanie zaznamov v DB…

CZechBoY
Člen | 3608
+
0
-

@cujan Já to používám takhle

$grid->addActionEvent('delete', 'Smazat', function ($id) {
	return $this->model->deleteById($id); // vraci boolean
});
cujan
Člen | 410
+
0
-

@CZechBoY
da sa v grido zobrazit, klasicky v riadku ako zaznam, checkbox – zaskrtavacie policko? uplne staci aby sa ani endalo editovat, len aby zobrazilo, ze dany zaznam je zaskrtnuty…

CZechBoY
Člen | 3608
+
0
-

@cujan Přes custom render

$grid->addColumnXXX()
	->setCustomRender(function($row) {
		return Html::el('input', [
			'type'     => 'checkbox',
			'disabled' => 'disabled',
			'readonly' => 'readonly',
			'onclick'  => 'return false',
			'checked'  => $row['sloupec'] ? 'checked' : null
		]);
	});

Editoval CZechBoY (27. 10. 2016 22:51)

cujan
Člen | 410
+
0
-

CZechBoY napsal(a):

@cujan Přes custom render

$grid->addColumnXXX()
	->setCustomRender(function($row) {
		return Html::el('input', [
			'type'     => 'checkbox',
			'disabled' => 'disabled',
			'readonly' => 'readonly',
			'onclick'  => 'return false',
			'checked'  => $row['sloupec'] ? 'checked' : null
		]);
	});

nevies precosom dostal chybovu hlasku
Call to undefined method Grido\Grid::addColumnXXX().

CZechBoY
Člen | 3608
+
0
-

@cujan za XXX bys měl doplnit požadovaný typ sloupce :-) třeba Text