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
yup, its working, and its off.
Cheers,
Quentin J Sarafinchan
Total Garage - Garage Organizers and Enhancement
http://www.totalgarage.ca
something is not right here, error report is suppressed for some reason, otherwise you see tons of notices on the site.
What is your cart version? your php version?
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
Also, check your php.ini, see if "display_errors" is on
http://www.washington.edu/computing/...display_errors
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
will post tomorrow, 4am here.
Cheers,
Quentin J Sarafinchan
Total Garage - Garage Organizers and Enhancement
http://www.totalgarage.ca
PHP 5.2.5 and the latest ver of ZC
Cheers,
Quentin J Sarafinchan
Total Garage - Garage Organizers and Enhancement
http://www.totalgarage.ca
A number of minor fixes, now all notices and warnings should be gone:
PHP Code:
<?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','true');
class simple_categories_generator{
var $category_tree = array();
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();
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;
}
}
// 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 = $temp(count($temp)-1);
}
$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>';
}
}
?>
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
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
There is a bug that would cause fatal error if you attempt to pass a cPath string (instead of number), fixed:
PHP Code:
<?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','true');
class simple_categories_generator{
var $category_tree = array();
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();
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;
}
}
// 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 = $temp[count($temp)-1];
}
$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>';
}
}
?>
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
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:
To get the array contains deepest cat of a certain cat id:PHP Code:
$_SESSION['category_tree']->build_deepest_level_children();
PHP Code:
$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 Code:
<?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']);
}
}
}
?>
Last edited by yellow1912; 12 Feb 2008 at 07:06 PM.
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
Bookmarks