Grido – DataGrid pro Nette

Pavel Kravčík
Člen | 1195
+
0
-

@o5: Super. Já už to rozchodil na ~2.0, co jsem potřeboval. Ale chtěl jsem to jen napsat, že by to mohlo do budoucna někomu pomoci. Jinak Grido je super! GJ

mbskot
Člen | 42
+
0
-

Zdravím,

nevieš v čom môže byť chyba, ak sa v gride prekladá len „Grido.Items“? Používam Kdyby/Translation a vytvoril som si pre ten Tvoj grid slovník Grido.sk.neon, do ktorého som nakopíroval všetky preklady z Tvojho súboru sk.php.

Grid vytváram takto:

protected function createComponentUserGrid()
{
	$grid = new UserGrid($this->userDao);
	$grid->setTranslator($this->translator);

	return $grid;
}

Používam najnovšiu verziu dev-master.

Ďakujem za odpoveď.

rumcais1
Člen | 80
+
0
-

Neřešil jste někdo skrývání sloupců u grido? Mám grido s hodně sloupci. A každý uživatel chce jiné kombinace.

Oli
Člen | 1215
+
0
-

Tak to by neměl být problém ne? Celou definici sloupce obalíš nějakým ifem, kde ověříš, jestli aktuální uživatel má práva ten sloupec vidět. Nebo tam je nějaká záludnost, kterou nevidím? Takhle například řeším jazyky. Pro některé projekty je podpora jazyků vypnutá a existuje jen jeden, v takovém případě sloupec s jazyky skryju.

Desttro
Člen | 126
+
0
-

Nesetkal se někdo prosím s takovém problémem? V topicu jsou tam 2, děkuji:
https://forum.nette.org/…razeni-nazvu

Pavel Kravčík
Člen | 1195
+
0
-

@o5: Ještě jedna věc. Nezkoušel si suggestion na case-sensitive znaky? Přijde mi, že to hledá jen podle velikosti. Třeba ‚Kravčík‘ to nenabídne pokud napíšeš velké ‚Č‘. Stejné chování je v ~2.0 i ~1.3.

Je to drobnost, ale asi nad tím strávím ke konci týdne nějaký čas, aby se to opravilo. Může to být matoucí pro „hloupější“ uživatele. Takže neřešil už někdo?

o5
Člen | 416
+
0
-

@kzk_cz: pokud myslíš ArraySource, tak to v současné době je case-sensitive case-insensitive, ale nic nebrání tomu to implementovat. Zkusíš? Testy jsou, takže není třeba se čeho bát :) V ostatních případech je to věc správného nastavení collation v DB.

Editoval o5 (1. 2. 2015 11:26)

matopeto
Člen | 395
+
0
-

Neviem ci niekto z vas mal problem s memory limitom (nad 128MB) pri exporte velkej tabulky (tak 30000 riadkov) Ak ano, moze pouzit tento upraveny export (Funguje iba ak je datasource selection), co to exportuje po malych davkach. (jediny problem je ze dopredu nevieme velkost suboru, takze downloader ma tam nekonecny loading:))
https://gist.github.com/…8532e8026be1

Pavel Kravčík
Člen | 1195
+
0
-

@o5: Pokud se povede, rád to poskytnu. Takže vyzkouším, ale uvidím, jestli na to moje mozková kapacita bude stačit. Díky za info.

o5
Člen | 416
+
0
-

@matopeto: Super, díky za zveřejnění! Zadal jsem na to issue, ale chtělo by to vyřešit nějak komplexně napříč všemi datasources.

Nevím kdy se k tomu dostanu, protože dosavadní práce na tomto projektu mě stála obrovské množství času a jediné co z toho mám, je nepoměr hvězdiček na githubu / počet stažení přes composer :)

Pavel Kravčík
Člen | 1195
+
+1
-

Dokonce jsem se kvůli té hvězdičce registroval. Git jinak nepoužívám. :)

Pavel Kravčík
Člen | 1195
+
0
-

@o5: Jelikož jsem programátorská nula (rozchození Gitu jest úkolem nadlidským), tak jsem to vyřešil hloupě a možná i neefektivně. Ale je to srozumitelné, funkční a do budoucna rozšířitelné pro Norštinu, takže to používám.

