TreeView

#1 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

TreeView

Presunuté do Nette/Extras/TreeView

Na žiadosť toma tu hádžem svoj TreeView control, ktorý využívam na vykreslovanie zoznamu rekurzívnych dát.

TreeView v0.5.2 – Download

TreeView v0.5.1 – Download

TreeView v0.4 – Download

Najlepšie si to vysvetlíme v praxi

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

Routovanie

<?php
// 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}

Možno sa to niekomu zíde.

enjoy !!! ;)

Editoval Jod (5. 8. 2009 10:51)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#2 před 3 lety

Blonďák
Nový člen
Registrovaný: 27. 2. 2009
Příspěvky: 3

Re: TreeView

Taky přihodím svou trošku do mlýna. Vytvořil jsem dvě komponenty TreeView a ExpandableTreeView, které jsou ke stažení zde TreeView.tgz použití ve podle mě celkem jednoduché. Přibalil jsem tam i CSS na formátování, které může třeba někomu posloužit.

Je to moje první komponenta (ne jenom pro Nette), tak prosím buďte případně shovívaví.

PS: Nevíte, proč nejde udělat něco jako toto?

<?php
class a {
        private $_test;

        function Test($_test = $this->_test){
                return $this->_test = $_test;
        }
}
?>

Model

<?php
abstract class EshopObject extends Object {
        protected $lineData = NULL;
        private $dbMap = NULL;
        protected $changedData  = array();

        abstract protected function getDBMap();
        abstract protected function fetchData();

        protected function _getData($key){
                $this->fetchData();
                if (!(is_array ($this->lineData) || is_object($this->lineData)))
                        return NULL;
                if (!array_key_exists($key,$this->lineData))
                        return NULL;
                return $this->lineData[$key];
        }

        protected function _setData($key, array $args){
                $this->changedData[$key] = $args[0];
        }

        public function SaveData(){
                throw new FatalErrorException("Method SaveData need to be defined.");
        }

        public function DeleteData(){
                throw new FatalErrorException("Method DeleteData need to be defined.");
        }

        public function __call($name,$args){
                $class = get_class($this);
                if ($name === '')
                        throw new /*\*/MemberAccessException("Call to class '$class' method without name.");
                if ($this->dbMap == NULL)
                        $this->dbMap = $this->getDBMap();
                if (preg_match('/^get([a-zA-Z]+)/',$name,$res))
                        if (array_key_exists($res[1],$this->dbMap))
                                return $this->_getData($this->dbMap[$res[1]]);
                if (preg_match('/^set([a-zA-Z]+)/',$name,$res))
                        if (array_key_exists($res[1],$this->dbMap))
                                return $this->_setData($this->dbMap[$res[1]],$args);
                throw new MemberAccessException("Call to undefined method $class::$name().");
        }
}


class EshopCategory extends EshopObject implements ITreeViewNode, IExpandableTreeViewNode{
        /** @var int */
        private $_categoryId;

        /** @var array*/
        private $_childNodes = NULL;

        function __construct($ctg = 1){
                $this->_categoryId = $ctg;
        }

        public function getCategoryId(){
                return $this->_categoryId;
        }

        protected function getDBMap(){
                return array(
                        'CategoryCaption' => 'c_category_caption',
                );
        }

        public function hasChildNodes(){
                $this->fetchData();
                return ($this->lineData['c_category_lft']+1) != $this->lineData['c_category_rgt'];
        }

        public function getChildNodes(){
                if ($this->_childNodes === NULL){
                        $rows = dibi::select('c_category_id')->from('[c_category]')->where('[c_category_parent_id]=%i',$this->_categoryId)->orderBy('c_category_prio')->fetchAll();
                        $this->_childNodes = array();
                        foreach($rows as $row)
                                $this->_childNodes[] = new EshopCategory($row['c_category_id']);
                }
                return $this->_childNodes;
        }

        public function getNodeId(){
                return $this->_categoryId;
        }

        public function getNodeCaption(){
                return $this->getCategoryCaption();
        }

