1);
$result = hesk_dbQuery('SELECT `parent`, COUNT(*) AS `num` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'kb_categories` GROUP BY `parent`');
while ($row = hesk_dbFetchAssoc($result))
{
$parent[$row['parent']] = $row['num'];
}
$parent_copy = $parent;
//print_r($parent);
// Get Knowledgebase structure
$kb_cat = array();
$result = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'kb_categories` ORDER BY `parent` ASC, `cat_order` ASC');
while ($cat = hesk_dbFetchAssoc($result))
{
// Can this category be moved at all?
if (
$cat['id'] == 1 || // Main category cannot be moved
! isset($parent[$cat['parent']]) || // if the parent category isn't set
$parent[$cat['parent']] < 2 // Less than 2 articles in category
)
{
$cat['move_up'] = false;
$cat['move_down'] = false;
}
else
{
$cat['move_up'] = true;
$cat['move_down'] = true;
}
$kb_cat[] = $cat;
}
//print_r($kb_cat);
/* Translate main category "Knowledgebase" if needed */
$kb_cat[0]['name'] = $hesklang['kb_text'];
require(HESK_PATH . 'inc/treemenu/TreeMenu.php');
$icon = 'folder.gif';
$expandedIcon = 'fa-folder-open" style="font-size:17px';
$menu = new HTML_TreeMenu();
$thislevel = array('0');
$nextlevel = array();
$i = 1;
$j = 1;
if (isset($_SESSION['KB_CATEGORY']))
{
$selected_catid = intval($_SESSION['KB_CATEGORY']);
}
else
{
$selected_catid = 0;
}
while (count($kb_cat) > 0)
{
foreach ($kb_cat as $k=>$cat)
{
if (in_array($cat['parent'],$thislevel))
{
$arrow = ($i - 2) % 10;
$arrow = $arrow == 0 ? '' : $arrow;
$up = $cat['parent'];
$my = $cat['id'];
$type = $cat['type'] ? '*' : '';
$selected = ($selected_catid == $my) ? 1 : 0;
$cls = (isset($_SESSION['newcat']) && $_SESSION['newcat'] == $my) ? ' class="kbCatListON"' : '';
$text = str_replace('\\','\\\\',''.$cat['name'].' ').$type.' ('.$cat['articles'].' , '.$cat['articles_private'].' , '.$cat['articles_draft'].' ) '; /* ' */
$text_short = $cat['name'].$type.' ('.$cat['articles'].', '.$cat['articles_private'].', '.$cat['articles_draft'].')';
$total_articles += $cat['articles'];
// Generate KB menu icons
$menu_icons =
' '
.' '
.' '
;
// Can this category be moved up?
if ($cat['move_up'] == false || ($cat['move_up'] && $parent_copy[$cat['parent']] == $parent[$cat['parent']]) )
{
$menu_icons .= ' ';
}
else
{
$menu_icons .= ' ';
}
// Can this category be moved down?
if ($cat['move_down'] == false || ($cat['move_down'] && $parent_copy[$cat['parent']] == 1) )
{
$menu_icons .= ' ';
}
else
{
$menu_icons .= ' ';
}
if (isset($node[$up]))
{
$node[$my] = &$node[$up]->addItem(new HTML_TreeNode(array('hesk_selected' => $selected, 'text' => $text, 'text_short' => $text_short, 'menu_icons' => $menu_icons, 'hesk_catid' => $cat['id'], 'hesk_select' => 'option'.$j, 'icon' => $icon, 'expandedIcon' => $expandedIcon, 'expanded' => true)));
}
else
{
$node[$my] = new HTML_TreeNode(array('hesk_selected' => $selected, 'text' => $text, 'text_short' => $text_short, 'menu_icons' => $menu_icons, 'hesk_catid' => $cat['id'], 'hesk_select' => 'option'.$j, 'icon' => $icon, 'expandedIcon' => $expandedIcon, 'expanded' => true));
}
$nextlevel[] = $cat['id'];
$parent_copy[$cat['parent']]--;
$j++;
unset($kb_cat[$k]);
}
}
$thislevel = $nextlevel;
$nextlevel = array();
/* Break after 20 recursions to avoid hang-ups in case of any problems */
if ($i > 20)
{
break;
}
$i++;
}
$menu->addItem($node[1]);
// Create the presentation class
$treeMenu = & ref_new(new HTML_TreeMenu_DHTML($menu, array('images' => '../img', 'defaultClass' => 'treeMenuDefault', 'isDynamic' => true)));
$listBox = & ref_new(new HTML_TreeMenu_Listbox($menu));
/* Hide new article and new category forms by default */
if (!isset($_SESSION['hide']))
{
$_SESSION['hide'] = array(
//'treemenu' => 1,
'new_article' => 1,
'new_category' => 1,
);
}
echo '';
/* Hide tree menu? */
if (!isset($_SESSION['hide']['treemenu']))
{
?>
0)
{
foreach ($kb_cat as $k=>$cat)
{
if (in_array($cat['parent'],$thislevel))
{
$up = $cat['parent'];
$my = $cat['id'];
$type = $cat['type'] ? '*' : '';
$text_short = $cat['name'].$type.' ('.$cat['articles'].', '.$cat['articles_private'].', '.$cat['articles_draft'].')';
if (isset($node[$up]))
{
$node[$my] = &$node[$up]->addItem(new HTML_TreeNode(array('hesk_parent' => $this_cat['parent'], 'text' => 'Text', 'text_short' => $text_short, 'hesk_catid' => $cat['id'], 'hesk_select' => 'option'.$j, 'icon' => $icon, 'expandedIcon' => $expandedIcon, 'expanded' => true)));
}
else
{
$node[$my] = new HTML_TreeNode(array('hesk_parent' => $this_cat['parent'], 'text' => 'Text', 'text_short' => $text_short, 'hesk_catid' => $cat['id'], 'hesk_select' => 'option'.$j, 'icon' => $icon, 'expandedIcon' => $expandedIcon, 'expanded' => true));
}
$nextlevel[] = $cat['id'];
$j++;
unset($kb_cat[$k]);
}
}
$thislevel = $nextlevel;
$nextlevel = array();
/* Break after 20 recursions to avoid hang-ups in case of any problems */
if ($i > 20)
{
break;
}
$i++;
}
$menu->addItem($node[1]);
// Create the presentation class
$listBox = & ref_new(new HTML_TreeMenu_Listbox($menu));
/* Print header */
require_once(HESK_PATH . 'inc/headerAdmin.inc.php');
/* Print main manage users page */
require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
?>
1,
'new_article' => 1,
//'new_category' => 1,
);
$parent = intval( hesk_POST('parent', 1) );
$type = empty($_POST['type']) ? 0 : 1;
$_SESSION['KB_CATEGORY'] = $parent;
$_SERVER['PHP_SELF'] = 'manage_knowledgebase.php';
/* Check that title is valid */
$title = hesk_input( hesk_POST('title') );
if (!strlen($title))
{
$_SESSION['new_category'] = array(
'type' => $type,
);
hesk_process_messages($hesklang['kb_cat_e_title'],$_SERVER['PHP_SELF']);
}
/* Get the latest reply_order */
$res = hesk_dbQuery('SELECT `cat_order` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'kb_categories` ORDER BY `cat_order` DESC LIMIT 1');
$row = hesk_dbFetchRow($res);
$my_order = $row[0]+10;
$result = hesk_dbQuery("INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` (`name`,`parent`,`cat_order`,`type`) VALUES ('".hesk_dbEscape($title)."','".intval($parent)."','".intval($my_order)."','".intval($type)."')");
$_SESSION['newcat'] = hesk_dbInsertID();
$_SESSION['hide'] = array(
'treemenu' => 1,
'new_article' => 1,
//'new_category' => 1,
'cat_treemenu' => 1,
);
hesk_process_messages($hesklang['kb_cat_added2'],$_SERVER['PHP_SELF'],'SUCCESS');
} // End new_category()
function new_article()
{
global $hesk_settings, $hesklang, $listBox;
global $hesk_error_buffer;
/* A security check */
# hesk_token_check('POST');
$_SESSION['hide'] = array(
'treemenu' => 1,
//'new_article' => 1,
'new_category' => 1,
);
$hesk_error_buffer = array();
$catid = intval( hesk_POST('catid', 1) );
$type = empty($_POST['type']) ? 0 : (hesk_POST('type') == 2 ? 2 : 1);
$html = $hesk_settings['kb_wysiwyg'] ? 1 : (empty($_POST['html']) ? 0 : 1);
$now = hesk_date();
// Prevent submitting duplicate articles by reloading manage_knowledgebase.php page
if (isset($_SESSION['article_submitted']))
{
header('Location:manage_knowledgebase.php?a=manage_cat&catid=' . $catid);
exit();
}
$_SESSION['KB_CATEGORY'] = $catid;
$subject = hesk_input( hesk_POST('subject') ) or $hesk_error_buffer[] = $hesklang['kb_e_subj'];
if ($html)
{
if (empty($_POST['content']))
{
$hesk_error_buffer[] = $hesklang['kb_e_cont'];
}
$content = hesk_getHTML( hesk_POST('content') );
// Clean the HTML code
require(HESK_PATH . 'inc/htmlpurifier/HTMLPurifier.standalone.php');
$purifier = new HTMLPurifier();
$content = $purifier->purify($content);
}
else
{
$content = hesk_input( hesk_POST('content') ) or $hesk_error_buffer[] = $hesklang['kb_e_cont'];
$content = nl2br($content);
$content = hesk_makeURL($content);
}
$sticky = isset($_POST['sticky']) ? 1 : 0;
$keywords = hesk_input( hesk_POST('keywords') );
/* Article attachments */
define('KB',1);
require_once(HESK_PATH . 'inc/posting_functions.inc.php');
$attachments = array();
$use_legacy_attachments = hesk_POST('use-legacy-attachments', 0);
$myattachments='';
if ($hesk_settings['attachments']['use']) {
require_once(HESK_PATH . 'inc/attachments.inc.php');
if ($use_legacy_attachments) {
for ($i=1; $i<=$hesk_settings['attachments']['max_number']; $i++)
{
$att = hesk_uploadFile($i);
if ( ! empty($att))
{
$attachments[$i] = $att;
}
}
} else {
// The user used the new drag-and-drop system.
$temp_attachment_ids = hesk_POST_array('attachment-ids');
foreach ($temp_attachment_ids as $temp_attachment_id) {
// Simply get the temp info and move it to the attachments table
$temp_attachment = mfh_getTemporaryAttachment($temp_attachment_id);
$attachments[] = $temp_attachment;
mfh_deleteTemporaryAttachment($temp_attachment_id);
}
}
}
/* Any errors? */
if (count($hesk_error_buffer))
{
// Remove any successfully uploaded attachments
if ($hesk_settings['attachments']['use'])
{
hesk_removeAttachments($attachments);
}
$_SESSION['new_article'] = array(
'type' => $type,
'html' => $html,
'subject' => $subject,
'content' => hesk_input( hesk_POST('content') ),
'keywords' => $keywords,
'sticky' => $sticky,
);
$tmp = '';
foreach ($hesk_error_buffer as $error)
{
$tmp .= "$error \n";
}
$hesk_error_buffer = $tmp;
$hesk_error_buffer = $hesklang['rfm'].' ';
hesk_process_messages($hesk_error_buffer,'manage_knowledgebase.php');
}
$revision = sprintf($hesklang['revision1'],$now,$_SESSION['name'].' ('.$_SESSION['user'].')');
/* Add to database */
if ( ! empty($attachments))
{
foreach ($attachments as $myatt)
{
hesk_dbQuery("INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_attachments` (`saved_name`,`real_name`,`size`) VALUES ('".hesk_dbEscape($myatt['saved_name'])."','".hesk_dbEscape($myatt['real_name'])."','".intval($myatt['size'])."')");
$myattachments .= hesk_dbInsertID() . '#' . $myatt['real_name'] .',';
}
}
/* Get the latest reply_order */
$res = hesk_dbQuery("SELECT `art_order` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='".intval($catid)."' AND `sticky` = '" . intval($sticky) . "' ORDER BY `art_order` DESC LIMIT 1");
$row = hesk_dbFetchRow($res);
$my_order = $row[0]+10;
/* Insert article into database */
hesk_dbQuery("INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` (`catid`,`dt`,`author`,`subject`,`content`,`keywords`,`type`,`html`,`sticky`,`art_order`,`history`,`attachments`) VALUES (
'".intval($catid)."',
NOW(),
'".intval($_SESSION['id'])."',
'".hesk_dbEscape($subject)."',
'".hesk_dbEscape($content)."',
'".hesk_dbEscape($keywords)."',
'".intval($type)."',
'".intval($html)."',
'".intval($sticky)."',
'".intval($my_order)."',
'".hesk_dbEscape($revision)."',
'".hesk_dbEscape($myattachments)."'
)");
$_SESSION['artord'] = hesk_dbInsertID();
// Update category article count
if ($type == 0)
{
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles`=`articles`+1 WHERE `id`='".intval($catid)."'");
}
else if ($type == 1)
{
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles_private`=`articles_private`+1 WHERE `id`='".intval($catid)."'");
}
else
{
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles_draft`=`articles_draft`+1 WHERE `id`='".intval($catid)."'");
}
unset($_SESSION['hide']);
$_SESSION['article_submitted']=1;
hesk_process_messages($hesklang['your_kb_added'],'NOREDIRECT','SUCCESS');
$_GET['catid'] = $catid;
manage_category();
} // End new_article()
function remove_article()
{
global $hesk_settings, $hesklang;
/* A security check */
hesk_token_check();
$id = intval( hesk_GET('id') ) or hesk_error($hesklang['kb_art_id']);
/* Get article details */
$result = hesk_dbQuery("SELECT `catid`, `type`, `attachments` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `id`='".intval($id)."' LIMIT 1");
if (hesk_dbNumRows($result) != 1)
{
hesk_error($hesklang['kb_art_id']);
}
$article = hesk_dbFetchAssoc($result);
$catid = intval($article['catid']);
$result = hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `id`='".intval($id)."' LIMIT 1");
// Remove any attachments
delete_kb_attachments($article['attachments']);
// Update category article count
if ($article['type'] == 0)
{
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles`=`articles`-1 WHERE `id`='{$catid}'");
}
else if ($article['type'] == 1)
{
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles_private`=`articles_private`-1 WHERE `id`='{$catid}'");
}
else
{
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles_draft`=`articles_draft`-1 WHERE `id`='{$catid}'");
}
hesk_process_messages($hesklang['your_kb_deleted'],'./manage_knowledgebase.php?a=manage_cat&catid='.$catid,'SUCCESS');
} // End remove_article()
function order_category()
{
global $hesk_settings, $hesklang;
/* A security check */
hesk_token_check();
$catid = intval( hesk_GET('catid') ) or hesk_error($hesklang['kb_cat_inv']);
$move = intval( hesk_GET('move') );
$_SESSION['newcat'] = $catid;
$result = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `cat_order`=`cat_order`+".intval($move)." WHERE `id`='".intval($catid)."' LIMIT 1");
if (hesk_dbAffectedRows() != 1)
{
hesk_error($hesklang['kb_cat_inv']);
}
update_category_order();
header('Location: manage_knowledgebase.php');
exit();
} // End order_category()
function order_article()
{
global $hesk_settings, $hesklang;
/* A security check */
hesk_token_check();
$id = intval( hesk_GET('id') ) or hesk_error($hesklang['kb_art_id']);
$catid = intval( hesk_GET('catid') ) or hesk_error($hesklang['kb_cat_inv']);
$move = intval( hesk_GET('move') );
$_SESSION['artord'] = $id;
$result = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `art_order`=`art_order`+".intval($move)." WHERE `id`='".intval($id)."' LIMIT 1");
if (hesk_dbAffectedRows() != 1)
{
hesk_error($hesklang['kb_art_id']);
}
/* Update article order */
update_article_order($catid);
header('Location: manage_knowledgebase.php?a=manage_cat&catid='.$catid);
exit();
} // End order_article()
function show_treeMenu() {
global $hesk_settings, $hesklang, $treeMenu;
?>
printMenu(); ?>
=
=
=
(
1 ,
2 ,
3 ) =
'.$hesklang['gopr'].' | ';
$link['newa'] = ' '.$hesklang['kb_i_art'].' | ';
$link['newc'] = ' '.$hesklang['kb_i_cat'].' | ';
if ($hide && isset($link[$hide]))
{
$link[$hide] = preg_replace('##', '', $link[$hide]);
$link[$hide] = str_replace(' ','',$link[$hide]);
}
?>
:
$value)
{
$value['articles'] = isset($value['articles']) ? $value['articles'] : 0;
$value['articles_private'] = isset($value['articles_private']) ? $value['articles_private'] : 0;
$value['articles_draft'] = isset($value['articles_draft']) ? $value['articles_draft'] : 0;
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles`={$value['articles']}, `articles_private`={$value['articles_private']}, `articles_draft`={$value['articles_draft']} WHERE `id`='{$catid}' LIMIT 1");
}
// Show a success message?
if ($show_success)
{
hesk_process_messages($hesklang['acv'], 'NOREDIRECT','SUCCESS');
}
return true;
} // END update_count()
function delete_category_recursive($catid)
{
global $hesk_settings, $hesklang;
$catid = intval($catid);
// Don't allow infinite loops... just in case
$hesk_settings['recursive_loop'] = isset($hesk_settings['recursive_loop']) ? $hesk_settings['recursive_loop'] + 1 : 1;
if ($hesk_settings['recursive_loop'] > 20)
{
return false;
}
// Make sure any attachments are deleted
$result = hesk_dbQuery("SELECT `attachments` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='{$catid}'");
while ($article = hesk_dbFetchAssoc($result))
{
delete_kb_attachments($article['attachments']);
}
// Remove articles from database
hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='{$catid}'");
// Delete all sub-categories
$result = hesk_dbQuery("SELECT `id` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` WHERE `parent`='{$catid}'");
while ($cat = hesk_dbFetchAssoc($result))
{
delete_category_recursive($cat['id']);
}
return true;
} // END delete_category_recursive()
function delete_kb_attachments($attachments)
{
global $hesk_settings, $hesklang;
// If nothing to delete just return
if (empty($attachments))
{
return true;
}
// Do the delete
$att = explode(',',substr($attachments, 0, -1));
foreach ($att as $myatt)
{
list($att_id, $att_name) = explode('#', $myatt);
// Get attachment saved name
$result = hesk_dbQuery("SELECT `saved_name` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_attachments` WHERE `att_id`='".intval($att_id)."' LIMIT 1");
if (hesk_dbNumRows($result) == 1)
{
$file = hesk_dbFetchAssoc($result);
hesk_unlink(HESK_PATH.$hesk_settings['attach_dir'].'/'.$file['saved_name']);
}
$result = hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_attachments` WHERE `att_id`='".intval($att_id)."' LIMIT 1");
}
return true;
} // delete_kb_attachments()
function hesk_stray_article($id)
{
global $hesk_settings, $hesklang, $article;
// Set article to category ID 1
$article['catid'] = 1;
// Update database
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `catid`=1 WHERE `id`='".intval($id)."' LIMIT 1");
// Update count of articles in categories
update_count();
// Return new category ID
return 1;
} // END hesk_stray_article()
?>