Gridito (falešný datagrid) – komponenta

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

ahoj, chtěl bych se zeptat, jestli je gridito stále vyvíjeno :)

A pak dotaz k implementaci…

v demu je:

$grid->setModel(new Gridito\DibiFluentModel($db->select("*")->from("users")));
$grid->addColumn("id", "ID")->setSortable(true);

Jak k tomu přidám nějakou logiku? Např. pokud bych chtěl v tomto případě ukazovat id * 5 ?

díky

Honza Marek
Člen | 1664
+
0
-

S Griditem počítám i do budoucna a jakmile v něm budu něco akutně potřebovat, dovyvinu to.

id * 5 (příklad ze života…) můžeš ukazovat, pokud si definuješ vlastní renderer… což je snadné:

$grid->addColumn("id", "ID")->setRenderer(function ($entity) {
	echo $entity->id * 5;
});
baki
Člen | 21
+
0
-

ahoj, jak už tu bylo řečeno. lze nějak vypsat do sloupce data z další tabulky?
příklad:
mám příspěvky a články

a do jedné tabulky (tabulka komentářů) chci vypsat třeba jméno článku kde byl komentář vypsán a datum toho komentáře. ±

pro zjednodušení mám TABULKY: sloupce

CLANEK: id, jmeno

KOMENTAR: id, id_clanek, datum

jak by to šlo udělat. zkoušel jsem už hodně :)
díky

Editoval baki (18. 1. 2011 10:35)

v6ak
Člen | 206
+
0
-

To je otázka modelu. Potřebuješ join. Záleží na tom, který model používáš.

baki
Člen | 21
+
0
-

mám takovou prasárnu:

<?php
$db = new DibiConnection(Environment::getConfig('db'));
    		$grid->setModel(new Gridito\DibiFluentModel($db->select(array('c', 'p'))
                                                                ->from('comments','posts')
                                                                ->leftJoin('c.post','p')
                                                                ));
?>

nevím jak to přesně udělat. nějak jsem nepochopil ten join v dibi.

bojovyletoun
Člen | 667
+
0
-

Editoval bojovyletoun (18. 1. 2011 11:31)

colek
Člen | 59
+
0
-

Ahoj, ještě bych měl dotaz – jak udělat link z komponenty?

takhle mi to nefunguje, protože $this není objekt…

díky za radu

protected function createComponentGrid($name)
    {
        $id = $this->getParam('id');

        $grid = new Gridito\Grid($this, $name);
        $db = dibi::getConnection();
        $grid->setModel(new Gridito\DibiFluentModel(UsersModel::getUserById($id)  ));

        $grid->setItemsPerPage(15);

        $grid->addColumn("id", "ID")->setSortable(true);
        $grid->addColumn("name", "Jméno", array(
            "renderer" => function ($row) {
               $this->link(':Front:Default:showUser', array( 'id' => $row->id));
            },
            "sortable" => true,
        ));
    }
davidm
Člen | 81
+
0
-
protected function createComponentGrid($name)
{
    $id = $this->getParam('id');
	$presenter = $this;

    $grid = new Gridito\Grid($this, $name);
    $db = dibi::getConnection();
    $grid->setModel(new Gridito\DibiFluentModel(UsersModel::getUserById($id)  ));

    $grid->setItemsPerPage(15);

    $grid->addColumn("id", "ID")->setSortable(true);
    $grid->addColumn("name", "Jméno", array(
        "renderer" => function ($row) use ($presenter) {
           $presenter->link(':Front:Default:showUser', array( 'id' => $row->id));
        },
        "sortable" => true,
    ));
}
iwtu
Člen | 8
+
0
-

Zdravím. Mám problém a vôbec nerozumiem prečo. Presne ten istý kód raz funguje a raz nie. V Gridite podľa nastaveného filtru sa zobrazujú aktívni a deaktivovaní užívatelia. Podľa hodnôt filtru sa aj gridito drobátko upravuje. Pri aktívnych mam buttony Detaily, Uprav, Deaktivuj a pri deaktivovaných sú Detaily a Aktivuj. Pri aktivovaných funguje všetko fajn, pri deaktivovaných ladička hádže error a notice.

Error: Nette\Application\BadSignalException #403 The signal receiver component ‚grid-actions-activate‘ is not found. //po kliknutí na button Aktivuj

