Ovlivnění datagridu z externího formuláře

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

Ahoj,

mám následující situaci:

v BasePresenteru mám definovaný datagrid a protected proměnnou, kterou předávám datagridu datasource. V poděděném presenteru ho pak zobrazuji. Vše funguje jak má, včetně ajaxového stránkování atp.

Nad datagridem mám formulář, kterým chci ovlivňovat zdrojový datasource pro datagrid. Po odeslání formuláře se zavolá obslužná funkce a datasource se upraví tak, jak chci. Předám ho datagridu a invaliduji.

Překreslí se správně první stránka (první 10), upraví se správně stránkování i počet položek. Problém je v tom, když chci přejít na druhou stránku, tak se datasource „nějak“ vrátí na ten, který se generuje při prvním zobrazení dané stránky, i když ta se nerefreshuje – rozbije se stránkování, změní se zpět celkový počet položek a i záznamy na další straně už neodpovídají změněnému datasource.

Možná dělám něco koncepčně špatně.. Nakopnete někdo? Přikládám ještě základní kostru.

BasePresenter.php

<?php

// data pro datagrid
protected $checkOutResultsDataSource = NULL;

// vytvoreni datagridu a naplneni dat
function createComponentCheckOutResultsDataGrid()
{
  $grid = new DataGrid;

  $grid->itemsPerPage = 10; // display 10 rows per page
  $grid->displayedItems = array('all', 10, 20, 50); // items per page selectbox items

  $grid->rememberState = true;
  $grid->multiOrder = true; // order by one column only

  // columns
  // actions
  // operace

  return $grid;

}
?>

CheckOutTestsPresenter.php

<?php
// obecne zobrazeni bez filtru
public function actionDefault()
{
  $this->model = new TestStandsModel();

  $this->checkOutResultsDataSource = $this->model->getCheckOutResults();
  $this->checkOutResultsDataSource->setDefaultSorting(array('ResultID'=>'d'));
}

// prirazeni datagridu do sablony
public function renderDefault()
{
  // vytvoreni gridu a pridani datasource
  $checkOutResultsDataGrid = $this->getComponent('checkOutResultsDataGrid');
  $checkOutResultsDataGrid->bindDataTable($this->checkOutResultsDataSource);

  $this->template->checkOutResultsDataGrid = $checkOutResultsDataGrid;

}

// vytvoreni externiho formulare
public function createComponentFilterForm()
{
  $form = new AppForm();

  $form->addText('SN','Sériové číslo');
  $form->addSubmit('filterSubmit', 'Filtrovat')
        ->onClick[] = array($this, 'filterSubmitClicked');

  return $form;
}

// obsluha externiho formulare
public function filterSubmitClicked(SubmitButton $button)
{
  $formVals = $button->getForm()->getValues();

  $this->checkOutResultsDataSource = $this->model->getCheckOutResultsBySN($formVals['SN']); // vraci datasource
  $this->checkOutResultsDataSource->setDefaultSorting(array('ResultID'=>'d'));

  $checkOutResultsDataGrid = $this->getComponent('checkOutResultsDataGrid');
  $checkOutResultsDataGrid->bindDataTable($this->checkOutResultsDataSource);

  // invalidace datagridu
  $checkOutResultsDataGrid->invalidateControl();
}

?>

V šabloně pak

<?php
{control filterForm}

<hr />
@{!$checkOutResultsDataGrid}
?>
Lopo
Člen | 277
+
0
-

prve co ma napada je pouzit persistent hodnoty

blacksun
Člen | 177
+
0
-

To mě taky napadlo, zkoušel jsem proměnnou pro datasource persistovat, ale nepomohlo to..

mkoubik
Člen | 728
+
0
-

Persistování přímo datasource nepomůže, pokud ho vytváříš při každém requestu – ten správný bude jenom v prvním requestu po odeslání formuláře. Spíš bych perzistoval hodnoty, podle kterých ten datasource vytváříš.

blacksun
Člen | 177
+
0
-

Datasource pro datagrid by se vytvářet při každém requestu neměl. Jednou se datagridu předá při prvním vykreslení s prázdným externím formulářem. Poté po odeslání externího formuláře se vytvoří nový, omezený datasource, který se datagridu nabinduje. Pak se stránky datagridu přepínají ajaxem, tak by se neměl tvořit nový.. Nebo se sám pletu?

mkoubik
Člen | 728
+
0
-

Ajaxovej request probíhá stejně jako „normální“, (actionX, renderX, atd) i persistentní parametry se normálně předávají, akorát se vykreslujou pouze invalidovaný snippety místo celý stránky. Tzn, pokud invaliduješ datagrid, tak se createComponentX zavolá znovu.