Asi by to pole šlo skládat snadněji (přes key(), array_in()) a vyhnout se opakování zápisu (i závorek a |), ale tohle mi přišlo rychlejší.

V ArraySource (já používám rozšíření pro uestlovu kvaziORM) si definuji znaky, které PHP není schopno zpracovat v preg_quote/match.

class ArraySourceYetORM extends \Grido\DataSources\ArraySource
{
   static $czechChars =array(
        'Á'=>'(á|Á)','á'=>'(á|Á)',
        'Č'=>'(č|Č)','č'=>'(č|Č)',
        'Ď'=>'(ď|Ď)','ď'=>'(ď|Ď)',
        'É'=>'(é|É)','é'=>'(é|É)',
        'Ě'=>'(ě|Ě)','ě'=>'(ě|Ě)',
        'Ň'=>'(ň|Ň)','ň'=>'(ň|Ň)',
        'Í'=>'(í|Í)','í'=>'(í|Í)',
        'Ó'=>'(ó|Ó)','ó'=>'(ó|Ó)',
        'Ř'=>'(ř|Ř)','ř'=>'(ř|Ř)',
        'Š'=>'(š|Š)','š'=>'(š|Š)',
        'Ť'=>'(ť|Ť)','ť'=>'(ť|Ť)',
        'Ú'=>'(ú|Ú)','ú'=>'(ú|Ú)',
        'Ů'=>'(ů|Ů)','ů'=>'(ů|Ů)',
        'Ý'=>'(ý|Ý)','ý'=>'(ý|Ý)',
        'Ž'=>'(ž|Ž)','ž'=>'(ž|Ž)');

A do funkce compare a LIKE podmínky si dám jednoduchý nahrazovač:

public function compare()
{
	if ($cond === 'LIKE') {
		$pattern = str_replace('%', '(.|\s)*', preg_quote($expected, '/'));
        /* Replace char in pattern with (char|CHAR) */
		foreach(self::$czechChars as $key => $value)
        {
        	if(strpos($pattern, $key))
            {
            	$pattern = str_replace($key, $value, $pattern);
            }
        }
        return (bool) preg_match("/^{$pattern}$/i", $actual);
	} elseif ($cond === '=') {
}

Třeba to někomu pomůže, než to vyřeší někdo chytřejší. :)

Šaman
Člen | 2659
+
0
-

Ahoj, jak rozchodit události navěšené na enteru ve vyhledávacích (filtrovacích) polích a na selectu s počtem záznamů? Když si doplním

$(function(){
	$('.grido').grido();
});

tak to funguje jen na poprvé a bez toho vůbec (ač to podle kódů live ukázky vypadá, že by mělo).

Další problém nastal když jsem hledal jak to vyřešit a nakonec jsem si i nainstaloval aktuální grido-sandbox. Nainstaloval jsem ho normálně composerem (composer create-project o5/grido-sandbox grido), doplnil do www grido.css a grido.js, ale pořád tomu chybí mrtě souborů. Ty se mají nainstalovat Bowerem, nebo kde je mám vzít? V repozitáři vůbec nejsou.

o5
Člen | 416
+
0
-

@Šaman Do aktuálního grido-sandbox se nic doplňovat nemusí. Spustíš composer create-project o5/grido-sandbox a díky post-install-cmd se i spustí bower up. A pak už je to jen o správném nalinkování.

Ty se mají nainstalovat Bowerem, nebo kde je mám vzít? V repozitáři vůbec nejsou

Tohle by ti mělo odpovědět. Je to teďka takový workaround, protože ta master verze ještě není zralá na otagování.

Šaman
Člen | 2659
+
0
-

o5 napsal(a):

@Šaman Do aktuálního grido-sandbox se nic doplňovat nemusí. Spustíš composer create-project o5/grido-sandbox a díky post-install-cmd se i spustí bower up. A pak už je to jen o správném nalinkování.

Ty se mají nainstalovat Bowerem, nebo kde je mám vzít? V repozitáři vůbec nejsou

Tohle by ti mělo odpovědět. Je to teďka takový workaround, protože ta master verze ještě není zralá na otagování.

Tohle mi napovědělo, že to asi bude potřebovat bower. Ale já ho nainstalovaný nemám, takže ani ten post-install-cmd mi nefungoval (ale myslel jsem že to nějak souvisí se symfony, nebo co to tam taky psalo).


Takže – Grido mi funguje, jen nevím jak zařídit, aby mi i po prvním překreslení nadále fungovalo nastavení počtu stránek (tam není ani viditelné tlačítko, takže to pálí víc) a ideálně i ty filtrovací inputy. Bude to něco s JS, ale s těmi se nekamarádím. Jinak nette.ajax, jquery a bootstrap mám nainstalované ručně, tak předpokládám, že mi žádná důležitá závislost nechybí.

o5
Člen | 416
+
0
-

@Šaman Fůůůk :) Ten post-install-cmd asi nebyl dobrej nápad, myslel jsem si, že Bower už je dnes standart. Dopíšu requires Bower do readme, protože nedokážu si moc představit nový projekt co vzniká bez Bower-u. Ale dík za upozornění.

