Grido – DataGrid pro Nette

o5
Člen | 416
+
0
-

sasule napsal(a):

Vyskytla se ale další věc, a to, že když vyberu filtrem (zkoušel jsem jen select), tak se to uloží do linku, ale do session, až když klepnu na „Vyhledat“ nebo vyfiltruju selectem podruhé. Při testování jsem smazal všechny sessions, cache, takže se začínalo na „čistém“.

Tohle se mi nedaří zreprodukovat, můžeš více popsat tvé prostředí?

Editoval o5 (29. 1. 2014 12:27)

sasule
Člen | 18
+
0
-

o5 napsal(a):

sasule napsal(a):

Vyskytla se ale další věc, a to, že když vyberu filtrem (zkoušel jsem jen select), tak se to uloží do linku, ale do session, až když klepnu na „Vyhledat“ nebo vyfiltruju selectem podruhé. Při testování jsem smazal všechny sessions, cache, takže se začínalo na „čistém“.

Tohle se mi nedaří zreprodukovat, můžeš více popsat tvé protředí?

Používám PHP5.4, Grido 1.0.4 (stáhnul jsem dnes z GitHubu master), Nette 2.1 stabilní verze.

o5
Člen | 416
+
0
-

Myslel jsem spíše prohlížeč apod. :) Každopádně zkus to prosím na čistém sandboxu.

composer create-project o5/grido-sandbox

Já to teď vyzkoušel, přidal jsem do DibiPresenteru na řádek č.18 $grid->setRememberState(); a funguje mi to. Stáhne se ti tedy Nette 2.0.14, ale zkoušel jsem ho vyměnit i za 2.1 a taky funguje.

Editoval o5 (29. 1. 2014 12:27)

sasule
Člen | 18
+
0
-

o5 napsal(a):

Myslel jsem spíše prohlížeč apod. :) Každopádně zkus to prosím na čistém sandboxu.

composer create-project o5/grido-sandbox

Já to teď vyzkoušel, přidal jsem do DibiPresenteru na řádek č.18 $grid->setRememberState(); a funguje mi to. Stáhne se ti tedy Nette 2.0.14, ale zkoušel jsem ho vyměnit i za 2.1 a taky funguje.

Prohlížeč byl Firefox, Chrome i IE. Sandbox mi šlape jak hodinky, tak ještě prověřím své zdrojáky. Každopádně díky za ochotu :-)

pepakriz
Člen | 246
+
0
-

Už několik hodin řeším takové zvláštní chování filtrů:

Když zadám filtry a ručně kliknu na tlačítko „Search“, korektně se provede jeden ajaxový dotaz a tabulka se vyfiltruje. (událost click na tlačítku search)

Když však použiju našeptávač (typeahead) a zavolám filtraci přes JS (` $(‚.filter [name=„buttons[search]“]‘, this.$element).click();`), tak se provedou ajax požadavky dva. První je vyvolán tím tlačítkem (událost click na tlačítku) a ihned se také začne provádět druhý (událost submit od formuláře). Bohužel první požadavek prohlížeč ukončí (hláška: caution: provisional headers are shown) a druhý neobsahuje informaci o odesálacím tlačítku, takže se filtrace neprovede.

Nenapadá mě, jaký může být rozdíl v tom, jestli na tlačítko klikám přímo myší, nebo na něm zavolám .click(). Máte někdo nějaký nápad?

o5
Člen | 416
+
0
-

@pepakriz: těžko říct, plugin pro typeahead, který není součástí hlavního repa dělal @Jiří Nápravník . Nevím přesně kvůli čemu jsou tam dvě volání _this.sendFilterForm();. Nějaký význam to asi mít bude, to bude vědět Jirka.

Pak bych zkusil taky změnit implementaci sendFilterForm() na nějaké $(‚form‘).submit()..

Jaké jsou ty dva „nechtěné“ ajax požadavky (jaký mají „do“ parametr) ?

pepakriz
Člen | 246
+
0
-

o5: S pluginem typeahead to vazbu mít nebude. _this.sendFilterForm(); se volá jen jednou. Zdvojení požadavku nastane někde uvnitř události „click“, kdy se tam nějak připojí i odeslání celého formuláře (ale jak? kde? nevím, jak tohle zdebugovat). Parametry „do“ mají oba requesty správně včetně ostatních parametrů, jen ten druhý neodesílá informaci o stisknutém tlačítku, protože odeslání bylo vyvolané $('form').submit();.

