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}




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