#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
$htmlse 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řídyHtml.Pro vynulování objektu
Htmlzkus 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


