Propojení TreeVeiw s DataGrid

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

Všechny Vás zdravím a prosím o radu, pokoušel jsem se hledat ve foru, ale přesnou odpověď jsem nenašel. Jde mi oto, že řeším administraci článků v CMS a na stránce zobrazuji strom menu pomocí TreeView a články zobrazuji pomoci DataGridu. Na úvodní strance se mi zobrazují všechny články seřazené podle posledního vložení. Nevím jak docílím toho, že po kliknutí na odkaz (s číslem kategorie) ve stromu TreeVeiw se mi datagrid překreslí jen na články zařazené v této kategorii.

V presenteru mám:

    public function actionDefault($id = null)
    {
        //
        if(null !== $id) {
            $this->invalidateControl('message');

        }
        $this->template->mode = null === $this->mode ? 1 : $this->mode;
    }

public function renderDefault()
    {
     ????
    }

public function createComponentGrid() {

      $model = new \ClankyModel();

      $grid = new \BaseGrid;
      $grid->bindDataTable( $model->getClanky('clanek') ); // váže DibiDataSource

      if($this->invalidateControl())
      {
      $grid->keyName = handleVyber(invalidateControl($mode)->idnav);
      } else {
      // nastavíme klíč pro akce
      $grid->keyName = 'id'; // Za činnosti či operace
      }
      $grid->itemsPerPage = 30;    // nastavení počtu zobrazení na 30
      $grid->multiOrder = FALSE; // pro řazení použij vždy jen jeden sloupec

      // sloupce pro textové atributy
      $grid->addColumn('idcl', 'ID');
      $grid->addColumn('clnadpis', 'Nadpis článku');
      $grid->addColumn('clpopis', 'Popis článku', 120)->getHeaderPrototype()->style('width: 50%');    // ořež text delší než 120 znaků
     // $grid->addColumn('kat_nazev', 'V kategorii');
      $grid->addColumn('autor', 'Vložil');
      $grid->addDateColumn('clvlozen', 'Vložen', '%d.%m.%Y %H:%M:%S')->addDefaultSorting('desc'); // český formát: '%d.%m.%Y'   a seřadáme

      //přidáme sloupec pro akce
      $grid->addActionColumn('Akce');
      $icon = \Nette\Web\Html::el('span');
      // a naplníme datagrid akcemi pomocí továrničky
      $grid->addAction('Přidat uživatele', 'add', clone $icon->class('icon icon-add'), FALSE, \DataGridAction::WITHOUT_KEY);
      $grid->addAction('Upravit', 'dummy-edit', clone $icon->class('icon icon-edit'));
      $grid->addAction('Odstranit', 'delete', clone $icon->class('icon icon-del'));

      return $grid;
   }

// Componenta pro vykreslení stromu vyběru
    public function createComponentTree()
    {
        $tree = new \TreeView();   // vytvoříme novou instanci třídy TreeView
        $tree->useAjax = true;
        $mode = null === $this->mode ? 1 : $this->mode;
        $session = Environment::getSession();
        $tree->mode = $mode;
        $tree->rememberState = true;
        $tree->addLink('default', 'nazev', 'idnav', true, $this->presenter);
        $tree->dataSource = \SitemapModel::findAll();

        //pomocí renderer formulaře vykreslíme
        // a pomocí wrappere nastavíme, čím se mají jednotlivé prvky obalit
        $tree->renderer->wrappers['link']['collapse'] = 'a class="ui-icon ui-icon-circlesmall-minus" style="float: left"';
        $tree->renderer->wrappers['link']['expand'] = 'a class="ui-icon ui-icon-circlesmall-plus" style="float: left"';
        $tree->renderer->wrappers['node']['icon'] = 'span class="ui-icon ui-icon-document" style="float: left"';

        return $tree;
    }


// handle pro vykreslení ajaksového signalu po kliknuti na odkaz ve stromě
    public function handleVyber($mode)
    {

        // po kliknutí na menu se musí objekt překreslit
        $this->invalidateControl('mode');   // invaliduje snippet 'mode'
        $this['tree']->invalidateControl();  // invaliduje celou komponentu, každý snippet a vklada je do pole

    }

V šabloně Default :

{block #submenu}
    <a href="{link add}">Vytvořit článek</a>
{/block}

{block #content}
<div class="tree">
<h3>Výběrový strom</h3>

{widget tree}
</div>


{snippet message}
{if isset($site)}
    <div class="ui-widget ui-state-highlight ui-corner-all">
        Klikli jste na odkaz "{$site->nazev}" ve stromě menu - ID menu navigace "{$site->idnav}".
    </div>
{/if}
{/snippet}
<div class="datagrid">
<h1>Výpis naposled přidaných článků</h1>


{widget grid}
</div>

Pokoušel jsem se různě propojit nastavením v handleVyber() s komponentou DataGrid, ale neúspěšně, asi jsem to ještě pořádně nepochopil. Životní cyklus chápu, ale mám zatím málo zkušeností. Pokud se to zde již řešilo, tak se omlouvám asi jsem to přehlédl. Děkují za každou radu.

pecina.ondrej
Člen | 7
+
0
-

Asi takhle bych to resil

<?php
public function createComponentGrid() {
  $idnav = $this->getParam('idnav');

  $model = new \ClankyModel();

  $grid = new \BaseGrid;
  $grid->bindDataTable( $model->getClanky('clanek')->where(...$idnav = ...) ); // váže DibiDataSource

?>
Bazylek
Člen | 22
+
0
-

Děkuji, ale problem budu mit asi v handle, nebo šabloně, po kliknutí na strom se nic neděje, jen se mi zobrazí message (nazev kategorie a id), takže budu muset propojit signál zpracovavaný v handle s datagridem. Zřejmě bych měl sippetem obalit {widget grid} aby se mi změny projevovaly.

Bazylek
Člen | 22
+
0
-

Ondřeji děkuji, měl jsi pravdu stačilo využít getParam(). Celkem mi pomohl dump($this[‚tree‘]); který jsem volal pod komponenetou DataGrid abych zhjistil, v jakém parametru TreView předává data (id navigace).

  public function createComponentGrid()
   {
	$this->invalidateControl('tree');
	$idnav = $this->getParam('id');

	$model = new \ClankyModel();
	$grid = new \BaseGrid;

      if(null !== $idnav)
      {
        $grid->keyName = 'idcl'; // Za činnosti či operace
        $where = array('cl.idnav' => $idnav );
        $grid->bindDataTable( $model->getClanky($where)); // váže DibiDataSource
      } else {
        $grid->keyName = 'idcl';
        $where = array('cltyp' => 'clanek');
        $grid->bindDataTable( $model->getClanky($where)); // váže DibiDataSource

      }
	$grid->itemsPerPage = 30;    // ořež text delší než 30 znaků
	$grid->multiOrder = FALSE; // pro řazení použij vždy jen jeden sloupec
...

Vše již šlape.

pecina.ondrej
Člen | 7
+
0
-

np :)