Pravděpodobně tedy chyba nesouvisí přímo s gridem :(

pepakriz
Člen | 246
+
0
-

Tak jsem na to konečně přišel. Může za to jQuery verze 2.1. Když použiju řadu 1.x, problém se neprojevuje.

1webit
Člen | 1
+
0
-

Zdravím. Může někdo poradit, co kde nastavit, aby si uživatel mohl dynamicky měnit šířku sloupců? Díky

Jiří Nápravník
Člen | 710
+
0
-

o5 napsal(a):

@pepakriz: těžko říct, plugin pro typeahead, který není součástí hlavního repa dělal @Jiří Nápravník . Nevím přesně kvůli čemu jsou tam dvě volání _this.sendFilterForm();. Nějaký význam to asi mít bude, to bude vědět Jirka.

Ty dvě volání tam jsou, že (pokud si dobře pamatuju), jednou je to pokud člověk stiskne enter a po druhý event co vyhazuje typeahead, když se vybere hodnota. Je ale možné, že ten event vyhazuje sám typeahead i při stisku enter, to jsem jaksi moc nezkoumal (to ošetření enteru, je tam ještě od tebe).

Ale nejspíše to bude opravdu tím jQuery 2, měl jsem s ním taky problém jednou na gridu, nevím jeslti zrovna v tomhle případě. Ale nakonec jsem použil jedničkovou verzi, protože mi dostačovala a dále to nezkoumal.,

matopeto
Člen | 395
+
0
-

Ako funguje getActualFilter()? Ak ho pouzijem v tovarnicke v prezentru (createComponentGrido($name)) tak nema aktualnu hodnotu ale o jeden request staru. Je nejaka moznost sa dostat k aktnualnemu filtru? Chcem podla jeho nastavenia vymenit model.

o5
Člen | 416
+
0
-

@matopeto: tak to děláš někde chybu, protože ta metoda funguje.

matopeto
Člen | 395
+
0
-

Pokial nejdem cez ajax tak i mne funguje, ale s ajaxom, je jednen dotaz pozadu.
Zaskrtnem checkbox, urobi sa ajax dotaz a v actualFilter nemam nic, odskrtnem ho, urobi sa ajax dotaz a v actualFilter mam jednicku a tak dokola. Nemam tam nic, je to nejako takto:

<?php
	public function createComponentGrid($name)
	{
		$grid = new \Grido\Grid($this, $name);

		$isUnique = $grid->getActualFilter('unique');

		error_log(print_R($grid->getActualFilter(), TRUE)) // tu je len pre logovanie. Tato hodnota nie je aktualna.

		if ($isUnique) {
			$grid->setModel($this->ordersModel->getUniqueGridDatasource());
		} else {
			$grid->setModel($this->ordersModel->getGridDatasource());
		}

		// Dummy polozka pre filter.
		$grid->addFilterCheck('unique', "Unikátní")
			->setWhere(function($value, $source) {
				return $source;
			});
	}
?>
ic
Člen | 430
+
0
-

Omezení při použití filterMapping

Ahoj, používám Grido s Doctrine a mám tam složitější dotaz, kde využívám filterMapping . To ale přináší několik problémů. Například takovýto kód:

$table->setModel(new Doctrine($this->orderRepository->createQueryBuilder('a')
    ->addSelect('SUM(b.price * b.quantity) AS price')
    ->innerJoin('a.second', 'b')
    ->groupBy('b.first'),
array('price' => 'price')
));
.
.
.
$table->addColumn('price', 'Price')
    ->setCustomRender(function ($entity) {
        return //…;
    })
    ->setSortable()
    ->setFilter()
    ->setSuggestion();

Mi dokáže tabulku řadit podle price , ale už ne fultrovat podle price. Nevím jak to filtrování správně rozchodit. Poradí někdo? Nebo tohle vůbec nepůjde? (Pak mě napadá ještě si data z Doctrine rozložit do nějakého pole a použít array driver)

Stejně tak při použití filterMapping mi nejde filtrování podle nevypsaného sloupce (což bez filterMapping funguje).

viz. tohle:

$table->setModel(new Doctrine($this->orderRepository->createQueryBuilder('a')
	->innerJoin('a.neco', 'b'),
array('name' => 'b.name')
));

musí mít alespoň

$table->addColumn('name', 'Name')
	->setCustomRender(function () {
		return NULL;
	});

jinak filter nefunguje.

o5
Člen | 416
+
0
-

@ic: co takhle poslat třeba nějakou hlášku co ti to hlásí, nefunguje je dost široký pojem.

Každopádně už jsem to tu párkrát psal, Grido pouze volá na nějaký datasource (v tvém případě na object Doctrine\ORM\QueryBuilder) metody uvedené v Grido\DataSources\IDataSource == tedy otázky typu Nebo tohle vůbec nepůjde? nemají moc opodstatnění, protože tohle Grido neovlivňuje. Problém bude tedy ve skládání podmínek a to se řeší tady. Doporučuju prozkoumat uvedenou metodu, protože já ti takto neporadím (Doctrine nepoužívám).

ic
Člen | 430
+
0
-

Jo tak už je mi to jasnější… díky.

makeWhere dělá (překvapivě) pouze where jenže když používám agregační funkci, tak bych potřeboval having.

Když to zjednoduším, co to jde… tak mám tabulku pokus

a b
3 4
5 6
3 9

a dotazem

SELECT a, b, SUM(a) AS c
FROM pokus
GROUP by a

se mi vrátí

a b c
3 4 6
5 6 5

jenže když chci filtrovat podle c = 6 tak filter udělá nefunkční dotaz

SELECT a, b, SUM(a) AS c
FROM pokus
WHERE c = 6
GROUP by a

namísto žádaného

SELECT a, b, SUM(a) AS c
FROM pokus
GROUP by a
HAVING c = 6

Bude asi potřeba nějak rozlišit, jestli je v dotazu použita nějaká agregační funkce a pokud ano, tak nepoužívat WHERE, ale HAVING.

Kam by se taková podmínka hodila? do makeWhere?

Editoval ic (11. 2. 2014 13:45)

o5
Člen | 416
+
0
-

@ic: teď tomu již rozumím, ovšem nenapadá mě v současnosti jiné řešení, než si podědit Grido\DataSources\Doctrine a dopsat si tam něco svého.

Tu informaci o HAVING by asi pak měl nést objekt Grido\Components\Filters\Condition a na základě něho se pak rozhodovat v datasource.

EDIT: Ještě mě napadlo, o vlastní callback podmínce ->setWhere() si v dokumentaci četl? Ta by to mohla vyřešit bez nutnosti dědit.

Editoval o5 (11. 2. 2014 17:34)

Filip023
Člen | 13
+
0
-

Zdravím,
mám menší problém s rozchozením řazení v Grido. Můj kód vypadá následovně:

<?php
use Nette,
    Grido\Grid,
    Grido\Components\Filters\Filter,
    Grido\Components\Columns\Column;

class ProductPresenter extends BasePresenter
{

  private $product;

  protected function startup()
  {
    parent::startup();

    $this->product = $this->context->product;
  }


  protected function createComponentGrid($name)
  {
    $grid = new Grid($this, $name);
    $grid->setModel($this->product->findAll()->order('created DESC'));

    $grid->addColumnText('title', 'Titulek')
        ->setSortable()
        ->setFilterText()
            ->setSuggestion();

    $grid->addColumnText('describe', 'Popis')
        ->setSortable()
        ->setFilterText()
            ->setSuggestion();
}
?>

Dle dokumentace, by se mělo řazení povolit přes setSortable(), což dělám. Tabulka se mi vypíše, vyhledávání i našeptávač v ní funguje. Když, ale kliknu na nějaký sloupec, např. title, zapíše se mi do url grid-sort[title]=↑ ale tabulka se dle title neseřadí, zůstane ve stejném pořadí jako předtím a console žádnou chybu nevrací.

Nevíte v čem by mohl být problém? Děkuji

Editoval Filip023 (12. 2. 2014 11:45)

o5
Člen | 416
+
0
-

@Filip023: vypni ajax jestli tam nemáš nějakou jinou chybu.

Filip023
Člen | 13
+
0
-

o5 napsal(a):

@Filip023: vypni ajax jestli tam nemáš nějakou jinou chybu.

Ajax jsem vypnul, chybu to žádnou nevyhodilo, ale také se neseřadilo.

o5
Člen | 416
+
0
-

@Filip023: Nevidím žádnou chybu v tom co si sem poslal. Koukni do prvního příspěvku tady, je tam návod jak rozjet sandbox na localhostě. Tam ti řazení bude fungovat, tak musíš porovnat zdrojáky.

Filip023
Člen | 13
+
0
-

Díky za rady, ale už jsem na chybu přišel.

Stačí když do grido nenastavím model takto

<?php
$grid->setModel($this->product->findAll()->order('created DESC'));
?>

ele předám bez řazení, tedy:

<?php
$grid->setModel($this->product->findAll());
?>

Teď mi funguje ve výpisu již vše, včetně řazení.

o5
Člen | 416
+
0
-

@Filip023: No, pokud předáš modelu již nějakaké řazení, tak další „vyklikané“ řazení je až jako druhé.

ORDER BY `created` DESC, `title` ASC

Chce to sledovat i dotazy co z toho lezou..

Editoval o5 (12. 2. 2014 13:56)

Jan Mikeš
Člen | 771
+
0
-

V demu (http://grido.bugyik.cz/example/) nefunguje sortovani, na localu vse v poradku.

Pozoruji nasledujici chovani: kliknu, sortne se a nasledne dojde k dalsimu ajax pozadavku a z url se zrusi parametr %91 nebo %93 takze vysledkem je napr http://grido.bugyik.cz/example/#…[surname]=

Testovano na OS X 10.9.1
Safari 7.0.1 (9537.73.11)

Chrome je OK

o5
Člen | 416
+
0
-

@Lexi: Haha, Safari rulezz!! Já jsem na hostingu měl celkem starou verzi, tak jsem si říkal, že to bude tím, jenže nebylo. Totožná verze na localhostě fungovala a na hostingu ale nikoli.

Opravdu netuším proč, ale Safari má z nějakého důvodu v ajax módu problém na ne-localhostě se znaky ↑ a ↓, protože když jsem tyhle ukazatele v Grido\Components\Column\Column.php změnil na klasické „asc“ a „desc“ fungovalo to normálně. Tohle „reprezentování“ řazení bylo kdysi na Githubu, takže už asi vím proč od toho upustili, každopádně Safari nepoužívám takřka vůbec, takže mě nenapadá jak ho k tomu donutit.

Editoval o5 (13. 2. 2014 9:49)

Oli
Člen | 1215
+
0
-

Ahoj, zkouším si s grido hrát a měl bych pár dotazů na který jsem nepřišel:

  1. Jde nějak říct addColumnHref kam má vytvořený link směřovat?
  2. Jde nějak zajaxovat addActionEvent?
  3. Jak se filtrují položky, které jsou cizím klíčem? Teď to mám takhle, ale nefunguje to:
$grid->addFilterSelect('user_id', 'Uživatel', $users);
$grid->addColumnText('user_id', 'Uživatel')
	->setColumn(function($item){return $item->user->first_name.' '.$item->user->second_name;})
	->setSortable();

Ostatně filtrování normální položky mě fungovalo, ale nevím co jsem změnil a teď mě to píše, že to potřebuje string a předávám objekt:

array (1)
	0 => Closure #f04b
	file => "C:\server\www\app\components\grid\Grid.php" (80)
	line => 38
	variables => array ()
	parameters => "$item" (5)

Přidávám to do gridu řekl bych normálně:

$grid->addColumnText('text', 'Text')
			->setTruncate(200)
			->setSortable()
			->setFilterText()
			->setSuggestion();

Možná to tu někde je, nepročítal jsem těch 10 stran. Zkoušel jsem to vyhledat, ale nikde jsem to nenašel.

Díky za popostrčení.

TheNEoo
Člen | 75
+
0
-

Ahoj,
mala otazecka. Jak zavolam handler misto akce?
addActionHref('detail', 'detail'); tento zapis vola akci.
Diky za popostrčeni :)

Editoval TheNEoo (19. 2. 2014 2:03)

TheNEoo
Člen | 75
+
0
-

Oli napsal(a):

Ahoj, zkouším si s grido hrát a měl bych pár dotazů na který jsem nepřišel:

  1. Jde nějak říct addColumnHref kam má vytvořený link směřovat?
  2. Jde nějak zajaxovat addActionEvent?
  3. Jak se filtrují položky, které jsou cizím klíčem? Teď to mám takhle, ale nefunguje to:
$grid->addFilterSelect('user_id', 'Uživatel', $users);
$grid->addColumnText('user_id', 'Uživatel')
	->setColumn(function($item){return $item->user->first_name.' '.$item->user->second_name;})
	->setSortable();

Ahoj cizim klicem to tu nekde je.

A je to takto

$grid->addColumnText('destination_id', 'Přiřazená lokalita')
        ->setSortable()
        ->setColumn('destination.nazev')
        ->setCustomRender(function($item) {
            return $item->destination->nazev;
        })
        ->setFilterText()
        ->setColumn('destination.nazev')
        ->setSuggestion(function($item) {
            return $item->destination->nazev;
        });

Jeden addColumn je pro nazev v gridu, aby tam nebylo ID polozky.
a druhy je pro seggestion

Editoval TheNEoo (19. 2. 2014 10:19)

Oli
Člen | 1215
+
0
-

Díky, to funguje, jen dodám, že tahle metoda už v grido není.

->setCustomRender(function($item) {
	return $item->destination->nazev;
})

Nefunguje mi ale vyhledávání normálně v textu:

$grid->addColumnText('comment', 'Komentář')
	->setSortable()
	->setColumn('comment')
	->setFilterText()
	->setSuggestion(function($item) {
		return $item->comment;
	});

Nepošle se na suggestion žádnej ajax požadavek a po vyhledání to nenajde vubec nic…

Plus teď ještě kdyby někdo věděl 1. a 2. otázku, tak mám přesně to co potřebuju. ;-)

o5
Člen | 416
+
0
-

@TheNEoo: @Oli: viděl někdo z vás dokumentaci??? Všechny odpovědi najdete tam a dotaz na „zajaxování addActionEvent“ není věc gridu.

Oli
Člen | 1215
+
0
-

o5 napsal(a):

@TheNEoo: @Oli: viděl někdo z vás dokumentaci??? Všechny odpovědi najdete tam a dotaz na „zajaxování addActionEvent“ není věc gridu.

No jasně, že jsem se koukal do dokumentace. To směřování hrefu jsem nějak přehlédl. Nicméně nevím jestli to dělám dobře:

$grid->addColumnText('comment', 'Komentář') //uplně stejnej výsledk pokud použiju addColumnHref
	->setSortable()
	->setCustomRender(function($item)
		{return \Nette\Utils\Html::el('a')
			->href($this->presenter->link("Comments:edit", $item->id))
			->title($item->comment)
			->setText($item->comment);})
	->setFilterText()
	->setSuggestion(function($item) {
		return $item->comment;
	});

Nejde to nějak líp?

To zajaxování je a není záležitostí gridu. Snažím se přejít z niftygridu, kde ajaxace byla záležitostí:

->setAjax();

Tady jsem to zkoušel následovně:

$grid->addActionEvent('delete', 'Smazat', function($item){
	$this->database->delete($item);
	$this->redrawControl();
	})
	->setIcon('trash')
	->setConfirm(function($item) {
		return "Opravdu chcete odstranit položku {$item->comment}?";
	})
	->getElementPrototype()->class[] = 'ajax';

Nicméně se grid nepřekreslí. Nevím jak mám zavolat tu metodu pro překreslení.

A poslední dotaz, co dělám blbě při vyhledávání? Podle dokumentace by to mělo fungovat ne? viz. můj předchozí příspěvek

o5
Člen | 416
+
0
-

Oli napsal(a):

Jde nějak říct addColumnHref kam má vytvořený link směřovat?

Buď hloupě formuluješ otázku, nebo nechápeš jasný popis v dokumentaci k této metodě (Parametry jsou $destination a $args které se předají metodě $presenter->link()).

Oli napsal(a):

Nicméně se grid nepřekreslí. Nevím jak mám zavolat tu metodu pro překreslení.

takto:

$grid->addActionEvent('remove', 'Remove', function($id, \Grido\Components\Actions\Event $event) {
    $this->context->dibi_sqlite->delete('user')->where('id = ?', $id)->execute();
    $event->grid->reload();
})->elementPrototype->class[] = 'ajax';

Oli napsal(a):

Jak se filtrují položky, které jsou cizím klíčem?

To ti radil @TheNEoo a jinak to je k vidění v demu.

Dokážeš si představit jaké to je, když vytvoříš demo, které obsahuje téměř všechny situace co se tu řeší, dokumentaci která odpovídá na většinu dotazů a stejnak se najde někdo, kdo prostě je buď línej nebo nechápe elementární věci, které s doplňkem nesouvisí? Je to fakt k nasrání hele…

Oli
Člen | 1215
+
0
-

o5:

  1. Máš pravdu, Netbeans mi nenabídnul tu metodu s $destination a $args. Takže jsem předpokládal, že má jen 2 parametry.
  2. Díky moc za radu s tím ajaxem
  3. Jasně, radil. a stím cizím klíčem mi to funguje (tam používám setFilterSelect). Pokud chci ale filtrovat v té samé tabulce tak mi to nejde.

Podle dema by mělo stačit:

$grid->addColumnText('firstname', 'Firstname')
	->setFilterText()
	->setSuggestion();

to mě však nefunguje, tak jsem zkusil něco ala to co mi radil TheNEoo:

$grid->addColumnText('comment', 'Komentář')
	->setSortable()
	->setColumn('comment') // nefunguje ani s function($item) {return $item->comment;}
	->setFilterText()
		->setColumn('comment')
		->setSuggestion(); // nefunguje ani s function($item) {return $item->comment;}

Oboje vrátí no results a nefunguje ani našeptávání. Fakt nevím co u tohle dělám blbě.

Každopádně díky za trpělivost a omlouvám se za často stupidní dotazy ;-)

