Added support for NULL fields in the database
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_treeview.php
index 2220325..ca11272 100755 (executable)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *  
-*  (c) 1999-2002 Kasper Skaarhoj (kasper@typo3.com)
+*  (c) 1999-2004 Kasper Skaarhoj (kasper@typo3.com)
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is 
  *
  *
  *
- *  104: class t3lib_treeView 
- *  239:     function init($clause='') 
- *  256:     function reset()  
- *  269:     function getBrowsableTree()       
- *  328:     function printTree($treeArr='')   
- *  370:     function PMicon($row,$a,$c,$nextCount,$exp)       
- *  392:     function PM_ATagWrap($icon,$cmd,$bMark='')        
- *  409:     function wrapTitle($title,$row)   
- *  422:     function wrapIcon($icon,$row)     
- *  443:     function addTagAttributes($icon,$attr)    
- *  455:     function wrapStop($str,$row)      
- *  469:     function getCount($uid)   
- *  491:     function addField($field,$noCheck=0)      
- *  507:     function expandNext($id)  
- *  517:     function initializePositionSaving()       
- *  544:     function savePosition()   
+ *  115: class t3lib_treeView 
+ *  267:     function init($clause='', $orderByFields='')      
+ *  294:     function setTreeName($treeName='') 
+ *  308:     function addField($field,$noCheck=0)      
+ *  322:     function reset()  
+ *
+ *              SECTION: output
+ *  346:     function getBrowsableTree()       
+ *  405:     function printTree($treeArr='')   
+ *
+ *              SECTION: rendering parts
+ *  458:     function PMicon($row,$a,$c,$nextCount,$exp)       
+ *  480:     function PM_ATagWrap($icon,$cmd,$bMark='')        
+ *  502:     function wrapTitle($title,$row,$bank=0)   
+ *  515:     function wrapIcon($icon,$row)     
+ *  526:     function addTagAttributes($icon,$attr)    
+ *  538:     function wrapStop($str,$row)      
+ *
+ *              SECTION: tree handling
+ *  566:     function expandNext($id)  
+ *  576:     function initializePositionSaving()       
+ *  603:     function savePosition()   
  *
  *              SECTION: Functions that might be overwritten by extended classes
- *  573:     function getRootRecord($uid) 
- *  583:     function getRootIcon($rec) 
- *  595:     function getRecord($uid) 
- *  609:     function getId($row) 
- *  619:     function getJumpToParm($row) 
- *  630:     function getIcon($row) 
- *  648:     function getTitleStr($row,$titleLen=30)   
- *  660:     function getTitleAttrib($row) 
+ *  632:     function getRootIcon($rec) 
+ *  645:     function getIcon($row) 
+ *  664:     function getTitleStr($row,$titleLen=30)   
+ *  676:     function getTitleAttrib($row) 
+ *  686:     function getId($row) 
+ *  696:     function getJumpToParm($row) 
+ *
+ *              SECTION: tree data buidling
+ *  729:     function getTree($uid, $depth=999, $depthData='',$blankLineCode='')       
  *
  *              SECTION: Data handling
- *  693:     function getTree($uid, $depth=999, $depthData='',$blankLineCode='')       
- *  771:     function getDataInit($parentId) 
- *  800:     function getDataCount($res) 
- *  817:     function getDataNext($res)
- *  842:     function getDataFree($res)
- *  862:     function setDataFromArray(&$dataArr,$traverse=FALSE,$pid=0)       
+ *  826:     function getCount($uid)   
+ *  853:     function getRootRecord($uid) 
+ *  866:     function getRecord($uid) 
+ *  883:     function getDataInit($parentId) 
+ *  913:     function getDataCount(&$res) 
+ *  930:     function getDataNext(&$res)
+ *  958:     function getDataFree(&$res)
+ *  978:     function setDataFromArray(&$dataArr,$traverse=FALSE,$pid=0)       
+ * 1011:     function setDataFromTreeArray(&$treeArr, &$treeLookupArr) 
  *