        protected  function fetchData(){
                if ($this->lineData != NULL)
                        return;
                $this->lineData = dibi::select('*')->from('[c_category]')->where('[c_category_id]=%i ',$this->_categoryId)->fetch();
        }
}
?>

Presenter

<?php
class CategoriesPresenter extends EshopPresenter
{
        public function renderDefault($id){
                $CategoriesTree = $this->getComponent("ctv");
                $this->template->CategoriesTree = $CategoriesTree;
        }

        public function renderNode($node){
                // zde můžete dělat co chcete, třeba udělat link, ...
                echo htmlSpecialChars($node->getNodeCaption());
        }

        protected function createComponent($name){
                switch($name){
                        case "ctv":
                                $CategoriesTree = new ExpandableTreeView($this, $name);
                                $CategoriesTree->treeViewNode($this->eshop->getEshopCategories());
                                $CategoriesTree->onRenderNode[] = array($this,'renderNode');
                                $CategoriesTree->expandNode();
                                return;
                        default :
                                parent::createComponent($name);
                }
        }
}
?>

Template

<?php
@{$TreeView->render()}
?>

 

#3 před 3 lety

Blonďák
Nový člen
Registrovaný: 27. 2. 2009
Příspěvky: 3

Re: TreeView

Tak jsem ještě trochu poladil tuto komponentu, verze 1.0.1 je přidána vlastnost hideRootNode, která skryje kořenový node + úprava CSS. Vyrenderovaná komponenta může vypadat např takto 

 

#4 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: TreeView

Nechcete to dát na http://addons.nette.org/cs

 

#5 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#6 před 3 lety

tom
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 77

Re: TreeView

Blonďák napsal(a):

$CategoriesTree->treeViewNode($this->eshop->getEshopCategories());

mohl bys jeste prosim popsat metodu getEshopCategories()? diky

 

#7 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Tipujem, že to bude pole z dibi->fetchAll() :)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#8 před 3 lety

Z0MBie
Člen
Registrovaný: 22. 7. 2008
Příspěvky: 24

Re: TreeView

Zdravím,
na návodu k modulu TreeView je mi nejasná jedna věc.
V Presenter části je na jednom řádku kód: $ds = $this->model->getAll(); // vráti datasource. Co ale nevím je, co znamená $this->model->getAll();. Vím, že to má být nějaký objekt DataSource z Dibi, ale jak ho zavolám? Respektive, co přesně mám napsat? $this->db->něconěconěco()->toDataSource()?

 

#9 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: TreeView

Musíš si sám naimplementovat metodu, která ti DibiDataSource s daty vrátí.

 

#10 před 3 lety

Z0MBie
Člen
Registrovaný: 22. 7. 2008
Příspěvky: 24

Re: TreeView

Dobře, takže mám
$ds = $this->model->getTextyData(); // vráti datasource
V Modelu mám

public function getTextyData()
{
return $this->db->dataSource(‚SELECT * FROM [texty]‘);
 }

A dostávám error: Call to a member function getResult() on a non-object
A report od Laděnky ..
Předávám špatný kód, nebo je chyba někde v Tree?

 

#11 před 3 lety

jasir
Nette guru
Registrovaný: 4. 12. 2008
Příspěvky: 768

Re: TreeView

Nedokážu určit co děláš špatně, ale ta hláška jasně říká ‚non-object‘. Máš tam tohle?

<?php
$tree->dataSource = $ds; // predáme datasource controlu
?>

Editoval jasir (31. 7. 2009 15:41)

 

#12 před 3 lety

Z0MBie
Člen
Registrovaný: 22. 7. 2008
Příspěvky: 24

Re: TreeView

Bože já jsem trotl… Díky, tohle už funguje.
Teď pro změnu řeším PresenterComponent::ajaxLink() is deprecated., což jde naštěstí potlačit přes $tree->useAjax = false;

 

#13 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Sry, toto je v novšej verzii vyriešené, plus Tree pracuje aj s poliami a ďalšie vylepšenia.
Večer to hádam updatnem, netušil som, že to niekto aj používa :D