matopeto
Člen | 395
+
0
-

A co moj starsi dotaz: „463.“ nema niekto rovnaky problem? Stale to neviem nijako poriesit.

Oli
Člen | 1215
+
0
-

o5 napsal(a):

Oli napsal(a):

Jde nějak říct addColumnHref kam má vytvořený link směřovat?

Buď hloupě formuluješ otázku, nebo nechápeš jasný popis v dokumentaci k této metodě (Parametry jsou $destination a $args které se předají metodě $presenter->link()).

o5: Tak jsem se přehlídnul a nebo jsem nepochopil tvou odpověď. To co odkazuješ ty je actionHref, předpokládám, že to má sloužit pro generování nějakýho tlačítka k něčemu. Já se ptal na columnHref, který by měl sloužit pro výstup z db. Ta metoda vygeneruje odkaz jakoby

$presenter->link('this', $item->column_name)

K čemu tedy slouží ta metoda addColumnHref, pokud jí nemůžu nastavit cílovou adresu? Nebo mi něco uniká?

o5
Člen | 416
+
0
-

@Oli: Měl si pravdu, tvojí otázku jsem nepochopil já :))

Oli napsal(a):

K čemu tedy slouží ta metoda addColumnHref, pokud jí nemůžu nastavit cílovou adresu? Nebo mi něco uniká?