Každopádně Bower za tebe řeší tu otročinu a to stahovat nějaký klientský knihovny ručně a dávat je do www/js apod, ale jestli to používat nechceš, tak si to samozřejmě dotahej a naházej do www/js ručně.

Šaman
Člen | 2659
+
0
-

Já jsem jen backenďák, takže žádné kupy js neřeším :)
Ale co jsem probral ty tvoje importovaný scripty, tak jsou to všechno jen ozdobný serepetičky. Plus datetime picker, ale ten jsem teď neřešil.

Z kódu mi vyplývá, že pokud používám nette.ajax, tak vůbec neimportuju main.js?

<script n:if="!$ajax" src="{$baseUri}/js/main.js{scache}"></script>

V tom případě nevim, co mi rozchodí události navěšené třeba na ten selecbox s počtem stran. Když ten soubor přilinkuju, tak to jednou projde, po ajaxovém překreslení už pak ne (ztratí se ta navěšená událost).


GRRR! Už jsem na to přišel. Jedná se o tenhle soubor. ALE nevím proč není composerem stažený společně s ostatními soubory. Ani když si composerem přidám Grido, dokonce ani v grido-sandbox není. Dá se k němu dostat jen stažením celého repozitáře, což mě dlouho nenapadlo (u ostatních projektů composer stahuje všechno).
Jestli se můžu přimluvit, tak to přidej, ve vendoru někde pod gridem v podsložce client-side to ničemu nevadí a kdo nepoužívá bower (z backanďáků, které znám, tak nikdo) to tam najde a načte si ho ručně. Takhle při stažení composerem chybí některé soubory, aniž by o nich někde byla zmínka.

o5
Člen | 416
+
0
-

ALE nevím proč není composerem stažený společně s ostatními soubory

Tohle je divný, protože composer stáhne celý repozitář, tedy i client-side složku. Teď jsem si to ověřil u projektu kde mám Grido přes composer loadnutý.

Pavel Kravčík
Člen | 1195
+
0
-

@o5 @Šaman: grido.ajax.js tam bylo, ale ručně je potřeba stáhnout typeahead.js a history.js a samozřejmě nette.ajax.js. Pro začátečníka bez firebugu to může být trošku zdlouhavé a matoucí, co mu kde chybí.

Šaman
Člen | 2659
+
0
-

Opravdu nikoliv. Tohle se mi stane, když nemám bower. Vyzkoušeno naposledy během psaní příspěvku.

  1. composer create-project o5/grido-sandbox grido-sandbox
  2. Ve složce grido-sandbox\vendor\o5\grido\client-side\ jsou právě jen dva soubory – grido.css a grido.js. Kdyby tam byly i ty pluginy, tak by mě to trklo hned při prvních pokusech.

IMHO tobě ten soubor stahuje bower, ne?

o5
Člen | 416
+
0
-

Divné.

IMHO tobě ten soubor stahuje bower, ne?

Bower to stahne ale do www/components (coz take neni uplne koser, ale je to proste spis demo nez sandbox). Jediný co mě napadlo je, že ti composer stáhne nějakou nacachovanou verzi a né poslední 1.2.3.

Šaman
Člen | 2659
+
0
-

