class_Tree.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:8k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. // $Id: class_Tree.php,v 1.5 2004/02/06 04:46:59 deskpro Exp $
  3. /**
  4. * HTML_TreeMenu Class
  5. * @author  Richard Heyes
  6. * @author  Harald Radi
  7. * @access  public
  8. * @package HTML_TreeMenu
  9. */
  10. class HTML_TreeMenu
  11. {
  12. /**
  13.     * Indexed array of subnodes
  14. * @var array
  15.     */
  16. var $items;
  17. /**
  18.     * The layer ID
  19. * @var string
  20.     */
  21. var $layer;
  22. /**
  23.     * Path to the images
  24. * @var string
  25.     */
  26. var $images;
  27. /**
  28.     * Name of the object
  29. * This should not be changed without changing
  30. * the javascript.
  31. * @var string
  32.     */
  33. var $menuobj;
  34. /**
  35.     * Constructor
  36. *
  37. * @access public
  38. * @param  string $layer          The name of the layer to add the HTML to.
  39. *                                In browsers that do not support document.all
  40. *                                or document.getElementById(), document.write()
  41. *                                is used, and thus this layer name has no effect.
  42. * @param  string $images         The path to the images folder.
  43. * @param  string $linkTarget     The target for the link. Defaults to "_self"
  44. * @param  string $usePersistence Whether to use clientside persistence. This option
  45. *                                only affects ie5+.
  46.     */
  47. function HTML_TreeMenu($layer, $images, $linkTarget = '_self', $usePersistence = true)
  48. {
  49. $this->menuobj        = 'objTreeMenu';
  50. $this->layer          = $layer;
  51. $this->images         = $images;
  52. $this->linkTarget     = $linkTarget;
  53. $this->usePersistence = $usePersistence;
  54. }
  55. /**
  56.     * This function adds an item to the the tree.
  57. *
  58. * @access public
  59. * @param  object $menu The node to add. This object should be
  60. *                      a HTML_TreeNode object.
  61. * @return object       Returns a reference to the new node inside
  62. *                      the tree.
  63.     */
  64. function &addItem(&$menu)
  65. {
  66. $this->items[] = &$menu;
  67. return $this->items[count($this->items) - 1];
  68. }
  69. /**
  70.     * This function prints the menu Jabbascript code. Should
  71. * be called *AFTER* your layer tag has been printed. In the
  72. * case of older browsers, eg Navigator 4, The menu HTML will
  73. * appear where this function is called.
  74. *
  75. * @access public
  76.     */ 
  77. function printMenu()
  78. {
  79. echo "n";
  80.   echo '<script language="javascript" type="text/javascript">' . "nt";
  81. echo sprintf('%s = new TreeMenu("%s", "%s", "%s", "%s");',
  82.              $this->menuobj,
  83.  $this->layer,
  84.  $this->images,
  85.  $this->menuobj,
  86.  $this->linkTarget);
  87.  
  88. echo "n";
  89. if (isset($this->items)) {
  90. for ($i=0; $i<count($this->items); $i++) {
  91. $this->items[$i]->_printMenu($this->menuobj . ".n[$i]");
  92. }
  93. }
  94.   echo sprintf("nt%s.drawMenu();", $this->menuobj);
  95. if ($this->usePersistence) {
  96. echo sprintf("nt%s.resetBranches();", $this->menuobj);
  97. }
  98. echo "n</script>";
  99. }
  100. } // HTML_TreeMenu
  101. /**
  102. * HTML_TreeNode class
  103. * This class is supplementary to the above and provides a way to
  104. * add nodes to the tree. A node can have other nodes added to it. 
  105. *
  106. * @author  Richard Heyes
  107. * @author  Harald Radi
  108. * @access  public
  109. * @package HTML_TreeMenu
  110. */
  111. class HTML_TreeNode
  112. {
  113. /**
  114.     * The text for this node.
  115. * @var string
  116.     */
  117. var $text;
  118. /**
  119.     * The link for this node.
  120. * @var string
  121.     */
  122. var $link;
  123. /**
  124.     * The icon for this node.
  125. * @var string
  126.     */
  127. var $icon;
  128. /**
  129.     * Indexed array of subnodes
  130. * @var array
  131.     */
  132. var $items;
  133. /**
  134.     * Whether this node is expanded or not
  135. * @var bool
  136.     */
  137. var $expanded;
  138. /**
  139.     * Constructor
  140. *
  141. * @access public
  142. * @param  string $text      The description text for this node
  143. * @param  string $link      The link for the text
  144. * @param  string $icon      Optional icon to appear to the left of the text
  145. * @param  bool   $expanded  Whether this node is expanded or not (IE only)
  146. * @param  bool   $isDynamic Whether this node is dynamic or not (no affect on non-supportive browsers)
  147.     */
  148. function HTML_TreeNode($text = null, $link = null, $icon = null, $expanded = false, $isDynamic = true)
  149. {
  150. $this->text      = (string)$text;
  151. $this->link      = (string)$link;
  152. $this->icon      = (string)$icon;
  153. $this->expanded  = $expanded;
  154. $this->isDynamic = $isDynamic;
  155. }
  156. /**
  157.     * Adds a new subnode to this node.
  158. *
  159. * @access public
  160. * @param  object $node The new node
  161.     */
  162. function &addItem(&$node)
  163. {
  164. $this->items[] = &$node;
  165. return $this->items[count($this->items) - 1];
  166. }
  167. /**
  168.     * Prints jabbascript for this particular node.
  169. *
  170. * @access private
  171. * @param  string $prefix The jabbascript object to assign this node to.
  172.     */
  173. function _printMenu($prefix)
  174. {
  175. echo sprintf("t%s = new TreeNode('%s', %s, %s, %s, %s);n",
  176.              $prefix,
  177.              htmlspecialchars($this->text),
  178.              !empty($this->icon) ? "'" . $this->icon . "'" : 'null',
  179.              !empty($this->link) ? "'" . $this->link . "'" : 'null',
  180.  $this->expanded  ? 'true' : 'false',
  181.  $this->isDynamic ? 'true' : 'false');
  182. if (!empty($this->items)) {
  183. for ($i=0; $i<count($this->items); $i++) {
  184. $this->items[$i]->_printMenu($prefix . ".n[$i]");
  185. }
  186. }
  187. }
  188. }
  189. // +-----------------------------------------------------------------------+
  190. // | END OF PEAR COPYRIGHT                                                 |
  191. // +-----------------------------------------------------------------------+
  192. /**
  193. * Builds a tree menu object out of two
  194. * mysql tables.
  195. *
  196. * EXPECTS
  197. *  o A global variable $db (database object from Deskpro)
  198. */
  199. class categoryTree
  200. {
  201. var $catLinkFormat;
  202. var $artLinkFormat;
  203. var $catNameFormat;
  204. var $artNameFormat;
  205. var $categories;
  206. var $articles;
  207. /**
  208. * Constructor. Autostarts the build process
  209. */
  210. function categoryTree()
  211. {
  212. $this->catLinkFormat = 'index.php?catid={id}';
  213. $this->artLinkFormat = 'view.php?do=view&articleid={id}';
  214. $this->catNameFormat = '{name} ({totalarticles})';
  215. $this->artNameFormat = '{title}';
  216. $this->_getData();
  217. $this->tree = &new HTML_TreeMenu('fooLayer', 'treeMenu/images/');
  218. $this->_buildTree($this->_getCategories(0), $this->tree);
  219. }
  220. /**
  221. * Prints the menu
  222. */
  223. function printMenu()
  224. {
  225. $this->tree->printMenu();
  226. }
  227. /**
  228. * Builds the menu
  229. */
  230. function _buildTree($categories, &$treenode)
  231. {
  232. for ($i=0; $i<count($categories); $i++) {
  233. $newnode = &$treenode->addItem(new HTML_TreeNode($this->_parseLinkFormat($this->catNameFormat, $categories[$i]), $this->_parseLinkFormat($this->catLinkFormat, $categories[$i]), 'folder.gif'));
  234. // Handle subcategories
  235. $subcats = $this->_getCategories($categories[$i]['id']);
  236. if (!empty($subcats)) {
  237. $this->_buildTree($subcats, $newnode);
  238. }
  239. // Handle articles
  240. $articles = $this->_getArticles($categories[$i]['id']);
  241. if (!empty($articles)) {
  242. foreach ($articles as $article) {
  243. $newnode->addItem(new HTML_TreeNode($this->_parseLinkFormat($this->artNameFormat, $article), $this->_parseLinkFormat($this->artLinkFormat, $article), 'article.gif'));
  244. }
  245. }
  246. }
  247. }
  248. /**
  249. * Gets categories using the given parent id
  250. */
  251. function _getCategories($id)
  252. {
  253. $return = array();
  254. if (is_array($this->categories)) {
  255. foreach ($this->categories as $key => $value) {
  256. if ($value['parent'] == $id) {
  257. $return[] = $value;
  258. }
  259. }
  260. }
  261. return $return;
  262. }
  263. /**
  264. * Gets articles using the given category id
  265. */
  266. function _getArticles($category)
  267. {
  268. return !empty($this->articles[$category]) ? $this->articles[$category] : array();
  269. }
  270. /**
  271. * Parses the data from the db
  272. */
  273. function _getData()
  274. {
  275. $GLOBALS['db']->query('SELECT * FROM faq_cats ORDER BY parent, show_order, id');
  276. while ($row = $GLOBALS['db']->row_array()) {
  277. $row['name'] = addslashes($row['name']);
  278. $this->categories[] = $row;
  279. }
  280. $GLOBALS['db']->query('SELECT id, title, category FROM faq_articles ORDER BY category, show_order, id');
  281. while ($row = $GLOBALS['db']->row_array()) {
  282. $row['title'] = addslashes($row['title']);
  283. $this->articles[$row['category']][] = $row;
  284. }
  285. }
  286. /**
  287. * Parses a link (though not only used for links)
  288. */
  289. function _parseLinkFormat($format, $data)
  290. {
  291. return preg_replace('/{(.+)}/Ue', "@$data['\1'];", $format);
  292. }
  293. }
  294. ?>