problem s DataGrid
- kraklin
- Člen | 12
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?
- romansklenar
- Člen | 655
Zkus vykreslovat pomocí @{? $grid->render()}
a měl bys
vidět přímo výjimku, která se vyhazuje v __toString()
.
- vlki
- Člen | 218
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)
- stromc3k
- Člen | 7
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)
- vlki
- Člen | 218
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
.
- vlki
- Člen | 218
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;
}
}
}
?>
- vlki
- Člen | 218
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();
?>
- Klokan
- Člen | 47
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řídyHtml
.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.
- natrim
- Člen | 73
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)