Záhada odhalena. Grido-sandbox si neříká o @dev verzi, tak dostane poslední stabilní 2.0.8

strunc
Člen | 7
+
0
-

Prosím, potřebuji přednastavit nějakou podmínku pro výběr dat do gridu. Tato podmínka se bude z vnějšku měnit, takže to nemohu nastavit staticky v ‚Model‘. Zkouším metodu ‚setDefaultFilter‘, ale nenašel jsem nikde správný tvar jak pole, které je parametrem pro ‚setDefaultFilter‘ má mít strukturu. Jako DB mám MySQL. Děkuji za radu.

o5
Člen | 416
+
0
-

@strunc $grid->setDefaultFilter() nastaví výchozí (gridem definované) filtry, přičemž parametrem je pole ve formátu [<název_filtru> ⇒ <výchozí_hodnota>].

Pokud chceš nastavit nějakou jinou podmínku, tak bys to měl asi dělat v modelu. Třeba nějak takto:

//ArticlePresenter.php
function createComponentGrid($name)
{
	$grid = new Grid($this, $name);
	$grid->setModel($this->articleModel->getList($where));
}

//ArticleModel.php
function getList(array $where = array())
{
	$list = $this->database->table($this->tableName);

	foreach ($where as $condition => $value) {
		$list->where($condition, $value);
    }

	return $list;
}

Editoval o5 (23. 1. 2015 17:36)

strunc
Člen | 7
+
0
-

Super. Děkuju moc za vysvětlení. Jak té metody setDefaultFilter tak i ten tip s podmínkou v modelu je inspirující.

Desttro
Člen | 126
+
0
-

Zdravím,
nechápu proč Grido mi vyhazuje u tohoto kódu tohle:
Warning
strtoupper() expects parameter 1 to be string, object given

$grid->addFilterSelect('supplier_id', 'Dodavatel', HomepagePresenter::getSuppliers());

zde je metoda:

public function getSuppliers()
 {
    $row = $this->database->table('supplier')
         ->select('id, name')
         ->order('name ASC')
         ->fetchPairs('id', 'name');

     return ($row) ? $row : NULL;
}

Děkuji za radu

zdeje celý můj HomepagePesenter

class HomepagePresenter extends BasePresenter
{
    /** @var Nette\Database\Context @inject */
    public $database;

    public function getSuppliers()
     {
        $row = $this->database->table('supplier')
             ->select('id, name')
             ->order('name ASC')
             ->fetchPairs('id', 'name');

         return ($row) ? $row : NULL;
    }

    protected function createComponentGrid($name)
    {
        $grid = new \Grido\Grid($this, $name);
        $grid->model = $this->database->table('manufacturing');

        //$row = $this->database->table('manufacturing')->fetch();
//dump($row->suppliers->name);

            $grid->addColumnText('supplier_id', 'Dodavatel')
        ->setSortable()
        //->setColumn(function($item){return $item->supplier->name;});
                    ->setColumn(function($item){return $item->supplier->name;});

        $grid->addColumnText('order_id', 'č. o.')
            ->setSortable()
            ->setFilterText()
                ->setSuggestion();

        $grid->addColumnText('orderp', 'č. p. o.')
            ->setSortable()
            ->setFilterText()
                ->setSuggestion();

        $grid->addColumnText('material', 'Materiál')
            ->setSortable()
            ->setFilterText()
                ->setSuggestion();

        $grid->addColumnText('dimension', 'Rozměr')
            ->setSortable()
            ->setFilterText()
                ->setSuggestion();

        $grid->addColumnDate('required_date', 'Požd. term.', \Grido\Components\Columns\Date::FORMAT_DATE)
            ->setSortable()
            ->setFilterDate();

        $grid->addColumnDate('confirmed_date', 'Potvrz. term.', \Grido\Components\Columns\Date::FORMAT_DATE)
            ->setSortable()
            ->setFilterDate();

        $grid->addColumnDate('delivery_date', 'Term. dodání', \Grido\Components\Columns\Date::FORMAT_DATE)
            ->setSortable()
            ->setFilterDate();

        $grid->addColumnText('delivered', 'Dodáno')
            ->setSortable()
            ->setFilterText()
                ->setSuggestion();

        $grid->addColumnText('note', 'Poznámka');

        $grid->addFilterSelect('supplier_id', 'Dodavatel', HomepagePresenter::getSuppliers());

        $grid->addActionHref('edit', 'Edit')
            ->setIcon('pencil');

        $grid->addActionHref('delete', 'Delete')
            ->setIcon('trash')
//            ->setConfirm(function($item) {
//                return "Are you sure you want to delete {$item->firstname} {$item->surname}?";
//        })
        ;

        $grid->filterRenderType = $this->filterRenderType;
        $grid->setExport();
    }
}

