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)