:))


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#14 před 3 lety

Z0MBie
Člen
Registrovaný: 22. 7. 2008
Příspěvky: 24

Re: TreeView

Už se na tu novou verzi těším :-). useAjax jsem nakonec musel zabít přímo uvnitř třídy, která teď pro změnu háže notice o Notice: Undefined index: id. Evidentně to počítá, že moje tabulka má ve struktuře sloupec ID, což se šeredně spletlo… (používám místo toho menu_order)… :D

 

#15 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Sry, nejak som sa pozabudol :))) . Tu je nová verzia 0.5.1 . Môj komentár hovorí, že je spätne nekompatibilná, ale teraz neviem, lebo som robil prasárny a keď som to vracal asi som to zabudol dať preč.

Primary key teraz zmeníš pomocou $tree->primaryKey = ‚menu_order‘;

Keby nešlo krič ,)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#16 před 3 lety

Z0MBie
Člen
Registrovaný: 22. 7. 2008
Příspěvky: 24

Re: TreeView

No.. Já jsem si nakonec po dnu čekání zbastlil svojí verzi. Sice nefunguje rekurzivně, ale jen do druhé úrovně, ale to mi nakonec stačí. Ale časem se na tohle ještě určitě mrknu, díky. :)

 

#17 před 3 lety

siM.s
Nový člen
Registrovaný: 25. 9. 2009
Příspěvky: 7

Re: TreeView

Zdarec,
tak se konecne do Nette pomalu dostavam a zacinam tvorit vlastni veci. Nicmene…TreeMenu je vec, kterou ted potrebuju, ale nejsem schopny to rozchodit. Je nekde ke stazeni hotove funkcni reseni, abych se podival co delam spatne?

Moc by mi to pomohlo. Diky.

EDIT: tak se mi to nakonec povedlo rozchodit, ale hazi mi to hodnekrat Warning: Warning: Call-time pass-by-reference has been deprecated in TreeView.php on line 184 a dalsi lajny.

Editoval siM.s (25. 9. 2009 19:19)

 

#18 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Bude to pravdepodobne novou verziou nette. Cez výkend upnem novú verziu, lebo s ním teraz tiež robím.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#19 před 3 lety

siM.s
Nový člen
Registrovaný: 25. 9. 2009
Příspěvky: 7

Re: TreeView

nejaky progress?

 

#20 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