- * TOTAL FUNCTIONS: 29
+ * TOTAL FUNCTIONS: 31
  * (This index is automatically created/updated by the extension "extdeveval")
  *
  */
@@ -92,9 +102,10 @@ require_once (PATH_t3lib.'class.t3lib_iconworks.php');
 require_once (PATH_t3lib.'class.t3lib_befunc.php');
 require_once (PATH_t3lib.'class.t3lib_div.php');
 
+
 /**
  * Base class for creating a browsable array/page/folder tree in HTML
- * 
+ *
  * @author     Kasper Skaarhoj <kasper@typo3.com>
  * @coauthor   RenĂ© Fritz <r.fritz@colorcube.de>
  * @package TYPO3
@@ -125,13 +136,7 @@ class t3lib_treeView {
         */
        var $MOUNTS='';
 
-       /**
-        * A prefix for table cell id's which will be wrapped around an item.
-        * Can be used for highlighting by JavaScript.
-        * Needs to be unique if multiple pages are on one HTML page.
-        * @see printTree()
-        */
-       var $domIdPrefix = 'row';
+
 
        /**
         * Database table to get the tree data from.
@@ -145,6 +150,34 @@ class t3lib_treeView {
        var $parentField='pid';
 
        /**
+        * WHERE clause used for selecting records for the tree. Is set by function init.
+        * Only makes sense when $this->table is set.
+        * @see init()
+        */
+       var $clause='';
+
+       /**
+        * Field for ORDER BY. Is set by function init.
+        * Only makes sense when $this->table is set.
+        * @see init()
+        */
+       var $orderByFields='';
+
+       /**
+        * Default set of fields selected from the tree table.
+        * Make SURE that these fields names listed herein are actually possible to select from $this->table (if that variable is set to a TCA table name)
+        * @see addField()
+        */
+       var $fieldArray = Array('uid','title');
+
+       /**
+        * List of other fields which are ALLOWED to set (here, based on the "pages" table!)
+        * @see addField()
+        */
+       var $defaultList = 'uid,pid,tstamp,sorting,deleted,perms_userid,perms_groupid,perms_user,perms_group,perms_everybody,crdate,cruser_id';
+
+
+       /**
         * Unique name for the tree.
         * Used as key for storing the tree into the BE users settings.
         * Used as key to pass parameters in links.
@@ -154,20 +187,28 @@ class t3lib_treeView {
        var $treeName = '';
 
        /**
-        * Icon file name for item icons.
+        * A prefix for table cell id's which will be wrapped around an item.
+        * Can be used for highlighting by JavaScript.
+        * Needs to be unique if multiple trees are on one HTML page.
+        * @see printTree()
         */
-       var $iconName = 'default.gif';
+       var $domIdPrefix = 'row';
+
+       /**
+        * Back path for icons
+        */
+       var $backPath;
 
        /**
         * Icon file path.
         */
        var $iconPath = '';
 
+
        /**
-        * Back path for icons
+        * Icon file name for item icons.
         */
-       var $backPath;
-
+       var $iconName = 'default.gif';
 
        /**
         * If true, HTML code is also accumulated in ->tree array during rendering of the tree.
@@ -180,24 +221,10 @@ class t3lib_treeView {
        var $setRecs = 0;
 
        /**
-        * WHERE clause used for selecting records for the tree. Is set by function init.
-        * Only makes sense when $this->table is set.
-        * @see init()
+        * Sets the associative array key which identifies a new sublevel if arrays are used for trees.
+        * This value has formerly been "subLevel" and "--sublevel--"
         */
-       var $clause=' AND NOT deleted';
-
-       /**
-        * Default set of fields selected from the tree table.
-        * Make SURE that these fields names listed herein are actually possible to select from $this->table (if that variable is set to a TCA table name)
-        * @see addField()
-        */
-       var $fieldArray = Array('uid','title');
-
-       /**
-        * List of other fields which are ALLOWED to set (here, based on the "pages" table!)
-        * @see addField()
-        */
-       var $defaultList = 'uid,pid,tstamp,sorting,deleted,perms_userid,perms_groupid,perms_user,perms_group,perms_everybody,crdate,cruser_id';
+       var $subLevelID = '_SUB_LEVEL'; 
 
 
 
