#1 3. 9. 2009 18:23

kraklin
Člen
Registrovaný: 3. 9. 2009
Příspěvky: 14

problem s DataGrid

Zdravim vsechny,

zacinam objevovat Nette a cim dal tim vic se mi zacina libit. Pri hrani si s komponentou DataGrid jsem se ale dostal do slepe ulicky. Komponenta se mi bez problemu vykresli, dokud si v ni necham zobrazvat pouze data.

Problem zacina, kdyz se pokusim pridat nejakou akci. Sloupec „Akce“ se vytvori v poradku, jakmile ale pridam nejakou akci, DataGrid se nevykresli a misto krasne tabulky na me z monitoru zira chybova hlaska,

Fatal error: Method DataGrid::__toString() must not throw an exception in /home/tomiik/workspace/printweb/nette/app/temp/cache-Nette.Template%00fbd1149454333ab752614ce546033f271.users.phtml.php on line 10

se kterou opravdu nehnu. V users.phtml ze ktereho je to generovano je pouze @{!$grid}

V presenteru mam neco takovehoto:

protected function createComponent($name)
{
        switch ($name) {
        case 'usersGrid':
                $grid = new DataGrid;
                $model = new Users;
                $grid->bindDataTable($model->listUsers());

                $grid->addColumn('login', 'Login');
                $grid->addDateColumn('lastLogin', 'Poslední přihlášení','%d.%m.%Y');


                $grid->addActionColumn('Akce');

                // a naplníme datagrid akcemi pomocí továrničky
                $grid->addAction('Upravit', 'User:edit');

                $this->addComponent($grid, $name);
                return;
        }
}

Urcite to bude jenom nejaka ptakovina, ale uz tu do toho ziram pres dve hodinky a ne a ne i s pomoci strejdy Googla najit reseni. Nekdo nejaky napad?

Offline

 

#2 3. 9. 2009 18:47

romansklenar
Moderator
Místo: Ostrava
Registrovaný: 20. 7. 2008
Příspěvky: 769
Web

Re: problem s DataGrid

Zkus vykreslovat pomocí @{? $grid->render()} a měl bys vidět přímo výjimku, která se vyhazuje v __toString().

Offline

 

#3 3. 9. 2009 20:48

vlki
Nette guru
Registrovaný: 30. 6. 2008
Příspěvky: 239

Re: problem s DataGrid

A když už využíváš továrničky, zkus se podívat na jejich vylepšenou verzi.

Taky se neboj využívat makra widget. Tvůj datagrid by šel tímto makrem vykreslit jako

@{control usersGrid}

Nemusíš u toho předávat grid do šablony v proměnné a vyhneš se i těmto problémum, kdy se vykresluje přes magickou metodu __toString().

Editoval vlki (3. 9. 2009 20:49)

Offline

 

#4 3. 9. 2009 21:45

kraklin
Člen
Registrovaný: 3. 9. 2009
Příspěvky: 14

Re: problem s DataGrid

Tak uz je to vsechno v poradku :) Dekuji za info, zjistil jsem, ze mam zadany spatny klic $grid->keyName jsem mel zkopirovany podle tutorialu, ale nemel jsem v nem nazev sloupce z me tabulky.

Jeste jednou diky za tip.

Offline

 

#5 7. 9. 2009 14:01

stromc3k
Nový člen
Registrovaný: 7. 8. 2009
Příspěvky: 6

Re: problem s DataGrid

Ahoj chtel jsem se zeptat jestli datagrid umi „podminene akce“. Uvedu na prikladu:

Mam tabulku ‚knihy‘ pokud je kniha skladem tak bych chtel mit treba akce: New/Delete

pokud dane zbozi neni skladem tak bych chtel mit jine akce treba jen jednu akci a to: Edit…

Da se to nejak vyresit v datagridu? nebo to datagrid zatim neumi? Dekuji

Editoval stromc3k (7. 9. 2009 14:02)

Offline

 

#6 7. 9. 2009 14:17

vlki
Nette guru
Registrovaný: 30. 6. 2008
Příspěvky: 239

Re: problem s DataGrid

Umí. Pomůže ti k tomu událost onActionRender . V definici DataGridu si uvedeš všechny akce a na základě předaných dat si v callbacku upravíš objekt Html.

Offline

 

#7 7. 9. 2009 15:16

stromc3k
Nový člen
Registrovaný: 7. 8. 2009
Příspěvky: 6

Re: problem s DataGrid

dekuju, v nette zatim moc nedelam, nasel by se nejaky priklad jak callback vyuzit?

Offline

 

#8 7. 9. 2009 17:22

vlki
Nette guru
Registrovaný: 30. 6. 2008
Příspěvky: 239

Re: problem s DataGrid

Určitě. Navazování callbacků na události je v Nette docela častá a hodně silná věc.

V tvém případě by mohlo fungovat něco takového…

