problem s DataGrid

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

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
+
0
-

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

vlki
Člen | 218
+
0
-

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)

kraklin
Člen | 12
+
0
-

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.

stromc3k
Člen | 7
+
0
-

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
+
0
-

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.

stromc3k
Člen | 7
+
0
-

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

vlki
Člen | 218
+
0
-

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;
		}
	}
}
?>
Klokan
Člen | 47
+
0
-

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.

vlki
Člen | 218
+
0
-

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
+
0
-

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

Klokan
Člen | 47
+
0
-

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.

natrim
Člen | 73
+
0
-

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)