Editoval Desttro (26. 1. 2015 8:44)

Pavel Kravčík
Člen | 1195
+
0
-

Dupni $row a ukaž ho.

Desttro
Člen | 126
+
0
-

dump:

array (3)
7 => "Firma1" (6)
8 => "Firma2" (6)
9 => "Firma3" (6)

Editoval Desttro (26. 1. 2015 9:05)

Pavel Kravčík
Člen | 1195
+
0
-

Proč vlastně tu metodu voláš přes ::? Stačí $this->.

Jinak asi si zkoušel smazat ten řádek s filtrem jestli to funguje předpokládám. A co když tam to pole vložíš ručně? Tohle je zvláštní chyba. Možná bude dobrá nápad pokusit se tu chybu zduplikovat na sandboxu Nette v nových verzích.

Desttro
Člen | 126
+
-1
-

Zkouším takto, jako je kód dole ale furt:
Warning
strtoupper() expects parameter 1 to be string, object given

		$grid->addColumnText('order_id', 'č. o.');

$grid->addFilterSelect('supplier_id', 'Dodavatel',  array(
    '' => '',
    'Firma1' => 'Firma1',
    'Firma2' => 'Firma2',
    'Firma3' => 'Firma3'
));

Verzi Nette mám poslední stabilní, no škoda, Grido se mi honě líbí ale asi budu muset použít něco jiného

o5
Člen | 416
+
+1
-

Desttro napsal(a):

no škoda, Grido se mi honě líbí ale asi budu muset použít něco jiného

Nevyhrožuj a klidně něco jiného použij :) Ono stejnak ty příspěvky co jsi tady psal, nemají s Grido nic společného.

Desttro
Člen | 126
+
0
-

o5 napsal(a):

Desttro napsal(a):

no škoda, Grido se mi honě líbí ale asi budu muset použít něco jiného

Nevyhrožuj a klidně něco jiného použij :) Ono stejnak ty příspěvky co jsi tady psal, nemají s Grido nic společného.

Nevyhrožuju :D já bych moc rád Grido používal, ale potřebuju aby to fungovalo a nemůžu přijít na to, kde ta chyba je. Moc rád bych byl za pomoc. Kde teda chyba může být? Dělám něco špatně? Určitě bude problém mezi monitorem a židlí, ale nevím kde dělám chybu.

Děkuji

Editoval Desttro (27. 1. 2015 13:22)

o5
Člen | 416
+
0
-

Desttro napsal(a):

ale potřebuju aby to fungovalo a nemůžu přijít na to, kde ta chyba je.

Slyšel jsi někdy o tzv. debugování? Ono totiž ta chyba co si tady posílal obsahuje ještě jednu docela užitečnou věc a to je název souboru a dokonce i číslo řádku, kde ten problém nastal. Takže si prostě otevřeš ten soubor a podíváš se tam! Z toho co si sem poslal ti nikdo nedokáže poradit, protože zřejmě posíláš něco co s tím absolutně vůbec nesouvisí.

Desttro
Člen | 126
+
0
-

Ano slyšel, ale nic mi tato chyba neříká: http://s13.postimg.org/…zr/grido.png

o5
Člen | 416
+
0
-

To už je lepší, pošli klikatelnou laděnku.

Desttro
Člen | 126
+
0
-

o5 napsal(a):

To už je lepší, pošli klikatelnou laděnku.

Nechápu proč, ale když použiju tohle:

$grid->addColumnText('supplier_id', 'Dodavatel')
    ->setColumn($this->getSuppliers());