addColumnHref() chápej jen jako ulehčení, pokud tvůj sloupec v db obsahuje link, tak Grido vygeneruje rovnou html odkaz, místo abys musel psát setCustomRender() apod. Pro stejný účel je i addColumnMail().

JDC
Člen | 19
+
0
-

Nevím čím to je, ale pravděpodobně se jedná o bug, jelikož to dělá, i když ten grid spustím „načisto“ s jedním collumnt bez jakéhokoli dodatečného nastavení. Debugger mi hlásí:

session_start(): session_start(): Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\songator\temp\cache\_Nette.FileTemplate\_Song.list.latte-b1524e41e043e2a76d15f01c3e83659f.php:41)

A ukazuje to někam sem:

Grid.php

572: } elseif (!$params && $session->params) { // tennhle řádek je označen červeně
573:                $params = (array) $session->params;
574:            }

Ironií osudu je, že takto se to chová jen v Chrome a no nové Opeře, která využívá stejné jádro jako Chrome, tedy WebKit. Na FF je to OK, na IE jsem nezkoušel.

Pravděpodobně se může jednat o bug, nebo něco dělám špatně já? Pak si ale nedokážu vysvětlit, proč to na mě huláká i při čistém gridu bez jakéhokoli dalšího nastavení a proč to dělá jen na Chrome a Opeře.

