Datagrid + Ajax
- odin
- Člen | 50
Zdravim, v aplikaci mam:
- app\.htaccess
- app\bootstrap.php
- app\config.ini
- app\log
- app\ResultsModule
- app\temp
- app\presenters
- app\presenters\BasePresenter.php
- app\templates
- app\templates\@layout.phtml
- app\templates\Default.phtml
- app\WelcomeModule
- app\WelcomeModule\BaseModel.php
- app\WelcomeModule\presenters
- app\WelcomeModule\ResultsModel.php
- app\WelcomeModule\templates
- app\WelcomeModule\presenters\DefaultPresenter.php
- app\WelcomeModule\templates\Default.default.phtml
- app\WelcomeModule\templates\Default.list.phtml
- libs\
- www\
v Default.list.phtml je {control maintable} coz je DataGrid komponenta, normalne se vykresli a funguje. Ale pokud pridam AJAXove skripty, tak pri pokusu cokoliv udelat (zmena poctu, dalsi stranka, …) skonci ajaxovy pozadavek chybou (ctu z firebug konzole):
Missing template file ‚C:\wwwroot\sanaewi3\www/../app/WelcomeModule/templates/1‘.
nemam nejmensi tuseni co to po mne chce. Pomuze nekdo?
Editoval odin (22. 11. 2009 12:54)
- odin
- Člen | 50
diky za odpoved, ale nepomuze to – asi jsem to mel napsat co jsem zkousel, takze
v @layout.phtml mam :
<div class='content-container'>
{include #content}
</div>
v Default.phtml
{extends $layout}
{block #content}
{/block}
v Default.default.phtml
{extends "../../templates/Default.phtml"}
{block #content}
Hura
{/block}
a pak v default.list.html
{extends "Default.default.phtml"}
{block #content}
<h2>Result List</h2>
{control maintable}
{/block}
Vzhledem k tomu, ze po tom co jsem tady na foru nasel o slovu zavinac, tak jsem si rekl ze v tom asi nekde bude chyba a dal jsem do @layout.phtml:
<div class='content-container'>
@{control maintable}
</div>
(cimz se doufam eliminuje mnozstvi zadrhelu), nicmene je uplne jedno jestli tam napisu zavinac nebo ne, chova se to identicky.
Editoval odin (22. 11. 2009 12:54)
- ClaryAldringen
- Člen | 5
Zdravím, mám nasledující problém s DataGridem:
Mám DataGrid ve kterém je seznam souborů. Pokud smažu soubor ikonkou ve sloupečku actions, zmizí i z tabulky. Pokud ovšem soubor označím a smažu přes operations, soubor v tabulce zůstane i když se DataGrid AJAXově překreslí. (s vypnutým JS vše funguje normálně).
Zde je továrnička datagridu:
protected function createComponentGrid($name)
{
$id = 0;
$keywords = $_GET['keywords'];
$folders = new Folders($this->userAuthHash);
if($keywords)$files = $folders->getSearchResult($keywords);
$source = new DataSource($files);
$grid = new DataGrid;
$source->getResult();
$grid->bindDataTable($source);
$grid->multiOrder = FALSE;
$grid->addColumn('1', 'Název souboru')
->getHeaderPrototype()->style('width: 500px');
$grid->addColumn('2', 'Datum nahrání')
->getHeaderPrototype()->style('width: 150px');
$grid->addColumn('3', 'Velikost')
->getHeaderPrototype()->style('width: 80px');
$grid->addActionColumn('Action','Možnosti')
->getHeaderPrototype()->style('width: 40px');
$grid->addAction('Smaž', 'fileDelete!', Html::el('span')->class('icon icon-del'), $useAjax = TRUE);
$folders = new Folders();
$slozky = $folders->getFolders();
foreach($slozky as $key=>$folder)
{
if(!$key)$folder = 'Výchozí';
$operations[$key] = 'Přesunout do '.$folder;
}
$operations['delete'] = 'Smazat';
$callback = array($this, 'gridOperationHandler');
$grid->allowOperations($operations, $callback, '0');
error_reporting(0);
$grid['3']->formatCallback[] = 'TemplateHelpers::bytes';
$grid['2']->formatCallback[] = array($this,'date');
$this->addComponent($grid, $name);
}
Zde je handler provádějící oprace:
public function gridOperationHandler(SubmitButton $button)
{
$folders = new Folders($this->userAuthHash);
$form = $button->getParent();
$grid = $this->getComponent('grid');
if ($form->isSubmitted() && $form->isValid())
{
$values = $form->getValues();
if($values['operations'] == 'delete')
{
$files = array();
foreach($values['checker'] as $key=>$file)
{
if($file)array_push($files,$key);
}
$status = $folders->deleteFiles($files);
}
}
$this->getComponent('grid')->invalidateControl();
$grid->invalidateControl();
$this->invalidateControl('grid');
if (!$this->presenter->isAjax())$this->redirect('this');
}
Zde pak handler provádějící akce – ty fungují bez problémů:
public function handleFileDelete($id)
{
$folders = new Folders($this->userAuthHash);
$folders->deleteFiles(array($id));
$this->getComponent('grid')->invalidateControl();
if (!$this->isAjax())$this->redirect('Main:files',array(0,$_GET['keywords']));
}
Šablona aktuálního action:
{include 'folders_div.phtml'}
{control folderManageForm}
{control searchForm}
@{control grid}
A šablona @layout.phtml:
<div id="content">
@{include $content}
</div>
Editoval ClaryAldringen (11. 12. 2009 19:47)