Notice: Trying to get property of non-object na riadku Environment::getSession(‚UserPresenter‘)->userId = $user->id v $grid->addButton(„details“, „Detaily“, array(//po klinutí na Detaily

<?php
protected function createComponentGrid($name)
    {
        $grid = new Grid($this, $name);
        $p = $this;
        $model = new UsersModel();

        $search = $this->getParam("hladaj", false);
        $role = $this->getParam('rola', 'all');
        $active = $this->getParam('aktivni', 1);

        if ($search) {
            $fluentModel = $model->filterUserSearch($search, $role, $active);
        } else {
            $fluentModel = $model->getUsersFluentModel($role, $active);
        }

        $grid->setModel($fluentModel);

        $grid->setItemsPerPage(10);

        $grid->addColumn("login", "Login")->setSortable(true);
        $grid->addColumn("rola", "Rola")->setSortable(true);
        $grid->addColumn("vytvoreny", "Vytvorený")->setSortable(true);


        $grid->addButton("details", "Detaily", array(
            "handler" => function ($user) use ($grid) {
                \Nette\Debug::dump($user);
                Environment::getSession('UserPresenter')->userId = $user->id;
                $grid->presenter->redirect("User:details");
            },
        ));


        if ($active) {
            $grid->addButton("edit", "Uprav", array(
                "handler" => function ($user) use ($grid) {
                    Environment::getSession('UserPresenter')->userId = $user->id;

                    switch (UsersModel::getRole($user->id)) {
                        case 'klient':
                            $grid->presenter->redirect("User:EditClient");
                        case 'tester':
                            $grid->presenter->redirect("User:EditTester");
                        case 'terapeut':
                            $grid->presenter->redirect("User:Edit");
                        case 'vedec':
                            $grid->presenter->redirect("User:Edit");
                    }
                },
            ));

            $grid->addButton("deactivate", "Deaktivuj", array(
                "handler" => function ($user) {
                    $model = new UsersModel();
                    $model->deactivateUser($user->id);
                },
            ));
        } else {
            $grid->addButton("activate", "Aktivuj", array(
                "handler" => function ($user) {
                    $model = new UsersModel();
                    $model->activateUser($user->id);
                },
            ));
        }
    }
?>

id poslielam v session kvoli bezpecnosti. Som začiatočník v PHP, nette, dibi. Za akúkoľvek inšpiráciu vopred ďakujem.

Report generated at 2011/01/18 19:48:43
http://localhost/…in/accounts/?…
PHP 5.3.5
Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/1.0.0c DAV/2 PHP/5.3.5 with Suhosin-Patch
Nette Framework 2.0-dev (revision 9e52d77 released on 2010–12–21)

Filip Procházka
Moderator | 4668
+
0
-

to je přece jasné ne? :)

Environment::getSession('UserPresenter')->userId = $user->id;

// takhle je to správně
Environment::getSession('UserPresenter')->offsetSet('userId', $user->id);

// nebo takhle
$userPresenterSession = Environment::getSession('UserPresenter');
$userPresenterSession['userId'] = $user->id;

//edit: zdá se že fungují všechny tři způsoby, proč jsem si myslel, že ten první nefunguje? :-/

Editoval HosipLan (19. 1. 2011 7:54)

iwtu
Člen | 8
+
0
-

Týmto to bohužiaľ nie je. Vyhadzuje presne tie isté hlášky. Len by som ešte dodal, ze v prípade notice ladenka vo Variable uvádza $user FALSE, kdež to

Gridito/Button.php (81) source ▼ Gridito\BaseButton→ handleClick (arguments ▼) $token „8f863546136e1eb08eeb9301f6dac789“ (32)
$uniqueId „139“ (3)

„139“ je správna hodnota, i keď nikde nemám premennú $uniqueId. Ak by náhodou fungoval, prečo by bol správny ten kód?

V prípade error nevyhodí to zlyhá už na $application->run();. Pripomínam, že rozdiel je iba podľa nastaveného filtru. Prikladám aj kód filtru.

<?php
protected function createComponentFilter($name)
    {
        $role = array(
            'all' => 'všetky',
            'klient' => 'klient',
            'terapeut' => 'terapeut',
            'tester' => 'tester',
            'vedec' => 'vedec',
        );

        $form = new AppForm($this, $name);
        $form->addText("hladaj", 'Hľadaj: ')->setDefaultValue($this->getParam('hladaj',''));
        $form->addSelect('rola', 'Rola', $role)->setDefaultValue($this->getParam('rola','all'));
        $form->addSelect('aktivni', '', array(
            '1' => 'aktívni',
            '0' => 'deaktivovaní',
        ))->setDefaultValue($this->getParam('aktivni','1'));

        $form->addSubmit("submit", "Hľadaj");
        $form->onSubmit[] = array($this, "filterSubmit");
    }

public function filterSubmit($form)
    {
        $this->redirect("Default", $form->getValues());
    }
?>
Honza Marek
Člen | 1664
+
0
-

nevím v čem je chyba, ale pro zobrazení/nezobrazení tlačítka se dá použít option „visible“.

$grid->addButton("activate", "Aktivuj", array(
        "handler" => function ($user) {
                $model = new UsersModel();
                $model->activateUser($user->id);
        },
	"visible" => !$active
));
univerz
Člen | 7
+
0
-

pre buduce generacie, kolega si nezaistil perzistenciu „aktivni“, tj. pri spracovani signalu ho spracovaval iny objekt, nez by rad.

colek
Člen | 59
+
0
-

dá se nastavit nějak default sort?

v dibu fluent mám join skrz několik tabulek a pro korektní zobrazení je třeba to seřadit podle třech z nich. Jenže když to nastavím v dibifluent, gridito samozřejmě pak neumí řadit dál…

díky za radu

Aurielle
Člen | 1281
+
0
-

Tuhle funkci jsem si pokusně implementoval, každopádně jsem Gridito měnil víc a netuším jestli k tomu není potřeba ještě něco dalšího… obecně by měla stačit podmínka typu

public $defaultSortType;
public $defaultSortColumn;

if($this->defaultSortType && $this->defaultSortColumn && !$this->sortColumn && !$this->sortType) {
	$this->sortType = $this->defaultSortType;
	$this->sortColumn = $this->defaultSortColumn
}

Tu podmínku strč před řazení v tuším render() metodě.

colek
Člen | 59
+
0
-

Yep, tohle je ono… díky moc…

ještě bych se chtěl zeptat autora, jestli neplánuje tuhle funkčnost přidat do výchozího balíku. Já totiž neradu upravuju cizí věci, pak potřebuji udělat třeba kvůli jiné funkčnosti upgrade a nevím kde všude jsem provedl změny… Zrovna gridito není nijak gigantické, ale obecně nerad upravuji cizí knihovny :)