EDIT: Ještě pár technických údajů:

Nette 2.1.1
Grido 1.0.5

EDIT2: Změna konfigurace session autostart ze smart na true to tak nějak zachránila, nicméně nechápu, proč ten autostart smart dělá takové brikule. Ještě jsem projel soubory, jestli neobsahují BOM a žádný soubor BOM neobsahuje. Pak je pro mě velikou záhadou, proč toto podivné chování. Ale hlavně že to změna způsobu startování session zachránila. :) Takže pokud by měl někdo podobný problém, může se zachránit takhle:

session:
		autoStart: true

Editoval JDC (25. 2. 2014 15:57)

Lord Dave
Člen | 7
+
0
-

Vprvomrade chcem autorovi poďakovat za skvelý grid :)
Už celé dva mesiace mi brutááálnym spôsobom šetrí hodiny práce a zefektivnuje robotu … klobuk dole…

Dalej .. chcel by som sa spýtat, či niekto skúšal aj pridať podporu pre dátovy model od Propel ORM? Ja som si musel spravit do toho vlastny propertyaccessor, ale tak trošku vyžaduje aj novú názvovu konvenciu pri columnoch … tak napríklad ked chcem do gridu zobrazit nielen jednu tabulku, ale aj tabulku co joinu povedzme dalšie tri tabulky a jedna z nich joine dalšiu tabulku … tak proste tento moj propertyaccesor pre propel to dokáže ohandlovat a dokáže nad týmto modelom aj robit filtrovanie sortovanie a celú tu mágiu (za čo vlastne najviac chcem autorovi pogratulovat k skvelemu návrhu kódu …) nevýhodou je, že musite aj columny mapovat na databázu … trebars „Partner_Adresa_Mesto_Nazov“ propelaccessor preloží ako $model->getAdresa()->getMesto()->getNazov() …
ak má niekto elegantnejšie riešenie .. pochválte sa :) zišlo by sa :D

