Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
 /**
  * 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);
 }
Ejemplo n.º 3
0
 /**
  * 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);
 }
Ejemplo n.º 4
0
 /**
  * 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;
 }
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
 /**
  * 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;
}
Ejemplo n.º 8
0
 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]);
                 }
             }
         }
     }
 }
Ejemplo n.º 9
0
 /**
  * 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);
 }
Ejemplo n.º 10
0
 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;