iwtu
Člen | 8
+
0
-

este ak sa mozem spytat, o asi taku advanced featuru… nemozhol by sa nadpis buttonu menit alebo ikonka menit podla nejakej nejakej hodnoty riadku?

Filip Procházka
Moderator | 4668
+
0
-
$ git clone git://github.com/janmarek/Gridito.git

// potřebuju něco upravit ...
$ git add moje_zmeny
$ git commit -m "upraveno tohle a tamto"

// za měsíc: Honza vydal novou verzi!
$ git fetch
$ git rebase origin/master
$ git rebase -i origin/master

// opakovat do zblbnutí

Takhle si můžeš udržet svoje změny organizované s aktuální originální komponentou. Popř je pak můžeš ještě pushovat na svůj fork Gridita a Honza je může zahrnout do originálního repozitáře, když bude chtít.

Honza Marek
Člen | 1664
+
0
-

tak tak… :)

Honza Marek
Člen | 1664
+
0
-

iwtu napsal(a):

este ak sa mozem spytat, o asi taku advanced featuru… nemozhol by sa nadpis buttonu menit alebo ikonka menit podla nejakej nejakej hodnoty riadku?

Dají se jednotlivý tlačítka vypínat a zobrazovat podle nějaké hodnoty řádku: http://griddemo.janmarek.net/document_root/?…

na1k
Člen | 288
+
0
-

Dá se nějak jednoduše zničit provázanost s jQueryUI? Mám celkem specifické požadavky na nastylování (a osobní odpor k jQUI) a pořád se s tím musím přebíjet :-/

Hraju si s Griditem teprve od včerejška, tak jsem do toho možná ještě neproniknul. Rozhodně se ale líbí a právě teď jím zkouším nahradit původní Datagrid a uvidím jak se osvědčí :)

Aurielle
Člen | 1281
+
0
-

Prostě jen zakomentuj příslušné javascripty. Já mám jQuery UI přidané jen kvůli ikonkám řazení, jinak bych na to taky kašlal :D

laky
Člen | 3
+
0
-

