Current Directory: /home/astoriaah/www/components/com_sh404sef
Viewing File: /home/astoriaah/www/components/com_sh404sef/sef_ext.php
<?php
/**
* sh404SEF - SEO extension for Joomla!
*
* @author Yannick Gaultier
* @copyright (c) Yannick Gaultier - Weeblr llc - 2022
* @package sh404SEF
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @version 4.24.1.4308
* @date 2022-05-31
*/
// Security check to ensure this file is being included by a parent file.
use Joomla\CMS\Component\ComponentHelper;
use Joomla\Registry\Registry;
defined('_JEXEC') || die;
global $_SEF_SPACE, $lowercase;
class sef_component
{
function revert(&$url_array, $pos)
{
global $_SEF_SPACE;
$QUERY_STRING = '';
$url_array = array_filter($url_array); // V x : traling slash can cause empty array element
$url_array = array_values($url_array);
if (!empty($url_array[1]) && strcspn($url_array[1], ',') == strlen($url_array[1]))
{
// This is a nocache url
$x = 0;
$c = count($url_array);
while ($x < $c)
{
if (isset($url_array[$x]) && $url_array[$x] != '' && isset($url_array[$x + 1]) && $url_array[$x + 1] != '')
{
$QUERY_STRING .= '&' . $url_array[$x] . '=' . $url_array[$x + 1];
}
$x += 2;
}
}
else
{
//This is a default mambo SEF url for a component
foreach ($url_array as $value)
{
$temp = explode(",", $value);
if (isset($temp[0]) && $temp[0] != '' && isset($temp[1]) && $temp[1] != "")
{
$QUERY_STRING .= "&$temp[0]=$temp[1]";
}
}
}
//return str_replace("&option","option",$QUERY_STRING);
return JString::ltrim($QUERY_STRING, '&');
}
}
class sef_content
{
function revert(&$url_array, $pos)
{ // V 1.2.4.l // updated based on includes/sef.php.
$url_array = array_filter($url_array); // V x : traling slash can cause empty array element
$url_array = array_values($url_array);
$uri = explode('content/', $_SERVER['REQUEST_URI']);
$option = 'com_content';
$pos = array_search('content', $url_array);
// language hook for content
$lang = '';
foreach ($url_array as $key => $value)
{
if (!JString::strcasecmp(JString::substr($value, 0, 5), 'lang,'))
{
$temp = explode(',', $value);
if (isset($temp[0]) && $temp[0] != '' && isset($temp[1]) && $temp[1] != '')
{
$lang = $temp[1];
}
unset($url_array[$key]);
}
}
if (isset($url_array[$pos + 8]) && $url_array[$pos + 8] != '' && in_array('category', $url_array) && (strpos($url_array[$pos + 5], 'order,') !== false) && (strpos($url_array[$pos + 6], 'filter,') !== false))
{
// $option/$task/$sectionid/$id/$Itemid/$order/$filter/$limit/$limitstart
$task = $url_array[$pos + 1];
$sectionid = $url_array[$pos + 2];
$id = $url_array[$pos + 3];
$Itemid = $url_array[$pos + 4];
$order = str_replace('order,', '', $url_array[$pos + 5]);
$filter = str_replace('filter,', '', $url_array[$pos + 6]);
$limit = $url_array[$pos + 7];
$limitstart = $url_array[$pos + 8];
$QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&filter=$filter&limit=$limit&limitstart=$limitstart";
}
else
{
if (isset($url_array[$pos + 7]) && $url_array[$pos + 7] != '' && $url_array[$pos + 5] > 1000 && (in_array('archivecategory', $url_array) || in_array('archivesection', $url_array)))
{
// $option/$task/$id/$limit/$limitstart/year/month/module
$task = $url_array[$pos + 1];
$id = $url_array[$pos + 2];
$limit = $url_array[$pos + 3];
$limitstart = $url_array[$pos + 4];
$year = $url_array[$pos + 5];
$month = $url_array[$pos + 6];
$module = $url_array[$pos + 7];
$QUERY_STRING = "option=com_content&task=$task&id=$id&limit=$limit&limitstart=$limitstart&year=$year&month=$month&module=$module";
}
else
{
if (isset($url_array[$pos + 7]) && $url_array[$pos + 7] != '' && $url_array[$pos + 6] > 1000 && (in_array('archivecategory', $url_array) || in_array('archivesection', $url_array)))
{
// $option/$task/$id/$Itemid/$limit/$limitstart/year/month
$task = $url_array[$pos + 1];
$id = $url_array[$pos + 2];
$Itemid = $url_array[$pos + 3];
$limit = $url_array[$pos + 4];
$limitstart = $url_array[$pos + 5];
$year = $url_array[$pos + 6];
$month = $url_array[$pos + 7];
$QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart&year=$year&month=$month";
}
else
{
if (isset($url_array[$pos + 7]) && $url_array[$pos + 7] != '' && in_array('category', $url_array) && (strpos($url_array[$pos + 5], 'order,') !== false))
{
// $option/$task/$sectionid/$id/$Itemid/$order/$limit/$limitstart
$task = $url_array[$pos + 1];
$sectionid = $url_array[$pos + 2];
$id = $url_array[$pos + 3];
$Itemid = $url_array[$pos + 4];
$order = str_replace('order,', '', $url_array[$pos + 5]);
$limit = $url_array[$pos + 6];
$limitstart = $url_array[$pos + 7];
$QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&limit=$limit&limitstart=$limitstart";
}
else
{
if (isset($url_array[$pos + 6]) && $url_array[$pos + 6] != '')
{
// $option/$task/$sectionid/$id/$Itemid/$limit/$limitstart
$task = $url_array[$pos + 1];
$sectionid = $url_array[$pos + 2];
$id = $url_array[$pos + 3];
$Itemid = $url_array[$pos + 4];
$limit = $url_array[$pos + 5];
$limitstart = $url_array[$pos + 6];
$QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
}
else
{
if (isset($url_array[$pos + 5]) && $url_array[$pos + 5] != '')
{
// $option/$task/$id/$Itemid/$limit/$limitstart
$task = $url_array[$pos + 1];
$id = $url_array[$pos + 2];
$Itemid = $url_array[$pos + 3];
$limit = $url_array[$pos + 4];
$limitstart = $url_array[$pos + 5];
$QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
}
else
{
if (isset($url_array[$pos + 4]) && $url_array[$pos + 4] != '' && (in_array('archivecategory', $url_array) || in_array('archivesection', $url_array)))
{
// $option/$task/$year/$month/$module
$task = $url_array[$pos + 1];
$year = $url_array[$pos + 2];
$month = $url_array[$pos + 3];
$module = $url_array[$pos + 4];
$QUERY_STRING = "option=com_content&task=$task&year=$year&month=$month&module=$module";
}
else
{
if (!(isset($url_array[$pos + 5]) && $url_array[$pos + 5] != '') && isset($url_array[$pos + 4]) && $url_array[$pos + 4] != '')
{
// $option/$task/$sectionid/$id/$Itemid
$task = $url_array[$pos + 1];
$sectionid = $url_array[$pos + 2];
$id = $url_array[$pos + 3];
$Itemid = $url_array[$pos + 4];
$QUERY_STRING = "option=com_content&task=$task§ionid=$sectionid&id=$id&Itemid=$Itemid";
}
else
{
if (!(isset($url_array[$pos + 4]) && $url_array[$pos + 4] != '') && (isset($url_array[$pos + 3]) && $url_array[$pos + 3] != ''))
{
// $option/$task/$id/$Itemid
$task = $url_array[$pos + 1];
$id = $url_array[$pos + 2];
$Itemid = $url_array[$pos + 3];
$QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid";
}
else
{
if (!(isset($url_array[$pos + 3]) && $url_array[$pos + 3] != '') && (isset($url_array[$pos + 2]) && $url_array[$pos + 2] != ''))
{
// $option/$task/$id
$task = $url_array[$pos + 1];
$id = $url_array[$pos + 2];
$QUERY_STRING = "option=com_content&task=$task&id=$id";
}
else
{
if (!(isset($url_array[$pos + 2]) && $url_array[$pos + 2] != '') && (isset($url_array[$pos + 1]) && $url_array[$pos + 1] != ''))
{
// $option/$task
$task = $url_array[$pos + 1];
$QUERY_STRING = 'option=com_content&task=' . $task;
}
}
}
}
}
}
}
}
}
}
}
if ($lang != '')
{
$QUERY_STRING .= '&lang=' . $lang;
}
return $QUERY_STRING;
}
}
class sef_404
{
public function create($string, &$vars, &$shAppendString, $shLanguage, $shSaveString, &$originalUri)
{
// get our config objects
$pageInfo = Sh404sefFactory::getPageInfo();
$sefConfig = Sh404sefFactory::getConfig();
// get DB // backward compat, some plugins rely on having this object available in scope
$database = ShlDbHelper::getDb();
ShlSystem_Log::debug('sh404sef', 'Entering sef404 create function with ' . $string);
// extract request vars to have them readily available
ShlSystem_Log::debug('sh404sef', 'Extracting $vars:', print_r($vars, true));
extract($vars);
// maybe one of them interfere with the variable holding our result?
if (isset($title))
{ // V 1.2.4.r : protect against components using 'title' as GET vars
$sh404SEF_title = $title; // means that $sh404SEF_title has to be used in plugins or extensions
}
$title = array(); // V 1.2.4.r
// use custom method to find about correct plugin to use
// can be overwritten by a user plugin
$extPlugin = Sh404sefFactory::getExtensionPlugin($option);
// which plugin file are we supposed to use?
$extPluginPath = $extPlugin->getSefPluginPath($vars);
$pluginType = $extPlugin->getPluginType();
// various ways to handle various SEF url plugins
switch ($pluginType)
{
// use Joomla router.php file in extension dir
case Sh404sefClassBaseextplugin::TYPE_JOOMLA_ROUTER:
// Load the plug-in file.
ShlSystem_Log::debug('sh404sef', 'Loading component own router.php file');
$originalVars = empty($originalUri) ? $vars : $originalUri->getQuery($asArray = true);
$title = Sh404sefHelperUrl::buildUrlWithRouterphp($originalVars, $option);
$title = sh404sefHelperUrl::encodeSegments($title);
// manage GET var lists ourselves, as Joomla router.php does not do it
if (!empty($vars))
{
// there are some unused GET vars, we must transfer them to our mechanism, so
// that they are eventually appended to the sef url
foreach ($vars as $k => $v)
{
switch ($k)
{
case 'option':
case 'Itemid':
case 'lang':
shRemoveFromGETVarsList($k);
break;
default:
// if variable has not been used in sef url, add it to list of variables to be
// appended to the url as query string elements
if (array_key_exists($k, $originalVars))
{
shAddToGETVarsList($k, $v);
}
else
{
shRemoveFromGETVarsList($k);
}
break;
}
}
}
// special case for search component, as router.php encode the search word in the url
// we can't do that, as we are storing each url in the db
if ((isset($originalVars['option']) && $originalVars['option'] == 'com_search')
&& !empty($vars['searchword'])
)
{
// router.php has encoded that in the url, we need to undo
$title = array();
$originalVars['searchword'] = $vars['searchword'];
shAddToGETVarsList('searchword', $vars['searchword']);
if (!empty($vars['view']))
{
$vars['view'] = $vars['view'];
shAddToGETVarsList('view', $vars['view']);
}
}
// handle menu items, having only a single Itemid in the url
// (router.php will return an empty array in that case, even if we have restored
// the full non-sef url, as we already did)
/*
* Build the application route
*/
$tmp = '';
$prefix = shGetComponentPrefix($option);
$insertMenuIdForRouterPhp = in_array(str_replace('com_', '', $option), $sefConfig->useJoomlaRouterPhpWithItemid);
if (($insertMenuIdForRouterPhp || empty($title)) && isset($originalVars['Itemid']) && !empty($originalVars['Itemid']))
{
$menu = JFactory::getApplication()->getMenu('site');
$item = $menu->getItem($originalVars['Itemid']);
if (is_object($item) && $originalVars['option'] == $item->component)
{
array_unshift($title, $item->route);
}
}
if (empty($title) && empty($prefix))
{
$title[] = substr($originalVars['option'], 4);
}
// add user defined prefix
if (!empty($prefix))
{
array_unshift($title, $prefix);
}
// now process the resulting title string
$string = shFinalizePlugin(
$string, $title, $shAppendString, '',
(isset($limit) ? $limit : null), (isset($limitstart) ? $limitstart : null),
(isset($shLangName) ? $shLangName : null), (isset($showall) ? $showall : null),
$suppressPagination = true
);
break;
// use sh404sef plugins, either in ext. dir or in sh404sef dir
case Sh404sefClassBaseextplugin::TYPE_SH404SEF_ROUTER:
ShlSystem_Log::debug('sh404sef', 'Loading sh404SEF plugin in ' . $extPluginPath);
// get the current Itemid
$activeMenu = JFactory::getApplication()->getMenu('site')->getActive();
$shCurrentItemid = empty($activeMenu) ? '' : $activeMenu->id;
// build the URL
include $extPluginPath;
break;
// Joomsef plugins
case Sh404sefClassBaseextplugin::TYPE_JOOMSEF_ROUTER:
Sh404sefHelperExtplugins::loadJoomsefCompatLibs();
include_once $extPluginPath;
$className = 'SefExt_' . $option;
$plugin = new $className;
if (!shIsHomepage($string))
{
// make sure the plugin does not try to calculate pagination
$params = &SEFTools::GetExtParams('com_content');
$params->set('pagination', '1');
// ask plugin to build url
$plugin->beforeCreate($originalUri);
$result = $plugin->create($originalUri);
$title = empty($result['title']) ? array() : $result['title'];
$plugin->afterCreate($originalUri);
// make sure we have a url
if (empty($title) && isset($vars['Itemid']) && !empty($vars['Itemid']))
{
$menu = JFactory::getApplication()->getMenu('site');
$item = $menu->getItem($vars['Itemid']);
if (is_object($item) && $vars['option'] == $item->component)
{
$title[] = $item->route;
}
}
$prefix = shGetComponentPrefix($option);
if (!empty($prefix))
{
array_unshift($title, $prefix);
}
if (empty($title) && !shIsHomepage($string))
{
$title[] = substr($vars['option'], 4);
}
list($usedVars, $ignore) = $plugin->getNonSefVars($result);
if (!empty($ignore))
{
$usedVars = array_merge($usedVars, $ignore);
}
}
else
{
$string = '';
$title[] = '/';
$usedVars = array();
}
// post process result to adjust to our workflow
if (!empty($vars))
{
foreach ($vars as $key => $value)
{
if (!array_key_exists($key, $usedVars))
{
shRemoveFromGETVarsList($key);
}
}
}
// finalize url
$string = shFinalizePlugin(
$string, $title, $shAppendString = '', $shItemidString = '',
(isset($limit) ? $limit : null), (isset($limitstart) ? $limitstart : null),
(isset($shLangName) ? $shLangName : null), (isset($showall) ? $showall : null)
);
break;
// Acesef plugins
case Sh404sefClassBaseextplugin::TYPE_ACESEF_ROUTER:
Sh404sefHelperExtplugins::loadAcesefCompatLibs();
include_once $extPluginPath;
$className = 'AceSEF_' . $option;
$plugin = new $className;
$plugin->AcesefConfig = AcesefFactory::getConfig(); // some plugins appear to not call the constructor parent, and so AcesefConfig is not set
$tmp = JPluginHelper::getPlugin('sh404sefextacesef', $option);
$params = new JRegistry();
$params->loadString($tmp->params);
$plugin->setParams($params);
$segments = array();
$do_sef = true;
$metadata = array();
$item_limitstart = 0;
$plugin->beforeBuild($originalUri);
$originalVars = empty($originalUri) ? $vars : $originalUri->getQuery($asArray = true);
$plugin->build($originalVars, $title, $do_sef, $metadata, $item_limitstart);
$plugin->afterBuild($originalUri);
$prefix = shGetComponentPrefix($option);
if (empty($title) && isset($vars['Itemid']) && !empty($vars['Itemid']))
{
$menu = JFactory::getApplication()->getMenu('site');
$item = $menu->getItem($vars['Itemid']);
if (is_object($item) && $vars['option'] == $item->component)
{
$title[] = $item->route;
}
}
if (!empty($prefix))
{
array_unshift($title, $prefix);
}
if (empty($title) && !shIsHomepage($string))
{
$title[] = substr($vars['option'], 4);
}
// acesef plugin don't remove used vars from our GET var manager
// we'll do it now. Vars used are those not present anymore in
// $originalVars
// they will be reappended to the SEF url by shFinalizePlugin
$usedVars = array_diff($vars, $originalVars);
if (!empty($usedVars))
{
foreach ($usedVars as $key => $value)
{
shRemoveFromGETVarsList($key);
}
}
// remove Itemid and option, as these are not unset by plugin
shRemoveFromGETVarsList('Itemid');
shRemoveFromGETVarsList('option');
// finalize url
$string = shFinalizePlugin(
$string, $title, $shAppendString = '', $shItemidString = '',
(isset($limit) ? $limit : null), (isset($limitstart) ? $limitstart : null),
(isset($shLangName) ? $shLangName : null), (isset($showall) ? $showall : null)
);
break;
default:
ShlSystem_Log::debug('sh404sef', 'Falling back to sefGetLocation');
if (empty($sefConfig->defaultComponentStringList[str_replace('com_', '', $option)]))
{
$title[] = getMenuTitle($option, (isset($task) ? $task : null), null, null, $shLanguage);
}
else
{
$title[] = $sefConfig->defaultComponentStringList[str_replace('com_', '', $option)];
}
if ($title[0] != '/')
{
$title[] = '/'; // V 1.2.4.q getMenuTitle can now return '/'
}
if (count($title) > 0)
{
// V 1.2.4.q use $shLanguage insted of $lang (lang name rather than lang code)
$string = sef_404::sefGetLocation($string, $title, (isset($task) ? $task : null), (isset($limit) ? $limit : null), (isset($limitstart) ? $limitstart : null), (isset($shLanguage) ? $shLanguage : null));
}
break;
}
// hook
/**
* Filter the SEF URL as built by the component-specific sh404SEF plugin.
*
* @api
* @package sh404SEF\filter\router
* @var sh404sef_after_plugin_build
* @since 4.9.2
*
* @param string $string The computed SEF URL.
* @param array $vars Associate array of query vars used to build the SEF.
* @param int $pluginType Plugin type: native sh404SEF, Joomsef, Acesef,...
* @param string $extPluginPath The full path to the plugin used to build the URL.
*
* @return string
*/
$string = ShlHook::filter('sh404sef_after_plugin_build', $string, $vars, $pluginType, $extPluginPath);
return $string;
}
function revert(&$url_array, $pos)
{
die('voluntary die in ' . __METHOD__ . ' of class ' . __CLASS__);
}
public static function getContentTitles($view, $id, $layout, $Itemid = 0, $shLang = null, $sefConfig = null)
{
// if config is not injected, get default one
if (is_null($sefConfig))
{
$sefConfig = &Sh404sefFactory::getConfig();
}
$title = self::getContentSlugsArray($view, $id, $layout, $Itemid, $shLang, $sefConfig);
return $title;
}
public static function getContentSlugsArray($view, $id, $layout, $Itemid = 0, $shLang = null, $sefConfig = null)
{
$slugsArray = array();
$prefixArray = array();
// if config is not injected, get default one
if (is_null($sefConfig))
{
$sefConfig = Sh404sefFactory::getConfig();
}
$id = empty($id) ? 0 : intval($id);
$requestedLanguage = empty($shLang) ? '*' : $shLang;
try
{
$slugsModel = Sh404sefModelSlugs::getInstance();
$menuItemTitle = getMenuTitle(null, $view, (isset($Itemid) ? $Itemid : null), '', $shLang);
$uncategorizedPath = $sefConfig->slugForUncategorizedContent == shSEFConfig::COM_SH404SEF_UNCATEGORIZED_EMPTY ? '' : $menuItemTitle;
switch ($view)
{
case 'category':
if (empty($layout) || $layout == 'default')
{
if (!empty($Itemid))
{
$menuItem = \Joomla\CMS\Factory::getApplication()->getMenu('site')->getItem($Itemid);
}
if (!empty($menuItem)
&& $menuItem->component == 'com_content'
&& isset($menuItem->query['view'], $menuItem->query['id'])
&& $menuItem->query['view'] == 'category'
&& $menuItem->query['id'] == $id)
{
if (isset($menuItem->query['layout']))
{
$layout = $menuItem->query['layout'];
}
}
if (empty($layout))
{
$categories = JCategories::getInstance('content', $options = array('access' => false, 'published' => 0));
$category = $categories->get($id);
if (empty($category))
{
$layout = 'default';
}
else
{
$cparams = $category->getParams();
$app = JFactory::getApplication();
$category->params = $app->isClient('site')
? clone $app->getParams()
: self::backendFallbackGetParams('com_content', $app);
$category->params->merge($cparams);
$paramsLayout = $category->params->get('category_layout');
if (wbContains($paramsLayout, ':'))
{
$temp = explode(':', $paramsLayout);
$layout = $temp[1];
}
else
{
$layout = $paramsLayout;
}
}
}
}
if ($layout != 'blog')
{
if ($sefConfig->shInsertContentTableName)
{
$prefix = empty($sefConfig->shContentTableName) ? $menuItemTitle : $sefConfig->shContentTableName;
if (!empty($prefix))
{
$prefixArray[] = $prefix;
}
}
if (!empty($id))
{ // we have a category id
$slugsArray = $slugsModel->getCategorySlugArray('com_content', $id, $sefConfig->includeContentCatCategories, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage);
}
else
{ // no category id, use menu item title
if (!$sefConfig->shInsertContentTableName || empty($sefConfig->shContentTableName))
{
if (!empty($menuItemTitle))
{
$slugsArray[] = $menuItemTitle;
}
}
}
}
if ($layout == 'blog')
{ // blog category
if ($sefConfig->shInsertContentBlogName)
{
$prefix = empty($sefConfig->shContentBlogName) ? $menuItemTitle : $sefConfig->shContentBlogName;
if (!empty($prefix))
{
$prefixArray[] = $prefix;
}
}
if (!empty($id))
{
$slugsArray = $slugsModel->getCategorySlugArray('com_content', $id, $sefConfig->includeContentCatCategories, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage);
}
else
{ // this should not happen, probably a malformed url
if (!$sefConfig->shInsertContentBlogName || empty($sefConfig->shContentBlogName))
{
if (!empty($menuItemTitle))
{
$slugsArray[] = $menuItemTitle;
}
}
}
}
if (!empty($prefixArray))
{
$slugsArray = array_merge($prefixArray, $slugsArray);
}
$slugsArray[] = '/';
break;
case 'categories':
// now get category(ies) path
if (!empty($id))
{
$slugsArray = $slugsModel->getCategorySlugArray('com_content', $id, $sefConfig->includeContentCatCategories, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage);
// insert a suffix to distinguish from normal category listing
if (!empty($sefConfig->contentCategoriesSuffix))
{
$slugsArray[] = $sefConfig->contentCategoriesSuffix;
}
// end with a directory sign
$slugsArray[] = '/';
}
else
{
if (!empty($menuItemTitle))
{
$slugsArray[] = $menuItemTitle;
}
}
break;
case 'featured' :
if (!empty($menuItemTitle))
{
$slugsArray[] = $menuItemTitle;
}
break;
case 'article':
$article = $slugsModel->getArticle($id);
$language = $requestedLanguage;
if (empty($article[$requestedLanguage]))
{
$language = '*';
}
// still no luck, use whatever is available
if (empty($article[$language]))
{
$languages = array_keys($article);
$language = array_shift($languages);
}
// get category(ies)
// special case for the "uncategorised" category
$unCat = Sh404sefHelperCategories::getUncategorizedCat('com_content');
if (!empty($unCat) && $article[$language]->catid == $unCat->id)
{
$slugsArray = empty($uncategorizedPath) ? array() : array($uncategorizedPath);
}
else
{
$slugsArray = $slugsModel->getCategorySlugArray('com_content', $article[$language]->catid, $sefConfig->includeContentCat, $sefConfig->useCatAlias, $insertId = false, $uncategorizedPath, $requestedLanguage);
}
// get article slug, optionnally including article id inurl
$insertIdCatList = $sefConfig->ContentTitleInsertArticleId ? $sefConfig->shInsertContentArticleIdCatList : array();
$articleSlug = $slugsModel->getArticleSlug($id, $sefConfig->UseAlias, $sefConfig->ContentTitleInsertArticleId, $insertIdCatList, $requestedLanguage);
$slugsArray[] = $articleSlug;
break;
default :
break;
}
}
catch (Exception $e)
{
ShlSystem_Log::error('sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage());
}
return $slugsArray;
}
/**
* Get the application parameters
*
* @param string $option The component option
*
* @return Registry The parameters object
*
* @since 3.2
*/
public static function backendFallbackGetParams($option, $app)
{
static $params = array();
$hash = '__default';
if (!empty($option))
{
$hash = $option;
}
if (!isset($params[$hash]))
{
// Get new instance of component global parameters
$params[$hash] = clone ComponentHelper::getParams($option);
// Get menu parameters
$menus = $app->getMenu();
$menu = $menus->getActive();
// Get language
$lang_code = $app->getLanguage()->getTag();
$languages = \JLanguageHelper::getLanguages('lang_code');
$title = $app->get('sitename');
if (isset($languages[$lang_code]) && $languages[$lang_code]->metadesc)
{
$description = $languages[$lang_code]->metadesc;
}
else
{
$description = $app->get('MetaDesc');
}
$rights = $app->get('MetaRights');
$robots = $app->get('robots');
// Retrieve com_menu global settings
$temp = clone ComponentHelper::getParams('com_menus');
// Lets cascade the parameters if we have menu item parameters
if (is_object($menu))
{
// Get show_page_heading from com_menu global settings
$params[$hash]->def('show_page_heading', $temp->get('show_page_heading'));
$params[$hash]->merge($menu->params);
$title = $menu->title;
}
else
{
// Merge com_menu global settings
$params[$hash]->merge($temp);
// If supplied, use page title
$title = $temp->get('page_title', $title);
}
$params[$hash]->def('page_title', $title);
$params[$hash]->def('page_description', $description);
$params[$hash]->def('page_rights', $rights);
$params[$hash]->def('robots', $robots);
}
return $params[$hash];
}
/**
*
* @param string $url
* @param array $title
* @param string $task
* @param int $limit
* @param int $limitstart
*
* @return sefurl
*/
public static function sefGetLocation(
$nonSefUrl, &$title, $task = null, $limit = null
, $limitstart = null, $langParam = null, $showall = null, $suppressPagination = false
)
{
try
{
$pageInfo = Sh404sefFactory::getPageInfo();
$sefConfig = Sh404sefFactory::getConfig();
$lang = empty($langParam) ? $pageInfo->currentLanguageTag : $langParam;
// shumisha : try to avoid duplicate content on multilingual sites by always adding &lang=xx to url (stored in DB).
// warning : must add &lang=xx only if it does not exists already
if (!strpos($nonSefUrl, 'lang='))
{
$shSepString = (substr($nonSefUrl, -9) == 'index.php' ? '?' : '&');
$nonSefUrl .= $shSepString . 'lang=' . Sh404sefHelperLanguage::getUrlCodeFromTag($lang);
}
// make sure url is consistent
$nonSefUrl = str_replace('&', '&', $nonSefUrl);
// detect multipage homepage
$shMultiPageHomePageFlag = shIsHomepage($nonSefUrl);
// get all the slugs ready for being urls bits
$tempSefUrl = array();
foreach ($title as $titlestring)
{
$decodedTitletring = urldecode($titlestring);
$tempSefUrl[] = titleToLocation($decodedTitletring);
}
// now build the URL
$tempSefUrl = implode("/", $tempSefUrl);
// remove duplicate /
$tempSefUrl = ShlSystem_Strings::pr('/\/{2,}/u', '/', $tempSefUrl);
// and truncate to max length, according to param
$tempSefUrl = JString::substr($tempSefUrl, 0, sh404SEF_MAX_SEF_URL_LENGTH); // trim to max length V 1.2.4.t
/**
* Filter the SEF URL just before any pagination info is added and URL stored to db.
*
* @api
* @package sh404SEF\filter\router
* @var sh404sef_url_before_store
* @since 4.21.1
*
* @param string $string The computed SEF URL.
* @param array $vars Associate array of query vars used to build the SEF.
*
* @return string
*/
$tempSefUrl = ShlHook::filter(
'sh404sef_url_before_store',
$tempSefUrl,
$nonSefUrl
);
// if URL is empty, and unless this is a paginated home page, or home page in non-default language, stop there
if (empty($tempSefUrl))
{
if ((empty($pageInfo->isMultilingual) || ($pageInfo->isMultilingual && shIsDefaultlang($lang))) && !$sefConfig->addFile
&& !$shMultiPageHomePageFlag
) //
{
return '';
} // if location is empty, and not multilingual site, or multilingual, but this is default language, then there is nothing to add to url
}
// we have a valid SEF url, built with the data ($title) sent
// by plugin. Now we want to check if it's already in the db
// and add it if not
// first, we search the memory cache for the non-sef url
// as it is faster than looking up the db
$finalSefUrl = '';
$sefUrlType = Sh404sefHelperCache::getSefUrlFromCache($nonSefUrl, $finalSefUrl);
// if non-sef was not found in cache - or found, but it was a 404 last time we saw it -
// we should continue and try adding it
if ($sefUrlType == sh404SEF_URLTYPE_NONE || $sefUrlType == sh404SEF_URLTYPE_404)
{
$finalSefUrl = false;
// non-sef was not found in cache, let's look up the database
if ($sefUrlType == sh404SEF_URLTYPE_NONE)
{
$finalSefUrl = ShlDbHelper::selectResult('#__sh404sef_urls', 'oldurl', array('newurl' => $nonSefUrl));
}
// we found the sef url in database, we're done
if (!empty($finalSefUrl))
{
return $finalSefUrl;
}
// the non-sef url is not in memory cache, nor in database
// that's a new one, we need to finalize its sef (add pagination and language information)
// After finalizing it, we'll also check that sef is not in the db
// as it can already be there, associated with another non-sef (ie: a duplicate)
// Either way we'll add it in the db, but mark it as a duplicate if needed
// add pagination information, unless we were instructed by extension plugin not to
// find if we should separate pagination info from sef with a / or not
if (!empty($tempSefUrl))
{
$shSeparator = (JString::substr($tempSefUrl, -1) == '/') ? '' : '/';
}
else
{
$shSeparator = '';
}
$finalSefUrl = shAddPaginationInfo($limit, $limitstart, $showall, 1, $nonSefUrl, $tempSefUrl, $shSeparator, $defaultListLimitValue = null, $suppressPagination);
// if home page, we don't record anything, just return "home page"
if ($shMultiPageHomePageFlag && ('/' . $finalSefUrl == $tempSefUrl) // if homepage
&& (empty($pageInfo->isMultilingual) // and not multilingual
|| ($pageInfo->isMultilingual // or multilingual
&& shIsDefaultLang($lang))) // but this is default language
)
{
// this is start page of multipage homepage, return home or forced home
if (!empty($sefConfig->shForcedHomePage))
{
return str_replace($pageInfo->getDefaultFrontLiveSite() . '/', '', $sefConfig->shForcedHomePage);
}
else
{
return '';
}
}
// add language information
// first, remove languages in non-sef, to see if we're on homepage
// as handling is sligthly different for homepage
$v1 = shCleanUpLang($nonSefUrl);
$v2 = shCleanUpLang($pageInfo->homeLink);
if ($v1 == $v2 || $v1 == 'index.php')
{ // check if this is homepage
if ($pageInfo->isMultilingual && !shIsDefaultLang($lang))
{
// if homepage in not-default-language, then add language code regardless of user settings
// as we otherwise would not be able to switch language on the frontpage
$finalSefUrl = Sh404sefHelperLanguage::getUrlCodeFromTag($lang) . '/';
}
else
{
$finalSefUrl = '';
}
}
else
{
// not on homepage, insert lang code based on user setting
$option = Sh404sefHelperUrl::getUrlVar($nonSefUrl, 'option', '');
if (shInsertIsoCodeInUrl($option, $lang))
{ // insert language code based on param
// pass URL lang info, as may not be current lang
$finalSefUrl = Sh404sefHelperLanguage::getUrlCodeFromTag($lang) . '/' . $finalSefUrl; // must be forced lang, not default
}
}
// after adding pagination part of SEF, and adding language code
// the new SEF url is now complete and we can try adding to it cache and db
if ($finalSefUrl != '')
{
$dburl = null;
$dbUrlId = null;
$nonSefUrlType = sh404SEF_URLTYPE_NONE;
// search the memory cache for this new sef
if ($sefConfig->shUseURLCache)
{
$nonSefUrlType = Sh404sefHelperCache::getNonSefUrlFromCache($finalSefUrl, $dburl);
}
$newMaxRank = 0;
// if the new SEF was not found in memory cache, or if it was found but
// we're set to record duplicates, we search for it in the database
if ($sefConfig->shRecordDuplicates || $nonSefUrlType == sh404SEF_URLTYPE_NONE)
{
$dbUrlList = ShlDbHelper::selectObjectList(
'#__sh404sef_urls', array('id', 'newurl', 'rank', 'dateadd')
, array('oldurl' => $finalSefUrl)
, $aWhereData = array()
, $orderBy = array('rank')
);
if (count($dbUrlList) > 0)
{
$dburl = $dbUrlList[0]->newurl;
$dbUrlId = $dbUrlList[0]->id;
if (empty($dburl))
{ // V 1.2.4.t url was found in DB, but was a 404
$nonSefUrlType = sh404SEF_URLTYPE_404;
}
else
{
$newMaxRank = $dbUrlList[count($dbUrlList) - 1]->rank + 1;
$nonSefUrlType = $dbUrlList[0]->dateadd == '0000-00-00' ?
sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM;
}
}
}
if ($nonSefUrlType != sh404SEF_URLTYPE_NONE && $nonSefUrlType != sh404SEF_URLTYPE_404)
{
// we found the SEF, one or more times in the db, in records which do have a non-sef attached
$isDuplicate = $dburl != $nonSefUrl;
// This is a duplicate so we must indert it with incremented rank;
if (is_null($dburl) || ($isDuplicate && $sefConfig->shRecordDuplicates))
{
// shAddSefUrlToDBAndCache( $nonSefUrl, $finalSefUrl, ($isDuplicate ? $newMaxRank : 0), $nonSefUrlType);
$dateAdd = $nonSefUrlType == sh404SEF_URLTYPE_AUTO ? '0000-00-00' : date("Y-m-d");
$rank = $isDuplicate ? $newMaxRank : 0;
$finalSefUrl = ShlHook::filter(
'sh404sef_url_before_create',
$finalSefUrl,
$nonSefUrl,
$rank,
$dateAdd
);
ShlDbHelper::insert('#__sh404sef_urls', array(
'oldurl' => $finalSefUrl,
'newurl' => $nonSefUrl,
'rank' => $rank,
'dateadd' => $dateAdd
));
// store new sef/non-sef pair in memory cache
Sh404sefHelperCache::addSefUrlToCache($nonSefUrl, $finalSefUrl, $nonSefUrlType);
// store optional data
Sh404sefHelperUrl::storeUrlSourceData($nonSefUrl, $finalSefUrl, $rank);
// create shURL : get a shURL model, and ask url creation
$model = ShlMvcModel_Base::getInstance('pageids', 'Sh404sefModel');
$model->createPageId($finalSefUrl, $nonSefUrl);
}
}
else
{
// we haven't found the non-sef/sef pair, but maybe there is a record for
// a 404 with that SEF. If so, we will "upgrade" the 404 record to a
// normal non-sef/sef pair
$dbUrlId = empty($dbUrlId) ? 0 : intval($dbUrlId);
if ($sefConfig->shLog404Errors)
{
if ($nonSefUrlType == sh404SEF_URLTYPE_404 && !empty($dbUrlId))
{ // we already have seen that it is a 404
$id = $dbUrlId;
}
elseif ($nonSefUrlType == sh404SEF_URLTYPE_404)
{
$id = ShlDbHelper::selectResult('#__sh404sef_urls', 'id', array('oldurl' => $finalSefUrl, 'newurl' => ''));
}
else
{
$id = null;
}
}
else
{
$id = null; // if we are not logging 404 errors, then no need to check for
} // previous hit of this page.
if (!empty($id))
{
// we found a 404 record matching the SEF url just created. We'll update that record
// instead of creating a new one
// need to update dateadd to 0, as otherwise this sef/non-sef pair will be seen as custom
// this makes all such 404 errors 'disappear' from the 404 log, but no other solution
ShlDbHelper::updateIn(
'#__sh404sef_urls', array('newurl' => $nonSefUrl, 'dateadd' => '0000-00-00', 'cpt' => 0)
, 'id', array($id)
);
Sh404sefHelperCache::addSefUrlToCache($nonSefUrl, $finalSefUrl, sh404SEF_URLTYPE_AUTO);
// store optional data
Sh404sefHelperUrl::storeUrlSourceData($nonSefUrl, $finalSefUrl, $rank = 0);
}
else
{
// standard case: creation of a totally new sef/non-sef pair
/**
* Filter the SEF URL just before it's stored to the database.
*
* @api
* @package sh404SEF\filter\router
* @var sh404sef_url_before_create
* @since 4.9.2
*
* @param string $string The computed SEF URL.
* @param array $vars Associate array of query vars used to build the SEF.
* @param int $pluginType Plugin type: native sh404SEF, Joomsef, Acesef,...
* @param string $extPluginPath The full path to the plugin used to build the URL.
*
* @return string
*/
$finalSefUrl = ShlHook::filter(
'sh404sef_url_before_create',
$finalSefUrl,
$nonSefUrl,
0,
'0000-00-00'
);
ShlDbHelper::insert('#__sh404sef_urls', array(
'oldurl' => $finalSefUrl,
'newurl' => $nonSefUrl,
'rank' => 0,
'dateadd' => '0000-00-00'
));
// store new sef/non-sef pair in memory cache
Sh404sefHelperCache::addSefUrlToCache($nonSefUrl, $finalSefUrl, sh404SEF_URLTYPE_AUTO);
// store optional data
Sh404sefHelperUrl::storeUrlSourceData($nonSefUrl, $finalSefUrl, 0);
// create shURL : get a shURL model, and ask url creation
$model = ShlMvcModel_Base::getInstance('pageids', 'Sh404sefModel');
$model->createPageId($finalSefUrl, $nonSefUrl);
}
}
}
}
}
catch (Exception $e)
{
$finalSefUrl = '';
ShlSystem_Log::error('sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage());
}
return $finalSefUrl;
}
public static function getcategories($catid, $shLang = null, $section = '')
{
ShlSystem_Log::debug('sh404sef', 'Calling deprecated sef_404::getCategories() method. Use Sh404sefModelSlugs model instead.');
return '';
}
}