File Manager

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&sectionid=$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&sectionid=$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&sectionid=$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&sectionid=$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 .= '&amp;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('&amp;', '&', $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 ''; } }