Zdravim, teprve zacinam a libi se mi tento grid. a jeste vic by se mi libilo kdyby slo ve windowsButton mit formular treba pro editaci. Mohlo by to fungovat takle? Formular se vykresli ale vubec nedojde k zavolani userFormSubmitted

<?php
      $grid->addToolbarWindowButton("create", "Přidat záznam")->setHandler(function () {
              // formular pro pridani zaznamu ----------------
    		  	$form = new AppForm;
          		$form->addText('username', 'Uživatelské jméno:')
          		     ->addRule(Form::FILLED, 'Přezdívka');
          		$form->addText('password', 'Heslo:')
          		     ->addRule(Form::FILLED, 'Tajné heslo');
              		$form->addText('email', 'E-mail:')
          		     ->addRule(Form::FILLED, 'Chybí email');

          		$form->addSubmit('save', 'Uložit')->setAttribute('class', 'default')->onClick[] = 'OkClicked';
          		$form->addSubmit('cancel', 'Zrušit')->setValidationScope(NULL);
          		$form->onSubmit[] = array($this, 'userFormSubmitted');

          		$form->addProtection('Prosím vyplňte forumlář znova(bezpečnostní token vypršel).');
          		echo $form;

      })->setIcon("ui-icon-newwin");
?>

dekuji za odpoved

Honza Marek
Člen | 1664
+
0
-

Editační formulář ve window buttonu mít jde, ale ten musí být definován klasicky v presenteru. Jinak se při odeslání nedá najít a proto neproběhne ta onSubmit akce.

<?php
$presenter = $this;
$grid->addToolbarWindowButton("create", "Přidat záznam")->setHandler(function () use ($presenter) {
    echo $presenter['addForm'];
})->setIcon("ui-icon-newwin");
?>

Nicméně bych to spíše nedoporučil. Pokud bude formulář obsahovat validaci, kterou nelze zkontrolovat javascriptem, při špatném odeslání se mi již formulář nezobrazí a přijdu o již vyplněná data.

bojovyletoun
Člen | 667
+
0
-

Aha, tak já jsem na githubu našel toto
v6ak-Gridito-dfbb639 funguje pěkně. Je tam dibi model hotový a defatko co se musí pro zprovoznění udělat, je v set model předat anonymní funkci, která přidá k formuláři editační pole a addEditButton a to je vše.

PS jinak tohle je zavržená větev? Zkoušel jsem i verzi od Pavel Maca- ta je hlavní verze? V kterých verzích je podpora filtrů?

colek
Člen | 59
+
0
-

měl bych k tomu ještě jeden dotaz…

jak se dá postupovat, pokud potřebuji vykreslit v buňce formulář (jeden select a submit), který je vztažen k datům konkrétního řádku.

Tj. např. na řádku 3 mám ve sloupci ID hodnotu 5 – potřebuji se podívat do databáze a k ID 5 najít nějaké hodnoty a ty zobrazit v tom selectboxu.

Komponentou to nepůjde, ta se zavolá jen jednou, takže jí žádné parametry nepošlu.

Můžu z té anonymní funkce nějak zavolat formulář, který bude mít pokaždé jiná data?

Aurielle
Člen | 1281
+
0
-

Používám vlastní modifikaci verze z hlavního repozitáře, co se týče modelů jen jsem dopsal/upravil OrmionModel a Gridito funguje perfektně.

v6ak
Člen | 206
+
0
-

Abych pravdu řekl, tak tu svoji větvi dnes nevyvíjím.

Šaman
Člen | 2659
+
0
-

gmvasek napsal(a):

Používám vlastní modifikaci verze z hlavního repozitáře, co se týče modelů jen jsem dopsal/upravil OrmionModel a Gridito funguje perfektně.

Super, zkouším Ormion a tohle se hodí. Nicméně jedno mi není jasné:
Dá se nějak elegantněji zapsat tohle?

$grid->setModel(new Gridito\OrmionModel(Character::findAll()));
$grid->addColumn("name", "Jméno")->setSortable(true);
$grid->addColumn("state", "Status")
  ->setRenderer(function ($entity) {echo $entity->State->text;})
  ->setSortable(true);

Nejprve jsem intuitivně zkoušel jsem tuto, ale to nešlape:

$grid->setModel(new Gridito\OrmionModel(Character::findAll()));
$grid->addColumn("name", "Jméno")->setSortable(true);
$grid->addColumn("State->text", "Status")
  ->setSortable(true);

