A new feature added in this version, it let you retrieve the deepest children of each and every category, this can come in very handy when you want to list all products belong to a category that has many sub-cats. This feature is in alpha version.
To use: after building the tree, you can call this function, it will be executed only once if you use session:
$_SESSION['category_tree']->build_deepest_level_children();
To get the array contains deepest cat of a certain cat id:
$category_tree = $_SESSION['category_tree']->retrieve_category_tree_array();
// assuming we want cat 1
$deepest_cats = $category_tree[1]['deepest_cats']; // this is an array containing deepest categories ids
<?php
/**
* Simple Category Tree
* @Version: Beta 1
* @Authour: yellow1912
* @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
*/
define ('SCT_REBUILD_TREE','false');
class simple_categories_generator{
var $category_tree = array();
var $is_deepest_cats_built = false;
var $parent_open_tag = '';
var $parent_close_tag = '';
var $child_open_tag = '';
var $child_close_tag = '';
function simple_categories_generator() {}
function init(){
if(SCT_REBUILD_TREE != 'false' || count($this->category_tree) == 0){
global $languages_id, $db;
$categories_query = "select c.categories_id, cd.categories_name, c.parent_id
from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd
where c.categories_id = cd.categories_id
and c.categories_status=1
and cd.language_id = '" . (int)$_SESSION['languages_id'] . "'
order by c.parent_id, c.sort_order, cd.categories_name";
$categories = $db->Execute($categories_query);
// reset the tree first
$this->category_tree = array();
$this->is_deepest_cats_built = false;
while (!$categories->EOF) {
$this->category_tree[$categories->fields['categories_id']] = array('name' => $categories->fields['categories_name'],
'parent_id' => $categories->fields['parent_id']);
$this->category_tree[$categories->fields['categories_id']]['path'][] = $categories->fields['categories_id'];
$this->category_tree[$categories->fields['parent_id']]['sub_cats'][] = $categories->fields['categories_id'];
$categories->MoveNext();
}
// walk through the array and build sub/cPath and other addtional info needed
foreach($this->category_tree as $key => $value){
// add sub 'class' for print-out purpose
$this->category_tree[$key]['sub'] = isset($this->category_tree[$key]['sub_cats']) ? 'has_sub' : 'no_sub';
// only merge if parent cat is not 0
if(isset($this->category_tree[$key]['parent_id']) && $this->category_tree[$key]['parent_id'] > 0){
if(is_array($this->category_tree[$this->category_tree[$key]['parent_id']]['path']) && count($this->category_tree[$this->category_tree[$key]['parent_id']]['path'])> 0)
$this->category_tree[$key]['path'] = array_merge($this->category_tree[$this->category_tree[$key]['parent_id']]['path'],$this->category_tree[$key]['path']);
}
$this->category_tree[$key]['cPath'] = isset($this->category_tree[$key]['path']) ? implode('_',$this->category_tree[$key]['path']) : $key;
}
// for debugging using super global mod
// $_POST['category_tree'] = $this->category_tree;
}
}
function retrieve_category_tree_array(){
return $this->category_tree;
}
// 9 is a ridiculous level already. If you go deeper than that, you have some problem with performance + structure
// Max level should be around 3
function build_category_string($parent_tag = 'div', $child_tag = 'span', $divider = '', $categories_id = 0, $max_level = 9, $include_root = false){
if(!is_int($categories_id)){
$temp = explode('_',$categories_id);
$categories_id = end($temp);
}
$result = '';
// don't check if max_level = 0, since we assume store owners are not crazy enough to do that
// --> less check = faster
if(isset($this->category_tree[$categories_id])){
//
$sub = $this->category_tree[$categories_id]['sub'];
$level = 0;
$class = "level_$level $sub";
$this->_build_tags($parent_tag, $child_tag);
// check if we should include the root or only its branches
if($include_root && $categories_id > 0){
$result = sprintf($this->parent_open_tag, $class).sprintf($this->child_open_tag, $class);
$result .= $this->_build_category_string($categories_id, $level, $max_level, $divider);
$result .= $this->child_close_tag.$this->parent_close_tag;
}
else{
$result .= $this->__build_category_string($categories_id, $level, $max_level, $divider);
}
}
return $result;
}
function _build_category_string($categories_id, $level, $max_level, $divider){
$result = $this->build_category_link($this->category_tree[$categories_id]['name'],$this->category_tree[$categories_id]['cPath']);
$level++;
$result .= $this->__build_category_string($categories_id, $level, $max_level, $divider);
return $result;
}
function __build_category_string($categories_id, $level, $max_level, $divider){
$result = '';
if($level < $max_level){
$sub = $this->category_tree[$categories_id]['sub'];
$class = "level_$level $sub";
if(isset($this->category_tree[$categories_id]['sub_cats'])){
$result .= sprintf($this->parent_open_tag, $class);
$count = count($this->category_tree[$categories_id]['sub_cats']);
for($i=0; $i < $count; $i++){
$sub = $this->category_tree[$this->category_tree[$categories_id]['sub_cats'][$i]]['sub'];
$class = "level_$level $sub";
$result .= sprintf($this->child_open_tag, $class).$this->_build_category_string($this->category_tree[$categories_id]['sub_cats'][$i],$level,$max_level, $divider).$this->child_close_tag;
$result .= ($i < ($count-1)) ? $divider : '';
}
$result .= $this->parent_close_tag;
}
}
return $result;
}
function _build_tags($parent_tag, $child_tag){
if(!empty($parent_tag)){
$this->parent_open_tag = "<$parent_tag class='%s'>";
$this->parent_close_tag = "</$parent_tag>";
}
else{
$this->parent_open_tag = $this->parent_close_tag = '';
}
if(!empty($child_tag)){
$this->child_open_tag = "<$child_tag class='%s'>";
$this->child_close_tag = "</$child_tag>";
}
else{
$this->child_open_tag = $this->child_close_tag = '';
}
}
function build_category_link($categories_name, $cPath){
return '<a href="' . zen_href_link(FILENAME_DEFAULT, 'cPath=' . $cPath) . '">'.$categories_name.'</a>';
}
function build_deepest_level_children(){
if(!$this->is_deepest_cats_built)
$this->_build_deepest_level_children(0);
// for debugging using super global mod
// $_POST['category_tree'] = $this->category_tree;
}
function _build_deepest_level_children($categories_id){
$parent_id = isset($this->category_tree[$categories_id]['parent_id']) ? $this->category_tree[$categories_id]['parent_id'] : -1;
if(isset($this->category_tree[$categories_id]['sub_cats'])){
foreach($this->category_tree[$categories_id]['sub_cats'] as $sub_cat){
// we now need to loop thru these cats, and find if they have sub_cats
$this->_build_deepest_level_children($sub_cat);
}
}
elseif($parent_id > 0){
$this->category_tree[$parent_id]['deepest_cats'][] = $categories_id;
}
if($parent_id > 0 && isset($this->category_tree[$categories_id]['deepest_cats'])
&& isset($this->category_tree[$parent_id]['deepest_cats'])){
$this->category_tree[$parent_id]['deepest_cats'] = array_merge($this->category_tree[$parent_id]['deepest_cats'],$this->category_tree[$categories_id]['deepest_cats']);
}
}
}
?>
I no longer provide installation support on forum for all my modules. However, if there are real bugs with the modules please feel free to contact me