tak to vyhodí tuto chybu: http://petrsabrnak.eu/…/chyba1.html
edit: s vypnutým debuggem:
http://petrsabrnak.eu/…eption1.html

když to předělám takhle, tak to funguje:

$grid->addColumnText('supplier_id', 'Dodavatel')
    ->setColumn(function($item){return $item->supplier->name;});

No, ale když vyberu select např. na Firma1, tak to vyhodí tuto chybu:
http://petrsabrnak.eu/…/chyba2.html
edit: s vypnutým debuggem:
http://petrsabrnak.eu/…eption2.html

Zde je celý kód:

namespace App\Presenters;

 use Nette,
	App\Model;

class HomepagePresenter extends BasePresenter
{
    /** @var Nette\Database\Context @inject */
    public $database;

         public function getSuppliers()
     {
        $row = $this->database->table('supplier')
             ->select('id, name')
             ->order('name ASC')
             ->fetchPairs('id', 'name');

         return ($row) ? $row : NULL;
    }

protected function createComponentGrid($name)
{
    $grid = new \Grido\Grid($this, $name);
    $grid->model = $this->database->table('manufacturing');


    //$grid->addColumnText('supplier_id', 'Dodavatel')
    //    ->setColumn($this->getSuppliers());

    $grid->addColumnText('supplier_id', 'Dodavatel')
        ->setColumn(function($item){return $item->supplier->name;});


    $grid->addFilterSelect('supplier_id', 'supplier_id',  array(
        '' => '',
        'Firma1' => 'Firma1',
        'Firma2' => 'Firma2',
        'Firma3' => 'Firma3'
    ));
}

Děkuji za pomoc

Editoval Desttro (27. 1. 2015 15:53)

Desttro
Člen | 126
+
0
-

Tak už jsem to nějak rozchodil, ale narazil jsem na další problém, se kterým si nevím rady (mám tam i funkční odkaz na laděnku) https://forum.nette.org/…rray-problem#…

Děkuji za radu

Pavel Kravčík
Člen | 1195
+
0
-

Desttro napsal(a):

Tak už jsem to nějak rozchodil

Bylo by fajn popsat problém, ukázat řešení, třeba to někomu pomůže. :)

Desttro
Člen | 126
+
0
-

kzk_cz napsal(a):

Desttro napsal(a):

Tak už jsem to nějak rozchodil

Bylo by fajn popsat problém, ukázat řešení, třeba to někomu pomůže. :)

To máš pravdu, bohužel řešení bylo, že jsem to udělal znova a fungovalo to – nechápu proč.
U obou řešení je ta stejná databáze i stejný postup:

$grid->addColumnText('suppliers_id', 'Dodavatel')
   ->setSortable();
   ->setColumn('suppliers.name');

U prvního to vyhodí tuto chybu:
Nette\MemberAccessException
Cannot read an undeclared column ‚suppliers.name‘.

laděnka: http://uoerebor.cz/…tabulka.html

druhý funguje bez problému – nechápu.

První generuje tento SQL dotaz:

SELECT `id`, `suppliers_id`, `order_id`, `orderp`, `material`, `dimension`, `required_date`,
`confirmed_date`, `delivery_date`, `delivered`, `note`
FROM `manufacturing`
LIMIT 4

druhý (funkční) generuje tohle:

SELECT `id`, `supplier_id`, `suppliers_id`, `order_id`, `orderp`, `material`, `dimension`,
`required_date`, `confirmed_date`, `delivery_date`, `delivered`, `note`
FROM `manufacturing`
LIMIT 4

nechápu, proč ten jede a ten ne – dělal jsem stejný postup

Editoval Desttro (28. 1. 2015 11:37)

Desttro
Člen | 126
+
0
-

Zdravím,
řešil někdo duplikaci/kopírování řádku? Např. checkboxy vyberu 5 položek vyberu přes selectbox operation a vyberu duplikovat – zduplikuje to přesně ty vybrané řádky ale samozřejmě s jiným ID.
Nebo ještě přes tlačítko „duplikovat“

Takhle jsem vyřešil mazání, ale nemohu přijít na duplikaci.

