Current Directory: /home/astoriaah/www/old15/components/com_sh404sef
Viewing File: /home/astoriaah/www/old15/components/com_sh404sef/sef_ext.php
<?php
/**
* sh404SEF - SEO extension for Joomla!
*
* @author Yannick Gaultier
* @copyright (c) Yannick Gaultier 2014
* @package sh404SEF
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @version 4.4.4.1791
* @date 2014-07-01
*/
// Security check to ensure this file is being included by a parent file.
if (!defined('_JEXEC')) die('Direct Access to this location is not allowed.');
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':
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 = '';
if (empty($title) && isset($vars['Itemid']) && !empty($vars['Itemid'])) {
$menu = JFactory::getApplication()->getMenu();
$item = $menu->getItem($vars['Itemid']);
if (is_object($item) && $vars['option'] == $item->component) {
$title[] = $item->route;
}
}
if(empty($title)) {
$title[] = substr($vars['option'], 4);
}
// add user defined prefix
$prefix = shGetComponentPrefix( $option);
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);
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();
$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();
$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;
}
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();
// if config is not injected, get default one
if (is_null( $sefConfig)) {
$sefConfig = & Sh404sefFactory::getConfig();
}
$id = empty( $id) ? 0 : intval($id);
// TODO: this will not work when we have Joomfish (probably). With JF, default should be
// $shLang = empty($shLang) ? $shPageInfo->currentLanguageTag : $shLang; ??
$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 != '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;
}
}
}
} else { // 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;
}
/**
*
* @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 {
$shPageInfo = & Sh404sefFactory::getPageInfo();
$sefConfig = & Sh404sefFactory::getConfig();
$lang = empty($langParam) ? $shPageInfo->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
// 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 ((!shIsMultilingual() || (shIsMultilingual() && 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
&& ( !shIsMultilingual() // and not multilingual
|| ( shIsMultilingual() // 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( $shPageInfo->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( $shPageInfo->homeLink);
if ($v1 == $v2 || $v1 == 'index.php') { // check if this is homepage
if (shIsMultilingual() && !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");
ShlDbHelper::insert( '#__sh404sef_urls', array( 'oldurl' => $finalSefUrl, 'newurl' => $nonSefUrl, 'rank' => ($isDuplicate ? $newMaxRank : 0), 'dateadd' => $dateAdd));
// store new sef/non-sef pair in memory cache
Sh404sefHelperCache::addSefUrlToCache( $nonSefUrl, $finalSefUrl, $nonSefUrlType);
// 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')
, 'id', array( $id));
Sh404sefHelperCache::addSefUrlToCache( $nonSefUrl, $finalSefUrl, sh404SEF_URLTYPE_AUTO);
} else {
// standard case: creation of a totally new sef/non-sef pair
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);
// 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 '';
}
}