state je property, která obsahuje id záznamu v nezávislé tabulce

State je objekt z nezávislé tabulky

State->text je text který odpovídá ID v políčku state

Editoval Šaman (1. 2. 2011 5:26)

colek
Člen | 59
+
0
-

chtěl bych se zeptat na možnost exportu do excelu, pdf… jestli se mám pokoušet to udělat, nebo jestli narazím na nějaký zásadní problém :)

srandis
Člen | 4
+
0
-

WindowButton nespustí handler pokud model naplním daty s využitím joinu

Zevrubná ukázka:

<?php
$grid->setModel(new Gridito\DibiFluentModel(dibi::select('firma,cislo_faktury')
     ->from('dodavatel')
     ->innerJoin('faktura')
     ->on('dodavatel.id=prijate_faktury.dodavatel_id')));
$grid->addWindowButton('detail','Detail')
     ->setHandler(function () {echo 'cokoliv';});
?>

Zde při kliknutí na tlačítko Detail vyskočí jen prázdné jquery-ui okénko.
Pokud použiji SELECT nad jednou tabulkou zobrazí se očekávaně ‚cokoliv‘.

Nevíte v čem by mohl být problém? Děkuji za případnou reakci .)

používám:

  • janmarek-Gridito-2d46e33 – prostě co je teĎ odkaz na staženi zde v doplňcích
  • Nette 2.0 alpha2 z 22.11.2010
  • php 5.3.5

EDIT:

Tak jsem na to již přišel. V mém konkrétním případě kde se mi v joinu kryly idčka jsem aliasoval zhruba takto prijate_faktury.id AS id a gridito, když vytahuje jednotlivý záznamy tak přidává k fluentu další klauzuli where s primárním klíčem, který má standardně definovaný jako ‚id‘ a tak bylo potřeba si trošku pohrát s názvy id sloupců a nastavit primary key v griditu vlastní.

V tom jednoduchém příkladě, co jsem napsal výše, pokud by byl primary key třeba sloupec cislo_faktury by to vypadalo takto:

<?php
$model = new Gridito\DibiFluentModel(dibi::select('firma,cislo_faktury')
     ->from('dodavatel')
     ->innerJoin('faktura')
     ->on('dodavatel.id=prijate_faktury.dodavatel_id'));
$model->setPrimaryKey('cislo_faktury');
$grid->setModel($model);
$grid->addWindowButton('detail','Detail')
     ->setHandler(function () {echo 'cokoliv';});
?>

Editoval srandis (23. 2. 2011 20:56)

Bumerank
Člen | 30
+
0
-

měl bych dotaz k tlačítkům (potřebuji editaci / smazání a další akci pro jednotlivé položky) – používám dibi

<?php
$grid->addButton('name', 'Popisek');
?>

..zkoušel jsem i různé další syntaxe z ukázkových příkladů

vyhodí chybu: Undefined property: DibiRow::$id

<?php
104:        public function getUniqueId($item)
105:        {
106:            return $item->{$this->getPrimaryKey()};
107:        }
?>
v6ak
Člen | 206
+
0
-

Musíš nastavit primární klíč, nejmenule-li se „id“.

Bumerank
Člen | 30
+
0
-

to jsem si myslel, jen mě nenapadlo, že se musí jmenovat „id“ – díky..stačilo lehce nakopnout :D

v6ak
Člen | 206
+
0
-

Nemusí, ale pak je to potřeba říct.

Podbor
Člen | 19
+
0
-

Zdarec,
měl bych k téhle pěkné komponentně dotaz. Pokouším se implementovat ji a narazil jsem na problém u vykreslování tlačítek pro úpravu, smazání atp. Používám dibi a když chci vykreslit přes „WindowButton“ tlačítko „info“, které by v dialogu vypsalo informace o dané entitně, ale nevím, jak přistoupit v daném řádku ke konkrétnímu uživateli.
Zkouším předávat parametr „$row“, ale když se poté zobrazí jQuery UI dialog, tak je prázdný…
Ukázka kódu