Prečo ale hlavne píšem … typeahead filtrovanie a našepkávanie … ignoruje interpunkciu :-O aj v deme nejde interpunkcia … Vie sa o tejto chybičke? či píšem neskoro?

o5
Člen | 416
+
0
-

@Lord Dave:

ad Propel ORM: Na githubu v nejnovější issue @martinknor zmiňuje, že používá toto ORM. Takže ho zkus kontaktovat a případný patch do mastera rád zmerguju. Pull ale musí obsahovat testy pro datasource (neměl by to být problém, stačí se podívat jak jsou napsaný testy třeba pro Doctrine)

ad interpunkce v typeahead: není věc Grido, ale správně nastaveného collation v databázi. Pak chce příslušný typeahead donutit aby zvýrazňoval při zadání „s“ ⇒ „š“ apod.

Oli
Člen | 1215
+
0
-

Jak dostanu do našeptávače zformátovaný text? Zkoušel jsem něco jako:

$grid->addColumnText('comment', 'Komentář')
	->setSortable()
	->setColumn(function($item) {return strip_tags($item->comment);})
	->setFilterText()
		->setColumn('comment')
		->setSuggestion()
		->setSuggestionCallback($this->gridStripTagsFilterCondition);


public function gridStripTagsFilterCondition($value)
{
	foreach ($value as &$val) {
		$val->comment = strip_tags($val->comment);
	}
	return count($value) > 0
	? $value
	: NULL;
}