public function actionDelete()
{
    $id = $this->getParameter('id');
    $id_out = is_array($id) ? implode(', ', $id) : $id;
    $this->database->table('manufacturing')->where('id', $id)->update(array('trash' => '1'));
    $this->flashMessage("Action '$this->action' for row with id: $id_out done.", 'success');
    $this->redirect('default');
}

ve skutečnosti nemažu ale jenom nastavuju sloupeček trash na 1 a v modelu mám ať vypíše pouze s „trash“ kde je 0

děkuji za rady

orion05
Člen | 9
+
0
-

Ahojte,

vybral som si tento datagrid, pretože zo všetkých odskúšaných bol pre mňa najvhodnejší aj kvôli existujúcemu API

Čo však neviem zakomponovať, teda možno už je na to niekde odpoveď, len tú som nenašiel, je aby sa pri zmene hodnoty jedného filtra zmenili hodnoty v selecte aj pre druhy filter. Funkcie vracajuce pole pre select mam spravene, grido funguje ajaxovo. tu je ukazka kodu:

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

        $basePath = $this->template->basePath;

        $repository = $this->database->getRepository('App\Geocaching');
        $model = new \Grido\DataSources\Doctrine(
            $repository->createQueryBuilder('a')
                ->addSelect('c')
                ->innerJoin('a.country', 'c')
                ->innerJoin('a.type','b'),array('country' => 'c.country','type' => 'b.name'));

        $grid->model = $model;

        $grid->setDefaultSort(array('added' => 'desc'));
        $grid->setFilterRenderType(\Grido\Components\Filters\Filter::RENDER_INNER);

        $grid->addColumnText('id', 'ID')
                ->setSortable();

        $grid->addColumnText('country', 'Krajina')
                ->setCustomRender(function($item) use ($basePath){
                    $img = Html::el('img')->src("$basePath/images/flags/shiny/16/".$item->country->image);
                    return "$img".$item->country->country;
            })
            ->setSortable()
            ->setColumn('country')
            ->setFilterSelect($this->getCountryFilter());

        $grid->addColumnText('type', 'Typ')
                ->setCustomRender(function($item) use ($basePath){
                    $img = Html::el('img')->src("$basePath/images/gcTypes/".$item->type->image);
                    return "$img".$item->type->name;
            })
            ->setSortable()
            ->setFilterSelect($this->getTypeFilter());

        $grid->addColumnText('name', 'Názov')
                ->setSortable();

        $grid->addColumnText('region', 'Región')
            ->setSortable();

        $grid->addColumnText('district', 'Okres')
            ->setSortable()
            ->setFilterSelect();

        $grid->addColumnText('town', 'Mesto')
            ->setSortable()
            ->setFilterSelect();

        $grid->addColumnText('altitude', 'Výška')
            ->setSortable()
            ->cellPrototype->class[] = 'center';

        //FILTERS SET
        $filter = $grid->getActualFilter();

        $grid->getFilter('country')->setColumn('c.id');
        $grid->getFilter('type')->setColumn('b.id');
    }

?>

Proste a jednoducho ked zmenim filter krajiny na konkretnu krajinu, ajaxovo sa vykreslia vysledky podla krajiny, len chcem este k tomu zmenit filter regionov aby boli na vyber regiony z konkretnej krajiny

v6ak
Člen | 206
+
0
-

Nedávno jsem narazil na tento commit:

daaf5ed6a3c58b278d6d1b973b69b800e1048521: DataSources\DibiFluent: Fixed possible SQL injection

Je určitě fajn, že jsi to opravil. Bude k tomu i nějaké upozornění, že je v případě používání DibiFluent potřeba upgradovat?

o5
Člen | 416
+
0
-

@v6ak: uff, tos mě dostal, díky za připomínku. Přiznám se, že dibi už nepoužívám a vycházel jsem z toho, že podobná věc už v Grido bude téměř rok.

Pavel Kravčík
Člen | 1195
+
0
-

Funguje Grido v multiplieru? Nějak se mi to nedaří rozjet. Ať zkouším, co zkouším stále se mi to nedaří. Pokud vyměním Grido za UI/Form tak mi to funguje.

