public function loadHomepages() { $app = JFactory::getApplication(); if ($app->isAdmin()) { return; } // store default links in each language $defaultLanguage = shGetDefaultLang(); jimport('joomla.language.helper'); $languages = JLanguageHelper::getLanguages(); $menu = JFactory::getApplication()->getMenu(); foreach ($languages as $language) { $menuItem = $menu->getDefault($language->lang_code); if (!empty($menuItem)) { $this->homeLinks[$language->lang_code] = $this->_prepareLink($menuItem, $languages); } } // save default link $this->homeLink = $this->homeLinks[$defaultLanguage]; // find about the "All" languages home link $menuItem = $menu->getDefault('*'); if (!empty($menuItem)) { $this->allLangHomeLink = $this->_prepareLink($menuItem, $languages); } }
/** * Save a list of meta data as entered by user in backend to the database * * @param string $metaData an array of meta key/meta value from user. Also include nonsef url * * @return boolean true on success */ public function save($metaDatas) { $this->_db =& JFactory::getDBO(); $row =& JTable::getInstance($this->_defaultTable, 'Sh404sefTable'); // attach incoming data to table object $status = $row->bind($metaDatas); // add language code if missing, except on home page if ($status && $row->newurl != sh404SEF_HOMEPAGE_CODE && !preg_match('/(&|\\?)lang=[a-zA-Z]{2,3}/iU', $row->newurl)) { // no lang string, let's add default $shTemp = explode('-', shGetDefaultLang()); $shLangTemp = $shTemp[0] ? $shTemp[0] : 'en'; $row->newurl .= '&lang=' . $shLangTemp; } // sort url params, except on home page if ($status && $row->newurl != sh404SEF_HOMEPAGE_CODE) { $row->newurl = shSortUrl($row->newurl); } // pre-save checks $status = $status && $row->check(); // save the changes $status = $status && $row->store(); // store error message if (!$status) { $error = $row->getError(); $this->setError($error); } // return true if no error $errors = $this->getError(); return empty($errors); }
/** * Save a list of meta data as entered by user in backend to the database * * @param string $metaData an array of meta key/meta value from user. Also include nonsef url * @return boolean true on success */ public function save($metaDatas) { $this->_db =& JFactory::getDBO(); $row =& JTable::getInstance($this->_defaultTable, 'Sh404sefTable'); // only save if there is actually some metas data // at least on new records $metas = ''; foreach ($metaDatas as $key => $value) { if ($key != 'meta_id' && (substr($key, 0, 4) == 'meta' || substr($key, 0, 3) == 'fb_' || substr($key, 0, 3) == 'og_' || $key == 'canonical')) { $metas .= $value; } } // if there is no meta data entered, don't save if (!empty($metas) && $metas == SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT) { if (!empty($metaDatas['id'])) { // there is an existing record, meta data was cleared by user, we can delete the record altogether try { Sh404sefHelperDb::delete('#__sh404sef_metas', array('id' => $metaDatas['id'])); return true; } catch (Sh404sefExceptionDefault $e) { $this->setError($e->getMessage()); return false; } } // in any case, don't save anything return true; } $status = true; // load pre-existing values if (!empty($metaDatas['id'])) { $status = $row->load($metaDatas['id']); } // attach incoming data to table object $status = $status && $row->bind($metaDatas); // add language code if missing, except on home page if ($status && $row->newurl != sh404SEF_HOMEPAGE_CODE && !preg_match('/(&|\\?)lang=[a-zA-Z]{2,3}/iU', $row->newurl)) { // no lang string, let's add default $shTemp = explode('-', shGetDefaultLang()); $shLangTemp = $shTemp[0] ? $shTemp[0] : 'en'; $row->newurl .= '&lang=' . $shLangTemp; } // sort url params, except on home page if ($status && $row->newurl != sh404SEF_HOMEPAGE_CODE) { $row->newurl = shSortUrl($row->newurl); } // pre-save checks $status = $status && $row->check(); // save the changes $status = $status && $row->store(); // store error message if (!$status) { $error = $row->getError(); $this->setError($error); } // return true if no error $errors = $this->getError(); return empty($errors); }
/** * Vul in de array $title de onderdelen waaruit de link moet bestaan * Bijvoorbeeld: menuitem, categorie, itemnaam * Deze functie last de boel aan elkaar * * @param string $url * @param array $title * @param string $task * @param int $limit * @param int $limitstart * @return sefurl */ function sefGetLocation($url, &$title, $task = null, $limit = null, $limitstart = null, $langParam = null, $showall = null) { global $shMosConfig_locale, $option, $shHomeLink; $sefConfig =& shRouter::shGetConfig(); // get DB $database =& JFactory::getDBO(); $lang = empty($langParam) ? $shMosConfig_locale : $langParam; // V 1.2.4.k added homepage check : needed in case homepage is not com_frontpage if (empty($shHomeLink)) { $menu =& shRouter::shGetMenu(); $shHomePage =& $menu->getDefault(); if ($shHomePage) { if (substr($shHomePage->link, 0, 9) == 'index.php' && !preg_match('/Itemid=[0-9]*/', $shHomePage->link)) { // and it does not have an Itemid $shHomePage->link .= ($shHomePage->link == 'index.php' ? '?' : '&') . 'Itemid=' . $shHomePage->id; // then add itemid } $shHomeLink = $shHomePage->link; //$shHomeLink = 'index.php'; if (!strpos($shHomeLink, 'lang=')) { $shDefaultIso = shGetIsoCodeFromName(shGetDefaultLang()); $shSepString = substr($shHomeLink, -9) == 'index.php' ? '?' : '&'; $shHomeLink .= $shSepString . 'lang=' . $shDefaultIso; } $shHomeLink = shSortUrl($shHomeLink); // $homeLink has lang info, whereas $homepage->link may or may not } } // shumisha : try to avoid duplicate content when using Joomfish by always adding &lang=xx to url (stored in DB). // warning : must add &lang=xx only if it does not exists already, which happens for the joomfish language selection modules or search results if (!strpos($url, 'lang=')) { $shSepString = substr($url, -9) == 'index.php' ? '?' : '&'; $url .= $shSepString . 'lang=' . shGetIsoCodeFromName($lang); } // shumisha end of fix //shorten the url for storage and for consistancy $url = str_replace('&', '&', $url); // V 1.2.4.q detect multipage homepage $shMultiPageHomePageFlag = shIsHomepage($url); // get all the titles ready for urls $location = array(); foreach ($title as $titlestring) { // V 1.2.4.t removed array_filter as it prevents '0' values in URL $location[] = titleToLocation(urldecode($titlestring)); } $location = implode("/", $location); // V 1.2.4.t // V 1.2.4.t remove duplicate / $location = preg_replace('/\\/{2,}/', '/', $location); $location = JString::substr($location, 0, sh404SEF_MAX_SEF_URL_LENGTH); // trim to max length V 1.2.4.t // shumisha protect against querying for empty location if (empty($location)) { // V 1.2.4.t if ((!shIsMultilingual() || shIsMultilingual() && shIsDefaultlang($lang)) && !$sefConfig->addFile && !$shMultiPageHomePageFlag) { // V 1.2.4.q : need to go further and add pagination return ''; } } // if location is empty, and no Joomfish, or Joomfish but this is default language, then there is nothing to add to url before querying DB // shumisha end of change //check for non-sef url first and avoid repeative lookups //we only want to look for title variations when adding new //this should also help eliminate duplicates. // shumisha 2003-03-13 added URL Caching $realloc = ''; $urlType = Sh404sefHelperCache::getSefUrlFromCache($url, $realloc); if ($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) { // V 1.2.4.t // shumisha end of addition $realloc = false; if ($urlType == sh404SEF_URLTYPE_NONE) { $query = "SELECT oldurl from #__redirection WHERE newurl = " . $database->Quote($url); $database->setQuery($query); //if ($realloc = $database->loadResult()) { if ($shTemp = $database->loadObject()) { $realloc = $shTemp->oldurl; } } if ($realloc) { // found a match, so we aredone //Dat betekent dus, dat de functie create(), slecht gekozen is // shumisha : removed this die() that I do not understand! //die('regel292 in sef_ext.php'); // shumisha end of removal } else { // this is new, so we need to insert the new title. //Hier worden eindelijk de nieuwe links gemaakt $iteration = 1; $realloc = false; $prev_temploc = ''; do { // temploc is $location, unless we're on a second or greater iteration, // then its $location.$iteration if (!empty($location)) { $shSeparator = JString::substr($location, -1) == '/' ? '' : '/'; } else { $shSeparator = ''; } $temploc = shAddPaginationInfo($limit, $limitstart, $showall, $iteration, $url, $location, $shSeparator); // v 1.2.4.t // V 1.2.4.t if ($shMultiPageHomePageFlag && '/' . $temploc == $location && (!shIsMultilingual() || shIsMultilingual() && shIsDefaultLang($lang))) { // but this is default language // this is start page of multipage homepage, return home or forced home if (!empty($sefConfig->shForcedHomePage)) { // V 1.2.4.t return str_replace($GLOBALS['shConfigLiveSite'] . '/', '', $sefConfig->shForcedHomePage); } else { return ''; } } // V 1.2.4.k here we need to check for other-than-default-language homepage // remove lang $v1 = shCleanUpLang($url); // V 1.2.4.t $v2 = shCleanUpLang($shHomeLink); // V 1.24.t if ($v1 == $v2 || $v1 == 'index.php') { // check if this is homepage if (shIsMultilingual() && !shIsDefaultLang($lang)) { // V 1.2.4.m : insert language code based on param $temploc = shGetIsoCodeFromName($lang) . '/'; } else { $temploc = ''; } // if homepage in not-default-language, then add language code even if param says opposite // as we otherwise would not be able to switch language on the frontpage } else { if (shInsertIsoCodeInUrl($option, $lang)) { // V 1.2.4.m : insert language code based on param // V 1.2.4.q : pass URL lang info, as may not be current lang $temploc = shGetIsoCodeFromName($lang) . '/' . $temploc; // V 1.2.4.q must be forced lang, not default } } if ($temploc != '') { // see if we have a result for this location // V 1.2.4.r without mod_rewrite $temploc = shAdjustToRewriteMode($temploc); $sql = "SELECT id, newurl, rank, dateadd FROM #__redirection WHERE oldurl = " . $database->Quote($temploc) . " ORDER BY rank ASC"; // V 1.2.4.q $database->setQuery($sql); if ($iteration > 9999) { //var_dump($sql); JError::raiseError(500, 'Too many pages :' . $temploc . '##'); } $dburl = null; // V 1.2.4.t initialize $dburl to avoid notices error if cache disabled $dbUrlId = null; // V 1.2.4.t $urlType = sh404SEF_URLTYPE_NONE; // shumisha 2007-03-13 added URL caching, check for various URL for same content if ($sefConfig->shUseURLCache) { $urlType = Sh404sefHelperCache::getNonSefUrlFromCache($temploc, $dburl); } $newMaxRank = 0; $shDuplicate = false; if ($sefConfig->shRecordDuplicates || $urlType == sh404SEF_URLTYPE_NONE) { // V 1.2.4.s $dbUrlList = $database->loadObjectList(); 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 $urlType = sh404SEF_URLTYPE_404; } else { $newMaxRank = $dbUrlList[count($dbUrlList) - 1]->rank + 1; $urlType = $dbUrlList[0]->dateadd == '0000-00-00' ? sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM; } } } if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { if ($dburl == $url) { // found the matching object // it probably should have been found sooner // but is checked again here just for CYA purposes // and to end the loop $realloc = $temploc; } else { $shDuplicate = true; } // else, didn't find it, increment and try again // shumisha added this to close the loop if working on frontpage // as domain.tld/index.php?lang=xx and domain.tld/index.php?option=com_frontpage&Itemid=1&lang=xx both must end up in domain.tld/xx/ (if xx is not default language of course - in that case, they must endup in domain.tld) // this is true also if Joomfish is not installed and there is no language information in the url // V 1.2.4.q this is a duplicate so we must indert it with incremented rank; if ($shDuplicate && $sefConfig->shRecordDuplicates) { shAddSefUrlToDBAndCache($url, $temploc, $shDuplicate ? $newMaxRank : 0, $urlType); } $realloc = $temploc; // to close the loop // shumisha end of addition } else { //title not found, chechk 404 $dbUrlId = empty($dbUrlId) ? 0 : intval($dbUrlId); if ($sefConfig->shLog404Errors) { // V 1.2.4.m if ($urlType == sh404SEF_URLTYPE_404 && !empty($dbUrlId)) { // we already have seen that it is a 404 $id = $dbUrlId; // V 1.2.4.t } elseif ($urlType == sh404SEF_URLTYPE_404) { $query = "SELECT `id` FROM #__redirection WHERE `oldurl` = " . $database->Quote($temploc) . " AND `newurl` = ''"; $database->setQuery($query); $id = $database->loadResult(); } else { $id = null; } } else { $id = null; } // V 1.2.4.m if we are not logging 404 errors, then no need to check for // previous hit of this page. if (!empty($id)) { // V 1.2.4.q : need to update dateadd to 0, as otherwise this redir will be seen as a custom redir // this makes all such 404 errors 'disappear' from the 404 log, but no other solution $query = "UPDATE #__redirection SET `newurl` = " . $database->Quote($url) . ",`dateadd` = '0000-00-00' WHERE `id` = '{$id}'"; $database->setQuery($query); if (!$database->query()) { _log('error adding new sef url to db:' . $database->getErrorMsg()); //var_dump($query); } else { Sh404sefHelperCache::addSefUrlToCache($url, $temploc, sh404SEF_URLTYPE_AUTO); // v 1.2.4.t } } else { /* put it in the database */ shAddSefUrlToDBAndCache($url, $temploc, 0, sh404SEF_URLTYPE_AUTO); } $realloc = $temploc; } } $prev_temploc = $temploc; $iteration++; // shumisha allow loop exit if $temploc = '' (homepage) //} while (!$realloc); } while (!$realloc && $temploc != ''); } } // shumisha : enf of check if URL is in cache return $realloc; }
function shSefRelToAbs($string, $shLanguageParam, &$uri, &$originalUri) { global $_SEF_SPACE, $shMosConfig_lang, $shMosConfig_locale, $mainframe, $shGETVars, $shRebuildNonSef, $shHomeLink; _log('Entering shSefRelToAbs with ' . $string . ' | Lang = ' . $shLanguageParam); // if superadmin, display non-sef URL, for testing/setting up purposes if (sh404SEF_NON_SEF_IF_SUPERADMIN) { $user = JFactory::getUser(); if ($user->usertype == 'Super Administrator') { _log('Returning non-sef because superadmin said so.'); return 'index.php'; } } // return unmodified anchors if (JString::substr($string, 0, 1) == '#') { // V 1.2.4.t return $string; } $sefConfig =& shRouter::shGetConfig(); $shPageInfo =& shRouter::shPageInfo(); // Quick fix for shared SSL server : if https, switch to non sef $id = shGetURLVar($string, 'Itemid', JRequest::getInt('Itemid')); $secure = !empty($shPageInfo->shHttpsSave) || 'yes' == shGetMenuItemSsl($id); if ($secure && $sefConfig->shForceNonSefIfHttps) { _log('Returning shSefRelToAbs : Forced non sef if https'); return shFinalizeURL($string); } $database =& JFactory::getDBO(); $shOrigString = $string; $shMosMsg = shGetMosMsg($string); // V x 01/09/2007 22:45:52 $string = shCleanUpMosMsg($string); // V x 01/09/2007 22:45:52 // V x : removed shJoomfish module. Now we set $mosConfi_lang here $shOrigLang = $shMosConfig_locale; // save current language $shLanguage = shGetURLLang($string); // target language in URl is always first choice if (empty($shLanguage)) { $shLanguage = !empty($shLanguageParam) ? $shLanguageParam : $shMosConfig_locale; } // V 1.3.1 protect against those drop down lists if (strpos($string, 'this.options[selectedIndex].value') !== false) { $string .= '&lang=' . shGetIsoCodeFromName($shLanguage); return $string; } $shMosConfig_locale = $shLanguage; _log('Language used : ' . $shLanguage); // V 1.2.4.t workaround for old links like option=compName instead of option=com_compName if (strpos(strtolower($string), 'option=login') === false && strpos(strtolower($string), 'option=logout') === false && strpos(strtolower($string), 'option=&') === false && JString::substr(strtolower($string), -7) != 'option=' && strpos(strtolower($string), 'option=cookiecheck') === false && strpos(strtolower($string), 'option=') !== false && strpos(strtolower($string), 'option=com_') === false) { $string = str_replace('option=', 'option=com_', $string); } // V 1.2.4.k added homepage check : needed in case homepage is not com_frontpage if (empty($shHomeLink)) { // first, find out about homepage link, from DB. homepage is not always /index.php or similar // it can be a link to anything, a page, a component,... $menu =& shRouter::shGetMenu(); $shHomePage =& $menu->getDefault(); if ($shHomePage) { if (JString::substr($shHomePage->link, 0, 9) == 'index.php' && !preg_match('/Itemid=[0-9]*/', $shHomePage->link)) { // and it does not have an Itemid $shHomePage->link .= ($shHomePage->link == 'index.php' ? '?' : '&') . 'Itemid=' . $shHomePage->id; // then add itemid } $shHomeLink = $shHomePage->link; if (!strpos($shHomeLink, 'lang=')) { // V 1.2.4.q protect against not existing $shDefaultIso = shGetIsoCodeFromName(shGetDefaultLang()); $shSepString = JString::substr($shHomeLink, -9) == 'index.php' ? '?' : '&'; $shHomeLink .= $shSepString . 'lang=' . $shDefaultIso; } $shHomeLink = shSortUrl($shHomeLink); // $shHomeLink has lang info, whereas $homepage->link may or may not } _log('HomeLink = ' . $shHomeLink); } // V 1.2.4.j string to be appended to URL, but not saved to DB $shAppendString = ''; $shRebuildNonSef = array(); $shComponentType = ''; // V w initialize var to avoid notices if ($shHomeLink) { // now check URL against our homepage, so as to always return / if homepage $v1 = JString::ltrim(str_replace($GLOBALS['shConfigLiveSite'], '', $string), '/'); // V 1.2.4.m : remove anchor if any $v2 = explode('#', $v1); $v1 = $v2[0]; $shAnchor = isset($v2[1]) ? '#' . $v2[1] : ''; $shSepString = JString::substr($v1, -9) == 'index.php' ? '?' : '&'; $shLangString = $shSepString . 'lang=' . shGetIsoCodeFromName($shLanguage); if (!strpos($v1, 'lang=')) { $v1 .= $shLangString; } $v1 = str_replace('&', '&', shSortURL($v1)); // V 1.2.4.t check also without pagination info if (strpos($v1, 'limitstart=0') !== false) { // the page has limitstart=0 $stringNoPag = shCleanUpPag($v1); // remove paging info to be sure this is not homepage } else { $stringNoPag = null; } if ($v1 == $shHomeLink || $v1 == 'index.php' . $shLangString || $stringNoPag == $shHomeLink) { // V 1.2.4.t 24/08/2007 11:07:49 $shTemp = $v1 == $shHomeLink || shIsDefaultLang($shLanguage) ? '' : shGetIsoCodeFromName($shLanguage) . '/'; //10/08/2007 17:28:14 if (!empty($shMosMsg)) { // V x 01/09/2007 22:48:01 $shTemp .= '?' . $shMosMsg; } if (!empty($sefConfig->shForcedHomePage)) { // V 1.2.4.t $shTmp = $shTemp . $shAnchor; $ret = shFinalizeURL($sefConfig->shForcedHomePage . (empty($shTmp) ? '' : '/' . $shTmp)); if (empty($uri)) { // if no URI, append remaining vars directly to the string $ret .= $shAppendString; } else { shRebuildVars($shAppendString, $uri); } $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 1 with ' . $ret); return $ret; } else { $shRewriteBit = shIsDefaultLang($shLanguage) ? '/' : $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode]; $ret = shFinalizeURL($GLOBALS['shConfigLiveSite'] . $shRewriteBit . $shTemp . $shAnchor); if (empty($uri)) { // if no URI, append remaining vars directly to the string $ret .= $shAppendString; } else { shRebuildVars($shAppendString, $uri); } $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 2 with ' . $ret); return $ret; } } } $newstring = str_replace($GLOBALS['shConfigLiveSite'] . '/', '', $string); // check for url to same site, but with SSL : Joomla 1.5 does not allow it yet //$liveSiteSsl = str_replace('http://', 'https://', $GLOBALS['shConfigLiveSite']); //$newStringSsl = str_replace($liveSiteSsl.'/', '', $string); $letsGo = JString::substr($newstring, 0, 9) == 'index.php' && strpos($newstring, 'this.options[selectedIndex\\].value') === false; $letsGoSsl = false; if ($letsGo || $letsGoSsl) { // Replace & character variations. $string = str_replace(array('&', '&'), array('&', '&'), $letsGo ? $newstring : $newStringSsl); $newstring = $string; // V 1.2.4.q $shSaveString = $string; // warning : must add &lang=xx (only if it does not exists already), so as to be able to recognize the SefURL in the db if it's there if (!strpos($string, 'lang=')) { $shSepString = JString::substr($string, -9) == 'index.php' ? '?' : '&'; $anchorTable = explode('#', $string); // V 1.2.4.m remove anchor before adding language $string = $anchorTable[0]; $string .= $shSepString . 'lang=' . shGetIsoCodeFromName($shLanguage) . (!empty($anchorTable[1]) ? '#' . $anchorTable[1] : ''); // V 1.2.4.m then stitch back anchor } $URI = new sh_Net_URL($string); // V 1.2.4.l need to save unsorted URL if (count($URI->querystring) > 0) { // Import new vars here. $option = null; $task = null; //$sid = null; V 1.2.4.s // sort GET parameters to avoid some issues when same URL is produced with options not // in the same order, ie index.php?option=com_virtuemart&category_id=3&Itemid=2&lang=fr // Vs index.php?category_id=3&option=com_virtuemart&Itemid=2&lang=fr ksort($URI->querystring); // sort URL array $string = shSortUrl($string); // now we are ready to extract vars $shGETVars = $URI->querystring; extract($URI->querystring, EXTR_REFS); } if (empty($option)) { // V 1.2.4.r protect against empty $option : we won't know what to do $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 3 with ' . $shOrigString); return $shOrigString; } // get plugin associated with the extension $extPlugin =& Sh404sefFactory::getExtensionPlugin($option); // get component type $shComponentType = $extPlugin->getComponentType(); $shOption = str_replace('com_', '', $option); //list of extension we always skip $alwaysSkip = array('jce', 'akeeba'); if (in_array($shOption, $alwaysSkip)) { $shComponentType = Sh404sefClassBaseextplugin::TYPE_SKIP; } // V 1.2.4.s : fallback to to JoomlaSEF if no extension available // V 1.2.4.t : this is too early ; it prevents manual custom redirect to be checked agains the requested non-sef URL _log('Component type = ' . $shComponentType); // is there a named anchor attached to $string? If so, strip it off, we'll put it back later. if ($URI->anchor) { $string = str_replace('#' . $URI->anchor, '', $string); } // V 1.2.4.m // shumisha special homepage processing (in other than default language) if (shIsHomePage($string) || $string == 'index.php') { $sefstring = ''; $urlType = shGetSefURLFromCacheOrDB($string, $sefstring); // still use it so we need it both ways if (($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) && empty($showall) && (!empty($limit) || !isset($limit) && !empty($limitstart))) { $urlType = shGetSefURLFromCacheOrDB(shCleanUpPag($string), $sefstring); // V 1.2.4.t check also without page info //to be able to add pagination on custom //redirection or multi-page homepage if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { $sefstring = shAddPaginationInfo(@$limit, @$limitstart, @showall, 1, $string, $sefstring, null); // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); } // that's a new URL, so let's add it to DB and cache shAddSefUrlToDBAndCache($string, $sefstring, 0, $urlType); // created url must be of same type as original } if ($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) { require_once sh404SEF_FRONT_ABS_PATH . 'sef_ext.php'; $sef_ext = new sef_404(); // Rewrite the URL now. // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); //$URI->addQueryString( 'limit', $listLimit); } $urlVars = is_array($URI->querystring) ? array_map('urldecode', $URI->querystring) : $URI->querystring; $sefstring = $sef_ext->create($string, $urlVars, $shAppendString, $shLanguage, $shOrigString, $originalUri); // V 1.2.4.s added original string } } else { if ($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) { // not found but no $limit or $limitstart $sefstring = shGetIsoCodeFromName($shLanguage) . '/'; shAddSefUrlToDBAndCache($string, $sefstring, 0, sh404SEF_URLTYPE_AUTO); // create it } } // V 1.2.4.j : added $shAppendString to pass non sef parameters. For use with parameters that won't be stored in DB $ret = $GLOBALS['shConfigLiveSite'] . (empty($sefstring) ? '' : $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] . $sefstring); // not valid with 1.5 anymore ; //if (!empty($shMosMsg)) // V x 01/09/2007 22:48:01 // $ret .= (empty($shAppendString) || $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] == '/index.php?/' ? '?':'&').$shMosMsg; $ret = shFinalizeURL($ret); if (empty($uri)) { // if no URI, append remaining vars directly to the string $ret .= $shAppendString; } else { shRebuildVars($shAppendString, $uri); } $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 4 with ' . $ret); return $ret; } if (isset($option) && !($option == 'com_content' && @$task == 'edit') && strtolower($option) != 'com_sh404sef') { // V x 29/08/2007 23:19:48 // check also that option = com_content, otherwise, breaks some comp switch ($shComponentType) { case Sh404sefClassBaseextplugin::TYPE_SKIP: $sefstring = $shSaveString; // V 1.2.4.q : restore untouched URL, except anchor // which will be added later break; case Sh404sefClassBaseextplugin::TYPE_SIMPLE: /* case 'sh404SEFFallback': // v 1.2.4.t*/ // check for custom urls $sefstring = ''; $urlType = shGetSefURLFromCacheOrDB($string, $sefstring); // if no custom found, then build default url if ($urlType != sh404SEF_URLTYPE_CUSTOM) { // if not found then fall back to Joomla! SEF if (isset($URI)) { unset($URI); } $sefstring = 'component/'; $URI = new sh_Net_URL(shSortUrl($shSaveString)); if (count($URI->querystring) > 0) { foreach ($URI->querystring as $key => $value) { if (is_array($value)) { foreach ($value as $k => $v) { // fix for arrays, thanks doorknob $sefstring .= $key . '[' . $k . '],' . $v . '/'; } } else { $sefstring .= $key . ',' . $value . '/'; } } $sefstring = str_replace('option/', '', $sefstring); } } break; default: $sefstring = ''; // base case: $urlType = shGetSefURLFromCacheOrDB($string, $sefstring); // first special case. User may have customized paginated urls // this will be picked up by the line above, except if we're talking about // a category or section blog layout, where Joomla does not uses the correct // value for limit if (($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) && empty($showall) && (!empty($limit) || !isset($limit) && !empty($limitstart))) { if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $tmpString = shSetURLVar($string, 'limit', $listLimit); $tmpString = shSortUrl($tmpString); $urlType = shGetSefURLFromCacheOrDB($tmpString, $sefstring); if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { // we found a match with pagination info! $string = $tmpString; } } } // now let's try again without any pagination at all if (($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) && empty($showall) && (!empty($limit) || !isset($limit) && !empty($limitstart))) { $urlType = shGetSefURLFromCacheOrDB(shCleanUpPag($string), $sefstring); // search without pagination info if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { $sefstring = shAddPaginationInfo(@$limit, @$limitstart, @showall, 1, $string, $sefstring, null); // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); } // that's a new URL, so let's add it to DB and cache _log('Created url based on non paginated base url:' . $string); shAddSefUrlToDBAndCache($string, $sefstring, 0, $urlType); } } if ($urlType == sh404SEF_URLTYPE_NONE) { // If component has its own sef_ext plug-in included. $shDoNotOverride = in_array($shOption, $sefConfig->shDoNotOverrideOwnSef); if (shFileExists(sh404SEF_ABS_PATH . 'components/' . $option . '/sef_ext.php') && ($shDoNotOverride || !$shDoNotOverride && (!shFileExists(sh404SEF_ABS_PATH . 'components/com_sh404sef/sef_ext/' . $option . '.php') && !shFileExists(sh404SEF_ABS_PATH . 'components/' . $option . '/sef_ext/' . $option . '.php')))) { // Load the plug-in file. V 1.2.4.s changed require_once to include include_once sh404SEF_ABS_PATH . 'components/' . $option . '/sef_ext.php'; $_SEF_SPACE = $sefConfig->replacement; $comp_name = str_replace('com_', '', $option); $className = 'sef_' . $comp_name; $sef_ext = new $className(); // V x : added default string in params if (empty($sefConfig->defaultComponentStringList[$comp_name])) { $title[] = getMenuTitle($option, null, isset($Itemid) ? @$Itemid : null, null, $shLanguage); } else { $title[] = $sefConfig->defaultComponentStringList[$comp_name]; } // V 1.2.4.r : clean up URL BEFORE sending it to sef_ext files, to have control on what they do // remove lang information, we'll put it back ourselves later //$shString = preg_replace( '/(&|\?)lang=[a-zA-Z]{2,3}/iU' ,'', $string); // V 1.2.4.t use original non-sef string. Some sef_ext files relies on order of params, which may // have been changed by sh404SEF $shString = preg_replace('/(&|\\?)lang=[a-zA-Z]{2,3}/iU', '', $shSaveString); $finalstrip = explode("|", $sefConfig->stripthese); $shString = str_replace('&', '&', $shString); _log('Sending to own sef_ext.php plugin : ' . $shString); $sefstring = $sef_ext->create($shString); _log('Created by sef_ext.php plugin : ' . $sefstring); $sefstring = str_replace("%10", "%2F", $sefstring); $sefstring = str_replace("%11", $sefConfig->replacement, $sefstring); $sefstring = rawurldecode($sefstring); if ($sefstring == $string) { if (!empty($shMosMsg)) { // V x 01/09/2007 22:48:01 $string .= '?' . $shMosMsg; } $ret = shFinalizeURL($string); $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 5 with ' . $ret); return $ret; } else { // V 1.2.4.p : sef_ext extensions for opensef/SefAdvance do not always replace ' $sefstring = str_replace('\'', $sefConfig->replacement, $sefstring); // some ext. seem to html_special_chars URL ? $sefstring = str_replace(''', $sefConfig->replacement, $sefstring); // V w 27/08/2007 13:23:56 $sefstring = str_replace(' ', $_SEF_SPACE, $sefstring); $sefstring = str_replace(' ', '', (shInsertIsoCodeInUrl($option, $shLanguage) ? shGetIsoCodeFromName($shLanguage) . '/' : '') . titleToLocation($title[0]) . '/' . $sefstring . ($sefstring != '' ? $sefConfig->suffix : '')); if (!empty($sefConfig->suffix)) { $sefstring = str_replace('/' . $sefConfig->suffix, $sefConfig->suffix, $sefstring); } //$finalstrip = explode("|", $sefConfig->stripthese); $sefstring = str_replace($finalstrip, $sefConfig->replacement, $sefstring); $sefstring = str_replace($sefConfig->replacement . $sefConfig->replacement . $sefConfig->replacement, $sefConfig->replacement, $sefstring); $sefstring = str_replace($sefConfig->replacement . $sefConfig->replacement, $sefConfig->replacement, $sefstring); $suffixthere = 0; if (!empty($sefConfig->suffix) && strpos($sefstring, $sefConfig->suffix) !== false) { // V 1.2.4.s $suffixthere = strlen($sefConfig->suffix); } $takethese = str_replace("|", "", $sefConfig->friendlytrim); $sefstring = JString::trim(JString::substr($sefstring, 0, strlen($sefstring) - $suffixthere), $takethese); $sefstring .= $suffixthere == 0 ? '' : $sefConfig->suffix; // version u 26/08/2007 17:27:16 // V 1.2.4.m store it in DB so as to be able to use sef_ext plugins really ! $string = str_replace('&', '&', $string); // V 1.2.4.r without mod_rewrite $shSefString = shAdjustToRewriteMode($sefstring); // V 1.2.4.p check for various URL for same content $dburl = ''; // V 1.2.4.t prevent notice error $urlType = sh404SEF_URLTYPE_NONE; if ($sefConfig->shUseURLCache) { $urlType = Sh404sefHelperCache::getNonSefUrlFromCache($shSefString, $dburl); } $newMaxRank = 0; // V 1.2.4.s $shDuplicate = false; if ($sefConfig->shRecordDuplicates || $urlType == sh404SEF_URLTYPE_NONE) { // V 1.2.4.q + V 1.2.4.s+t $sql = "SELECT newurl, rank, dateadd FROM #__redirection WHERE oldurl = " . $database->Quote($shSefString) . " ORDER BY rank ASC"; $database->setQuery($sql); $dbUrlList = $database->loadObjectList(); if (count($dbUrlList) > 0) { $dburl = $dbUrlList[0]->newurl; $newMaxRank = $dbUrlList[count($dbUrlList) - 1]->rank + 1; $urlType = $dbUrlList[0]->dateadd == '0000-00-00' ? sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM; } } if ($urlType != sh404SEF_URLTYPE_NONE && $dburl != $string) { $shDuplicate = true; } $urlType = $urlType == sh404SEF_URLTYPE_NONE ? sh404SEF_URLTYPE_AUTO : $urlType; _log('Adding from sef_ext to DB : ' . $shSefString . ' | rank = ' . ($shDuplicate ? $newMaxRank : 0)); shAddSefUrlToDBAndCache($string, $shSefString, $shDuplicate ? $newMaxRank : 0, $urlType); } } else { $string = JString::trim($string, "&?"); // V 1.2.4.q a trial in better handling homepage articles if (shIsCurrentPageHome() && $option == 'com_content' && isset($task) && $task == 'view' && $sefConfig->guessItemidOnHomepage) { $string = preg_replace('/(&|\\?)Itemid=[^&]*/i', '', $string); // we remove Itemid, as com_content plugin $Itemid = null; // will hopefully do a better job at finding the right one unset($URI->querystring['Itemid']); unset($shGETVars['Itemid']); } require_once sh404SEF_FRONT_ABS_PATH . 'sef_ext.php'; $sef_ext = new sef_404(); // Rewrite the URL now. // V 1.2.4.s added original string // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); //$URI->addQueryString( 'limit', $listLimit); } $sefstring = $sef_ext->create($string, $URI->querystring, $shAppendString, $shLanguage, $shOrigString, $originalUri); _log('Created sef url from default plugin: ' . $sefstring); } } } // end of cache check shumisha if (isset($sef_ext)) { unset($sef_ext); } // V 1.2.4.j // V 1.2.4.r : checked for double // // V 1.2.4.r try sef without mod_rewrite $shRewriteBit = $shComponentType == Sh404sefClassBaseextplugin::TYPE_SKIP ? '/' : $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode]; if (strpos($sefstring, 'index.php') === 0) { $shRewriteBit = '/'; } // V 1.2.4.t bug #119 $string = $GLOBALS['shConfigLiveSite'] . $shRewriteBit . JString::ltrim($sefstring, '/') . ($URI->anchor ? "#" . $URI->anchor : ''); } else { // V x 03/09/2007 13:47:37 editing content $shComponentType = Sh404sefClassBaseextplugin::TYPE_SKIP; // will prevent turning & into & _log('shSefrelfToAbs: option not set, skipping'); } $ret = $string; // $ret = str_replace('itemid', 'Itemid', $ret); // V 1.2.4.t bug #125 _log('(1) Setting shSefRelToAbs return string as: ' . $ret); } if (!isset($ret)) { $ret = $string; _log('(2) Setting shSefRelToAbs return string as: ' . $ret); } //if (!empty($shMosMsg) && strpos($ret, $shMosMsg) === false) // V x 01/09/2007 23:02:00 // $ret .= (strpos( $ret, '?') === false || $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] == '/index.php?/'? '?':'&').$shMosMsg; $ret = $shComponentType == Sh404sefClassBaseextplugin::TYPE_DEFAULT ? shFinalizeURL($ret) : $ret; // V w 27/08/2007 13:21:28 _log('(3) shSefRelToAbs return string after shFinalize: ' . $ret); if (empty($uri) || $shComponentType == Sh404sefClassBaseextplugin::TYPE_SKIP) { // we don't have a uri : we must be doing a redirect from non-sef to sef or similar $ret .= $shAppendString; // append directly to url _log('(4) shSefRelToAbs return string after appendString: ' . $ret); } else { if (empty($sefstring) || !empty($sefstring) && strpos($sefstring, 'index.php') !== 0) { shRebuildVars($shAppendString, $uri); // instead, add to uri. Joomla will put everything together. Only do this if we have a sef url, and not if we have a non-sef _log('(5) shSefRelToAbs no sefstring, adding rebuild vars : ' . $shAppendString); } } $shMosConfig_locale = $shOrigLang; _log('shSefRelToAbs: finally returning: ' . $ret); return $ret; }
/** * Save an url to the database, updating various elements * at the same time like ranking of duplicates * * @param integer $type force url type, used when saving a custom url */ private function _saveUrl($type = sh404SEF_URLTYPE_AUTO) { // check for homepage handling if (!empty($this->_data['newurl']) && ($this->_data['newurl'] == '/' || $this->_data['newurl'] == sh404SEF_HOMEPAGE_CODE)) { $this->_saveHomeUrl(); return sh404SEF_HOMEPAGE_CODE; } // check for importing urls : if importing, rank will already be set in // incoming data. If saving a url from the UI, rank is never set // as it is caculated upon saving the url $importing = isset($this->_data['rank']); // get required tools jimport('joomla.database.table'); $row =& JTable::getInstance($this->_defaultTable, 'Sh404sefTable'); // now bind incoming data to table row if (!$row->bind($this->_data)) { $this->setError($row->getError()); return 0; } // pre-save checks if (!$row->check()) { $this->setError($row->getError()); return 0; } // must load cache from disk, so that it can be written back later, with new url require_once JPATH_ROOT . '/components/com_sh404sef/shCache.php'; shLoadURLCache(); // find if we are adding a custom or automatic url $urlType = $row->dateadd == '0000-00-00' ? sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM; // override with user supplied if (!empty($type)) { $urlType = $type; } // adjust date added field if needed if ($urlType == sh404SEF_URLTYPE_CUSTOM) { $row->dateadd = date("Y-m-d"); } // if custom url, and no language string, let's add default one if ($urlType == sh404SEF_URLTYPE_CUSTOM && !preg_match('/(&|\\?)lang=[a-zA-Z]{2,3}/iU', $row->newurl)) { $shTemp = explode('-', shGetDefaultLang()); $shLangTemp = $shTemp[0] ? $shTemp[0] : 'en'; $row->newurl .= '&lang=' . $shLangTemp; } // normalize the non-sef url representation, sorting query parts alphabetically $row->newurl = shSortUrl($row->newurl); // retrieve previous values of sef and non sef urls $previousSefUrl = JRequest::getVar('previousSefUrl', null, 'POST'); $previousNonSefUrl = JRequest::getVar('previousNonSefUrl', null, 'POST'); // if both were set, and nothing has changed, then nothing to do if (!empty($previousSefUrl) && !empty($previousNonSefUrl) && $previousNonSefUrl == $row->newurl && $previousSefUrl == $row->oldurl) { // nothing changed ! must be changing meta or aliases $this->_url = $row; return $row->id; } // search DB for urls pairs with same SEF url $query = 'SELECT * FROM #__redirection WHERE oldurl = ' . $this->_db->Quote($row->oldurl) . ' ORDER BY rank ASC'; $this->_db->setQuery($query); $dbUrlList = $this->_db->loadObjectList(); // do we have urls in the db with same SEF ? if (count($dbUrlList) > 0) { // yes we do // get config object $sefConfig = shRouter::shGetConfig(); if (!$sefConfig->shRecordDuplicates) { // we don't allow duplicates : reject this URL $this->setError(COM_SH404SEF_DUPLICATE_NOT_ALLOWED); } else { // same SEF, but we allow duplicates $existingRecord = null; // importing meta data for instance foreach ($dbUrlList as $urlInDB) { // same SEF, but is the incoming non-sef in this list of URl with same SEF ? if ($urlInDB->newurl == $row->newurl) { $existingRecord = $urlInDB; $this->setError(COM_SH404SEF_URLEXIST); } } if (empty($existingRecord)) { // this new non-sef does not already exists $shTemp = array('nonSefURL' => $row->newurl); // which means we must update the record for the old non-sef url Sh404sefHelperCache::removeURLFromCache($shTemp); // remove the old url from cache // then find new rank (as we are adding a duplicate, we add it at the end of the duplicate list) // but only if not importing. When importing, rank is already set if (!$importing) { $row->rank = $dbUrlList[count($dbUrlList) - 1]->rank + 1; } // store will create a new record if id=0, or update existing if id non 0 $row->store(); // put custom URL in DB and cache Sh404sefHelperCache::addSefUrlToCache($row->newurl, $row->oldurl, $urlType); // we must add the previous SEF url to the alias list, only if // - not already there // - this sef url does not already exists in the DB; which will happen if the url // being saved was customized and also had duplicates // TODO this code is duplicated just a few line below, need refactoring if (!empty($previousSefUrl) && strpos($this->_data['shAliasList'], $previousSefUrl) === false) { // check if not already a valid SEF url in the DB $query = 'SELECT count(id) FROM #__redirection WHERE oldurl = ' . $this->_db->Quote($previousSefUrl); $this->_db->setQuery($query); $isThere = $this->_db->loadResult(); if (empty($isThere)) { $this->_data['shAliasList'] .= $previousSefUrl . "\n"; } } } else { // there is already a record with both this sef and non sef. // just do nothing but return success (ie: record id). // Later, controller may store new aliases or metas // This should never happen when saving regular data as we added // a check for this case earlier // May happen when importing though $this->_url = $row; return $row->id; } // additional step : if we are here, it may be because we have modified // an existing url, and specifically changed it sef value to something else // Now it may be that this record was the one with rank = 0 in a series // of duplicate urls. If so, the urls which was ranked above must now become // the main url, having rank = 0 // note : when importing, we don't enter this test as previousSefUrl is empty // TODO this code is duplicated just a few line below, need refactoring if (!empty($previousSefUrl) && $previousSefUrl != $row->newurl) { // search for the old #2 record in duplicate list $query = 'SELECT id FROM #__redirection WHERE oldurl = ' . $this->_db->Quote($previousSefUrl) . ' ORDER BY rank ASC'; $this->_db->setQuery($query); $previousRanked2 = $this->_db->loadObject(); // there was more than one duplicate in the same series, promote #2 to top spot if (!empty($previousRanked2)) { $query = 'UPDATE #__redirection SET rank="0" WHERE id = ' . $this->_db->Quote($previousRanked2->id); $this->_db->setQuery($query); $this->_db->query(); } } } } else { // there is no URL with same SEF URL, we are customizing an existing SEF url $shTemp = array('nonSefURL' => $row->newurl); Sh404sefHelperCache::removeURLFromCache($shTemp); // remove it from cache // simply store URL. If there is already one with same non-sef, this will raise an error in store() // as we don't allow creating a custom url for an already existing non-sef. User should // directly edit the existing non-sef/sef pair if (!$row->check()) { $this->setError($row->getError()); return 0; } if (!$row->store()) { $this->setError($row->getError()); return 0; } // add also to cache if saved to db Sh404sefHelperCache::addSefUrlToCache($row->newurl, $row->oldurl, $urlType); // we must add the previous SEF url to the alias list, only if // - not already there // - this sef url does not already exists in the DB; which will happen if the url // begin saved was customized and also had duplicates // note : when importing, we don't enter this test as previousSefUrl is empty // TODO this code is duplicated just a few line above, need refactoring if (!empty($previousSefUrl) && strpos($this->_data['shAliasList'], $previousSefUrl) === false) { // check if not already a valid SEF url in the DB $query = 'SELECT count(id) FROM #__redirection WHERE oldurl = ' . $this->_db->Quote($previousSefUrl); $this->_db->setQuery($query); $isThere = $this->_db->loadResult(); if (empty($isThere)) { $this->_data['shAliasList'] .= $previousSefUrl . "\n"; } } // finally, also check db for urls with same sef as previous SEF if any. We need // to search for the first duplicate of this old sef, and set it to be // the new main url // note : when importing, we don't enter this test as previousSefUrl is empty // TODO this code is duplicated just a few line above, need refactoring if (!empty($previousSefUrl) && $previousSefUrl != $row->newurl) { // search for the old #2 record in duplicate list $query = 'SELECT id FROM #__redirection WHERE oldurl = ' . $this->_db->Quote($previousSefUrl) . ' ORDER BY rank ASC'; $this->_db->setQuery($query); $previousRanked2 = $this->_db->loadObject(); // there was more than one duplicate in the same series, promote #2 to top spot if (!empty($previousRanked2)) { $query = 'UPDATE #__redirection SET rank="0" WHERE id = ' . $this->_db->Quote($previousRanked2->id); $this->_db->setQuery($query); $this->_db->query(); } } } // store saved url object $this->_url = $row; // return what should be a non-zero id return $this->_url->id; }
function shGetMenuItemLanguage( $id) { if(empty( $id)) { return ''; } $language = ''; $app = JFactory::getApplication(); $menu = $app->getMenu(); if(!empty($menu)) { $item = $menu->getItem( $id); if(!empty( $item)) { $language = $item->language == '*' ? shGetDefaultLang() : $item->language; } } return $language; }
public function loadHomepages() { $app = JFactory::getApplication(); if ($app->isAdmin()) { return; } // store default links in each language jimport('joomla.language.helper'); $languages = JLanguageHelper::getLanguages(); $this->isMultilingual = shIsMultilingual(); $defaultLanguage = shGetDefaultLang(); if ($this->isMultilingual === false || $this->isMultilingual == 'joomla') { $menu = JFactory::getApplication()->getMenu(); foreach ($languages as $language) { $menuItem = $menu->getDefault($language->lang_code); if (!empty($menuItem)) { $this->homeLinks[$language->lang_code] = $this->_prepareLink($menuItem); if ($language->lang_code == $defaultLanguage) { $this->homeLink = $this->homeLinks[$language->lang_code]; $this->homeItemid = $menuItem->id; } } } // find about the "All" languages home link $menuItem = $menu->getDefault('*'); if (!empty($menuItem)) { $this->allLangHomeLink = $this->_prepareLink($menuItem, $languages); } } else { // trouble starts $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('id,language,link'); $query->from('#__menu'); $query->where('home <> 0'); $db->setQuery($query); $items = $db->loadObjectList('language'); if (!empty($items)) { if (count($items) == 1) { $tmp = array_values($items); $defaultItem = $tmp[0]; } if (empty($defaultItem)) { $defaultItem = empty($items[$defaultLanguage]) ? null : $items[$defaultLanguage]; } if (empty($defaultItem)) { $defaultItem = empty($items['*']) ? null : $items['*']; } foreach ($languages as $language) { if (!empty($items[$language->lang_code])) { $this->homeLinks[$language->lang_code] = $this->_prepareLink($items[$language->lang_code]); } else { // no menu item for home link // let's try to build one $this->homeLinks[$language->lang_code] = $this->_prepareLink($defaultItem, shGetIsoCodeFromName($language->lang_code)); } if ($language->lang_code == $defaultLanguage) { $this->homeLink = $this->homeLinks[$language->lang_code]; $this->homeItemid = $defaultItem->id; $this->allLangHomeLink = shCleanUpLang($this->homeLinks[$language->lang_code]); } } } } }
/** * Save a list of meta data as entered by user in backend to the database * * @param string $metaData an array of meta key/meta value from user. Also include nonsef url * @return boolean true on success */ public function save($dataArray = null) { $this->_db = ShlDbHelper::getDb(); $row = JTable::getInstance($this->_defaultTable, 'Sh404sefTable'); // only save if there is actually some metas data // at least on new records $metas = ''; foreach ($dataArray as $key => $value) { if ($key != 'meta_id' && (substr($key, 0, 4) == 'meta' || substr($key, 0, 3) == 'fb_' || substr($key, 0, 3) == 'og_' || $key == 'canonical')) { $metas .= $value; } } // if there is no meta data entered, and this is an existing record, delete it, or at least do not save if (!empty($metas) && $metas == SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT . SH404SEF_OPTION_VALUE_USE_DEFAULT) { if (!empty($dataArray['meta_id'])) { // there is an existing record, meta data was cleared by user, we can delete the record altogether try { ShlDbHelper::delete('#__sh404sef_metas', array('id' => $dataArray['meta_id'])); return true; } catch (Exception $e) { $this->setError($e->getMessage()); return false; } } // in any case, don't save anything return true; } if (empty($metas) && empty($dataArray['meta_id'])) { // avoid creating a new (and empty) record when savnig a record from the "metas" page // where we're editing several records at a time // This would pass the test just above, because we do not have any values for fb_*, og_*, etc // fields as we're only editing title and description return true; } $status = true; // load pre-existing values if (!empty($dataArray['meta_id'])) { $status = $row->load($dataArray['meta_id']); } // attach incoming data to table object $status = $status && $row->bind($dataArray); // add language code if missing, except on home page if ($status && $row->newurl != sh404SEF_HOMEPAGE_CODE && !preg_match('/(&|\\?)lang=[a-zA-Z]{2,3}/iuU', $row->newurl)) { // no lang string, let's add default $shTemp = explode('-', shGetDefaultLang()); $shLangTemp = $shTemp[0] ? $shTemp[0] : 'en'; $row->newurl .= '&lang=' . $shLangTemp; } // sort url params, except on home page if ($status && $row->newurl != sh404SEF_HOMEPAGE_CODE) { $row->newurl = shSortUrl($row->newurl); } // pre-save checks $status = $status && $row->check(); // save the changes $status = $status && $row->store(); // store error message if (!$status) { $error = $row->getError(); $this->setError($error); } // return true if no error $errors = $this->getError(); return empty($errors); }
shCheckVMCookieRedirect(); // V 1.2.4.t _log('after VM cookie redirect check'); $menu =& shRouter::shGetMenu(); $shHomePage =& $menu->getDefault(); if ($shHomePage) { _log('$shHomePage found from menu, link = ' . $shHomePage->link); if (substr($shHomePage->link, 0, 9) == 'index.php' && !preg_match('/Itemid=[0-9]*/', $shHomePage->link)) { // and it does not have an Itemid $shHomePage->link .= ($shHomePage->link == 'index.php' ? '?' : '&') . 'Itemid=' . $shHomePage->id; // then add itemid } $shHomeLink = $shHomePage->link; if (!strpos($shHomeLink, 'lang=')) { //V 1.2.4.q protect against not existing $shDefaultIso = shGetIsoCodeFromName(shGetDefaultLang()); $shSepString = substr($shHomeLink, -9) == 'index.php' ? '?' : '&'; $shHomeLink .= $shSepString . 'lang=' . $shDefaultIso; } $shHomeLink = shSortUrl($shHomeLink); // $shHomeLink has lang info, whereas $homepage->link may or may not } _log('$shHomeLink calculated as : ' . $shHomeLink); _log('$shPageInfo->index : ' . $shPageInfo->index); if (strtolower($shPageInfo->index) == 'index.php' && empty($_POST)) { // prevents loading homepage if accessing index2.php (ajax calls) _log('rendering home page'); $vars['Itemid'] = $shHomePage->id; $_SERVER['QUERY_STRING'] = $shPageInfo->QUERY_STRING = str_replace('index.php?', '', $shHomeLink); $REQUEST_URI = $shPageInfo->base . 'index.php?' . $shPageInfo->QUERY_STRING; $_SERVER['REQUEST_URI'] = $REQUEST_URI;