showSubLinks();
*
* So in order to add a cart icon, we must declare at theme.
*
*/
const MenuDefaultID = 'DefaultMenu';
protected static $position_opts = [];
private static $id = '';
private static $instances = [];
private static $primary_cache_data = [];
private static $optional_cache_data = [];
/**
* Get Site Links Position Options
*
* @return array
*/
public static function get_SiteLinksPosition() {
$locale = fusion_get_locale('', LOCALE.LOCALESET."admin/sitelinks.php");
if (empty(self::$position_opts)) {
self::$position_opts = [
'1' => $locale['SL_0025'], // only css navigational panel
'2' => $locale['SL_0026'], // both
'3' => $locale['SL_0027'], // subheader
'4' => $locale['custom']." ID",
];
}
return (array)self::$position_opts;
}
/**
* Get Sitelinks SQL Row
*
* @param $id
*
* @return array|bool
*/
public static function get_SiteLinks($id) {
$data = [];
$link_query = "SELECT * FROM ".DB_SITE_LINKS." ".(multilang_table("SL") ? "WHERE link_language='".LANGUAGE."' AND" : "WHERE")." link_id='$id'";
$result = dbquery($link_query);
if (dbrows($result) > 0) {
$data = dbarray($result);
}
return $data;
}
/**
* Given a matching URL, fetch Sitelinks data
*
* @param string $url - url to match (link_url) column
* @param string $key - column data to output, blank for all
*
* @return array|bool
*/
public static function get_current_SiteLinks($url = "", $key = NULL) {
$url = stripinput($url);
static $data = [];
if (empty($data)) {
if (!$url) {
$url = FUSION_FILELINK;
}
$result = dbquery("SELECT * FROM ".DB_SITE_LINKS." WHERE link_url='".$url."' AND link_language='".LANGUAGE."'");
if (dbrows($result) > 0) {
$data = dbarray($result);
}
}
return $key === NULL ? (array)$data : (isset($data[$key]) ? $data[$key] : NULL);
}
/**
* Link ID validation
*
* @param $link_id
*
* @return bool|string
*/
public static function verify_sitelinks($link_id) {
if (isnum($link_id)) {
return dbcount("(link_id)", DB_SITE_LINKS, "link_id='".intval($link_id)."'");
}
return FALSE;
}
/**
* SQL Delete Site Link Action
*
* @param $link_id
*
* @return bool|mixed|null|resource
*/
public static function delete_sitelinks($link_id) {
$result = NULL;
if (isnum($link_id)) {
$data = dbarray(dbquery("SELECT link_order FROM ".DB_SITE_LINKS." ".(multilang_table("SL") ? "WHERE link_language='".LANGUAGE."' AND" : "WHERE")." link_id='".$_GET['link_id']."'"));
$result = dbquery("UPDATE ".DB_SITE_LINKS." SET link_order=link_order-1 ".(multilang_table("SL") ? "WHERE link_language='".LANGUAGE."' AND" : "WHERE")." link_order>'".$data['link_order']."'");
if ($result) {
$result = dbquery("DELETE FROM ".DB_SITE_LINKS." WHERE link_id='".$_GET['link_id']."'");
}
return $result;
}
return $result;
}
/**
* Get Group Array
*
* @return array
*/
public static function get_LinkVisibility() {
static $visibility_opts = [];
$user_groups = getusergroups();
foreach ($user_groups as $key => $user_group) {
$visibility_opts[$user_group['0']] = $user_group['1'];
}
return (array)$visibility_opts;
}
/**
* Calling the SiteLinks instance with Custom Parameters
*
* @param array $options
*
* @return static
*/
public static function setSubLinks(array $options = []) {
/*
* If set an ID, it will re-run the class to create a new object again.
*/
$default_options = [
'id' => self::MenuDefaultID,
'container' => FALSE,
'container_fluid' => FALSE,
'responsive' => TRUE,
'navbar_class' => 'navbar-default',
'nav_class' => '',
'additional_nav_class' => '',
'item_class' => '', // $class
'locale' => [],
'separator' => '', // $sep
'links_per_page' => '',
'grouping' => '',
'show_banner' => FALSE,
'show_header' => FALSE,
'custom_header' => '',
'language_switcher' => FALSE,
'searchbar' => FALSE,
'search_icon' => 'fa fa-search',
'searchbar_btn_class' => 'btn-primary',
'caret_icon' => 'caret',
'link_position' => [2, 3],
'html_pre_content' => '',
'html_content' => '',
'html_post_content' => ''
];
$options += $default_options;
if (!isset(self::$instances[$options['id']]->menu_options)) {
$options['locale'] += fusion_get_locale();
if (!$options['links_per_page']) {
$options['links_per_page'] = fusion_get_settings('links_per_page');
}
if (empty($options['grouping'])) {
$options['grouping'] = fusion_get_settings('links_grouping');
}
if (!isset($options['callback_data']) && empty($options['callback_data'])) {
$options['callback_data'] = self::get_SiteLinksData(['link_position' => $options['link_position']]);
}
$options['banner'] = fusion_get_settings('sitebanner') && $options['show_banner'] == TRUE ? "" : fusion_get_settings("sitename");
$pageInfo = pathinfo($_SERVER['REQUEST_URI']);
$start_page = $pageInfo['dirname'] !== "/" ? ltrim($pageInfo['dirname'], "/")."/" : "";
$site_path = ltrim(fusion_get_settings("site_path"), "/");
$start_page = str_replace([$site_path, '\/'], ['', ''], $start_page);
$start_page .= $pageInfo['basename'];
if (fusion_get_settings("site_seo") && defined('IN_PERMALINK') && !isset($_GET['aid'])) {
$filepath = Router::getRouterInstance()->getFilePath();
$start_page = $filepath;
}
$options['start_page'] = $start_page;
self::$instances[$options['id']] = self::getInstance($options['id']);
self::$id = $options['id'];
self::$instances[$options['id']]->menu_options = $options;
}
return self::$instances[$options['id']];
}
/**
* Fetches Site Links Hierarchy Data - for a less support complexity
*
* @param array $options
* - join
* - link_position (array)
* - condition
* - group
* - order
*
* @return array
*/
public static function get_SiteLinksData(array $options = []) {
$default_position = [2, 3];
/*
* $options['link_position'] - accepts either string or array
*/
$link_position = '';
if (!empty($options['link_position'])) {
$link_position = $options['link_position'];
if (is_array($link_position)) {
$link_position = implode(' OR sl.link_position=', $link_position);
}
}
$default_link_filter = [
'join' => '',
'position_condition' => '(sl.link_position='.($link_position ? $link_position : implode(' OR sl.link_position=', $default_position)).')',
'condition' => (multilang_table("SL") ? " AND link_language='".LANGUAGE."'" : "")." AND ".groupaccess('link_visibility')." AND link_status=1",
'group' => '',
'order' => "link_cat ASC, link_order ASC",
];
$options += $default_link_filter;
$query_replace = "";
if (!empty($options)) {
$query_replace = "SELECT sl.* ".(!empty($options['select']) ? ", ".$options['select'] : '')." ";
$query_replace .= "FROM ".DB_SITE_LINKS." sl ";
$query_replace .= $options['join']." ";
$query_replace .= "WHERE ".$options['position_condition'].$options['condition'];
$query_replace .= (!empty($options['group']) ? " GROUP BY ".$options['group']." " : "")." ORDER BY ".$options['order'];
}
return (array)dbquery_tree_full(DB_SITE_LINKS, "link_id", "link_cat", "", $query_replace);
}
/**
* @param string $id
*
* @return static
*/
public static function getInstance($id = self::MenuDefaultID) {
self::$id = $id;
if (isset(self::$instances[$id])) {
return self::$instances[$id];
} else {
return self::$instances[$id] = new static();
}
}
/**
* Add a link to primary menu
*
* @param int $link_id
* @param string $link_name
* @param int $link_cat
* @param string $link_url
* @param string $link_icon
* @param bool|FALSE $link_active
* @param bool|FALSE $link_title
* @param bool|FALSE $link_disabled
* @param bool|FALSE $link_window
* @param string $link_class
*/
public static function addMenuLink($link_id, $link_name, $link_cat = 0, $link_url = '', $link_icon = '', $link_active = FALSE, $link_title = FALSE, $link_disabled = FALSE, $link_window = FALSE, $link_class = '') {
self::$primary_cache_data[self::$id][$link_cat][$link_id] = [
'link_id' => $link_id,
'link_name' => $link_name,
'link_cat' => $link_cat,
'link_url' => $link_url,
'link_icon' => $link_icon,
'link_active' => $link_active,
'link_title' => $link_title,
'link_disabled' => $link_disabled,
'link_window' => $link_window,
'link_class' => $link_class
];
}
/**
* Add a link to secondary menu
*
* @param int $link_id
* @param string $link_name
* @param int $link_cat
* @param string $link_url
* @param string $link_icon
* @param bool|FALSE $link_active
* @param bool|FALSE $link_title
* @param bool|FALSE $link_disabled
* @param bool|FALSE $link_window
* @param string $link_class
*/
public static function addOptionalMenuLink($link_id, $link_name, $link_cat = 0, $link_url = '', $link_icon = '', $link_active = FALSE, $link_title = FALSE, $link_disabled = FALSE, $link_window = FALSE, $link_class = '') {
self::$optional_cache_data[self::$id][$link_cat][$link_id] = [
'link_id' => $link_id,
'link_name' => $link_name,
'link_cat' => $link_cat,
'link_url' => $link_url,
'link_icon' => $link_icon,
'link_active' => $link_active,
'link_title' => $link_title,
'link_disabled' => $link_disabled,
'link_window' => $link_window,
'link_class' => $link_class,
];
}
private static function setLinks() {
$primary_cache = (isset(self::$primary_cache_data[self::$id])) ? self::$primary_cache_data[self::$id] : [];
$secondary_cache = (isset(self::$optional_cache_data[self::$id])) ? self::$optional_cache_data[self::$id] : [];
if (!empty(self::getMenuParam('callback_data')) && is_array(self::getMenuParam('callback_data'))) {
if (isset($primary_cache)) {
self::replaceMenuParam('callback_data', array_replace_recursive(self::getMenuParam('callback_data'), $primary_cache));
}
} else {
self::replaceMenuParam('callback_data', $primary_cache);
}
if (!empty(self::getMenuParam('additional_data') && is_array(self::getMenuParam('additional_data')))) {
if (isset($secondary_cache)) {
self::replaceMenuParam('additional_data', array_replace_recursive(self::getMenuParam('additional_data'), $secondary_cache));
}
} else {
self::replaceMenuParam('additional_data', $secondary_cache);
}
// Change hierarchy data when grouping is activated
if (self::getMenuParam('grouping')) {
$callback_data = self::getMenuParam('callback_data');
if (isset($callback_data[0])) {
if (count($callback_data[0]) > self::getMenuParam('links_per_page')) {
$more_index = 9 * 10000000;
$base_data = $callback_data[0];
$data[$more_index] = array_slice($base_data, self::getMenuParam('links_per_page'), 9, TRUE);
$data[0] = array_slice($base_data, 0, self::getMenuParam('links_per_page'), TRUE);
$more[$more_index] = [
"link_id" => $more_index,
"link_cat" => 0,
"link_name" => fusion_get_locale('global_700'),
"link_url" => "#",
"link_icon" => "",
"link_visibility" => 0,
"link_position" => 2,
"link_window" => 0,
"link_order" => self::getMenuParam('links_per_page'),
"link_language" => LANGUAGE
];
$data[0] = $data[0] + $more;
$data = $data + $callback_data;
self::replaceMenuParam('callback_data', $data);
}
}
}
}
public function showSubLinks($id = 0) {
$locale = self::getMenuParam('locale');
$res = '';
if (empty($id)) {
self::setLinks();
$res = "