<?php
class FooPresenter extends Presenter
{
        protected function createComponentDg($name)
        {
                $dg = new DataGrid;
                ...
                $dg->addActionColumn('Actions');
                $dg->addAction('New', 'BarPresenter:new', Html::el('span')->class('icon icon-new'), FALSE, DataGridAction::WITHOUT_KEY);
                $dg->addAction('Edit', 'BarPresenter:edit', Html::el('span')->class('icon icon-edit'));
                $dg->addAction('Delete', 'BarPresenter:delete', Html::el('span')->class('icon icon-delete'));

                $model = new Model;
                $renderer = $dg->getRenderer();
                $renderer->onActionRender[] = array($model, 'formatDataGridAction');
        }
}
?>
<?php
class Model
{
        public function formatDataGridAction(Html &$html, DibiRow $data)
        {
                switch($html->title) {
                        case 'New':
                        case 'Delete':
                                $html = $data->skladem ? $html : Html::el();
                                break;
                        case 'Edit':
                                $html = !$data->skladem ? $html : Html::el();
                                break;
                }
        }
}
?>

Offline

 

#9 23. 10. 2009 12:51

Klokan
Člen
Registrovaný: 28. 5. 2009
Příspěvky: 49

Re: problem s DataGrid

Ahojte, chci se optat, jestli Ti ta předchozí konstrukce funguje. Chci jednu akci na základě hodnoty z $data nezobrazit, ale ať dělám co dělám, tak ten Html objekt nevynuluju. Správně se mi callback zavolá, pokud tam něco nastavím, tak to funguje, ale vymazat mi prostě nejde.

Offline

 

#10 23. 10. 2009 13:55

vlki
Nette guru
Registrovaný: 30. 6. 2008
Příspěvky: 239

Re: problem s DataGrid

Popravdě nefunguje. Psal jsem to z hlavy, omlouvám se za zmatení. Objekt $html se v parametrech předá odkazem a nelze vytvořit nový objekt a do proměnné ho přiřadit. Co ale lze, tak „vynulovat“ objekt třídy Html.

Pro vynulování objektu Html zkus následující…

<?php
$html->setName(NULL);
$html->setHtml(NULL);
$html->attrs = array();
?>

Offline

 

#11 23. 10. 2009 16:31

Klokan
Člen
Registrovaný: 28. 5. 2009
Příspěvky: 49

Re: problem s DataGrid

No perfekní, funguje. Díky moc. Zkoušel jsem různé nastavení enable a další podobné způsoby, ale teprve tahle kombinace konečně celý odkaz odstraní. Ještě jednou dík

Offline

 

#12 8. 11. 2009 21:40

Klokan
Člen
Registrovaný: 28. 5. 2009
Příspěvky: 49

Re: problem s DataGrid

vlki napsal(a):

Popravdě nefunguje. Psal jsem to z hlavy, omlouvám se za zmatení. Objekt $html se v parametrech předá odkazem a nelze vytvořit nový objekt a do proměnné ho přiřadit. Co ale lze, tak „vynulovat“ objekt třídy Html.

Pro vynulování objektu Html zkus následující…

<?php
$html->setName(NULL);
$html->setHtml(NULL);
$html->attrs = array();
?>

Tak jsem ještě přišel na problém. Když nastavím ty vlastnosti pro Html objekt, tak všechny další řádky už danou akci nezobrazí. Mám tam podmínku

<?php
if($row->title === 'Výmaz' && $data->typ == Adresa::TYP_FAKTURACNI) {
   $row->setName(NULL);
   $row->setHtml(NULL);
   $row->attrs = array();
}
?>

a po prvním řádku, který podmínku splňuje už se nikdy ikona nezobrazí. Zkoumal jsem co leze do funkce, tak $row->title zůstane od té doby, co ho nastavím na null, prázdné. Zkoušel jsem ho i nastavit, pokud to podmínku nesplňuje, ale ani ťuk.

Offline

 

#13 11. 12. 2009 10:01

natrim
Nový člen
Registrovaný: 11. 12. 2009
Příspěvky: 4

Re: problem s DataGrid

Klokan napsal(a):

Tak jsem ještě přišel na problém. Když nastavím ty vlastnosti pro Html objekt, tak všechny další řádky už danou akci nezobrazí. Mám tam podmínku

<?php
if($row->title === 'Výmaz' && $data->typ == Adresa::TYP_FAKTURACNI) {
   $row->setName(NULL);
   $row->setHtml(NULL);
   $row->attrs = array();
}
?>

a po prvním řádku, který podmínku splňuje už se nikdy ikona nezobrazí. Zkoumal jsem co leze do funkce, tak $row->title zůstane od té doby, co ho nastavím na null, prázdné. Zkoušel jsem ho i nastavit, pokud to podmínku nesplňuje, ale ani ťuk.

Pokud to ještě někoho zajimá, tak je možný ten odkaz jen schovat před uživatelem:

<?php
if($row->title === 'Výmaz' && $data->typ == Adresa::TYP_FAKTURACNI) {
$html->style('display:none;');
} else{
$html->style('display:inline;');
}
?>

a pak zkontrolovat podminku v akci.

Editoval natrim (11. 12. 2009 10:02)

Offline

 

Zápatí