@@ -214,8 +241,8 @@ class t3lib_treeView {
        var $specUIDmap=array();                // Special UIDs for folders (integer-hashes of paths)
 
                // For arrays:
-       var $data = array();                    // Holds the input data array 
-       var $dataLookup = array();              // Holds an index with references to the data array.
+       var $data = false;                              // Holds the input data array
+       var $dataLookup = false;                // Holds an index with references to the data array.
 
                // For both types
        var $tree = Array();                    // Tree is accumulated in this variable
@@ -232,38 +259,88 @@ class t3lib_treeView {
        /**
         * Initialize the tree class. Needs to be overwritten
         * Will set ->fieldsArray, ->backPath and ->clause
-        * 
-        * @param       string          record select clause
-        * @return      void            
+        *
+        * @param       string          record WHERE clause
+        * @param       string          record ORDER BY field
+        * @return      void
         */
-       function init($clause='')       {
+       function init($clause='', $orderByFields='')    {
                $this->BE_USER = $GLOBALS['BE_USER'];   // Setting BE_USER by default
                $this->titleAttrib = 'title';   // Setting title attribute to use.
                $this->backPath = $GLOBALS['BACK_PATH'];        // Setting backpath.
 
-               $this->clause = $clause ? $clause : $this->clause;      // Setting clause
+               if ($clause)    $this->clause = $clause;        // Setting clause
+               if ($orderByFields)     $this->orderByFields = $orderByFields;
 
                if (!is_array($this->MOUNTS))   {
                        $this->MOUNTS = array(0 => 0); // dummy
                }
+
+               $this->setTreeName();
+
+               if($this->table) {
+                       t3lib_div::loadTCA($this->table);
+               }
        }
 
+
+       /**
+        * Sets the tree name which is used to identify the tree
+        * Used for JavaScript and other things
+        *
+        * @param       string          Default is the table name. Underscores are stripped.
+        * @return      void
+        */
+       function setTreeName($treeName='') {
+               $this->treeName = $treeName ? $treeName : $this->treeName;
+               $this->treeName = $this->treeName ? $this->treeName : $this->table;
+               $this->treeName = str_replace('_','',$this->treeName);
+       }
+
+
+       /**
+        * Adds a fieldname to the internal array ->fieldArray
+        *
+        * @param       string          Field name to
+        * @param       boolean         If set, the fieldname will be set no matter what. Otherwise the field name must either be found as key in $TCA[$table]['columns'] or in the list ->defaultList
+        * @return      void
+        */
+       function addField($field,$noCheck=0)    {
+               global $TCA;
+               if ($noCheck || is_array($TCA[$this->table]['columns'][$field]) || t3lib_div::inList($this->defaultList,$field))        {
+                       $this->fieldArray[]=$field;
+               }
+       }
+       
+       
+       
        /**
         * Resets the tree, recs, ids, and ids_hierarchy internal variables. Use it if you need it.
-        * 
-        * @return      void            
+        *
+        * @return      void
         */
        function reset()        {
                $this->tree = array();
                $this->recs = array();
                $this->ids = array();
                $this->ids_hierarchy = array();
+       
+       # These lines should be removed; The first one does not do anything since $This is not $this; The second makes tree generation based on an array impossible...  
+#              $This->data = false;
+#              $this->dataLookup = false;
        }
 
+
+       /*******************************************
+        *
+        * output
+        *
+        *******************************************/
+
        /**
         * Will create and return the HTML code for a browsable tree
         * Is based on the mounts found in the internal array ->MOUNTS (set in the constructor)
-        * 
+        *
         * @return      string          HTML code for the browsable tree
         */
        function getBrowsableTree()     {
@@ -321,7 +398,7 @@ class t3lib_treeView {
        
        /**
         * Compiles the HTML code for displaying the structure found inside the ->tree array
-        * 
+        *
         * @param       array           "tree-array" - if blank string, the internal ->tree array is used.
         * @return      string          The HTML code for the tree
         */
@@ -356,9 +433,19 @@ class t3lib_treeView {
                return $out;
        }
 
+
+
+       /*******************************************
+        *
+        * rendering parts
+        *
+        *******************************************/
+
+
+
        /**
         * Generate the plus/minus icon for the browsable tree.
-        * 
+        *
         * @param       array           record for the entry
         * @param       integer         The current entry number
         * @param       integer         The total number of entries. If equal to $a, a "bottom" element is returned.
@@ -383,7 +470,7 @@ class t3lib_treeView {
 
        /**
         * Wrap the plus/minus icon in a link
-        * 
+        *
         * @param       string          HTML string to wrap, probably an image tag.
         * @param       string          Command for 'PM' get var
         * @param       boolean         If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
@@ -391,20 +478,25 @@ class t3lib_treeView {
         * @access private
         */
        function PM_ATagWrap($icon,$cmd,$bMark='')      {
-               if ($bMark)     {
-                       $anchor = '#'.$bMark;
-                       $name=' name="'.$bMark.'"';
+               if ($this->thisScript) {
+                       if ($bMark)     {
+                               $anchor = '#'.$bMark;
+                               $name=' name="'.$bMark.'"';
+                       }
+                       $aUrl = $this->thisScript.'?PM='.$cmd.$anchor;
+                       return '<a href="'.htmlspecialchars($aUrl).'"'.$name.'>'.$icon.'</a>';
+               } else {
+                       return $icon;
                }
-               $aUrl = $this->thisScript.'?PM='.$cmd.$anchor;
-               return '<a href="'.htmlspecialchars($aUrl).'"'.$name.'>'.$icon.'</a>';
        }
 
        /**
         * Wrapping $title in a-tags.
-        * 
+        *
         * @param       string          Title string
         * @param       string          Item record
-        * @return      string          
+        * @param       integer         Bank pointer (which mount point number)
+        * @return      string
         * @access private
         */
        function wrapTitle($title,$row,$bank=0) {
@@ -414,7 +506,7 @@ class t3lib_treeView {
 
        /**
         * Wrapping the image tag, $icon, for the row, $row (except for mount points)
-        * 
+        *
         * @param       string          The image tag for the icon
         * @param       array           The row for the current element
         * @return      string          The processed icon input value.
@@ -426,7 +518,7 @@ class t3lib_treeView {
        
        /**
         * Adds attributes to image tag.
-        * 
+        *
         * @param       string          Icon image tag
         * @param       string          Attributes to add, eg. ' border="0"'
         * @return      string          Image tag, modified with $attr attributes added.
@@ -437,7 +529,7 @@ class t3lib_treeView {
 
        /**
         * Adds a red "+" to the input string, $str, if the field "php_tree_stop" in the $row (pages) is set
-        * 
+        *
         * @param       string          Input string, like a page title for the tree
         * @param       array           record row with "php_tree_stop" field
         * @return      string          Modified string
@@ -449,49 +541,25 @@ class t3lib_treeView {
                }
                return $str;
        }
-       
-       /**
-        * Returns the number of records having the parent id, $uid
-        * 
-        * @param       integer         id to count subitems for
-        * @return      integer         
-        * @access private
-        */
-       function getCount($uid) {
-               if ($this->table) {
-                       $query = 'SELECT count(*) FROM '.$this->table.
-                                       ' WHERE '.$this->parentField.'="'.addslashes($uid).'"'.
-                                       $this->clause;
-                       $res = mysql(TYPO3_db, $query);
-                       $row=mysql_fetch_row($res);
-                       return $row[0];
-               } else {
-                               // Getting count for non-tables (could also work for tables, BUT then we will have all fields selected which is not as efficient as count(*))
-                       $res = $this->getDataInit($uid);
-                       return $this->getDataCount($res);
-               }
-       }
 
-       /**
-        * Adds a fieldname to the internal array ->fieldArray
-        * 
-        * @param       string          Field name to
-        * @param       boolean         If set, the fieldname will be set no matter what. Otherwise the field name must either be found as key in $TCA['pages']['columns'] or in the list ->defaultList
-        * @return      void            
-        */
-       function addField($field,$noCheck=0)    {
-               global $TCA;
-               if ($noCheck || is_array($TCA[$this->table]['columns'][$field]) || t3lib_div::inList($this->defaultList,$field))        {
-                       $this->fieldArray[]=$field;
-               }
-       }
+
+
+
+
+
+       /*******************************************
+        *
+        * tree handling
+        *
+        *******************************************/
+
 
        /**
         * Returns true/false if the next level for $id should be expanded - based on data in $this->stored[][] and ->expandAll flag.
         * Extending parent function
-        * 
+        *
         * @param       integer         record id/key
-        * @return      boolean         
+        * @return      boolean
         * @access private
         * @see t3lib_pageTree::expandNext()
         */
@@ -501,8 +569,8 @@ class t3lib_treeView {
 
        /**
         * Get stored tree structure AND updating it if needed according to incoming PM GET var.
-        * 
-        * @return      void            
+        *
+        * @return      void
         * @access private
         */
        function initializePositionSaving()     {
@@ -511,7 +579,7 @@ class t3lib_treeView {
 
                        // PM action
                        // (If an plus/minus icon has been clicked, the PM GET var is sent and we must update the stored positions in the tree):
-               $PM = explode('_',t3lib_div::GPvar('PM'));      // 0: mount key, 1: set/clear boolean, 2: item ID (cannot contain "_"), 3: treeName
+               $PM = explode('_',t3lib_div::_GP('PM'));        // 0: mount key, 1: set/clear boolean, 2: item ID (cannot contain "_"), 3: treeName
                if (count($PM)==4 && $PM[3]==$this->treeName)   {
                        if (isset($this->MOUNTS[$PM[0]]))       {
                                if ($PM[1])     {       // set
@@ -528,16 +596,16 @@ class t3lib_treeView {
        /**
         * Saves the content of ->stored (keeps track of expanded positions in the tree)
         * $this->treeName will be used as key for BE_USER->uc[] to store it in
-        * 
-        * @return      void            
+        *
+        * @return      void
         * @access private
         */
        function savePosition() {
                $this->BE_USER->uc['browseTrees'][$this->treeName] = serialize($this->stored);
                $this->BE_USER->writeUC();
        }
-       
-       
+
+
        
 
 
@@ -554,20 +622,10 @@ class t3lib_treeView {
         * Functions that might be overwritten by extended classes
         * 
         ********************************/
-        
-       /**
-        * Returns root record for uid (<=0)
-        * 
-        * @param       integer         uid, <= 0 (normally, this does not matter)
-        * @return      array           Array with title/uid keys with values of $this->title/0 (zero)
-        */
-       function getRootRecord($uid) {
-               return array('title'=>$this->title, 'uid'=>0);
-       }
 
        /**
         * Returns the root icon for a tree/mountpoint (defaults to the globe)
-        * 
+        *
         * @param       array           Record for root.
         * @return      string          Icon image tag.
         */
@@ -575,46 +633,12 @@ class t3lib_treeView {
                return $this->wrapIcon('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/i/_icon_website.gif','width="18" height="16"').' alt="" />',$rec);
        }
 
-       /**
-        * Returns the record for a uid.
-        * For tables: Looks up the record in the database.
-        * For arrays: Returns the fake record for uid id.
-        * 
-        * @param       integer         UID to look up
-        * @return      array           The record
-        */
-       function getRecord($uid) {
-               if($this->table) {
-                       return t3lib_befunc::getRecord($this->table,$uid);
-               } else {
-                       return $this->dataLookup[$uid];
-               }
-       }
 
-       /**
-        * Returns the id from the record (typ. uid)
-        * 
-        * @param       array           Record array
-        * @return      integer         The "uid" field value.
-        */
-       function getId($row) {
-               return $row['uid'];
-       }
-
-       /**
-        * Returns jump-url parameter value.
-        * 
-        * @param       array           The record array.
-        * @return      string          The jump-url parameter.
-        */
-       function getJumpToParm($row) {
-               return "'".$this->getId($row)."'";
-       }
 
        /**
         * Get icon for the row.
         * If $this->iconPath and $this->iconName is set, try to get icon based on those values.
-        * 
+        *
         * @param       array           Item row.
         * @return      string          Image tag.
         */
@@ -624,14 +648,15 @@ class t3lib_treeView {
                } else {
                        $icon = t3lib_iconWorks::getIconImage($this->table,$row,$this->backPath,'align="top" class="c-recIcon"');
                }
-               
+
                return $this->wrapIcon($icon,$row);
        }
 
+
        /**
-        * Returns the title for the input record. If blank, a "no title" labele (localized) will be returned. 
+        * Returns the title for the input record. If blank, a "no title" labele (localized) will be returned.
         * Do NOT htmlspecialchar the string from this function - has already been done.
-        * 
+        *
         * @param       array           The input row array (where the key "title" is used for the title)
         * @param       integer         Title length (30)
         * @return      string          The title.
@@ -643,7 +668,7 @@ class t3lib_treeView {
 
        /**
         * Returns the value for the image "title" attribute
-        * 
+        *
         * @param       array           The input row array (where the key "title" is used for the title)
         * @return      string          The attribute value (is htmlspecialchared() already)
         * @see wrapIcon()
@@ -651,6 +676,27 @@ class t3lib_treeView {
        function getTitleAttrib($row) {
                return htmlspecialchars($row['title']);
        }
+       
+       /**
+        * Returns the id from the record (typ. uid)
+        *
+        * @param       array           Record array
+        * @return      integer         The "uid" field value.
+        */
+       function getId($row) {
+               return $row['uid'];
+       }
+
+       /**
+        * Returns jump-url parameter value.
+        *
+        * @param       array           The record array.
+        * @return      string          The jump-url parameter.
+        */
+       function getJumpToParm($row) {
+               return "'".$this->getId($row)."'";
+       }
+
 
 
 
@@ -667,14 +713,13 @@ class t3lib_treeView {
 
        /********************************
         *
-        * Data handling
-        * Works with records and arrays
+        * tree data buidling
         *
         ********************************/
 
        /**
         * Fetches the data for the tree
-        * 
+        *
         * @param       integer         item id for which to select subitems (parent id)
         * @param       integer         Max depth (recursivity limit)
         * @param       string          HTML-code prefix for recursive calls.
@@ -682,6 +727,7 @@ class t3lib_treeView {
         * @return      integer         The count of items on the level
         */
        function getTree($uid, $depth=999, $depthData='',$blankLineCode='')     {
+
                        // Buffer for id hierarchy is reset:
                $this->buffer_idH=array();
                
@@ -734,6 +780,7 @@ class t3lib_treeView {
                        if ($this->makeHTML)    {
                                $HTML = $depthData.$this->PMicon($row,$a,$c,$nextCount,$exp);
                                $HTML.=$this->wrapStop($this->getIcon($row),$row);
+                               #       $HTML.=$this->wrapStop($this->wrapIcon($this->getIcon($row),$row),$row);
                        }
 
                                // Finally, add the row/HTML content to the ->tree array in the reserved key.
@@ -751,112 +798,189 @@ class t3lib_treeView {
                return $c;
        }
 
+
+
+
+
+
+
+
+
+
+
+
+       /********************************
+        *
+        * Data handling
+        * Works with records and arrays
+        *
+        ********************************/
+
+       /**
+        * Returns the number of records having the parent id, $uid
+        *
+        * @param       integer         id to count subitems for
+        * @return      integer
+        * @access private
+        */
+       function getCount($uid) {
+               if (is_array($this->data)) {
+                       $res = $this->getDataInit($uid);
+                       return $this->getDataCount($res);
+               } else {
+                       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
+                                               'count(*)', 
+                                               $this->table, 
+                                               $this->parentField.'="'.$GLOBALS['TYPO3_DB']->quoteStr($uid, $this->table).'"'.
+                                                       t3lib_BEfunc::deleteClause($this->table).
+                                                       $this->clause,  // whereClauseMightContainGroupOrderBy
+                                               '',
+                                               $this->orderByFields
+                                       );
+                       $row = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
+                       return $row[0];
+               }
+       }       
+
+
+
+       /**
+        * Returns root record for uid (<=0)
+        *
+        * @param       integer         uid, <= 0 (normally, this does not matter)
+        * @return      array           Array with title/uid keys with values of $this->title/0 (zero)
+        */
+       function getRootRecord($uid) {
+               return array('title'=>$this->title, 'uid'=>0);
+       }
+
+
+       /**
+        * Returns the record for a uid.
+        * For tables: Looks up the record in the database.
+        * For arrays: Returns the fake record for uid id.
+        *
+        * @param       integer         UID to look up
+        * @return      array           The record
+        */
+       function getRecord($uid) {
+               if (is_array($this->data)) {
+                       return $this->dataLookup[$uid];
+               } else {
+                       return t3lib_befunc::getRecord($this->table,$uid);
+               }
+       }
+
        /**
-        * Getting the tree data: Selecting/Initializing data pointer to items for a certain parent id. 
+        * Getting the tree data: Selecting/Initializing data pointer to items for a certain parent id.
         * For tables: This will make a database query to select all children to "parent"
         * For arrays: This will return key to the ->dataLookup array
-        * 
+        *
         * @param       integer         parent item id
         * @return      mixed           data handle (Tables: An sql-resource, arrays: A parentId integer. -1 is returned if there were NO subLevel.)
         * @access private
         */
        function getDataInit($parentId) {
-               if ($this->table) {
-                       $query = 'SELECT '.implode($this->fieldArray,',').' FROM '.$this->table.
-                                       ' WHERE '.$this->parentField.'="'.addslashes($parentId).'"'.
-                                       $this->clause;
-                       $res = mysql(TYPO3_db, $query);
-                       if (mysql_error())      {
-                               echo mysql_error();
-                               debug($query);
-                       }
-                       return $res;
-               } else {
-                       if (!is_array($this->dataLookup[$parentId]['subLevel'])) {
+               if (is_array($this->data)) {
+                       if (!is_array($this->dataLookup[$parentId][$this->subLevelID])) {
                                $parentId = -1;
                        } else {
-                               reset($this->dataLookup[$parentId]['subLevel']);
+                               reset($this->dataLookup[$parentId][$this->subLevelID]);
                        }
                        return $parentId;
+               } else {
+                       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
+                                               implode($this->fieldArray,','), 
+                                               $this->table, 
+                                               $this->parentField.'="'.$GLOBALS['TYPO3_DB']->quoteStr($parentId, $this->table).'"'.
+                                                       t3lib_BEfunc::deleteClause($this->table).
+                                                       $this->clause,  // whereClauseMightContainGroupOrderBy
+                                               '',
+                                               $this->orderByFields
+                                       );
+                       return $res;
                }
        }
 
        /**
         * Getting the tree data: Counting elements in resource
-        * 
+        *
         * @param       mixed           data handle
         * @return      integer         number of items
         * @access private
         * @see getDataInit()
         */
-       function getDataCount($res) {
-               if ($this->table) {
-                       $c=mysql_num_rows($res);
-                       return $c;
+       function getDataCount(&$res) {
+               if (is_array($this->data)) {
+                       return count($this->dataLookup[$res][$this->subLevelID]);
                } else {
-                       return is_array($this->dataLookup[$res]['subLevel']) ? count($this->dataLookup[$res]['subLevel']) : 0;
+                       $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
+                       return $c;
                }
        }
 
        /**
         * Getting the tree data: next entry
-        * 
+        *
         * @param       mixed           data handle
         * @return      array           item data array OR FALSE if end of elements.
         * @access private
         * @see getDataInit()
         */
-       function getDataNext($res){
-               if ($this->table) {
-                       return @mysql_fetch_assoc($res);
-               } else {
+       function getDataNext(&$res){
+               if (is_array($this->data)) {
                        if ($res<0) {
                                $row=FALSE;
                        } else {
-                               list(,$row) = each($this->dataLookup[$res]['subLevel']);
+                               list(,$row) = each($this->dataLookup[$res][$this->subLevelID]);
+
+                               /*
                                if (!is_array($row))    {
                                        $row=FALSE;
                                } else {
                                        unset($row['subLevel']);
-                               }
+                               }       
+                               */
                        }
                        return $row;
+               } else {
+                       return @$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
                }
        }
 
        /**
         * Getting the tree data: frees data handle
-        * 
+        *
         * @param       mixed           data handle
-        * @return      void            
+        * @return      void
         * @access private
         */
-       function getDataFree($res){
-               if ($this->table) {
-                       mysql_free_result($res);
-               } else {
+       function getDataFree(&$res){
+               if (is_array($this->data)) {
                #       unset();
+               } else {
+                       $GLOBALS['TYPO3_DB']->sql_free_result($res);
                }
        }
 
        /**
         * Used to initialize class with an array to browse.
         * The array inputted will be traversed and an internal index for lookup is created.
-        * The keys of the input array are perceived as "uid"s of records which means that keys GLOBALLY must be unique like uids are. 
+        * The keys of the input array are perceived as "uid"s of records which means that keys GLOBALLY must be unique like uids are.
         * "uid" and "pid" "fakefields" are also set in each record.
         * All other fields are optional.
-        * 
+        *
         * @param       array           The input array, see examples below in this script.
         * @param       boolean         Internal, for recursion.
         * @param       integer         Internal, for recursion.
-        * @return      void            
+        * @return      void
         */
        function setDataFromArray(&$dataArr,$traverse=FALSE,$pid=0)     {
                if (!$traverse) {
                        $this->data = &$dataArr;
                        $this->dataLookup=array();
                                // add root
-                       $this->dataLookup[0]['subLevel']=&$dataArr;
+                       $this->dataLookup[0][$this->subLevelID]=&$dataArr;
                }
 
                foreach($dataArr as $uid => $val)       {
@@ -867,10 +991,26 @@ class t3lib_treeView {
                                // gives quick access to id's
                        $this->dataLookup[$uid] = &$dataArr[$uid];
 
-                       if (is_array($val['subLevel'])) {
-                               $this->setDataFromArray($dataArr[$uid]['subLevel'],TRUE,$uid);
+                       if (is_array($val[$this->subLevelID])) {
+                               $this->setDataFromArray($dataArr[$uid][$this->subLevelID],TRUE,$uid);
+                               unset($dataArr[$uid][$this->subLevelID]);
                        }
                }
+               if (!$traverse) {
+                       $this->data = &$dataArr;
+               }
+       }
+
+       /**
+        * Sets the internal data arrays
+        *
+        * @param       array           Content for $this->data
+        * @param       array           Content for $this->dataLookup
+        * @return      void
+        */
+       function setDataFromTreeArray(&$treeArr, &$treeLookupArr)       {
+               $this->data = &$treeArr;
+               $this->dataLookup=&$treeLookupArr;
        }
 
 
@@ -890,7 +1030,7 @@ class t3lib_treeView {
                                'title'=>'title...',
                                'id' => 'id3',
                                'icon' => 'icon ref, relative to typo3/ folder...'
-                               'subLevel' => array(
+                               $this->subLevelID => array(
                                        [id3_asdf#1] => array(
                                                'title'=>'title...',
                                                'id' => 'asdf#1',
@@ -913,7 +1053,9 @@ class t3lib_treeView {
 }
 
 
+                       
+
 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_treeview.php']) {
        include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_treeview.php']);
 }
-?>
\ No newline at end of file
+?>