EN | CS | Přihlásit | Registrovat

TreeView

Komponenta pre jednoduché vykreslovanie rekurzívnych dát

Verzia 0.6.0a
Demo http://treeview.nettuj.com
Git http://github.com/romcok/treeview
Forum thread http://forum.nette.org/…353-treeview
Licencia New BSD License
Autor Roman Novák

Toto je návod pre verziu 0.5.2 a nižšie. Vo verzii 0.6.0 je ukážka zahrnutá spolu s komponentou v git repozitári na github.com

Príklad použitia na frontende v stránkach:

Routovanie

// routes.php, alebo bootstrap.php
Route::$styles['path'] = array(
Route::PATTERN => '.*?',
);

$router[] = new Route('<lang [a-z]{2}>/pages/<path .+?>', array(
'presenter' => 'Pages',
'view' => 'default',
'path' => null
));

Presenter

<?php

class PagesPresenter extends BasePresenter
{
function beforeRender()
{
parent::beforeRender();

$tree = new TreeView($this, 'tree');
$tree->setRowLink('default', 'url'); // nastavíme si link ktorý bude smerovať na default akciu presenteru a ako parameter mať url z databázy

$treeColumns = array(
'id',
'title',
'url',
'parentId'
);

$tree->column = $treeColumns[1]; // ako text linku sa použije title z databázy

$ds = $this->model->getAll(); // vráti datasource
$ds->select($treeColumns); // nastavíme ktoré stĺpce chceme selektnúť
$ds->where('active=1'); // chceme zobraziť len aktívne stránky

$tree->dataSource = $ds; // predáme datasource controlu
$this->template->tree = $tree;
}

// táto akcia nám zobrazí požadovanú stránku
function renderDefault($path)
{
if(!empty($path)) {
$page = $this->model->getPageByPath($path); // vráti stránku podla url
}
else {
$page = $this->model->getFirstPage(); // vráti prvú stránku v zozname
}

$this->template->page = $page;
}
}

Template

<table>
<tr>
<td>
{$tree->render()}
</td>
{if !empty($page)}
<td valign="top">
<h1>{$page['title']}</h1>
{$page['content']}
</td>
{/if}
</tr>
</table>

Príklad použitia v administrácii:

Presenter

<?php
/**
* Admin - Pages
*/

class Admin_PagesPresenter extends Admin_BasePresenter
{

/********************* actions *********************/

/**
* Default
*/

function actionDefault()
{
// TreeView
$tree = $this->getComponent('tree');

$treeColumns = array(
'id',
'title',
'parentId');

$tree->column = $treeColumns[1];

$ds = $this->model->getAll();
$ds->select($treeColumns);
$tree->dataSource = $ds;

if($this->model->isAllowed('read'))
$tree->setRowLink('detail', 'id', true, false); // detail akcia, parameter je id z databázy, link používa ajax, vypnutie vnorenej adresy (pre id ju nepotrebujeme)

$this->template->tree = $tree;
$this->template->add = $this->model->isAllowed('write');
}

/********************* components *********************/

protected function createComponent($name)
{
switch($name) {
default:
parent::createComponent($name);
break;
case 'tree':
$this->createTree();
break;
}
}

/********************* tree *********************/

function createTree()
{
// TreeView
$tree = new TreeView($this->presenter, 'tree');
$tree->onLinkRender[] = array($this, 'tree_linkRender'); // zaregistrujeme si event, ktorý sa zavolá pri renderovaní linku
}

// chceme zobraziť celý zoznam, ale linky len k vlastným záznamom
// prvý parameter je referencia na control, druhý na riadok z databázy a tretí na bool parameter či sa má link vyrenderovať, alebo zobraziť len text
function tree_linkRender(TreeView $sender, $row, $render)
{
if($this->model->isAllowed('owner')) { // ak je má skupina právo pristupovať len k svojim údajom
if($this->model->user->identity->id !== $row->userId) { // zistíme či záznam patrí užívatelovi
$render = false; // ak patrí zakážeme renderovanie linku na riadok
}
}
}

Template

@{if isset($tree)}
@{$tree->render()}
@{/if}
{if isset($add) && $add}
<a href="{link add}" onclick="{$control->ajaxLink(null)}" class="button">
<span>Pridať stránku</span>
</a>
{/if}

Komentáře Comments feed

Roman Ožana | 18. 6. 2010, 10:01 | bug

nefunguje download zipu

Matúš Matula | 15. 8. 2010, 23:22 | bug

nefunkcne demo – Parse Error

Login to submit a comment