DataGrid neustále nefiltruje

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

Nedaří se mi v DataGridu rozběhat filtrování na základě inputů nad sloupci.
Po odeslání pomocí tlačítka Apply Changes se odešle formulář s URL /?grid-page=2&grid-order=objednano%3Da&do=grid-form-submit ale od nette se mi vrátí HTTP kód 303 a web se začne načítat z adresy /?grid-page=2&grid-order=objednano%3Da.
Po tomto přesměrovacím kolečku se vrátím na původní stranu kde jsou nevyplněné inputy a nevyfiltrované sloupce.

protected function createComponentGrid($name)
{
	$grid = new DataGrid;
    	$grid->bindDataTable($this->ordersModel->findAll());
	$grid->displayedItems = array(10, 20, 50);
	$grid->multiOrder = FALSE;

	$grid->addColumn('objednano', 'Pokus')->addFilter();
	$grid->addActionColumn('Actions');
	$this->addComponent($grid, $name);
}

Díky za nápady

toka
Člen | 253
+
0
-

Fakt ti to nefunguje, resp. toto jsem teď zkoušel, a je to OK?

protected function createComponentGrid($name) {
  $grid = new DataGrid;

  $renderer = new DataGridRenderer;
  $grid->setRenderer($renderer);

  $grid->bindDataTable($this->ordersModel->findAll());

  $grid->displayedItems = array(10, 20, 50);

  $grid->multiOrder = FALSE;
  $grid->rememberState = TRUE;
  $grid->timeout = '+ 7 days';
  $grid->multiOrder = FALSE;

  $grid->addColumn('objednano', 'Pokus')->addFilter();
  $grid->addActionColumn('Actions');

  return $grid;
}

A v šabloně potom:

{widget grid}
king12345
Člen | 6
+
0
-

S tím to taky nejde, teď jsem stáhl přesný verze nette a dibi co datagrid vyžaduje, tedy Nette 0.9.0 a dibi 1.1.

V modelu snad bejt chyba nemuže…

public function findAll()
{
		$and = array(
		"objednavky.vlastnik = vlastnik.id",
		"objednavky.user = clients.id",
		"objednavky.status = status_objednavky.id",
		"objednavky.procedura = ceny.id",
		"objednavky.stroj = stroje.id"
		);
		$return =dibi::dataSource('SELECT vlastnik.vlastnik,clients.jmeno,clients.prijmeni,clients.telefon,status_objednavky.status,DATE_FORMAT(objednavky.termin, \'%e.%c.%Y %H:%i\') AS termin,ceny.popis,stroje.stroj FROM objednavky,vlastnik,clients,status_objednavky,ceny,stroje WHERE %and',$and);

		return $return;
}
toka
Člen | 253
+
0
-

Aha, už vím, co jsem zapomněl ještě přidat, já jsem to smazal, aby to bylo univerzální, a možná, určitě, to je potřeba :-) Chtěl jsem to univerzální, a ono ne…

...
	$grid->keyName = 'id_zaznam'; // primarni klic
...
king12345
Člen | 6
+
0
-

Bohužel nic. Ještě doplním že z datagridu nefungují žádné formuláře, tedy ani formuláře pod tabulkou pro nastavení počtu zobrazovaných položek nebo přeskočení na určitou stránkou.
Nemůže být chyba v routování ?
Funguje tedy pouze stránkování a řazení sloupců.

Nemůže být chyba v routování ?

// editovani polozky z datagridu
$router[] = new Route('objednavky/edit/<id>', array(
    'presenter' => 'Orders',
    'action' => 'edit',
		'id' => 'id'
));

// adresa k datagridu
$router[] = new Route('objednavky', array(
	'presenter' => 'Orders',
	'action' => 'default',
));
blacksun
Člen | 177
+
0
-

To, že funguje stránkování a řazení a nefunguje filtrování je tím, že pro filtrování se odesílá formulář, zatímco přecházení mezi stránkami a řazení je klasický GET požadavek.

Já teď řeším také nefunkční filtrování, mám poslední verzi nette, dibi i datagridu. Používám DibiMssqlDataSource nad DibiDataSource, v čemž by problém být neměl, sql se generují správně, zdá se mi.

Končím na chybě v SelectBoxFiltru na řádku 76

<?php
$this->element->setItems($this->generatedItems);
?>

, kde $this->element je prázdné.. Ani když podmínkou zajistím, aby se to buď přeskočilo nebo se $this->element naplnilo fcí getFormControl(), tak to ve výsledku nefiltruje, takže problém bude ještě někde jinde..

Už pomalu ale nevim, kam kouknout..

Doplním, že datagrid definuju v BasePresenteru v továrničce createComponentDatagrid(), vracím přes return bez datasource, pak ho v poděděném presenteru vytvářím v render metodě pomocí

<?php
$grid = $this->getComponent('datagrid');
?>

Dodám mu datasource a předám do šablony, ve které ho vykresluji pomocí @{? $grid->render() }
Stránkování i řazení funguje v pohodě ajaxově, na post požadavky formuláře dostávám 500ku :-(

Editoval blacksun (12. 7. 2010 16:14)

blacksun
Člen | 177
+
0
-

V konzoli firebugu ve firefoxu se objevuje tohle:

PHP Notice: Undefined index: filters in /var/www/html_testis/sloupy/app/components/DataGrid/DataGrid.php:570
PHP Warning: Invalid argument supplied for foreach() in /var/www/html_testis/sloupy/app/components/DataGrid/DataGrid.php:510
Call to a member function setItems() on a non-object

Zkusil jsem také odpojit a připojit komponentu k presenteru pomocí

<?php
$this->presenter->removeComponent($grid);
$this->presenter->addComponent($grid, 'datagrid');
?>

jelikož jsem narazil na hlášku, že komponenta '' není připojena k INamingContainer..

Ale stále bez úspěchu..