Ovlivnění datagridu z externího formuláře
- blacksun
- Člen | 177
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}
?>
- blacksun
- Člen | 177
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?