Source for file pcf_tree.phpinc

Documentation is available at pcf_tree.phpinc

  1. <?php
  2. /**
  3.   * Common Functions
  4.   *
  5.   * @project    Open CSP-Management
  6.   * @package    common
  7.   * @category   tree
  8.   *
  9.   * @author     Peter Krebs (pk)<p.krebs@lvus.at>
  10.   * @copyright  (c) 2002-2005 by LVUS <http://www.lvus.at>
  11.   * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
  12.   *
  13.   ***/
  14.  
  15.     function pcf_getTreeSelectFields($dbDesc{
  16.         $flds $dbDesc['SHOWFIELD']." AS SHOWFIELD, ";
  17.         $flds.= $dbDesc['KEYFIELD'." AS KEYFIELD, ";
  18.         $flds.= $dbDesc['PARENTFIELD']." AS PARENTFIELD, ";
  19.         if (!empty($dbDesc['SORTFIELD'])) {
  20.             $flds.= $dbDesc['SORTFIELD']." AS SORTFIELD ";
  21.         else {
  22.             $flds.= $dbDesc['SHOWFIELD']." AS SORTFIELD ";
  23.         }
  24.         
  25.         if (!empty($dbDesc['ADDFIELDS'])) {
  26.             $flds.= ",".$dbDesc['ADDFIELDS'];
  27.         }
  28.         $flds .= " ";
  29.         return $flds;
  30.     }         
  31.  
  32.     function pcf_getTreeNode($dbDesc,$aNodeId,$debug=FALSE{
  33.  
  34.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  35.         $query.= " FROM ".$dbDesc['TABLE'];
  36.         $query.= " WHERE ".$dbDesc['KEYFIELD']."=".intval($aNodeId);
  37.         if (!empty($dbDesc['WHEREADD']))  $query.=" AND ".$dbDesc['WHEREADD'];
  38.         if ($debugecho "<p>$query</p>";
  39.         return $GLOBALS['USRDB']->quickQuery($query);
  40.     }
  41.  
  42.     function pcf_getTreeChildArray($dbDesc,$aParentId,$debug=FALSE{
  43.         if ($debug{echo "<pre>pcf_getTreeChildArray:\n";print_r($dbDesc);echo"</pre>";}
  44.                 
  45.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  46.         $query.= " FROM ".$dbDesc['TABLE'];
  47.         $query.= " WHERE ".$dbDesc['PARENTFIELD']."=".intval($aParentId);
  48.         if (!empty($dbDesc['WHEREADD']))  $query.=" AND ".$dbDesc['WHEREADD'];
  49.         if (!empty($dbDesc['SORTFIELD'])) $query.= " ORDER BY ".$dbDesc['SORTFIELD'];
  50.         
  51.         if ($debugecho "<pre>pcf_getTreeChildArray:\n$query</p>";
  52.  
  53.         $retArray=array();
  54.         if ($cursor=$GLOBALS['USRDB']->query($query)) {
  55.             $count=0;
  56.             while($row=$cursor->fetchArrayFld()) {
  57.                 $row['_LEVNUMBER']=$count+1;
  58.                 $retArray[$count++]=$row;
  59.             }                           
  60.         }
  61.         
  62.         return $retArray;             
  63.     }
  64.  
  65.  
  66.     /**
  67.       * populates a tree into an array
  68.       *
  69.       * $dbDesc:
  70.       * ['TABLE']           Table name
  71.       * ['SHOWFIELD']       Showfield
  72.       * ['KEYFIELD']        primary Key
  73.       * ['PARENTFIELD']     foreign key to the parent
  74.       * ['WHEREADD']        append to where without first 'AND'
  75.       * ['SORTFIELD']
  76.       *
  77.       * @param array $dbDesc 
  78.       * @param int $aNodeId 
  79.       * @param string $intend 
  80.       * @param string $number 
  81.       * @param int $levels 
  82.       * @param boolean $debug 
  83.       *
  84.       * @return array 
  85.       *
  86.       ***/
  87.     function pcf_getTreeArray($dbDesc,$aNodeId=0,$intend="",$number="",$levels=999,$debug=FALSE{
  88.         if ($debug{echo "<pre>";print_r($dbDesc);echo"</pre>";}
  89.  
  90.         if (!isset($dbDesc['__MAXLEVELS']|| !intval($dbDesc['__MAXLEVELS'])) {
  91.             $dbDesc['__MAXLEVELS']=$levels;
  92.         }
  93.  
  94.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  95.         $query.= " FROM ".$dbDesc['TABLE'];
  96.         $query.= " WHERE ".$dbDesc['PARENTFIELD']."=".intval($aNodeId);
  97.         if (!empty($dbDesc['WHEREADD']))  $query.=" AND ".$dbDesc['WHEREADD'];
  98.         if (!empty($dbDesc['SORTFIELD'])) $query.= " ORDER BY ".$dbDesc['SORTFIELD'];
  99.         if ($debugecho "<pre>$query</pre>";
  100.  
  101.         $count=1;$retArray=array();
  102.         if ($cursor=$GLOBALS['USRDB']->query($query)) {
  103.             $subIntend=str_replace("--","  ",$intend)." -- ";
  104.             while($row=$cursor->fetchArrayFld()) {
  105.                 $row['_INTEND']     =$intend;
  106.                 $row['_NUMBER']     =$number.(empty($number"" ".").$count;
  107.                 $row['_LEVNUMBER']  =$count;
  108.                 $row['_LEVEL']      =$dbDesc['__MAXLEVELS']-$levels+1;
  109.                 $retArray[]=$row;
  110.                 if (($levels 0&& ($childArr=pcf_getTreeArray($dbDesc,$row['KEYFIELD'],$subIntend,$row['_NUMBER'],($levels-1),$debug))) {
  111.                     reset($childArr);
  112.                     while(list($key,$val)=each($childArr)) {
  113.                         $retArray[]=$val;
  114.                     }
  115.                     unset($childArr);
  116.                 }
  117.                 $found=TRUE;
  118.                 $count++;
  119.             }
  120.             $cursor->free();
  121.         else {
  122.             return FALSE;
  123.         }
  124.         if ($count>1return $retArray;                   
  125.         else return FALSE;
  126.     }
  127.  
  128.     function pcf_getTreePath($dbDesc,$aNodeId,$debug=FALSE{
  129.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  130.         $query.= " FROM ".$dbDesc['TABLE'];
  131.         $query.= " WHERE ".$dbDesc['KEYFIELD']."=".intval($aNodeId);
  132.         if (!empty($dbDesc['WHEREADD']))  $query.=" AND ".$dbDesc['WHEREADD'];
  133.         
  134.         if ($debugecho "<pre>pcf_getTreePath Node:$aNodeId\n$query</pre>";
  135.  
  136.         if ($curRow=$GLOBALS['USRDB']->quickQuery($query)) {
  137.             if ($debug{echo "<pre>curRow:\n";print_r($curRow);echo "</pre>";}
  138.             $retArray=array();
  139.             if ($curRow['KEYFIELD'!= $dbDesc['TREEROOT']{
  140.                 if ($aArray=pcf_getTreePath($dbDesc,$curRow['PARENTFIELD'],$debug)) {
  141.                     $retArray=$aArray;
  142.                 }
  143.             }
  144.             $retArray[]=$curRow;
  145.             return $retArray;
  146.         }
  147.         return FALSE;
  148.     }
  149.  
  150.     function pcf_writeTreeNode($dbDesc,$aNode,$linkUrl,$cssclass=""{
  151.         if (strpos($linkUrl,"?"=== FALSE$link=$linkUrl."?"}
  152.         else $link=$linkUrl."&"}
  153.         $link.=$dbDesc['KEYFIELD']."=".intval($aNode['KEYFIELD']);
  154.         $link.="&".$dbDesc['PARENTFIELD']."=".intval($aNode['PARENTFIELD']);
  155.         ?>
  156.             <tr>
  157.                 <td class="<?php echo $cssclass?>" valign="middle" align="left" width="5%"><a href='<?php echo $link?>' target='<?php echo $linkTarget?>'><IMG SRC='/img/e.gif' Border=0></a></td>
  158.                 <td class="<?php echo $cssclass?>" valign="middle" align="left"><a href='<?php echo $link?>' target='<?php echo $linkTarget?>'><?php echo $aNode['SHOWFIELD']?></a></td>
  159.             </tr>
  160.         <?php
  161.     }
  162.  
  163.     function pcf_writeTreeTill($dbDesc,$aNodeArr,$linkUrl="",$linkTarget="_self",$layout=NULL,$debug=FALSE{
  164.  
  165.         if (empty($linkUrl)) $linkUrl=$_SERVER['SCRIPT_NAME'];
  166.  
  167.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  168.         $query.= " FROM ".$dbDesc['TABLE'];
  169.         $query.= " WHERE ".$dbDesc['KEYFIELD']."=".intval($aNodeArr['PARENTFIELD']);
  170.  
  171.         if ($debugecho "<tr><td>&nbsp;</td><td>pcf_writeTreeTill: <br />$query</pre></td></tr>"}
  172.         if (($aNodeArr&& ($aktNode=$GLOBALS['USRDB']->quickQuery($query))) {
  173.             pcf_writeTreeTill($dbDesc,$aktNode,$linkUrl,$linkTarget,$layout,$debug);
  174.             pcf_writeTreeNode($dbDesc,$aktNode,$linkUrl,$layout['CLASSPATH']);
  175.             echo "\n<tr><td align='right' colspan='2'><table width='90%' border='0'>\n";
  176.         }
  177.         // ??? $query = " pcf_PARENT=".intval($aNodeArr['pcf_PARENT'])." AND pcf_NAME < '".$aNodeArr['pcf_NAME']."' ORDER BY pcf_NAME";
  178.  
  179.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  180.         $query.= " FROM ".$dbDesc['TABLE'];
  181.         $query.= " WHERE ".$dbDesc['PARENTFIELD']."=".intval($aNodeArr['PARENTFIELD']);
  182.         $query.= " AND ".$dbDesc['SORTFIELD']." < '".$aNodeArr['SORTFIELD']."' ";
  183.         $query.= " ORDER BY ".$dbDesc['SORTFIELD'];
  184.  
  185.         if ($debugecho "<tr><td>&nbsp;</td><td>pcf_writeTreeTill_2: <br />$query</pre></td></tr>"}
  186.         
  187.         if ($cursor2=$GLOBALS['USRDB']->query($query)) {
  188.             while ($childRow=$cursor2->fetchArray()) {
  189.                 pcf_writeTreeNode($dbDesc,$childRow,$linkUrl,$layout['CLASSOFF']);
  190.             }
  191.         }
  192.     }
  193.  
  194.     function pcf_writeTreeFrom($dbDesc,$aNodeArr,$linkUrl="",$linkTarget="_self",$layout=NULL,$debug=FALSE{
  195.  
  196.  
  197.         $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  198.         $query.= " FROM ".$dbDesc['TABLE'];
  199.         $query.= " WHERE ".$dbDesc['PARENTFIELD']."=".intval($aNodeArr['PARENTFIELD']);
  200.         $query.= " AND "$dbDesc['SORTFIELD'].">'".$aNodeArr['SORTFIELD']."'";
  201.         $query.= " ORDER BY ".$dbDesc['SORTFIELD'];
  202.  
  203.         if ($debugecho "<tr><td>&nbsp;</td><td>pcf_writeTreeFrom: <br />$query</pre></td></tr>"}
  204.  
  205.         if ($cursor2=$GLOBALS['USRDB']->query($query)) {
  206.             while ($childRow=$cursor2->fetchArray()) {
  207.                 pcf_writeTreeNode($dbDesc,$childRow,$linkUrl,$layout['CLASSOFF']);
  208.             }
  209.         }
  210.  
  211.         if (($aNodeArr&& (intval($aNodeArr['PARENTFIELD']0)) {
  212.             echo "\n</table></td></tr>\n";
  213.             $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  214.             $query.= " FROM ".$dbDesc['TABLE'];
  215.             $query.= " WHERE ".$dbDesc['KEYFIELD']."=".intval($aNodeArr['PARENTFIELD']);
  216.  
  217.             if ($debugecho "<tr><td>&nbsp;</td><td>pcf_writeTreeFrom_2: <br />$query</pre></td></tr>"}
  218.             $aktNode=$GLOBALS['USRDB']->quickQuery($query);
  219.             pcf_writeTreeFrom($dbDesc,$aktNode,$linkUrl,$linkTarget,$layout,$debug);
  220.         }
  221.     }
  222.  
  223.  
  224.     function pcf_writeTree($dbDesc,$aNodeId=-1,$linkUrl="",$linkTarget="_self",$layout=NULL,$debug=FALSE{
  225.             /**
  226.               * $dbDesc:
  227.               * ['TABLE']           Table name
  228.               * ['SHOWFIELD']       Showfield
  229.               * ['KEYFIELD']        primary Key
  230.               * ['PARENTFIELD']     foreign key to the parent
  231.               * ['SORTFIELD']
  232.             **/
  233.  
  234.  
  235.             $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  236.             $query.= " FROM ".$dbDesc['TABLE'];
  237.             $query.= " WHERE ".$dbDesc['KEYFIELD']."=".intval($aNodeId);
  238.  
  239.             if ($debugecho "<tr><td colspan='2'><pre>$query</pre></td></tr>";
  240.             $aktNode=$GLOBALS['USRDB']->quickQuery($query);
  241.             pcf_writeTreeTill($dbDesc,$aktNode,$linkUrl,$linkTarget,$layout,$debug);
  242.             if ($aktNode{
  243.                 if (strpos($linkUrl,"?"=== FALSE$link=$linkUrl."?"}
  244.                 else $link=$linkUrl."&"}
  245.                 $link.=$dbDesc['KEYFIELD']."=".intval($aktNode['KEYFIELD']);
  246.                 $link.="&".$dbDesc['PARENTFIELD']."=".intval($aktNode['PARENTFIELD']);
  247.                 ?>
  248.                     <tr>
  249.                         <td class="<?php echo $layout['CLASSON']?>" valign="middle" align="left" width="5%"><a href='<?php echo $link?>' target='<?php echo $linkTarget?>'><IMG SRC='/img/e.gif' Border=0></a></td>
  250.                         <td class="<?php echo $layout['CLASSON']?>" valign="middle" align="left"><a href='<?php echo $link?>' target='<?php echo $linkTarget?>'><?php echo $aktNode['SHOWFIELD']?></a></td>
  251.                     </tr>
  252.                 <?php
  253.                 
  254.                 $query ="SELECT ".pcf_getTreeSelectFields($dbDesc);
  255.                 $query.= " FROM ".$dbDesc['TABLE'];
  256.                 $query.= " WHERE ".$dbDesc['PARENTFIELD']."=".intval($aNodeId);
  257.                 $query.= " ORDER BY ".$dbDesc['SORTFIELD'];
  258.  
  259.                 if ($debugecho "<tr><td colspan='2'><pre>CHILDREN$query</pre></td></tr>";
  260.                 $childTbl="<tr><td align='right' colspan='2'><table width='90%'>";
  261.                 if ($cursor2=$GLOBALS['USRDB']->query($query)) {
  262.                     while ($childRow=$cursor2->fetchArray()) {
  263.                         echo $childTbl;
  264.                         $childTbl="";
  265.                         pcf_writeTreeNode($dbDesc,$childRow,$linkUrl,$layout['CLASSOFF']);
  266.                     }
  267.                 }
  268.                 if ($childTbl == ""echo "</td></table></tr>";
  269.             }
  270.             pcf_writeTreeFrom($dbDesc,$aktNode,$linkUrl,$linkTarget,$layout,$debug);
  271.     }
  272.     
  273.     
  274.     /**
  275.       * selects a tree from the database and writes all nodes as option list
  276.       *
  277.       * @param array $dbDesc 
  278.       * @param mixed $rootId 
  279.       * @param string $inted 
  280.       * @param string $where 
  281.       * @param array $selValues 
  282.       * @param boolean $debug 
  283.       *
  284.       * @returns string
  285.       *
  286.       * @since pk-07-01-10
  287.       *
  288.       ***/
  289.     function pcf_getTreeOptionLst($dbDesc,$parentId=0,$intend="",$where="",$selValues=NULL,$debug=FALSE{
  290.         if ($debugechoDebug(__FILE__,"<p><b>pcf_getTreeOptionLst(\$parentId=$parentId)</b></p>");
  291.         
  292.         $s_ret="";
  293.         
  294.         if (!is_array($selValues&& (!empty($selValues))) {
  295.             $a_selValues=array();
  296.             $a_selValues[]=$selValues;
  297.             $selValues=$a_selValues;
  298.         }
  299.         
  300.         $s_childIntend=(empty($intend"&nbsp;&nbsp;" $intend.$intend);
  301.         
  302.         $s_query "SELECT ".pcf_getTreeSelectFields($dbDesc);
  303.         $s_query.= " FROM ".$dbDesc['TABLE'];
  304.         $s_query.= " WHERE ".$dbDesc['PARENTFIELD']."=".$GLOBALS['USRDB']->qs_getSlashedValue($parentId);
  305.         if (!empty($where))               $s_query.=" AND ".$where;
  306.         if (!empty($dbDesc['SORTFIELD'])) $s_query.=" ORDER BY ".$dbDesc['SORTFIELD'];
  307.         
  308.         if ($o_cursor=$GLOBALS['USRDB']->query($s_query)) {
  309.             while ($a_row=$o_cursor->fetchArrayFld()) {
  310.                 if (!empty($a_row['KEYFIELD'])) {
  311.                     $s_ret.="<option value=\"".$a_row['KEYFIELD']."\"";
  312.                     if (is_array($selValues&& (in_array($a_row['KEYFIELD'],$selValues))) $s_ret .=" selected";
  313.                     $s_ret.=">".$intend.$a_row['SHOWFIELD']."</option>\n";
  314.                     
  315.                     $s_ret.=pcf_getTreeOptionLst($dbDesc,$a_row['KEYFIELD'],$s_childIntend,$where,$selValues,$debug);
  316.                 }
  317.             }
  318.         }
  319.         
  320.         return $s_ret;
  321.     }

Documentation generated on Thu, 08 Jan 2009 17:47:51 +0100 by phpDocumentor 1.4.0a2