<?php
	$grid = new Gridito\Grid($this, $name);

    	$grid->setModel(new Gridito\DibiFluentModel($this->getUsersModel()->findUsersFluent()));

	$grid->setItemsPerPage(5);

	// columns
	$grid->addColumn("id", "ID")->setSortable(true);
	$grid->addColumn("login", "Login")->setSortable(true);
	$grid->addColumn("name", "Jméno")->setSortable(true);
	$grid->addColumn("surname", "Příjmení")->setSortable(true);

	$grid->setDefaultSort("login","asc");

	// Přidání nového uživatele pokud má daný uživatel práva
	$grid->addWindowButton("info","Info",array(
      		"handler" => function ($row){
        		echo "$row->name $row->surname<br>($row->mail)";
      		},
      		"icon" => "ui-icon-search",
      		"showText"=> false
    	));
?>

Tlačítko se mi zobrazí, po kliknutí vyskočí dialog, ale neobsahuje vůbec nic, pouze prázdný „div“.
Předem díky.

Editoval Podbor (31. 3. 2011 14:25)

Podbor
Člen | 19
+
0
-

Tak se mi podařilo zjistit, co je za problém: tahám přes DibiFluent zdrojová data složeným dotazem ze dvou tabulek, u kterých obou je „id“, čili, když se následně přidává podmínka …->where(„id = X“) vyhodí výjimku „nejednoznačný identifikátor“. Jakým způsobem se dá definovat název primárního klíče?
Když jsem zkusil „id“ přes „as“ přejmenovat, v podmínce „WHERE“ ho stejně označoval jako neexistující sloupec a do „setPrimaryKey“ mi neakceptuje prefix tabulky (users.id) hlásí jako neznámé…
Napadá někoho ještě jiné řešení?

Editoval Podbor (31. 3. 2011 15:03)

v6ak
Člen | 206
+
0
-

setPrimaryKey

Podbor
Člen | 19
+
0
-

v6ak napsal(a):

setPrimaryKey

Díky, vyzkoušel jsem ho, ale stále nejsem schopen mu správně označit ten název sloupce. Zkoušel jsem to za
a) SELECT u.id AS user_id … – ale pak ho v podmínce WHERE user_id = 7 stejně dotaz nezná a vyhodí výjimku
b) ten sloupec nastavit jako primární klíč přes

<?php
$grid->getModel()->setPrimaryKey("u.id");
?>

s tím výsledkem, že $u.id bylo nalezeno jako nedefinované…
Lze to ještě nějak jinak?

srandis
Člen | 4
+
0
-

Podbor napsal(a):

v6ak napsal(a):

setPrimaryKey

Lze to ještě nějak jinak?

Já musel přejmenovat id sloupce v dtb, protože mě nic jinýho tehdy nenapadlo jak to udělat bez zásahů do gridita.

Podbor
Člen | 19
+
0
-

srandis napsal(a):

Podbor napsal(a):

v6ak napsal(a):

setPrimaryKey

Lze to ještě nějak jinak?

Já musel přejmenovat id sloupce v dtb, protože mě nic jinýho tehdy nenapadlo jak to udělat bez zásahů do gridita.

Díky, asi to taky tak udělám, neb modifikovat Gridito mi nepříjde zrovna nejlepší cesta.

yokozunacz
Člen | 5
+
0
-

Ahoj, existuje moznost, jak se po kliku na button a nasledne editaci dat v presenteru, se zase vratit zpet na vyfiltrovana data v datagridu? V komponente Romana Sklenare jsem nasel moznost:

<?php
$grid->rememberState = TRUE; // povolí ukládání stavů komponenty do session
?>

V Gridito jsem podobnou moznost neobjevil, ale mozna koukam spatne…

Filip Procházka
Moderator | 4668
+
0
-

To je dobrý feature request, asi to zařadím do Grinderu :)

VaKvas
Začátečník | 111
+
0
-

Zdravím,

zprovoznil jsem Gridito a pada me Filter.
Po kliknuti na Filter, dostavam hlasku :

Passed more parameters than method FrontModule\InfoPresenter::renderDefault() expects.

Vse jsem pouzil z prikladu, jen jsem dal pryc jeden sloupec, ktery neni v databazi.
CheckBox jsem pro zkousku predelal jako na „admin only“ posila to WHERE role=admin.

v DB jsou slouce ID, EMAIL, PASSWORD, NAME a ROLE.

Predem moc díky za radu.

Zde mam presenter:

namespace FrontModule;

use Nette\Application\AppForm;

/** * Dibi datagrid with filters example presenter
 * * * @author Jan Marek *
 * @license MIT
 */

class InfoPresenter extends BasePresenter {

