Datagrid + Ajax

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

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)

Ondřej Brejla
Člen | 746
+
0
-

Možná zavináč před widget? Tedy @{control maintable}

odin
Člen | 50
+
0
-

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

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)