e107_plugins/download/handlers/category_class.php
<?php
/*
* e107 website system
*
* Copyright (C) 2008-2009 e107 Inc (e107.org)
* Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
*
*
*
* $Source: /cvs_backup/e107_0.8/e107_plugins/download/handlers/category_class.php,v $
* $Revision$
* $Date$
* $Author$
*/
if (!e107::isInstalled('download')) { exit(); }
class downloadCategory
{
var $cat_tree; // Initialised with all categories in a tree structure
var $cat_count; // Count visible subcats and subsubcats
var $down_count; // Counts total downloads
/**
* downloadCategory constructor.
*
* @param int $nest_level If 0, merges subsubcats with subcats. >0 creates full tree.
* @param string $load_class If non-null, assumed to be a 'class set' such as USERCLASS_LIST
* @param string $main_cat_load
* @param bool $accum If TRUE, include file counts and sizes in superior categories
*/
function __construct($nest_level = 1, $load_class = USERCLASS_LIST, $main_cat_load = '', $accum = FALSE)
{
define("SUB_PREFIX","-->"); // Added in front of sub categories
define("SUBSUB_PREFIX","---->"); // Added in front of sub-sub categories
$this->cat_tree = $this->down_cat_tree($nest_level, $load_class, $main_cat_load, $accum);
}
/**
* Function returns a 'tree' of download categories, subcategories, and sub-sub-categories.
*
* @param int $nest_level If 0, merges subsubcats with subcats. >0 creates full tree.
* @param string $load_cat_class If non-null, assumed to be a 'class set' such as USERCLASS_LIST
* @param string $main_cat_load If $main_cat_load is numeric, and the value of a 'main' category, only that main category is displayed. (Unpredictable if $main_cat_load is some other category)
* @param bool $accum If TRUE, include file counts and sizes in superior categories
* @return array Returns empty array if nothing defined
*/
function down_cat_tree($nest_level = 1, $load_cat_class = USERCLASS_LIST, $main_cat_load = '', $accum = FALSE)
{
$sql2 = e107::getDb('sql2');
$catlist = array();
$this->cat_count = 0;
$this->down_count = 0;
$temp2 = "";
$temp1 = "";
if ($load_cat_class != "")
{
$temp1 = " WHERE dc.download_category_class IN ({$load_cat_class}) ";
$temp2 = "AND d.download_visible IN ({$load_cat_class}) ";
}
$qry = "
SELECT dc.*,
dc1.download_category_parent AS d_parent1, dc1.download_category_order,
SUM(d.download_filesize) AS d_size,
COUNT(d.download_id) AS d_count,
MAX(d.download_datestamp) as d_last,
SUM(d.download_requested) as d_requests
FROM #download_category as dc
LEFT JOIN #download_category as dc1 ON dc1.download_category_id=dc.download_category_parent
LEFT JOIN #download_category as dc2 ON dc2.download_category_id=dc1.download_category_parent
LEFT JOIN #download AS d on d.download_category = dc.download_category_id AND d.download_active > 0 {$temp2}
{$temp1}
GROUP by dc.download_category_id
ORDER by dc2.download_category_order, dc1.download_category_order, dc.download_category_order"; // This puts main categories first, then sub-cats, then sub-sub cats
if (!$sql2->gen($qry)) return $catlist;
while ($row = $sql2->fetch())
{
$tmp = $row['download_category_parent'];
if ($tmp == '0')
{ // Its a main category
if (!is_numeric($main_cat_load) || ($main_cat_load == $row['download_category_id']))
{
$row['subcats'] = array();
$catlist[$row['download_category_id']] = $row;
}
}
else
{
if (isset($catlist[$tmp]))
{ // Sub-Category
$this->cat_count++;
$this->down_count += $row['d_count'];
$catlist[$tmp]['subcats'][$row['download_category_id']] = $row;
$catlist[$tmp]['subcats'][$row['download_category_id']]['subsubcats'] = array();
$catlist[$tmp]['subcats'][$row['download_category_id']]['d_last_subs'] =
$catlist[$tmp]['subcats'][$row['download_category_id']]['d_last'];
}
else
{ // Its a sub-sub category
if (isset($catlist[$row['d_parent1']]['subcats'][$tmp]))
{
$this->cat_count++;
$this->down_count += $row['d_count'];
if ($accum || ($nest_level == 0))
{ // Add the counts into the subcategory values
$catlist[$row['d_parent1']]['subcats'][$tmp]['d_size'] += $row['d_size'];
$catlist[$row['d_parent1']]['subcats'][$tmp]['d_count'] += $row['d_count'];
$catlist[$row['d_parent1']]['subcats'][$tmp]['d_requests'] += $row['d_requests'];
}
if ($nest_level == 0)
{ // Reflect subcat dates in category
if ($catlist[$row['d_parent1']]['subcats'][$tmp]['d_last'] < $row['d_last'])
$catlist[$row['d_parent1']]['subcats'][$tmp]['d_last'] = $row['d_last'];
}
else
{
$catlist[$row['d_parent1']]['subcats'][$tmp]['subsubcats'][$row['download_category_id']] = $row;
}
// Separately accumulate 'last update' for subcat plus associated subsubcats
if ($catlist[$row['d_parent1']]['subcats'][$tmp]['d_last_subs'] < $row['d_last'])
$catlist[$row['d_parent1']]['subcats'][$tmp]['d_last_subs'] = $row['d_last'];
}
}
}
}
return $catlist;
}
// Rest of the class isn't actually used normally, but print_tree() might help with debug
function print_cat($cat, $prefix,$postfix)
{
$text = "<tr><td>".$cat['download_category_id']."</td><td>".$cat['download_category_parent']."</td><td>";
$text .= $prefix.htmlspecialchars($cat['download_category_name']).$postfix."</td><td>".$cat['d_size']."</td>";
$text .= "<td>".$cat['d_count']."</td><td>".$cat['d_requests']."</td><td>".eShims::strftime('%H:%M %d-%m-%Y',$cat['d_last'])."</td>";
$text .= "</tr>";
return $text;
}
function print_tree()
{
echo "<table><tr><th>ID</th><th>Parent</th><th>Name</th><th>Bytes</th><th>Files</th><th>Requests</th><th>Last Download</th><tr>";
foreach ($this->cat_tree as $thiscat)
{ // Main categories
$scprefix = SUB_PREFIX;
echo $this->print_cat($thiscat,'<strong>','</strong>');
foreach ($thiscat['subcats'] as $sc)
{ // Sub-categories
$sscprefix = SUBSUB_PREFIX;
echo $this->print_cat($sc,$scprefix,'');
foreach ($sc['subsubcats'] as $ssc)
{ // Sub-sub categories
echo $this->print_cat($ssc,$sscprefix,'');
}
}
}
echo "</table>";
return;
}
}