public function createComponentGrid($name)
{
    return new Multiplier(function ($itemId) use ($name) {
        $grid = new \Grido\Grid($this, $name);
		return $grid;
    }
}
pepakriz
Člen | 246
+
0
-

@kzk_cz Podle mě předáváš Gridu špatné jméno komponenty. Raději vůbec nepředávej, není nutné.

public function createComponentGrid()
{
    return new Multiplier(function () {
        $grid = new \Grido\Grid();
        return $grid;
    };
}
Oli
Člen | 1215
+
0
-

Ahoj,
jakým způsobem můžu vykreslit po editaci to co bylo před editací? Mě to vždycky vrátí ty data, která byla uložena do db. Pokud edituju pomocí selectboxu tak mě to vrátí ID, pokud edituju odkaz, tak mě to vrátí plain text. Používám doctrine a mám to takhle:
odkaz

$grid->addColumnText('name', 'name')
	->setCustomRender(function ($row) {
		return \Nette\Utils\Html::el('a')
			->href($this->presenter->link('Schools:edit', [$row->id]))
			->setText($row->name);
		})
	->setEditableCallback(function ($id, $newValue) {
			$school = $this->schoolsDao->findById($id);
			$school->name = $newValue;
			$this->schoolsDao->save($school);
			return true;
		})
	->setEditableRowCallback(function($id, $column) {
			// zkoušel jsem i return $this->schoolsDao->findById($id);
			$row = $this->schoolsDao->findById($id);
			return \Nette\Utils\Html::el('a')
				->href($this->presenter->link(':Admin:Schools:edit', [$row->id]))
				->setText($row->name);
		})
	->setFilterText()
		->setColumn('name')
		->setSuggestion();

select

$grid->addColumnText('schoolType', 'schoolType')
	->setColumn('schoolType.id')
	->setEditable()
	->setEditableControl(new \Nette\Forms\Controls\SelectBox(NULL, $array))
	->setEditableCallback(function ($id, $newValue, $oldValue, $column) {
		$school = $this->schoolsDao->findById($id);
		$type = $this->schoolsDao->fetchSchoolType($newValue);
		$school->schoolType = $type;
		$this->schoolsDao->save($school);
		return true;
	})
	->setEditableRowCallback(function($id, $column) {
		return $this->schoolsDao->findById($id);
	})
	->setCustomRender(function ($row) {
		return $row->schoolType->type;
	})
	->setFilterSelect($array))
		->setColumn('u.schoolType');

edit: měl jsem starý grido.js. S novým to už funguje tak jak má

Editoval Oli (6. 2. 2015 11:20)

Pavel Kravčík
Člen | 1195
+
0
-

@pepakriz Díky. Já jsem to samozřejmě zkoušel bez jména komponenty. Ale házelo mi to chybu. To s jménem byla až asi čtvrtá verze. Každopádně to už funguje. Asi cache nebo jsem se někde přehlédl. What kind of sorcery is this. :)

kybrex
Člen | 4
+
0
-

Čím to je, že při použití select nebo check filtru se po jeho změně provedou 2 ajax requesty, přitom první hned skončí jako Aborted a druhý se dokončí, ale grid se neinvaliduje a je stejně potřeba ještě stisknout tlačítko vyhledat? Používám dev verzi s nette 2.2.0

Martk
Člen | 661
+
0
-

@o5 přidal by jsi do csv exportu nastavení delimeter a enclosure ? Možná se bude pro ostatní hodit nastavit tyto dvě proměnné.

o5
Člen | 416
+
0
-

@kybrex: Je tam taková věc (už od začátku), že aby v url nebyl balast, tak po filtrování se provede navíc ještě jeden request, který zmínený balast odstraní. Taky se mi to (už) nelíbí, protože místo jednoho requestu jsou dva, ale jinak to v non-ajax módu řešit IMO nejde. Při zapnutém ajax módu, se provádí jeden request a přes HTML5 history API se do url doplní pouze ty parametry, které jsou potřeba. Napadá mě, že máš nějak blbě nabindovaný ajax extension, protože v demu to funguje.

@Antik: V exportu je aktuálně bug s memory limitem, takže to tam možná přidám až se dostanu k té opravě. Stejnak ale nechápu moc potřebu měnit separátor, je to CSV (comma-separated values), ale když ta fputcsv() fce ty parametry má, tak asi jo.