Ale to samozřejmě nefunguje. Hlavně proto, že to nezná $value. Jde to nějak?
díky

o5
Člen | 416
+
0
-

@Oli: v suggestionCallbacku sestavuješ celé data, které se předají ajax požadavku, je to vidět tady ..

Použití je pak takovéhle:

->setSuggestionCallback(function($query, $filter, $conditions) {
	//$query - to co píšeš do suggestu
	//$filter - vygenerovaný podmínky pro filtraci sloupce
	//$conditions - kolekce ostatních aktivních filtrů

	return $this->context->dibi->select('*')->where(...)->fetchPairs(); ////musí vracet pole
});
Oli
Člen | 1215
+
0
-

o5: Paráda, funguje. Jen mi není uplně jasný, na co tam jsou ty parametry $filter a $conditions. Tuším, že to je něco, když chceš tu filtraci poskládat na základě ostatních inputů. Každopádně se to blbě debuguje, bez ajaxu to nefunguje (když to je našeptávání :-)) a s ajaxem to vrací jen tu jednu hodnotu.

Pokud to ještě nikde není, mohl by jsi uvést nějakej základní příklad na ty 2 parametry? Nebo link, kde bych se na to mohl podivat. Díky!

EDIT: btw. vyvinul se nějakým způsobem tvůj názor na inline/dialog editaci? :-) A je to v nějaké fázi rozpracováno?

