This software requires PHP 5.1+ to run!");
}
// ############################################################################
// INIT PRGM
// ############################################################################
unset($pages_md_arr, $mainsettings);
require_once(ROOT_PATH . 'includes/init.php');
require_once(ROOT_PATH . 'includes/enablegzip.php');
// ############################################################################
// UNSUBSCRIBE USER FROM EMAILS
// ############################################################################
if(isset($_GET['unsubscribe_id']) && ctype_digit($_GET['unsubscribe_id']))
{
$unsubscribe_id = (string)$_GET['unsubscribe_id'];
$user_is_unsubscribed = false;
if($unsubscribe_id)
{
$join_date = substr($unsubscribe_id, 0, 10);
$user_id = substr($unsubscribe_id, 10);
// does user exist?
if($join_date AND $user_id
AND $user_arr = $DB->query_first('SELECT userid FROM {users} WHERE userid = %d
AND joindate = %d LIMIT 1',$user_id, $join_date))
{
$DB->query('UPDATE {users} SET receive_emails = 0 WHERE userid = %d', $user_arr['userid']);
$user_is_unsubscribed = true;
}
}
$unsubscribe_msg = $user_is_unsubscribed ? $sdlanguage['user_unsubscribed'] : $sdlanguage['user_not_unsubscribed'];
StopLoadingPage('
' . $unsubscribe_msg . '
', '', 0, '');
}
// ############################################################################
// WEBSITE OFFLINE?
// ############################################################################
if(($mainsettings_siteactivation == 'off') && !$userinfo['adminaccess'] && !$userinfo['offlinecategoryaccess'])
{
if(isset($mainsettings_site_inactive_redirect)) //SD342
{
if(sd_check_url($mainsettings_site_inactive_redirect))
{
StopLoadingPage('', $sdlanguage['website_offline'], 503, $mainsettings_site_inactive_redirect);
}
}
StopLoadingPage($mainsettings_offmessage, $sdlanguage['website_offline']);
}
// ############################################################################
// BUILD CATEGORIES FOR MENU
// ############################################################################
// If user is not logged in then do not display member-only categories.
// For that "$user_has_categories" stores that flag:
$user_has_categories = !empty($userinfo['categorymenuids']);
unset($categoryname,$categorylink,$categoryids,$sessioncreated);
$i = 0;
if($user_has_categories && !empty($pages_md_arr))
{
foreach($pages_md_arr as $cat_id => $category)
{
if(empty($category['parentid']) && @in_array($cat_id, $userinfo['categorymenuids']))
{
if(strlen($category['image'] > 4))
{
// SD313x - Shouldn't images only be for old skins' hover menu???
// hover image (min. length of 4)
if(isset($category['hoverimage']) && (strlen($category['hoverimage'])>3) /* ??? && ($design['skin_engine'] != 2) ??? */)
{
$categoryname[$i] = '';
}
else
{
$categoryname[$i] = '';
}
}
else
{
$categoryname[$i] = str_replace('[sdurl]',SITE_URL,$category['name']);
}
$categorylink[$i] = isset($category['link'][0]) ? $category['link'] : RewriteLink('index.php?categoryid=' . $cat_id);
$categorytarget[$i] = isset($category['target'][0]) ? $category['target'] : '_self';
$categoryids[$i] = (int)$cat_id;
$i++;
}
}
}
$categoryrows = $i;
unset($i, $cat_id, $category, $category_parents);
$article_arr = null;
$article_id = $page_identified_by_SEO = $page_to_load = false;
$categoryid = 0;
$hasParams = strpos($uri, '?');
$uri = $_SERVER['REQUEST_URI'];
$do301 = false;
$sd_variable_arr = array();
$sd_variable_arr_count = 0;
/* //SD342
Note: regardless of "modrewrite" option check the URL to allow for
way better detection of old links and needed redirecting.
Supported cases and notes ("http://..." left out)
*) Clones of the Articles plugin require an extra plugin id URL parameter
"pid" so that SEO works, like
/blog.htm?pid=5008&p5008_articleid=2
*) blog.htm?p2_articleid=5
TODO: Article is opened, but no redirect yet if SEO is enabled
*) /blog/p2_articleid/5
If SEO is ON and the article does have a SEO title, this will 301 to
the correct SEO-enabled URL, e.g. http://www.dom.com/blog/myarticle.htm
*) /blog/p2_articleid/5
*/
$check_vars = $article_url_wrong = $next_is_articleid = false;
if(strlen(SITE_URL))
{
// Test: http://127.0.0.1:8080/sdcom/index.php?categoryid=1&p2_articleid=59#comments
if(strlen($uri) && !strstr($uri, '/index.php') && substr($uri, -4) != '.php')
{
// get request_uri and remove any trailing slash
// ex: /program_folder/features.html?test=1
// ex: /program_folder
$uri = substr($uri, -1) == '/' ? substr($uri, 0, -1) : $uri;
// find the subfolders of the url
// ex: /program_folder/
$sub_folders = preg_replace("#https?://[^/]+(/?.*)#", "\$1", SITE_URL);
// now subtract the subfolders from the request_uri
// this will leave us with the variables in the url
// ex: home/articles.html?test=1
$url_variables = substr($uri, strlen($sub_folders));
$sd_url_params = array();
$prev_seo = '';
$idx = $last_valid_var = $prev_id = 0;
if(strlen($url_variables))
{
// explode the url variables
$sd_variable_arr = explode('/', $url_variables);
$sd_variable_arr_count = count($sd_variable_arr);
$last_var = $sd_variable_arr_count - 1;
// search and remove real php arguments
// we only want the friendly url variables
// the last key in the array could be something like:
// home.html?alpha=1&beta=2 (so get rid of ?alpha=1&beta=2)
if(($args_pos = strpos($sd_variable_arr[$last_var], '?')) !== false)
{
$sd_variable_arr[$last_var] = substr($sd_variable_arr[$last_var], 0, $args_pos);
}
// remove url extension
$last_var_org = $sd_variable_arr[$last_var];
if(strlen($mainsettings_url_extension) && (strpos($sd_variable_arr[$last_var], $mainsettings_url_extension) !== false) )
{
$sd_variable_arr[$last_var] = substr($sd_variable_arr[$last_var], 0, -strlen($mainsettings_url_extension));
}
//SD341: check and extract for SD 2.6 SEO names like "&pXXXX_articleid=YYYY" (incl. clones)
if(preg_match('#p([0-9]*)_articleid=([0-9]*)#',$url_variables,$article_matches) && (count($article_matches)==3))
{
array_shift($article_matches);
$pid = Is_Valid_Number($article_matches[0],0,2,9999);
$article_id = Is_Valid_Number($article_matches[1],0,1,999999);
if($article_arr = sd_cache_article($pid, $article_id))
{
$categoryid = (int)$article_arr['categoryid'];
if($mainsettings_modrewrite && isset($article_arr['seo_title']) && strlen($article_arr['seo_title']))
{
$do301 = true;
$page_identified_by_SEO = true;
}
}
}
unset($article_matches);
//SD342: if sub-categories in URL are allowed AND there are more than 1 variables:
if(!$page_identified_by_SEO && $sd_variable_arr_count)
{
$pid = GetVar('pid', 2, 'whole_number');
foreach($sd_variable_arr as $tmp)
{
$tmp2 = false;
// Check if variable is a SEO page
if($tmp2 = (!empty($pages_seo_arr[$tmp]) ? $pages_md_arr[$pages_seo_arr[$tmp]] : false))
{
if($tmp2 && isset($sd_cache['category_parents'][$prev_id]) &&
@in_array($tmp2['categoryid'], $sd_cache['category_parents'][$prev_id]))
{
// Redirect SEO URL to "index.php?categoryid=xxx" format
if(!$mainsettings_modrewrite) $do301 = true;
$categoryid = (int)$tmp2['categoryid'];
$last_valid_var = $idx;
}
else
{
if(!empty($tmp2['categoryid'])) //SD342 if present, use it
{
$categoryid = (int)$tmp2['categoryid'];
$page_identified_by_SEO = true;
}
else
if($idx < $sd_variable_arr_count) $do301 = true;
break;
}
}
// Check if current param is like "pXXX_articleid" and next param is an article id
elseif(($idx < $last_var) && preg_match('#p([0-9]*)_articleid#',$tmp,$matches) && (count($matches)==2))
{
if($pid = Is_Valid_Number($matches[1],0,2,9999))
{
$next_is_articleid = ($pid == 2) || (($pid >= 5000) && ($pid <= 9999));
}
else
{
unset($pid);
}
}
elseif($next_is_articleid)
{
// Catches old 2.6 article link like "/blog/p2_articleid/59"
$next_is_articleid = false;
$article_id = Is_Valid_Number($tmp,0,1,999999);
if($article_arr = sd_cache_article($pid, $article_id))
{
$article_arr['pluginid'] = $pid;
$categoryid = (int)$article_arr['categoryid'];
// if SEO is enabled and article has SEO title, then redirect
if($mainsettings_modrewrite && isset($article_arr['seo_title']) && strlen($article_arr['seo_title']))
{
$do301 = true;
$page_identified_by_SEO = true;
}
}
else
{
$article_url_wrong = true;
unset($article_arr,$article_id);
}
}
// Check if the LAST param is an article SEO
elseif($idx == $last_var)
{
if($article_seo_arr = sd_cache_articles($pid))
{
if(isset($article_seo_arr[$tmp]))
{
$article_id = $article_seo_arr[$tmp];
}
else //SD342 check for old 2.6 article link
if(preg_match('#-a([0-9]*)$#',$tmp,$matches) && (count($matches)==2) && (false!==(array_search($matches[1],$article_seo_arr))))
{
$article_id = (int)$matches[1];
$do301 = true;
}
}
}
else
{
// Unknown "variable", assume from here on "friendly" params and quit
if(strlen($prev_seo))
{
$page_identified_by_SEO = true;
$page_to_load = $prev_seo;
$check_vars = true;
}
break;
}
$idx++;
if($idx == $sd_variable_arr_count)
{
// If the loop did not break and this is the last variable, then the URL is valid
$page_identified_by_SEO = true;
$page_to_load = $article_id ? $prev_seo : $tmp;
}
if($tmp2!==false)
{
$prev_id = $tmp2['categoryid'];
$prev_seo = $tmp2['urlname'];
}
}
}
if($page_identified_by_SEO && $article_id && $pid && !isset($article_arr))
{
if($article_arr = sd_cache_article($pid, $article_id))
{
//SD342 if article is not active, then do 404 and redirect to page
$hasAccess = !empty($userinfo['adminaccess']) ||
(empty($article_arr['access_view']) || in_array($userinfo['usergroupid'],explode('|',$article_arr['access_view'])));
if(!$hasAccess || empty($article_arr['settings']) || (($article_arr['settings'] & 2) == 0))
{
$new_link = RewriteLink('index.php?categoryid='.(int)$categoryid);
StopLoadingPage('', '', 404, $new_link);
}
else
if($sd_variable_arr_count > 1)
{
$page_to_load = $sd_variable_arr[$sd_variable_arr_count - 2];
$page_identified_by_SEO = true;
}
}
}
// If indicated by "$check_vars", copy extra params to "$sd_url_params"
// so that these can be picked up by a plugin
// Example: http://localhost:8080/sdcom/testing/sd3-media-gallery/p5020/gallery/2
// Page is: "sd3-media-gallery.htm" with params "p5020/section/2"
if($check_vars)
{
for($idx; $idx <= $last_var; $idx++)
{
$sd_url_params[] = $sd_variable_arr[$idx];
}
}
unset($idx, $prev_id, $prev_seo, $pid, $tmp, $tmp2);
//SD341: redirect old article URL to new SEO URL:
if($do301 && $page_identified_by_SEO && îsset($article_arr) && is_array($article_arr))
{ //old link: http://www.site.com/old-article-url-a59.htm = article 59
$new_link = RewriteLink('index.php?categoryid='.$article_arr['categoryid']);
if($mainsettings_modrewrite)
{
$new_link = preg_replace('#'.SD_QUOTED_URL_EXT.'$#', '/' . $article_arr['seo_title'] .
$mainsettings_url_extension, $new_link);
}
else
{
$pid = $article_arr['pluginid'];
$new_link .= '&pid='.$pid.'&p'.$pid.'_articleid='.$article_arr['articleid'];
}
StopLoadingPage('', '', 301, $new_link);
}
elseif($do301 && $categoryid)
{
$new_link = RewriteLink('index.php?categoryid='.(int)$categoryid);
StopLoadingPage('', '', 301, $new_link);
}
elseif(!$categoryid)
{
StopLoadingPage('' . $sdlanguage['redirect_to_homepage'] . '', $sdlanguage['page_not_found'], 404);
}
}
}
else
// If "index.php" is detected then check for categoryid.
// This will then redirect (301) to the SEO URL of the targeted page if user
// has permission for it or otherwise do 404 and redirect to homepage.
if($mainsettings_modrewrite && strlen($uri) && strstr($uri, '/index.php'))
{
$categoryid = (int)GetVar('categoryid', 1, 'whole_number');
if($user_has_categories && isset($pages_md_arr[$categoryid]))
{
$new_link = RewriteLink('index.php?categoryid='.(int)$categoryid);
//SD342: check and extract for SD 2.6 SEO names like "&pXXXX_articleid=YYYY" (incl. clones)
//http://127.0.0.1:8080/sdcom/index.php?categoryid=1&p2_articleid=59#comments
if(preg_match('#p([0-9]*)_articleid=([0-9]*)#',$uri,$article_matches) && (count($article_matches)==3))
{
array_shift($article_matches);
$pid = Is_Valid_Number($article_matches[0],0,2,9999);
$article_id = Is_Valid_Number($article_matches[1],0,1,999999);
if($article_arr = sd_cache_article($pid, $article_id))
{
if($mainsettings_modrewrite && isset($article_arr['seo_title']) && strlen($article_arr['seo_title']))
{
$new_link = RewriteLink('index.php?categoryid='.(int)$categoryid.'&p'.$pid.'_articleid='.$article_id);
}
}
}
StopLoadingPage('', '', 301, $new_link);
}
else
{
$new_link = RewriteLink('index.php?categoryid=1');
StopLoadingPage('', '', 404, $new_link);
}
}
else
//SD342: SEO off, check and extract article id if possible
if(!$mainsettings_modrewrite && strlen($uri) && strstr($uri, '/index.php'))
{
$categoryid = (int)GetVar('categoryid', 1, 'whole_number');
if($user_has_categories && isset($pages_md_arr[$categoryid]))
{
$new_link = RewriteLink('index.php?categoryid='.(int)$categoryid);
if(preg_match('#p([0-9]*)_articleid=([0-9]*)#',$uri,$article_matches) && (count($article_matches)==3))
{
array_shift($article_matches);
$pid = Is_Valid_Number($article_matches[0],0,2,9999);
$article_id = Is_Valid_Number($article_matches[1],0,1,999999);
$article_arr = sd_cache_article($pid, $article_id);
}
}
}
}
if(!$categoryid)
{
$categoryid = GetVar('categoryid', 1, 'whole_number');
}
elseif($article_url_wrong)
{
// If an article was specified, but not found, then do 404
$new_link = RewriteLink('index.php?categoryid='.$categoryid);
StopLoadingPage('', '', 404, $new_link);
}
unset($check_vars, $article_url_wrong, $next_is_articleid);
define('PAGE_ID', (int)$categoryid);
//SD322: If user is logged in, update session with current location
if(($usersystem['name'] == 'Subdreamer') && !empty($userinfo['userid']))
{
$DB->query("UPDATE {sessions} SET location = '%s' WHERE userid = %d AND location <> '%s' AND admin = 0",
PAGE_ID, $userinfo['userid'], PAGE_ID);
}
// Below variable is used in functions_frontend for menu generation:
$root_parent_categoryid = GetRootCategoryid(PAGE_ID);
// GET SKIN, PAGE AND LAYOUT
// Check for skin-design's cache file, containing batches of 10 pages:
$theme_arr = false; $designs = array();
$designs_cacheid = (int)floor(PAGE_ID/10);
if($SDCache && $SDCache->IsActive() && (($getdesigns = $SDCache->read_var(CACHE_PAGE_DESIGN.$designs_cacheid, 'designs')) !== false))
{
if(isset($getdesigns['designs'][PAGE_ID])) $theme_arr = (array)$getdesigns['designs'][PAGE_ID];
}
if(!$theme_arr)
{
// Get all important design data; w/COMPLETE row from "skins" for further use!
//SD342: rewritten: only select design of current page, not all due to memory usage
if($getdesigns = $DB->query(
'SELECT c.categoryid, d.maxplugins, d.designpath, d.designid, d.design_name,
c.sslurl, c.name AS categoryname, c.metadescription, c.metakeywords, c.urlname, c.title,
s.skinid, s.skin_engine, s.name skinname, s.activated,
s.numdesigns, s.previewimage, s.authorname, s.authorlink,
s.folder_name, s.menu_level0_opening, s.menu_level0_closing,
s.menu_submenu_opening, s.menu_submenu_closing,
s.menu_item_opening, s.menu_item_closing, s.menu_item_link,
d.layout, s.header, s.footer, s.error_page
FROM {designs} d
INNER JOIN {categories} c ON c.designid = d.designid
INNER JOIN {skins} s ON s.skinid = d.skinid
WHERE c.categoryid BETWEEN %d AND %d',
$designs_cacheid*10,$designs_cacheid*10+9))
{
while($design = $DB->fetch_array($getdesigns,null,MYSQL_ASSOC))
{
$cid = (int)$design['categoryid'];
if($cid==PAGE_ID)
{
$theme_arr = $design;
}
$designs[$cid] = $design;
}
if($SDCache && $SDCache->IsActive())
$SDCache->write_var(CACHE_PAGE_DESIGN.$designs_cacheid, 'designs', array('designs' => $designs), false);
}
}
unset($cid,$designs,$designs_cacheid,$getdesigns);
if(!$theme_arr || empty($theme_arr['categoryid']))
{
StopLoadingPage('' .
$sdlanguage['redirect_to_homepage'] . '', $sdlanguage['page_not_found'], 404);
}
// #############################################################################
// CHECK SSL ACCESS (SD322)
// #############################################################################
// Let's check if this category is allowed to be viewed without SSL... if not it is a good time to escape
if(!empty($mainsettings['forcessl']) && !empty($theme_arr['sslurl']) &&
(empty($_SERVER['HTTPS']) || strtolower($_SERVER['HTTPS'])=='off'))
{
StopLoadingPage('' .
$sdlanguage['redirect_to_homepage'] . '', $sdlanguage['page_not_found'], 404);
}
// #############################################################################
// CHECK PAGE ACCESS
// #############################################################################
if((!$user_has_categories || !@in_array(PAGE_ID, $userinfo['categoryviewids'])) &&
(!$userinfo['adminaccess'] && !$userinfo['offlinecategoryaccess']) )
{
//SD342: differentiate error message for guests; added new title phrase
if(empty($userinfo['loggedin']))
{
StopLoadingPage($sdlanguage['no_view_access_guests'],$sdlanguage['no_view_access_title_guests']);
}
StopLoadingPage($sdlanguage['no_view_access'],$sdlanguage['no_view_access_title']);
}
define('SKIN_ENGINE', $theme_arr['skin_engine']);
define('SKIN_LAYOUT_NAME', $theme_arr['design_name']); //SD342
// #############################################################################
// SET COPYRIGHT
// #############################################################################
$copyright = $mainsettings_copyrighttext;
//SD322: take into account old BFO column AND new option from branding file
if(!defined('BRANDING_FREE') && empty($mainsettings_bfo))
{
$copyright .= ' ' . $sdlanguage['website_powered_by'] . ' ' . PRGM_NAME . '';
}
// #############################################################################
// SET RSS LINKS
// #############################################################################
$rss_link = '';
if($mainsettings_enable_rss)
{
$rss_link .= ' ' . "\n";
}
if($mainsettings_enable_rss_forum)
{
$rss_link .= ' ' . "\n";
}
// #############################################################################
// FORMAT WEBSITE TITLE
// #############################################################################
if(!strlen($mainsettings_title_separator))
{
$mainsettings_title_separator = ' ';
}
// combine page title with website title?
if($mainsettings_categorytitle && strlen($theme_arr['title']))
{
if(empty($mainsettings_title_order))
{
$mainsettings_websitetitle .= $mainsettings_title_separator . $theme_arr['title'];
}
else
{
$mainsettings_websitetitle = $theme_arr['title'] . $mainsettings_title_separator . $mainsettings_websitetitle;
}
}
// #############################################################################
// FORMAT WEBSITE META DESCRIPTION AND KEYWORDS
// #############################################################################
// replace website meta description with page meta description?
$mainsettings_metadescription = strlen($theme_arr['metadescription']) ? $theme_arr['metadescription'] : $mainsettings_metadescription;
// add page meta keywords to website meta keywords
$mainsettings_metakeywords .= (strlen($mainsettings_metakeywords) ? ',' : '') . $theme_arr['metakeywords'];
if(isset($article_arr) && @is_array($article_arr))
{
// replace current meta description with article meta description?
$mainsettings_metadescription = strlen($article_arr['metadescription']) ? $article_arr['metadescription'] : $mainsettings_metadescription;
// add article meta keywords to current meta keywords
$mainsettings_metakeywords .= (strlen($mainsettings_metakeywords) ? ',' : '') . $article_arr['metakeywords'];
//SD342: different combinations with article title first
switch($mainsettings_title_order)
{
case 0: break;
case 1: $mainsettings_websitetitle = $mainsettings_categorytitle?$mainsettings_websitetitle:$theme_arr['title'].$mainsettings_title_separator.$mainsettings_websitetitle; break;
case 2: $mainsettings_websitetitle = strip_tags($article_arr['title']); break;
case 3: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$mainsettings_websitetitle):$mainsettings_websitetitle; break;
case 4: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$theme_arr['title']):$mainsettings_websitetitle; break;
case 5: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$theme_arr['title'].$mainsettings_title_separator.$mainsettings_websitetitle_original):$mainsettings_websitetitle; break;
case 6: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$mainsettings_websitetitle_original.$mainsettings_title_separator.$theme_arr['title']):$mainsettings_websitetitle; break;
}
}
// SD313: remove trailing comma (HTML error)
if(!empty($mainsettings_metakeywords) && (substr($mainsettings_metakeywords,-1) == ','))
{
$mainsettings_metakeywords = substr($mainsettings_metakeywords,0,-1);
}
// DO NOT CLEAR "$article_arr" variable!
// ############################################################################
// IMAGE GALLERY SECTION/TITLE IN PAGE TITLE
// ############################################################################
$p17_sectionid = GetVar('p17_sectionid', null, 'whole_number', false, true);
$p17_imageid = GetVar('p17_imageid', null, 'whole_number', false, true);
if(!empty($p17_sectionid))
{
if(empty($p17_imageid) &&
($sectionname = $DB->query_first('SELECT name FROM {p17_sections} WHERE sectionid = %d', $p17_sectionid)))
{
if(empty($mainsettings_title_order))
{
$mainsettings_websitetitle .= $mainsettings_title_separator . $sectionname[0];
}
else
{
$mainsettings_websitetitle = $sectionname[0] . $mainsettings_title_separator . $mainsettings_websitetitle;
}
unset($sectionname);
}
else
if(!empty($p17_imageid))
{
if($imagetitle = $DB->query_first('SELECT title FROM {p17_images} WHERE imageid = %d', $p17_imageid))
{
if(empty($mainsettings_title_order))
{
$mainsettings_websitetitle .= $mainsettings_title_separator . $imagetitle[0];
}
else
{
$mainsettings_websitetitle = $imagetitle[0] . $mainsettings_title_separator . $mainsettings_websitetitle;
}
unset($imagetitle);
}
}
}
// #############################################################################
// INITIALIZE VARIABLES TO PREVENT ATTACK
// #############################################################################
$customplugincount = 0;
$customplugin = array();
$custompluginfile = array();
$customplugin_ids = array();
$pluginids = array();
$pluginname = array();
$pluginpath = array();
$custompluginoptions = array(); //SD342
$c_customplugin_ids = array();
$c_customplugin = array();
$c_custompluginfile = array();
$c_custompluginoptions = array();
$c_pluginids = array();
$c_pluginname = array();
$c_pluginpath = array();
$plugin_header = ''; // SD 313 - used again!
$design_maxplugins = $theme_arr['maxplugins'];
// #############################################################################
// INITIALIZE AND LOAD CACHED CATEGORY IF ENABLED
// #############################################################################
$IsCached = false; // DO NOT REMOVE!
$cache_id = CACHE_PAGE_PREFIX.PAGE_ID;
if($SDCache && $SDCache->IsActive()) // SD313x
{
// Check for category cache file, containing multiple arrays:
if(($c_categoryid = $SDCache->read_var($cache_id, 'c_categoryid')) !== false)
{
// Plugin arrays from cache file are loaded in global context
if($cache_file = $SDCache->CalcCachefileForID($cache_id))
{
if(is_file($cache_file) && @include($cache_file))
{
// Is category really correct?
if(!empty($c_categoryid) && ($c_categoryid == PAGE_ID))
{
// Assign cached arrays to the regular arrays:
$IsCached = true;
$customplugin = $c_customplugin;
$custompluginfile = $c_custompluginfile;
$customplugin_ids = $c_customplugin_ids;
$custompluginoptions = isset($c_custompluginoptions)?$c_custompluginoptions:array(); //SD342
$pluginids = $c_pluginids;
$pluginname = $c_pluginname;
$pluginpath = $c_pluginpath;
}
unset($c_customplugin,$c_customplugin_ids,$c_custompluginfile,$c_pluginids,$c_pluginname,$c_pluginpath);
}
}
// For security reasons init arrays here again
if(!$IsCached)
{
$customplugin_ids = array();
$customplugin = array();
$custompluginfile = array();
$custompluginoptions = array();
$pluginids = array();
$pluginname = array();
$pluginpath = array();
}
}
}
// #############################################################################
// LOAD PLUGINS (if not loaded from cache)
// #############################################################################
if(!$IsCached) // If cache disabled or file outdated/not existing
{
$custom_idx = 0;
// SD313 - Coded to a single statement for processing of all skin's plugin slots!
// Saves up to "maxplugins - 1" individual SELECT statements if all slots are set!
$extra = '';
if($DB->column_exists(PRGM_TABLE_PREFIX.'customplugins', 'ignore_excerpt_mode'))
{
$extra = 'c.ignore_excerpt_mode, ';
}
$get_pagesort = $DB->query('SELECT ps.displayorder, ps.pluginid,
IF(c.custompluginid is not null, 0, 1) isplugin,
IF(c.custompluginid is not null, c.custompluginid, ps.pluginid) realpluginid,
IF(c.custompluginid is not null, c.displayname, p.displayname) displayname,
IF(c.custompluginid is not null, \'plugins/customplugins.php\', concat(\'plugins/\',p.pluginpath)) pluginpath,
c.plugin, c.includefile, '.$extra.'p.authorname
FROM {pagesort} ps
LEFT JOIN {plugins} p ON p.pluginid = ps.pluginid
LEFT JOIN {customplugins} c ON c.custompluginid = substr(ps.pluginid,2,6) AND substr(ps.pluginid,1,1) = \'c\'
WHERE ps.categoryid = %d
ORDER BY ps.displayorder',PAGE_ID);
for($i = 0; $i < $design_maxplugins; $i++)
{
// default every plugin slot to be empty
$pluginids[$i] = 1;
$pluginname[$i] = '';
$pluginpath[$i] = EMPTY_PLUGIN_PATH;
if($pagesort_arr = $DB->fetch_array($get_pagesort,null,MYSQL_ASSOC))
{
$pluginid = (int)$pagesort_arr['realpluginid'];
$isCustom = (substr($pagesort_arr['pluginid'],0,1) == 'c');
if(!empty($pluginid) /*&& ($pagesort_arr['pluginid'] !== '1')*/)
{
$bAllowed = ( $isCustom && @in_array($pluginid, $userinfo['custompluginviewids'])) ||
(!$isCustom && @in_array($pluginid, $userinfo['pluginviewids']));
if(file_exists($pagesort_arr['pluginpath']))
{
// IF cache is enabled, it ALWAYS stores full category layout
if($SDCache && $SDCache->IsActive())
{
if(empty($pagesort_arr['isplugin']))
{
$c_customplugin_ids[$custom_idx] = $pagesort_arr['pluginid'];
$c_customplugin[$pagesort_arr['pluginid']] = $pagesort_arr['plugin'];
$c_custompluginfile[$pagesort_arr['pluginid']] = $pagesort_arr['includefile'];
$c_custompluginoptions[$pagesort_arr['pluginid']]['ignore_excerpt_mode'] = !empty($pagesort_arr['ignore_excerpt_mode']); //SD342
}
$c_pluginids[$i] = $pagesort_arr['pluginid'];
$c_pluginname[$i] = $pagesort_arr['displayname'];
$c_pluginpath[$i] = $pagesort_arr['pluginpath'];
}
if($isCustom)
{
$custom_id = $pagesort_arr['pluginid'];
$customplugin_ids[$custom_idx] = $pagesort_arr['pluginid'];
$customplugin[$custom_id] = $pagesort_arr['plugin'];
$custompluginfile[$custom_id] = $pagesort_arr['includefile'];
$custompluginoptions[$custom_id] = !empty($pagesort_arr['ignore_excerpt_mode']); //SD342
}
$pluginids[$i] = $pagesort_arr['pluginid'];
$pluginname[$i] = $pagesort_arr['displayname'];
$pluginpath[$i] = $pagesort_arr['pluginpath'];
if($isCustom)
{
$custom_idx++;
}
}
}
}
} //for
// Rewrite cache file (if enabled)
if($SDCache && $SDCache->IsActive())
{
$SDCache->write_var(CACHE_PAGE_PREFIX.PAGE_ID, '',
array('c_categoryid' => PAGE_ID,
'c_pluginids' => $c_pluginids,
'c_pluginname' => $c_pluginname,
'c_pluginpath' => $c_pluginpath,
'c_customplugin_ids' => $c_customplugin_ids,
'c_customplugin' => $c_customplugin,
'c_custompluginfile' => $c_custompluginfile,
'c_custompluginoptions' => $c_custompluginoptions), true);
}
}
unset($extra, $admin_menu_arr, $pluginid, $cache_file, $cache_id, $cachestamp, $get_pagesort, $pagesort_arr,
$isCustom, $IsCached, $c_pluginids, $c_pluginname, $c_pluginpath, $c_customplugin_ids,
$c_customplugin, $c_custompluginfile, $c_custompluginoptions, $args_pos,
$do301, $last_valid_page, $last_valid_var, $last_var, $last_var_org);
// #############################################################################
// PROCESS PLUGIN HEADERS (and optionally admin menu links)
// #############################################################################
$edit_plugin_link_arr = array();
// Preset some frequently used variables to lessen array searches
$user_custompluginviewids = $userinfo['custompluginviewids'];
$user_pluginviewids = $userinfo['pluginviewids'];
$IsAdmin = !empty($userinfo['loggedin']) && !empty($userinfo['adminaccess']);
// SD313: Loop through plugin slots to get extra headers from plugins (header.php)
// and re-evaluate view permissions if cached
$custom_idx = 0;
for($current_plugin_index = 0; $current_plugin_index < $design_maxplugins; $current_plugin_index++)
{
$pluginid = isset($pluginids[$current_plugin_index]) ? (string)$pluginids[$current_plugin_index] : '1';
$isCustom = (substr($pluginid,0,1)=='c');
$current_plugin_path = isset($pluginpath[$current_plugin_index]) ? (string)$pluginpath[$current_plugin_index] : '';
// Access is either granted for being ADMIN or has plugin view permissions:
$HasAccess = //$IsAdmin ||
($current_plugin_path == EMPTY_PLUGIN_PATH) ||
(($current_plugin_path == CUSTOMPLUGIN_PATH) && !empty($user_custompluginviewids) &&
@in_array(substr($pluginid,1,5), $user_custompluginviewids)) ||
(($current_plugin_path != CUSTOMPLUGIN_PATH) && !empty($user_pluginviewids) &&
@in_array($pluginid, $user_pluginviewids));
// Note: cached page contains ALL (custom) plugins, so IF plugins are loaded
// from cache, reset all plugins for which the current user does not have permission!
if(isset($current_plugin_path) && !$HasAccess && ($current_plugin_path != EMPTY_PLUGIN_PATH))
{
if($isCustom)
{
$custom_id = $customplugin_ids[$custom_idx];
$customplugin[$custom_id] = '';
$custompluginfile[$custom_id] = '';
$custompluginoptions[$custom_id] = false; //SD342
$pluginname[$current_plugin_index] = '';
}
else
{
$pluginids[$current_plugin_index] = '1';
$pluginname[$current_plugin_index] = '';
$pluginpath[$current_plugin_index] = EMPTY_PLUGIN_PATH;
}
}
if($isCustom)
{
$custom_idx++;
}
// Check plugin-specific "header.php" file to allow inclusion of e.g. additional
// CSS or JavaScript files into the header by sd_adder_head() calls:
// Note: ONLY for main- and downloaded plugins!
if($HasAccess && !$isCustom && isset($current_plugin_path) &&
($current_plugin_path != EMPTY_PLUGIN_PATH))
{
$headerfile = ROOT_PATH . dirname($pluginpath[$current_plugin_index]).'/header.php';
if(is_file($headerfile) && file_exists($headerfile))
{
$pluginid = $pluginids[$current_plugin_index];
@include($headerfile);
}
}
unset($HasAccess, $IsAdmin);
// This code is only active for SD3 skins AND if the following constant is defined
// (best in admin/branding.php or alternatively in includes/config.php)
if(defined('DISPLAY_PLUGIN_ADMIN_SHORTCUTS') && DISPLAY_PLUGIN_ADMIN_SHORTCUTS && ($theme_arr['skin_engine'] == 2))
{
if(substr($pluginids[$current_plugin_index], 0, 1) == 'c')
{
if(@in_array(substr($pluginids[$current_plugin_index], 1), $userinfo['custompluginadminids']))
{
$edit_plugin_link_arr[$current_plugin_index] =
'' . IMAGE_EDIT . '';
}
}
else
{
if(@in_array($pluginids[$current_plugin_index], $userinfo['pluginadminids']))
{
if($pluginids[$current_plugin_index] > 2)
{
$edit_plugin_link_arr[$current_plugin_index] =
' - ' . IMAGE_EDIT . ' View Plugin';
}
}
}
}
} //for
// Cleanup
unset($pluginid, $isCustom, $custom_id, $current_plugin_index, $current_plugin_path, $headerfile,
$user_custompluginviewids, $user_pluginviewids);
// SD313: $ExtraHeader receives complete output of extra plugin headers!
// This also used in "legacy_skin.php" with SD313:
$ExtraHeader = '
';
sd_header_add(array('css_import' => array('ceebox')));
//SD341: "Canonical tag" for articles with URL params present
if($mainsettings_modrewrite && $hasParams && $page_identified_by_SEO && @is_array($article_arr) && strlen($article_arr['seo_title']))
{
$article_link = RewriteLink();
$article_link = preg_replace('#'.SD_QUOTED_URL_EXT.'$#', '/' . $article_arr['seo_title'] .
$mainsettings_url_extension, $article_link);
$ExtraHeader = ''.$ExtraHeader;
}
// Include "Markitup" as BBCode-editor - if enabled - which is at least
// used by COMMENTS and Forum plugin etc.
if(!empty($mainsettings_allow_bbcode))
{
if(defined('ENABLE_MINIFY') && ENABLE_MINIFY)
{
sd_header_add(array('js' => array(SD_INCLUDE_PATH.'min/index.php?g=bbcode')));
}
else
{
sd_header_add(array('js' => array(SD_JS_PATH . 'markitup/markitup-full.js',)));
}
}
$ExtraHeader .= sd_header_flush(false);
// ******* Include JS for Ajax-rating *******
$ExtraHeader .= GetRatingsHandlingJS();
// #############################################################################
// LOAD LAYOUT AND BUILD HOVER MENU (IF NEEDED)
// #############################################################################
$menu_header = '';
$pages_menu = CreateMenu();
$breadcrumb = CreateBreadcrumb(PAGE_ID);
$pages_menu_top = CreateMenu(0, true);
$pages_menu_sub = CreateMenu(PAGE_ID); // SD 3.3.2 - new for SUBNAVIGATION
$pages_toplevel_nomenu = CreateMenu(0, true, true); // SD 3.3.2 - new
$cms_head_include =
'\n"
. '\n"
. '\n"
. '\n"
. '' . $mainsettings_websitetitle . "\n"
. $rss_link
. ''."\n"
;//. ''."\n";
if(defined('ENABLE_MINIFY') && ENABLE_MINIFY)
{
$cms_head_include .= '';
}
else
{
$cms_head_include .= '';
}
$cms_head_nomenu = $cms_head_include . $ExtraHeader; // SD 3.3.2 - new for CMS_HEAD_NOMENU: head excluding menu JS
// is there a hover menu involved?
$HoverNeeded = isset($sd_cache['category_parents'])
? (count($sd_cache['category_parents']) > 1)
: $DB->query_first('SELECT categoryid FROM {categories} WHERE parentid != 0 LIMIT 1');
if($HoverNeeded)
{
//SD322: preliminary minify support
if(defined('ENABLE_MINIFY') && ENABLE_MINIFY)
{
$menu_header = "\n".'';
}
else
{
$menu_header = "\n" .
'' . "\n"
. '' . "\n"
. '' . "\n"
. '' . "\n";
}
$menu_header .= "\n".$mainsettings_frontpage_menu_javascript;
}
$cms_head_include .= $menu_header . $ExtraHeader;
if($theme_arr['skin_engine'] == 2) // SD3-specific, xml-based skin
{
// Replace required skin placeholders with actual value
// SD 3.3.2 - testing for Max
// added SUBNAVIGATION and CMS_HEADER_NOMENU
$replace_search = array('[HEADER]','[FOOTER]','[NAVIGATION]','[BREADCRUMB]','[NAVIGATION-TOPLEVEL]','[NAVIGATION-TOPLEVEL-NOMENU]','[SUBNAVIGATION]','[LOGO]','[CMS_HEAD_INCLUDE]','[CMS_HEAD_NOMENU]','[COPYRIGHT]','[PAGE_TITLE]','[PAGE_NAME]');
$replace_values = array($theme_arr['header'],$theme_arr['footer'],$pages_menu,$breadcrumb,$pages_menu_top,$pages_toplevel_nomenu,$pages_menu_sub,$mainsettings_currentlogo,$cms_head_include,$cms_head_nomenu,$copyright,$theme_arr['title'],$theme_arr['categoryname']);
$theme_arr['layout'] = str_replace($replace_search, $replace_values, $theme_arr['layout']);
$current_layout = &$theme_arr['layout'];
// Cleanup
unset($menu_header,$cms_head_include,$cms_head_nomenu,$ExtraHeader,$replace_values,$replace_search,$c_categoryid,$last_var,
$custom_idx,$HoverNeeded,$pages_menu,$pages_menu_top,$pages_menu_sub,$user_has_categories,
$sub_folders,$url_variables,$get_designs,$active_skin_id,$admin_menu_arr,$args_pos,$pid);
// cycle through all the plugins
// step 1: check if each plugin has plugin_name tags
// if so then replace the tags with the plugin name
// step 2: remove the plugin tags
for($current_plugin_index = 0; $current_plugin_index < $design_maxplugins; $current_plugin_index++)
{
// STEP 1: does current have plugin_name tags?
// search for starting plugin tag
$plugin_open_tag_pos = strpos($current_layout, '');
// search for ending plugin tag
$plugin_close_tag_pos = strpos($current_layout, '');
// okay now we know where current plugin is located, does it have a plugin name?
// last @argument for substr_count = the length of characters to grab
// (which happens to be "plugin_close_tag_pos - plugin_open_tag_pos +9"
// the + 13 represents the extra "" characters
// SD322: replace substr_count with substr/strpos and $tmp variable due to
// problems with previously used "substr_count"
$tmp = substr($current_layout, $plugin_open_tag_pos, ($plugin_close_tag_pos - $plugin_open_tag_pos + 13));
if(@strpos($tmp, '') !== false)
{
// plugin name found, wonderful, now lets remove the plugin name tags
if(isset($pluginname[$current_plugin_index]) && strlen($pluginname[$current_plugin_index]))
{
// there is a plugin name, so only remove the FIRST pair of plugin_name tags
// we are left with something like
[PLUGIN_NAME]
$current_layout = preg_replace("''", '', $current_layout, 1);
$current_layout = preg_replace("''", '', $current_layout, 1);
}
else
{
// There is no plugin name, so remove the plugin_name tags and all code between
// them and then replace it with [PLUGIN_NAME], which eventually will be
// replaced by an empty string.
$current_layout = preg_replace("'(.*?)'ms", '[PLUGIN_NAME]', $current_layout, 1);
}
// Now check if the variable actually exists.
// For example, a skin author might have written this code:
//
hello world
// So lets definitely make sure it exists before trying to replace it
// and then replace it with a real name.
// SD322: replace substr_count with substr/strpos and $tmp variable
$tmp = substr($current_layout, $plugin_open_tag_pos, ($plugin_close_tag_pos - $plugin_open_tag_pos + 13));
if(@strpos($tmp, '[PLUGIN_NAME]') !== false)
{
$ptitle = isset($pluginname[$current_plugin_index]) ? $pluginname[$current_plugin_index] : '';
// it was found, lets replace it with the plugin name
$current_layout = preg_replace('/\[PLUGIN_NAME\]/', $ptitle, $current_layout, 1);
}
}
unset($tmp,$ptitle);
// STEP 2: remove tags
if($pluginpath[$current_plugin_index] == EMPTY_PLUGIN_PATH)
{
// plugin is empty, remove the plugin tags and everything in between them
// then replace it with [PLUGIN]
$current_layout = preg_replace("'(.*?)'ms", '[PLUGIN]', $current_layout, 1);
}
else
{
// A plugin exists, so remove the plugin tags (a single pair)
$current_layout = preg_replace("''", '', $current_layout, 1);
$current_layout = preg_replace("''", '', $current_layout, 1);
}
}
// SD313 - clean up all unused variables
unset($admin_menu_arr, $bAllowed, $category, $column_name, $column_value,
$current_plugin_index, $get_plugins, $headerfile, $i,
$replace_search, $user_arr);
//SD330: check for placeholders in skin layout
$current_layout = preg_replace_callback('/\[([^\s\]:]*):([^\s\]]*):([^\s\]]*)\]/', 'CheckLayoutReplacements', $current_layout);
// okay the layout is ready to be exploded, lets split it up into an array
$layout_arr = explode('[PLUGIN]', $current_layout);
unset($current_layout);
// SD313: shouldn't we add this to categories table since many plugins
// use this for sizing input fields correctly??
$inputsize = '30'; // legacy - default "input" width (characters)
// display layout
$current_page_url = RewriteLink('index.php?categoryid='.PAGE_ID); //SD342
for($layout_index = 0; $layout_index < count($layout_arr); $layout_index++)
{
// "$layout_arr[$layout_arr]" contains skin code between previous (or start of skin)
// and the currently loading plugin, which is eval'ed to both output skin HTML
// as well as process included PHP code:
if(is_array($layout_arr) && strlen($layout_arr[$layout_index]))
{
$layout_arr[$layout_index] = ' ?>' . $layout_arr[$layout_index] . 'conn)
{
$DB->close();
}