sorry trochu nestíham teraz doma niečo robiť :(


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#21 před 2 lety

despiq
Nette guru
Registrovaný: 24. 11. 2009
Příspěvky: 354

Re: TreeView

doporucuju k teto komponente pouzit jstree pro editaci viceurovnoveho stromu, tak kdyby nekdo hledal na netu nejake hotove veci tak je to nejpouzitelnejsi protoze jquery.ui sortable neni viceurovnove

 

#22 před 2 lety

iguana007
Nette guru
Registrovaný: 3. 11. 2009
Příspěvky: 485

Re: TreeView

jak pls udelam v tom treeView ajaxovy odkaz na Presenter Article a akci listArticles ? Tj. po kliknuti bych chtel v DIVu s id #top zobrazit vystup teto akce.
Tree renderuju v modulu Admin, ,presenteru Dashboard a akzi default… nedari se mi dokazat prave na jiny presenter v modulu Admin…

Uz tu nad tim sedim 5 hodin a porad mi to nefunguje :(((

Diky moc za kazdou radu …

igi

Editoval iguana007 (6. 1. 2010 15:59)


Omne Principium Grave

 

#23 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Toto ti nefunguje?

<?php
$tree->setRowLink('Article:listArticles', 'id', true);
?>

Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#24 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Tak som sa k tomu dostal a tu je ukážka nového TreeView: http://treeview.romcok.eu/

Je celý prepísaný, takže nebude pravdaže spätne kompatibilný.

Niektoré zmeny a vylepšenia:

  • rozklikávací strom
  • ajaxové rozklikávanie (pravdaže ide aj bez neho)
  • každý uzol je samostatná komponenta
  • pamätá si svoj stav aj po refreshi
  • renderovanie cez renderer a tým aj možnosť napísať si vlastný
  • štýlovanie cez wrappery
  • odstránené warningy, ktoré sa zobrazovali v php5.3

Ak niekoho napadá čo by mu nemalo chýbať, šup sem (checkboxy mám už naplánovane).

Ešte doťahujem API, potom to hodím na github.

Editoval Jod (11. 1. 2010 10:57)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#25 před 2 lety

iguana007
Nette guru
Registrovaný: 3. 11. 2009
Příspěvky: 485

Re: TreeView

Kdyby někdo využíval této komponenty, vkládám zde upravený template, který řeší bug že se defaultně nevykreslují všechny root položky stromu, ale pouze první + generuje XHTML validní strom kompatibilní s jsTree.

Ještě poznámka – v db tabulce nepoužívám pro root položku NULL ale 0.

(pro verzi TreeView 0.5.2)

<div class="tree-in">
<ul class="treeRows">
    {block #tree}
    {if isset($fixParentIndex)}
                    <ul class="treeRows">
    {/if}
        {foreach $rows as $index => $row}
                {if !isset($parentIndex) && empty($row[ $control->parentColumn ]) ||
                        isset($parentIndex) && $rows[ $parentIndex ][$primaryKey] == $row[ $control->parentColumn ]}
                {if $control->rowRender(&$row)}
                    {if $row['parentId']==0}
                    <li class="treeRow">
                    {else}
                    <ul class="treeRows"><li class="treeRow">
                    {/if}

                                {if $renderLink = $control->linkRender(&$row)}
                                <a href="{$row|url}"{if $rowLink['useAjax']} class="{$control->ajaxClass}"{/if}>
                                {/if}
                                {?$name = $row[ $control->column ]}
                                {if $control->nameRender(&$name, &$row)}
                                {$name}
                                {/if}
                                {if $renderLink}
                                </a>
                                {/if}
                                {if !empty($actions)}
                                <div style="position: relative;z-index:9999;display:inline">
                                    <img src="{$basePath}/images/tree-sipka.gif" alt="Ikona submenu" class="akceImg" />
                                    <div class="akce-in">
                                            <div class="context-menu">
                                                {foreach $actions as $action}
                                                    {if $control->actionRender(&$action, &$row)}
                                                    <a href="{plink $action['destination'], $row[ $action['columnKey'] ]}"{if $action['useAjax']} class="{$control->ajaxClass}"{/if}>
                                                        <img src="{$basePath}/images/ico-akce.gif" alt="Ikona akce" /> {$action['name']}
                                                    </a>
                                                    {/if}
                                                {/foreach}
                                            </div>
                                    </div>
                                </div>
                                {/if}
                        {?$fixParentIndex = $parentIndex}
                        {include #tree, 'parentIndex' => $index}
                        {if isset($fixParentIndex)}
                                {?$parentIndex = $fixParentIndex}
                                {?unset($fixParentIndex)}
                        </li></ul>
                        {else}
                    </li>
                        {/if}
                {/if}
                {/if}
        {/foreach}
    {if isset($fixParentIndex)}
                    </ul>
    {/if}
        {/block}
</ul>
</div>

Díky za pomoc JODovi při řešení bugu z root prvky stromu ;)

igi

Editoval iguana007 (15. 1. 2010 11:40)


Omne Principium Grave

 

#26 před 2 lety

crempa
Nette guru
Registrovaný: 21. 8. 2008
Příspěvky: 208

Re: TreeView

Jod napsal(a):

Tak som sa k tomu dostal a tu je ukážka nového TreeView: http://treeview.romcok.eu/

Zdar, uz je to nekde ke stazeni? V doplncich je zda se stale ten z leta…

Diky !

 

#27 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Mal som problém s klonovaním dibi fluent objektu. David to turborýchlo opravil, takže dneska hádam.

Ale zatiaľ to bude bez optimalizácie sql dotazov a trošku neupravené.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#28 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

TreeView 0.6a: http://github.com/…tte-treeview

Kód je zatiaľ provizórny, teraz potrebujem riešiť iné veci.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#29 před 2 lety

crempa
Nette guru
Registrovaný: 21. 8. 2008
Příspěvky: 208

Re: TreeView

diky, mrknu na to

 

#30 před 2 lety

iguana007
Nette guru
Registrovaný: 3. 11. 2009
Příspěvky: 485

Re: TreeView

Možná bych ještě doplnil, že tento addon vyžaduje zapnutí direktivy v php.ini:

allow_call_time_pass_reference 1

Jinak php vrací hromadu warningu …


Omne Principium Grave

 

#31 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Posledná verzia to už nerobí.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#32 před 2 lety

suxik
Člen
Registrovaný: 2. 2. 2010
Příspěvky: 62

Re: TreeView

v IE 8 nefunguje expand collapsnutych uzlu, nebo mam neco spatne nastavene? (ikonka [+] je neklikatelna)

 

#33 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Pozrem, keď budem púštať widle, ešte som sa nepreliečil z poslednej traumy :) .

Používam to s jTree a to mi v ie funguje.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#34 před 2 lety

ZETCHA
Člen
Registrovaný: 6. 1. 2010
Příspěvky: 62

Re: TreeView

Hledám kde určím hloubku rozbalení a jaká část stromu má být rozbalena po kliknutí na odkaz.
Hledám blbě nebo si to musím dodělat?


ZETCHA

Kdo to je Generál Failure a proč čte sakra zrovna můj disk?!

 

#35 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Malo by to fungovať nejak takto: $tree[‚id1‘][‚id2‘][‚id3‘]->expand(), ale s tým asi vela neporiešiš.
Pridám nejaké callbacky, stačí napísať. Uvidím ako budem stíhať.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#36 před 2 lety

tom
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 77

Re: TreeView

Da se nejak udelat aby po klikuti se adresa te zakliknute polozky zobrazila v URL? → aby kazda jednotliva stranka mela svou adresu, diky

 

#37 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Myslíš bez ajaxu?

http://github.com/…TreeView.php#L102

$useAjax = false


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#38 před 2 lety

tom
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 77

Re: TreeView

aha, pomohlo mi az kdyz jsem vyhodil

<script type="text/javascript">
    $("a.ajax").live("click", function (event) {
        event.preventDefault();
        $.get(this.href);
    });
</script>

dik za nakopnuti :-)

 

#39 před 2 lety

tom
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 77

Re: TreeView

da se nekde nastavit aby defaultne se zobrazily jen koreny stromu a az jakmile uzivatel klikne, tak se zacne rozbalovat? ted mam pocit ze defaultne se rozbali vse … dik

 

#40 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

http://treeview.romcok.eu/

Je to Ajax mód, ale myslím, že sa mi tam niečo dokazilo, lebo by sa nemal prekreslovať celý strom, ale len vetva.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#41 před 2 lety

tom
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 77

Re: TreeView

Čau,
když se v souboru TreeViewNode.php na řádku 100 dá $node->collapse(); místo $node->expand(); tak se strom nejdříve zobrazí sbalený.

 

#42 před 2 lety

ibru
Nový člen
Registrovaný: 21. 1. 2010
Příspěvky: 9

Re: TreeView

Ahoj, zda se mi, ze to nebere v uvahu, ze atributy data sourcu muzou byt i jine, nez id a parentId. Podle nasledujiciho kodu:

<?php
// TreeViewNode.php line: 93
if((empty($this->dataRow) && empty($dataRow->parentId)) || (!empty($this->dataRow) && $this->dataRow->id === $dataRow->parentId)) {
?>

Takhle uz je to lepší ;)

<?php
// TreeViewNode.php line: 93 - better way
if((empty($this->dataRow) && empty($dataRow[$this->treeView->parentColumn])) || (!empty($this->dataRow) && $this->dataRow[$this->treeView->primaryKey] === $dataRow[$this->treeView->parentColumn])) {
?>

Nebo jsem tam nekde neco zazdil?

Ale co jsem se chtel hlavne zeptat:
mam kategorie receptu, ke kazde kategorii i pocet receptu, a chtel bych vykreslit seznam kategorii tak, ze za titulek kategorie se pripise do zavorky i pocet receptu. A zaroven, kategorie, kde nebudou zadne recepty by se nevyrenderovaly jako odkaz, ale obycejny span nebo neco takoveho.

Takze bych chtel nejak ovlivnit ten vypis pomoci callbacku nejspise.
Hadam, ze by k tomu mohla slouzit promenna $onNodeRender, ale jak to pozit jsem nerozlustil, a dokumentace veskera zadna.

Prosim tedy o radu, diky.

 

#43 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Toto som opravoval, asi ma už ani git nepočúva :-/

Na callbackoch som zatiaľ vela nepracoval, len koľko som potreboval.
Keď sa pozreš sem: http://github.com/…Renderer.php#L109

Tak zápis callbacku bude takýto:

<?php
        $tree->onNodeRender[] = array('nodeRender');

        function nodeRender(TreeView $tree, TreeViewNode $node, Html $container) {
                $row = $node->dataRow; // data zo selectu
        }
?>

Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#44 před 2 lety

ibru
Nový člen
Registrovaný: 21. 1. 2010
Příspěvky: 9

Re: TreeView

Tak jo, nebylo to zase tak tezke :) Hodne pomohl var_dump. Moje reseni, kdyby nekdo potreboval inspiraci:

<?php
$tree->onNodeRender[] = function (TreeView $tree, TreeViewNode $node, Html $nodeContainer) {

    $recipeCount = $node->dataRow->recipeCount;
    $title = $node->dataRow->title . " ($recipeCount)";

    $emptyCategoryHtml = Html::el('span')->setText($title);
    $indexToReplace = count($nodeContainer->getChildren()) - 1;

    if ($recipeCount == '0') {
        //replace existing Html object with completely new object
        $nodeContainer->insert($indexToReplace, $emptyCategoryHtml, true);
    }
    else {
        //change only title of existing Html object
        $children = $nodeContainer->getChildren();
        $nonEmptyCategoryHtml = $children[$indexToReplace];
        $nonEmptyCategoryHtml->setText($title);
        $nodeContainer->insert($indexToReplace, $nonEmptyCategoryHtml, true);
    }
};
?>

 

#45 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Som rád :) (že nemusím pridávať ďalšie callbacky xDDD)
Neni čas, človek furt maká :-/
Keby bol problém niekde, kludne mi píšte na IM, hockde.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#46 před 2 lety

ibru
Nový člen
Registrovaný: 21. 1. 2010
Příspěvky: 9

Re: TreeView

Jeste jedna vec. Jak nastavim, aby se treeview zobrazil automaticky jako colapsed?
Je tam sice property mode, ale pokud ji nastavim na hodnotu 1, je to expanded, a pokud na jakoukoliv jinou hodnotu (zkousel jsem 0, 2, 3, 4) tak se treeview nevykresli vubec.
Diky.

 

#47 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Mode môže byť len ajax a expanded .

Node má metódu collapse , môžeš skúsiť tú.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#48 před 2 lety

hrtlik
Nový člen
Registrovaný: 25. 4. 2010
Příspěvky: 8

Re: TreeView

Rozbaluje se mi to jen do třetí úrovně, pak se to celé sbalí do rootu, stává se to ještě někomu? Ale pokud mám rememberState==TRUE, tak to funguje…

Editoval hrtlik (16. 7. 2010 20:25)

 

#49 před 2 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: TreeView

Ano, včera sme tú chybu našli, už natom pracujem, zatiaľ prosimťa používaj zapnuté ukladanie do session.


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#50 před 2 lety

tom
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 77

Re: TreeView

Neporadil by mi nekdo jakym zpusobem si udelat vlastni render tohoto stromu? Jakym zpusobem si treba zmenim ty +/- ikony atd? Vidim, ze je to tam v jQuery UI, ale nedari se mi to zmenit. Diky

 
Stránky: 1 2 Next

RSS feed RSS tématu

Zápatí