Editoval Oli (27. 2. 2014 16:21)

zimmi
Člen | 94
+
0
-

Zdravím!
Je možné nějak pro Array Datasource používat hromadné akce? Díval jsem se, že ani v demu to není a zatím se mi to nepodařilo rozchodit. Děkuju za odpověď.

o5
Člen | 416
+
0
-

@Oli: Debugování přes koukání se do response se nechá, jen je lepší hned za dumpem zabíjet, jinak veškerou funkcionalitu najdeš v testech. Ve svém projektu používám dialog a co se Grida týče, nastavil jsem akcím css třídu „open-modal“ a pak je to jen záležitost javascriptu, konkrétně použití bootstrap dialogu. Možná to někdy přidám do sandboxu, jako grido.js rozšíření.

@zimmi: Co myslíš tím „nepodařilo rozchodit“? Nevím o žádném problému při použití kteréhokoli datasource (tedy ani array).

zimmi
Člen | 94
+
0
-

@o5: Potřeboval bych ke gridu dostat zaškrtávací pole pro použití k hromadnému mazání/aktivaci atd. Přidávám tam teda alfanumerický id sloupec, ale ten se kreslí jako obyčejný textový sloupec. V demu to přitom funguje velmi podobně, aniž bys někde nastavoval, že se ten sloupec má kreslit jako inputy. Jak toho tedy docílit? Mám to udělat pomocí nějakého rendereru?

$this->addColumnText('id','Název role')
	->setSortable()
	->setFilterText()
		->setSuggestion();
o5
Člen | 416
+
0
-
o5
Člen | 416
+
0
-

JDC napsal(a):

Nevím čím to je, ale pravděpodobně se jedná o bug, jelikož to dělá, i když ten grid spustím „načisto“ s jedním collumnt bez jakéhokoli dodatečného nastavení. Debugger mi hlásí:

session_start(): session_start(): Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\songator\temp\cache\_Nette.FileTemplate\_Song.list.latte-b1524e41e043e2a76d15f01c3e83659f.php:41)

Hodil jsem do masteru fix, aby Grido šahalo na session jen pokud je potřeba (při použití setRememberState()).

lunak83
Člen | 47
+
0
-

Ahoj, dokážete někdo poznat co mi chybí připojit když mám (funkční) datepicker s černým pozadím? Mám připojené bootstrap-style.min.css, datepicker.css a grido.css. Díky moc.

Možná by bylo dobré napsat do dokumentace které (a teď myslím spíše JS knihovny) jsou potřeba připojit pro rozchození jednotlivých částí (operations, typeahead, datepicker…) sandboxu? Těch JS souborů už je docela hodně :-)

Editoval lunak83 (13. 3. 2014 11:56)

o5
Člen | 416
+
0
-

lunak83 napsal(a):

Ahoj, dokážete někdo poznat co mi chybí připojit když mám (funkční) datepicker s černým pozadím? Mám připojené bootstrap-style.min.css, datepicker.css a grido.css. Díky moc.

Možná by bylo dobré napsat do dokumentace které (a teď myslím spíše JS knihovny) jsou potřeba připojit pro rozchození jednotlivých částí (operations, typeahead, datepicker…) sandboxu? Těch JS souborů už je docela hodně :-)

Ne, tohle do dokumentace nepatří a dávat to tam nebudu, protože Grido nemá žádné závislosti na ten který datepicker či typeahead.. Uvedené operations žádný další javascript nepotřebují, jsou součástí grido.js.

Nevím co bych měl udělat víc. Mám fungujicí sandbox, kde si vše na localhostu můžeš v klidu vyzkoušet a instalace je otázkou jediného composer příkazu. Snažil jsem se to opravdu dost zjednodušit a pak se tu objeví opravdu základní problémy, kdy člověk nedokáže správně nalinkovat do stránky css či js soubor.

luk007
Člen | 6
+
0
-

Ahoj,
asi hloupá otázka, ale nikde jsem to neobjevil, chci mít tabulku s vnitřním (RENDER_INNER) filtrováním, ale bez sloupečku akcí. Pokud mám RENDER_OUTER sloupec pro akce se mne nevykreslí, pokud RENDER_INNER, tak ano.. Asi je to blbost, ale nějak na to nemůžu přijít.. :(
Díky za pomoc