    /**
     * @var bool
     * @persistent
     */
    public $activeOnly = false;
    /**
     * @var string
     * @persistent
     */
    public $search;

    public function renderDefault() {
	$this->template->filters = $this["filters"];
    }

    protected function createComponentGrid($name) {

	$grid = new \Gridito\Grid($this, $name);

	$db = \Nette\Environment::getService("DibiConnection");

	$model = new \UsersGriditoDibiModel($db);

	if ($this->getParam("activeOnly")) {
	    $model->filterActiveOnly();
	}

	$search = $this->getParam("search", false);
	if ($search) {
	    $model->filterSearch($search);
	} $grid->setModel($model);

	// columns
	$grid->addColumn("id", "ID")->setSortable(true);
	$grid->addColumn("email", "Email")->setSortable(true);
	$grid->addColumn("password", "Heslo")->setSortable(true);
	$grid->addColumn("name", "Jméno")->setSortable(true);
	//$grid->addColumn("role", "Role")->setSortable(true);
//	$grid->addColumn("mail", "E-mail", array("renderer" => function ($row) {
//		echo Nette\Web\Html::el("a")->href("mailto:$row->mail")->setText($row->mail);
//	    }, "sortable" => true,));
	$grid->addColumn("role", "Ma roli", array(
	    "renderer" => function ($row) {
		\Gridito\Column::renderBoolean($row->role);
	    },
	    "sortable" => true,
	));
    }

    protected function createComponentFilters($name) {
	$form = new AppForm($this, $name);
	$form->addText("search", "Search by")
		->setDefaultValue($this->getParam("search", ""));
	$form->addCheckbox("activeOnly", "Active users only")
		->setDefaultValue($this->getParam("activeOnly"));
	$form->addSubmit("s", "Filter");
	$form->onSubmit[] = array($this, "filters_submit");
    }

    public function filters_submit($form) {
	$this->redirect("default", $form->getValues());
    }

}

Model:

class UsersGriditoDibiModel extends \Gridito\DibiFluentModel {

    public function __construct(\DibiConnection $db) {
	parent::__construct($db->select("*")->from("users"));
    }

    public function filterActiveOnly() {
	$this->fluent->where("role = admin");
    }

    public function filterSearch($search) {
	$searchString = "%$search%";
	$this->fluent->where("(name like %s OR email like %s)", $searchString, $searchString);
    }

}

a sablona :

{block content}

{control $filters begin}
<fieldset>
    <legend>Filters</legend>
    <p>
        {$filters["search"]->label} {$filters["search"]->control}
        {$filters["activeOnly"]->control} {$filters["activeOnly"]->label}
        {$filters["s"]->control}
    </p></fieldset>
{control $filters end}

{control grid}

{/block}

Editoval VaKvas (7. 4. 2011 21:45)

VaKvas
Začátečník | 111
+
0
-

Zkusil jsem vse nechat jako je v prikladu a do db jsem pridal i potrebne sloupce, ale se stejnym vysledkem… :-(

Honza Marek
Člen | 1664
+
0
-

Zajímavý… zkusil bych

public function renderDefault($search, $activeOnly) { // <-- ty parametry
	// ...
}

ale myslim, že by to mělo fungovat i bez toho.

VaKvas
Začátečník | 111
+
0
-

Tak pak:
Object of class Nette\ArrayHash could not be converted to string

Ladenka se me zastavuje na radku

$this->redirect("default", $form->getValues());

nemuzu mit blbe routy ? Mam jen zakladni ale nevim jestli jsou to ty spravny :

$router[] = new Route('index.php', 'Front:Pages:');
$router[] = new Route('<presenter>');
$router[] = new Route('<presenter>/<action>');
Honza Marek
Člen | 1664
+
0
-

Aha, už chápu… Formuláře přestaly vracet v novější verzi Nette svoje hodnoty jako pole, takže to nejde přímo předat do toho redirectu.

$v = $form->getValues();
$this->redirect('default', array('search' => $v->search, 'activeOnly' => $v->activeOnly));
VaKvas
Začátečník | 111
+
0
-

Jo, to je ono !
Diky !!!!

Jeste prosim otazku. Na zprovozneni AJAXu, staci mit nacteny ty JSka?

Moc díky !

Filip Procházka
Moderator | 4668
+
0
-

ArrayHash si ukládá data do členských proměnných, prosté přetypování na array funguje stejně a příjde mi jednodužší. :)

$this->redirect('default', (array)$form->getValues());