diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84c62c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.project +/classes/class.modrewriteurlstack_1.php diff --git a/cl_plugin.xml b/cl_plugin.xml index 6d088e7..2f46480 100644 --- a/cl_plugin.xml +++ b/cl_plugin.xml @@ -9,10 +9,10 @@ ConLite Team plugins@conlite.org https://conlite.org - 1.0.0 + 1.0.2 - - + + diff --git a/classes/class.modrewrite.php b/classes/class.modrewrite.php index faa259a..114f762 100644 --- a/classes/class.modrewrite.php +++ b/classes/class.modrewrite.php @@ -53,6 +53,7 @@ class ModRewrite extends ModRewriteBase { */ public static function initialize($clientId) { mr_loadConfiguration($clientId, true); + parent::initialize($clientId); self::$_db = new DB_Contenido(); self::$_lookupTable = array(); } @@ -154,7 +155,7 @@ class ModRewrite extends ModRewriteBase { $iCatId = (int) $iCatId; // get websafe name - $sNewName = cApiStrCleanURLCharacters(conHtmlEntityDecode($sName)); + $sNewName = cApiStrCleanURLCharacters(clHtmlEntityDecode($sName)); // remove double or more separators $sNewName = mr_removeMultipleChars('-', $sNewName); @@ -195,7 +196,7 @@ class ModRewrite extends ModRewriteBase { $iLangId = (int) $iLangId; // create websafe name - $sNewName = cApiStrCleanURLCharacters(conHtmlEntityDecode($sName)); + $sNewName = cApiStrCleanURLCharacters(clHtmlEntityDecode($sName)); // remove double or more separators $sNewName = mr_removeMultipleChars('-', $sNewName); diff --git a/classes/class.modrewritecontroller.php b/classes/class.modrewritecontroller.php index aa59e24..3fb2611 100644 --- a/classes/class.modrewritecontroller.php +++ b/classes/class.modrewritecontroller.php @@ -494,8 +494,6 @@ class ModRewriteController extends ModRewriteBase { // load_client is set in frontend/config.php $lang = (int) $load_lang; } else { - // get client id from table - cInclude('classes', 'contenido/class.clientslang.php'); $clCol = new cApiClientLanguageCollection(); $clCol->setWhere('idclient', $client); $clCol->query(); diff --git a/classes/class.modrewriteurlstack.php b/classes/class.modrewriteurlstack.php index 99713fd..bed50e2 100644 --- a/classes/class.modrewriteurlstack.php +++ b/classes/class.modrewriteurlstack.php @@ -1,54 +1,26 @@ - * @copyright four for business AG - * @license http://www.contenido.org/license/LIZENZ.txt - * @link http://www.4fb.de - * @link http://www.contenido.org + * ModRewrite url stack class + * + * @category ConLite + * @package Plugin + * @subpackage ModRewrite + * @since 2.1.3 + * @author Ortwin Pinke + * @copyright (c) 2022, conlite.org + * @license http://www.gnu.de/documents/gpl.en.html GPL v3 (english version) + * @license http://www.gnu.de/documents/gpl.de.html GPL v3 (deutsche Version) + * @link http://www.conlite.org ConLite.org + * + * based on former AMR class by Murat Purc for CONTENIDO 4.8.x */ - if (!defined('CON_FRAMEWORK')) { die('Illegal call'); } -/** - * Mod rewrite url stack class. Provides features to collect urls and to get the - * pretty path and names of categories/articles at one go. - * - * Main goal of this class is to collect urls and to get the urlpath and urlname - * of the related categories/articles at one go. This will reduce the queries - * against the database. - * Therefore the full advantage will be taken by rewriting the urls at codeoutput - * in front_content.php, where you will be able to collect all urls at once... - * - * Usage: - * - * // get the instance - * $oMRUrlStack = ModRewriteUrlStack::getInstance(); - * - * // add several urls to fill the stack - * $oMRUrlStack->add('front_content.php?idcat=123'); - * $oMRUrlStack->add('front_content.php?idart=321'); - * $oMRUrlStack->add('front_content.php?idcatart=213'); - * $oMRUrlStack->add('front_content.php?idcatlang=213'); - * $oMRUrlStack->add('front_content.php?idartlang=312'); - * - * // now the first call will get the pretty path and names from database at one go - * $aPrettyParts = $oMRUrlStack->getPrettyUrlParts('front_content.php?idcat=123'); - * echo $aPrettyParts['urlpath']; // something like 'Main-category-name/Category-name/Another-category-name/' - * echo $aPrettyParts['urlname']; // something like 'Name-of-an-article' - * - * - * @author Murat Purc - * @package plugin - * @subpackage Mod Rewrite - */ class ModRewriteUrlStack { /** @@ -56,7 +28,7 @@ class ModRewriteUrlStack { * * @var ModRewriteUrlStack */ - private static $_instance; + private static $_oInstance; /** * Database object @@ -106,10 +78,9 @@ class ModRewriteUrlStack { * Constructor, sets some properties. */ private function __construct() { - global $cfg, $lang; - $this->_oDb = new DB_Contenido(); - $this->_aTab = $cfg['tab']; - $this->_idLang = $lang; + $this->_oDb = cRegistry::getDb(); + $this->_aTab = cRegistry::getConfigValue('tab'); + $this->_idLang = cRegistry::getLanguageId(); } /** @@ -118,10 +89,10 @@ class ModRewriteUrlStack { * @return ModRewriteUrlStack */ public static function getInstance() { - if (self::$_instance == null) { - self::$_instance = new ModRewriteUrlStack(); + if (self::$_oInstance == null) { + self::$_oInstance = new ModRewriteUrlStack(); } - return self::$_instance; + return self::$_oInstance; } /** @@ -175,11 +146,11 @@ class ModRewriteUrlStack { $sStackId = $this->_aUrls[$url]; if (!isset($this->_aStack[$sStackId]['urlpath'])) { - $this->_chunkSetPrettyUrlParts(); + $this->_chunkSetPrettyUrlParts($sStackId); } $aPretty = array( - 'urlpath' => $this->_aStack[$sStackId]['urlpath'], - 'urlname' => $this->_aStack[$sStackId]['urlname'] + 'urlpath' => (empty($this->_aStack[$sStackId]['urlpath']))?'':$this->_aStack[$sStackId]['urlpath'], + 'urlname' => (empty($this->_aStack[$sStackId]['urlname']))?'':$this->_aStack[$sStackId]['urlname'] ); return $aPretty; } @@ -197,7 +168,7 @@ class ModRewriteUrlStack { $aUrl['query'] = str_replace('&', '&', $aUrl['query']); parse_str($aUrl['query'], $aUrl['params']); } - if (!isset($aUrl['params']) && !is_array($aUrl['params'])) { + if (empty($aUrl['params']) || !is_array($aUrl['params'])) { $aUrl['params'] = array(); } return $aUrl; @@ -233,37 +204,36 @@ class ModRewriteUrlStack { * * Composes the query by looping thru stored but non processed urls, executes * the query and adds the (urlpath and urlname) result to the stack. + * + * @param type $sStackId + * @return type */ - private function _chunkSetPrettyUrlParts() { - // collect stack parameter to get urlpath and urlname - $aStack = array(); - foreach ($this->_aStack as $stackId => $item) { - if (!isset($item['urlpath'])) { - // pretty url is to create - $aStack[$stackId] = $item; - } + private function _chunkSetPrettyUrlParts($sStackId) { + if (!isset($this->_aStack[$sStackId]) || isset($this->_aStack[$sStackId]['urlpath'])) { + return; } + $aStack = []; + $aStack[$sStackId] = $this->_aStack[$sStackId]; + // now, it's time to compose the where clause of the query $sWhere = ''; - foreach ($aStack as $stackId => $item) { - $aP = $item['params']; - if ((int) mr_arrayValue($aP, 'idart') > 0) { - $sWhere .= '(al.idart = ' . $aP['idart'] . ' AND al.idlang = ' . $aP['lang'] . ') OR '; - } elseif ((int) mr_arrayValue($aP, 'idartlang') > 0) { - $sWhere .= '(al.idartlang = ' . $aP['idartlang'] . ') OR '; - } elseif ((int) mr_arrayValue($aP, 'idcat') > 0) { - $sWhere .= '(cl.idcat = ' . $aP['idcat'] . ' AND cl.idlang = ' . $aP['lang'] . ' AND cl.startidartlang = al.idartlang) OR '; - } elseif ((int) mr_arrayValue($aP, 'idcatart') > 0) { - $sWhere .= '(ca.idcatart = ' . $aP['idcatart'] . ' AND ca.idart = al.idart AND al.idlang = ' . $aP['lang'] . ') OR '; - } elseif ((int) mr_arrayValue($aP, 'idcatlang') > 0) { - $sWhere .= '(cl.idcatlang = ' . $aP['idcatlang'] . ' AND cl.startidartlang = al.idartlang) OR '; - } + $aP = $this->_aStack[$sStackId]['params']; + if ((int) mr_arrayValue($aP, 'idart') > 0) { + $sWhere .= '(al.idart = ' . $aP['idart'] . ' AND al.idlang = ' . $aP['lang'] . ') OR '; + } elseif ((int) mr_arrayValue($aP, 'idartlang') > 0) { + $sWhere .= '(al.idartlang = ' . $aP['idartlang'] . ') OR '; + } elseif ((int) mr_arrayValue($aP, 'idcat') > 0) { + $sWhere .= '(cl.idcat = ' . $aP['idcat'] . ' AND cl.idlang = ' . $aP['lang'] . ' AND cl.startidartlang = al.idartlang) OR '; + } elseif ((int) mr_arrayValue($aP, 'idcatart') > 0) { + $sWhere .= '(ca.idcatart = ' . $aP['idcatart'] . ' AND ca.idart = al.idart AND al.idlang = ' . $aP['lang'] . ') OR '; + } elseif ((int) mr_arrayValue($aP, 'idcatlang') > 0) { + $sWhere .= '(cl.idcatlang = ' . $aP['idcatlang'] . ' AND cl.startidartlang = al.idartlang) OR '; } if ($sWhere == '') { return; } - $sWhere = substr($sWhere, 0, -4); + $sWhere = cString::getPartOfString($sWhere, 0, -4); $sWhere = str_replace(' OR ', " OR \n", $sWhere); // compose query and execute it @@ -281,7 +251,7 @@ WHERE SQL; ModRewriteDebugger::add($sql, 'ModRewriteUrlStack->_chunkSetPrettyUrlParts() $sql'); - $aNewStack = array(); + $aNewStack = []; // create array of fields, which are to reduce step by step from record set below $aFields = array('', 'idart', 'idartlang', 'idcatart', 'idcat'); @@ -296,19 +266,15 @@ SQL; // reduce existing field unset($aRS[$field]); } - $rsStackID = $this->_makeStackId($aRS); - if (isset($aStack[$rsStackID])) { - // matching stack entry found, add urlpath and urlname to the new stack - $aNewStack[$rsStackID]['urlpath'] = $aRS['urlpath']; - $aNewStack[$rsStackID]['urlname'] = $aRS['urlname']; - break; - } + + // matching stack entry found, add urlpath and urlname to the new stack + $aNewStack[$sStackId]['urlpath'] = $aRS['urlpath']; + $aNewStack[$sStackId]['urlname'] = $aRS['urlname']; } } ModRewriteDebugger::add($aNewStack, 'ModRewriteUrlStack->_chunkSetPrettyUrlParts() $aNewStack'); + ModRewriteDebugger::add($this->_aStack, 'ModRewriteUrlStack->_chunkSetPrettyUrlParts() $this->_aStack'); - // merge stack data $this->_aStack = array_merge($this->_aStack, $aNewStack); } - -} +} \ No newline at end of file diff --git a/classes/controller/class.modrewrite_content_controller.php b/classes/controller/class.modrewrite_content_controller.php index 9aeaefb..ed75e19 100644 --- a/classes/controller/class.modrewrite_content_controller.php +++ b/classes/controller/class.modrewrite_content_controller.php @@ -27,6 +27,12 @@ if (!defined('CON_FRAMEWORK')) { */ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { + public $_oView; + public $_client; + /** + * @var array + */ + public $_cfg; /** * Index action */ @@ -41,13 +47,12 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { public function saveAction() { $bDebug = $this->getProperty('bDebug'); $aSeparator = $this->getProperty('aSeparator'); - $aWordSeparator = $this->getProperty('aWordSeparator'); $routingSeparator = $this->getProperty('routingSeparator'); $bError = false; - $aMR = array(); + $aMR = []; - $request = (count($_POST) > 0) ? $_POST : $_GET; + $request = ($_POST !== []) ? $_POST : $_GET; mr_requestCleanup($request); // use cl-mod-rewrite @@ -61,7 +66,7 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { // root dir if (mr_arrayValue($request, 'rootdir', '') !== '') { - if (!preg_match('/^[a-zA-Z0-9\-_\/\.]*$/', $request['rootdir'])) { + if (!preg_match('/^[a-zA-Z0-9\-_\/.]*$/', $request['rootdir'])) { $sMsg = i18n("The root directory has a invalid format, alowed are the chars [a-zA-Z0-9\-_\/\.]", "cl-mod-rewrite"); $this->_oView->rootdir_error = $this->_notifyBox('error', $sMsg); $bError = true; @@ -69,19 +74,19 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { if (mr_arrayValue($request, 'checkrootdir') == 1) { // root dir check is enabled, this results in error - $sMsg = i18n("The specified directory '%s' does not exists", "cl-mod-rewrite"); - $sMsg = sprintf($sMsg, $_SERVER['DOCUMENT_ROOT'] . $request['rootdir']); + $sMsgTpl = i18n("The specified directory '%s' does not exists", "cl-mod-rewrite"); + $sMsg = sprintf($sMsgTpl, $_SERVER['DOCUMENT_ROOT'] . $request['rootdir']); $this->_oView->rootdir_error = $this->_notifyBox('error', $sMsg); $bError = true; } else { // root dir check ist disabled, take over the setting and // output a warning. - $sMsg = i18n("The specified directory '%s' does not exists in DOCUMENT_ROOT '%s'. This could happen, if clients DOCUMENT_ROOT differs from CONTENIDO backends DOCUMENT_ROOT. However, the setting will be taken over because of disabled check.", "cl-mod-rewrite"); - $sMsg = sprintf($sMsg, $request['rootdir'], $_SERVER['DOCUMENT_ROOT']); + $sMsgTpl = i18n("The specified directory '%s' does not exists in DOCUMENT_ROOT '%s'. This could happen, if clients DOCUMENT_ROOT differs from CONTENIDO backends DOCUMENT_ROOT. However, the setting will be taken over because of disabled check.", "cl-mod-rewrite"); + $sMsg = sprintf($sMsgTpl, $request['rootdir'], $_SERVER['DOCUMENT_ROOT']); $this->_oView->rootdir_error = $this->_notifyBox('warning', $sMsg); } } - $this->_oView->rootdir = conHtmlentities($request['rootdir']); + $this->_oView->rootdir = clHtmlEntities($request['rootdir']); $aMR['cl-mod-rewrite']['rootdir'] = $request['rootdir']; } @@ -242,13 +247,13 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { $bError = true; } - $this->_oView->category_separator = conHtmlentities($categorySeperator); + $this->_oView->category_separator = clHtmlentities($categorySeperator); $aMR['cl-mod-rewrite']['category_seperator'] = $categorySeperator; - $this->_oView->category_word_separator = conHtmlentities($categoryWordSeperator); + $this->_oView->category_word_separator = clHtmlentities($categoryWordSeperator); $aMR['cl-mod-rewrite']['category_word_seperator'] = $categoryWordSeperator; - $this->_oView->article_separator = conHtmlentities($articleSeperator); + $this->_oView->article_separator = clHtmlentities($articleSeperator); $aMR['cl-mod-rewrite']['article_seperator'] = $articleSeperator; - $this->_oView->article_word_separator = conHtmlentities($articleWordSeperator); + $this->_oView->article_word_separator = clHtmlentities($articleWordSeperator); $aMR['cl-mod-rewrite']['article_word_seperator'] = $articleWordSeperator; // file extension @@ -258,7 +263,7 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { $this->_oView->file_extension_error = $this->_notifyBox('error', $sMsg); $bError = true; } - $this->_oView->file_extension = conHtmlentities($request['file_extension']); + $this->_oView->file_extension = clHtmlentities($request['file_extension']); $aMR['cl-mod-rewrite']['file_extension'] = $request['file_extension']; } else { $this->_oView->file_extension = '.html'; @@ -288,12 +293,12 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { $this->_oView->add_startart_name_to_url_chk = ' checked="checked"'; $aMR['cl-mod-rewrite']['add_startart_name_to_url'] = 1; if (mr_arrayValue($request, 'add_startart_name_to_url', '') !== '') { - if (!preg_match('/^[a-zA-Z0-9\-_\/\.]*$/', $request['default_startart_name'])) { + if (!preg_match('/^[a-zA-Z0-9\-_\/.]*$/', $request['default_startart_name'])) { $sMsg = i18n("The article name has a invalid format, allowed are the chars /^[a-zA-Z0-9\-_\/\.]*$/", "cl-mod-rewrite"); $this->_oView->add_startart_name_to_url_error = $this->_notifyBox('error', $sMsg); $bError = true; } - $this->_oView->default_startart_name = conHtmlentities($request['default_startart_name']); + $this->_oView->default_startart_name = clHtmlentities($request['default_startart_name']); $aMR['cl-mod-rewrite']['default_startart_name'] = $request['default_startart_name']; } else { $this->_oView->default_startart_name = ''; @@ -321,10 +326,10 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { // routing if (isset($request['rewrite_routing'])) { - $aRouting = array(); + $aRouting = []; $items = explode("\n", $request['rewrite_routing']); - foreach ($items as $p => $v) { - $routingDef = explode($routingSeparator, $v); + foreach ($items as $item) { + $routingDef = explode($routingSeparator, $item); if (count($routingDef) !== 2) { continue; } @@ -335,11 +340,11 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { } $aRouting[$routingDef[0]] = $routingDef[1]; } - $this->_oView->rewrite_routing = conHtmlentities($request['rewrite_routing']); + $this->_oView->rewrite_routing = clHtmlentities($request['rewrite_routing']); $aMR['cl-mod-rewrite']['routing'] = $aRouting; } else { $this->_oView->rewrite_routing = ''; - $aMR['cl-mod-rewrite']['routing'] = array(); + $aMR['cl-mod-rewrite']['routing'] = []; } // redirect invalid article to errorsite @@ -377,7 +382,7 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { $this->_oView->content_before .= $this->_notifyBox('info', $sMsg); } else { $sMsg = i18n("Configuration could not saved. Please check write permissions for %s ", "cl-mod-rewrite"); - $sMsg = sprintf($sMsg, $options['key']); + $sMsg = sprintf($sMsg, mr_getConfigurationFilePath($this->_client)); $this->_oView->content_before .= $this->_notifyBox('error', $sMsg); } } @@ -385,9 +390,8 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { /** * Checks, if any sseparators setting is modified or not * @param array $aNewCfg New configuration send by requests. - * @return bool */ - protected function _separatorModified($aNewCfg) { + protected function _separatorModified($aNewCfg): bool { $aCfg = ModRewrite::getConfig(); if ($aCfg['category_seperator'] != $aNewCfg['category_seperator']) { @@ -405,18 +409,19 @@ class ModRewrite_ContentController extends ModRewrite_ControllerAbstract { /** * Does some checks like 'is_start_compatible' check. * Adds notifications, if something will went wrong... + * + * @todo review text and translations */ protected function _doChecks() { - // Check for not supported '$cfg["is_start_compatible"] = true;' mode if (!empty($this->_cfg['is_start_compatible']) && true === $this->_cfg['is_start_compatible']) { $sMsg = i18n("Your Contenido installation runs with the setting 'is_start_compatible'. This plugin will not work properly in this mode.
Please check following topic in Contenido forum to change this:

is_start_compatible auf neue Version umstellen", "cl-mod-rewrite"); $this->_oView->content_before .= $this->_notifyBox('warning', $sMsg); } // Check for empty urlpath entries in cat_lang table - $db = new DB_Contenido(); + $dbConLite = new DB_ConLite(); $sql = "SELECT idcatlang FROM " . $this->_cfg['tab']['cat_lang'] . " WHERE urlpath = ''"; - if ($db->query($sql) && $db->next_record()) { + if ($dbConLite->query($sql) && $dbConLite->next_record()) { $sMsg = i18n("It seems as if some categories don't have a set 'urlpath' entry in the database. Please reset empty aliases in %sFunctions%s area.", "cl-mod-rewrite"); $sMsg = sprintf($sMsg, '', ''); $this->_oView->content_before .= $this->_notifyBox('warning', $sMsg); diff --git a/classes/controller/class.modrewrite_contentexpert_controller.php b/classes/controller/class.modrewrite_contentexpert_controller.php index a0ae01f..e49daa1 100644 --- a/classes/controller/class.modrewrite_contentexpert_controller.php +++ b/classes/controller/class.modrewrite_contentexpert_controller.php @@ -77,17 +77,9 @@ class ModRewrite_ContentExpertController extends ModRewrite_ControllerAbstract { return; } - if ($type == 'restrictive') { - $source = $this->_htaccessRestrictive; - } else { - $source = $this->_htaccessSimple; - } + $source = $type == 'restrictive' ? $this->_htaccessRestrictive : $this->_htaccessSimple; - if ($copy == 'contenido') { - $dest = $aInfo['contenido_full_path'] . '.htaccess'; - } else { - $dest = $aInfo['client_full_path'] . '.htaccess'; - } + $dest = $copy == 'contenido' ? $aInfo['contenido_full_path'] . '.htaccess' : $aInfo['client_full_path'] . '.htaccess'; if (!$result = @copy($source, $dest)) { $this->_oView->content_before = $this->_notifyBox('info', 'Die .htaccess konnte nicht von ' . $source . ' nach ' . $dest . ' kopiert werden!'); @@ -108,16 +100,12 @@ class ModRewrite_ContentExpertController extends ModRewrite_ControllerAbstract { return; } - if ($type == 'restrictive') { - $source = $this->_htaccessRestrictive; - } else { - $source = $this->_htaccessSimple; - } + $source = $type == 'restrictive' ? $this->_htaccessRestrictive : $this->_htaccessSimple; $this->_oView->content = file_get_contents($source); header('Content-Type: text/plain'); - header('Etag: ' . md5(mt_rand())); + header('Etag: ' . md5(random_int(0, mt_getrandmax()))); header('Content-Disposition: attachment; filename="' . $type . '.htaccess"'); $this->render('{CONTENT}'); } diff --git a/classes/controller/class.modrewrite_contenttest_controller.php b/classes/controller/class.modrewrite_contenttest_controller.php index 067e3f3..0b0c5fd 100644 --- a/classes/controller/class.modrewrite_contenttest_controller.php +++ b/classes/controller/class.modrewrite_contenttest_controller.php @@ -60,33 +60,25 @@ class ModRewrite_ContentTestController extends ModRewrite_ControllerAbstract { $this->_oView->content = ''; // Array for testcases - $aTests = array(); + $aTests = []; // Instance of mr test - $oMRTest = new ModRewriteTest($this->_iMaxItems); + $modRewriteTest = new ModRewriteTest($this->_iMaxItems); $startTime = getmicrotime(); // Fetch complete CONTENIDO page structure - $aStruct = $oMRTest->fetchFullStructure(); - ModRewriteDebugger::add($aStruct, 'mr_test.php $aStruct'); + $aStruct = $modRewriteTest->fetchFullStructure(); + ModRewriteDebugger::add($aStruct, 'ModRewrite_ContentTestController::testAction() $aStruct'); // Loop through the structure and compose testcases - foreach ($aStruct as $idcat => $aCat) { + foreach ($aStruct as $aCat) { // category - $aTests[] = array( - 'url' => $oMRTest->composeURL($aCat, 'c'), - 'level' => $aCat['level'], - 'name' => $aCat['name'] - ); + $aTests[] = ['url' => $modRewriteTest->composeURL($aCat, 'c'), 'level' => $aCat['level'], 'name' => $aCat['name']]; - foreach ($aCat['articles'] as $idart => $aArt) { + foreach ($aCat['articles'] as $aArt) { // articles - $aTests[] = array( - 'url' => $oMRTest->composeURL($aArt, 'a'), - 'level' => $aCat['level'], - 'name' => $aCat['name'] . ' :: ' . $aArt['title'] - ); + $aTests[] = ['url' => $modRewriteTest->composeURL($aArt, 'a'), 'level' => $aCat['level'], 'name' => $aCat['name'] . ' :: ' . $aArt['title']]; } } @@ -96,7 +88,7 @@ class ModRewrite_ContentTestController extends ModRewrite_ControllerAbstract { $oMRUrlStack = ModRewriteUrlStack::getInstance(); // first loop to add urls to mr url stack - foreach ($aTests as $p => $v) { + foreach ($aTests as $v) { $oMRUrlStack->add($v['url']); } @@ -104,15 +96,15 @@ class ModRewrite_ContentTestController extends ModRewrite_ControllerAbstract { $failCounter = 0; // second loop to do the rest - foreach ($aTests as $p => $v) { - $url = mr_buildNewUrl($v['url']); - $arr = $oMRTest->resolveUrl($url); + foreach ($aTests as $aTest) { + $url = mr_buildNewUrl($aTest['url']); + $arr = $modRewriteTest->resolveUrl($url); $error = ''; - $resUrl = $oMRTest->getResolvedUrl(); + $resUrl = $modRewriteTest->getResolvedUrl(); $color = 'green'; if ($url !== $resUrl) { - if ($oMRTest->getRoutingFoundState()) { + if ($modRewriteTest->getRoutingFoundState()) { $successCounter++; $resUrl = 'route to -> ' . $resUrl; } else { @@ -144,18 +136,18 @@ class ModRewrite_ContentTestController extends ModRewrite_ControllerAbstract { } } - $pref = str_repeat(' ', $v['level']); + $pref = str_repeat(' ', $aTest['level']); // render resolve information for current item $itemTpl = $this->_oView->lng_result_item_tpl; $itemTpl = str_replace('{pref}', $pref, $itemTpl); - $itemTpl = str_replace('{name}', $v['name'], $itemTpl); - $itemTpl = str_replace('{url_in}', $v['url'], $itemTpl); + $itemTpl = str_replace('{name}', $aTest['name'], $itemTpl); + $itemTpl = str_replace('{url_in}', $aTest['url'], $itemTpl); $itemTpl = str_replace('{url_out}', $url, $itemTpl); $itemTpl = str_replace('{color}', $color, $itemTpl); $itemTpl = str_replace('{url_res}', $resUrl, $itemTpl); $itemTpl = str_replace('{err}', $error, $itemTpl); - $itemTpl = str_replace('{data}', $oMRTest->getReadableResolvedData($arr), $itemTpl); + $itemTpl = str_replace('{data}', $modRewriteTest->getReadableResolvedData($arr), $itemTpl); $this->_oView->content .= "\n" . $itemTpl . "\n"; } diff --git a/classes/controller/class.modrewrite_controller_abstract.php b/classes/controller/class.modrewrite_controller_abstract.php index cf1bb01..de104f9 100644 --- a/classes/controller/class.modrewrite_controller_abstract.php +++ b/classes/controller/class.modrewrite_controller_abstract.php @@ -72,13 +72,13 @@ abstract class ModRewrite_ControllerAbstract { * Template file or template string to render * @var string */ - protected $_template = null; + protected $_template; /** * Additional properties list * @var array */ - protected $_properties = array(); + protected $_properties = []; /** * Debug flag @@ -138,20 +138,18 @@ abstract class ModRewrite_ControllerAbstract { /** * Property setter. * @param string $key - * @param mixed $value */ - public function setProperty($key, $value) { + public function setProperty($key, mixed $value) { $this->_properties[$key] = $value; } /** * Property getter. * @param string $key - * @param mixed $default * @return mixed */ - public function getProperty($key, $default = null) { - return (isset($this->_properties[$key])) ? $this->_properties[$key] : $default; + public function getProperty($key, mixed $default = null) { + return $this->_properties[$key] ?? $default; } /** @@ -202,7 +200,7 @@ abstract class ModRewrite_ControllerAbstract { * @param mixed $default The default value * @return mixed */ - protected function _getParam($key, $default = null) { + protected function _getParam($key, mixed $default = null) { if (isset($_GET[$key])) { return $_GET[$key]; } elseif (isset($_POST[$key])) { diff --git a/includes/functions.mod_rewrite.php b/includes/functions.mod_rewrite.php index 658c81e..59772c1 100644 --- a/includes/functions.mod_rewrite.php +++ b/includes/functions.mod_rewrite.php @@ -23,11 +23,15 @@ * @link http://www.4fb.de * @link http://www.contenido.org */ + +use ConLite\Log\LogWriter; +use ConLite\Log\Log; + if (!defined('CON_FRAMEWORK')) { die('Illegal call'); } -cInclude('classes', 'contenido/class.articlelanguage.php'); +global $_cecRegistry, $cfg, $contenido, $area, $client, $load_client; /** * Processes cl-mod-rewrite related job for created new tree. @@ -485,10 +489,14 @@ function mr_buildGeneratedCode($code) { // remove tinymce single quote entities: $code = str_replace("'", "'", $code); + + $baseUri = cRegistry::getFrontendUrl(); + $baseUri = CEC_Hook::execute("Contenido.Frontend.BaseHrefGeneration", $baseUri); - // get base uri - $sBaseUri = $cfgClient[$client]['path']['htmlpath']; - $sBaseUri = CEC_Hook::execute("Contenido.Frontend.BaseHrefGeneration", $sBaseUri); + // CON-1389 modifier /e is deprecated as of PHP 5.5 + $code = preg_replace_callback("/([\"|\'|=])upload\/(.?|.+?)([\"|\'|>])/i", function($match) use ($baseUri) { + return stripslashes($match[1] . $baseUri . 'upload/' . $match[2] . $match[3]); + }, $code); // define some preparations to replace /front_content.php & ./front_content.php // against front_content.php, because urls should start with front_content.php @@ -514,12 +522,15 @@ function mr_buildGeneratedCode($code) { foreach ($matches as $val) { $oMRUrlStack->add('front_content.php' . $val[2]); } - + ModRewriteDebugger::add($code, 'mr_buildGeneratedCode() before replace'); // ok let it beginn, build the clean urls $code = str_replace('"front_content.php"', '"' . mr_buildNewUrl('front_content.php') . '"', $code); $code = str_replace("'front_content.php'", "'" . mr_buildNewUrl('front_content.php') . "'", $code); $code = preg_replace_callback("/([\"|\'|=])front_content\.php(.?|.+?)([\"|\'|>])/i", function($match) { - return $match[1] . mr_buildNewUrl('front_content.php' . $match[2]) . $match[3]; + ModRewriteDebugger::add($match, 'mr_buildGeneratedCode() matches'); + $sHref = $match[1] . mr_buildNewUrl('front_content.php' . $match[2]) . $match[3]; + ModRewriteDebugger::add($sHref, 'mr_buildGeneratedCode() matches -> href'); + return $sHref; }, $code); ModRewriteDebugger::add($code, 'mr_buildGeneratedCode() out'); @@ -608,8 +619,7 @@ function mr_loadConfiguration($clientId, $forceReload = false) { } function mr_getConfigurationFilePath($clientId) { - $clientConfig = cRegistry::getClientConfig((int) $clientId); - $fePath = $clientConfig['path']['frontend']; + $fePath = cRegistry::getFrontendPath(); return $fePath . 'data/config/' . CL_ENVIRONMENT . '/config.mod_rewrite.php'; } @@ -666,11 +676,27 @@ function mr_getConfiguration($clientId) { * @return bool */ function mr_setConfiguration($clientId, array $config) { - global $cfg; - - $file = $cfg['path']['contenido'] . $cfg['path']['plugins'] . 'cl-mod-rewrite/includes/config.mod_rewrite_' . $clientId . '.php'; + $sClientPath = cRegistry::getClientConfig(cRegistry::getClientId())['path']['frontend']; + $sConfigClientPath = $sClientPath.'/data/config/'.CL_ENVIRONMENT.'/'; + + if (is_writable($sClientPath) && !file_exists($sConfigClientPath)) { + try { + mkdir($sConfigClientPath, 0777, true); + } catch (Exception $ex) { + $writer = LogWriter::factory("File", array('destination' => 'contenido.log')); + $log = new Log($writer); + $log->log($ex->getFile() . " (" . $ex->getLine() . "): " . $ex->getMessage(), Log::WARN); + } + } + + if(file_exists($sConfigClientPath) && is_writable($sConfigClientPath)) { + $file = $sConfigClientPath. 'config.mod_rewrite.php'; + } else { + $file = cRegistry::getConfigValue('path', 'contenido') . cRegistry::getConfigValue('path', 'plugins') . 'cl-mod-rewrite/includes/config.mod_rewrite_' . cRegistry::getClientId() . '.php'; + } + $result = file_put_contents($file, serialize($config)); - return ($result) ? true : false; + return (empty($result)) ? false : true; } /** diff --git a/includes/include.mod_rewrite_content.php b/includes/include.mod_rewrite_content.php index 05227e0..fecd30c 100644 --- a/includes/include.mod_rewrite_content.php +++ b/includes/include.mod_rewrite_content.php @@ -23,8 +23,10 @@ global $client, $cfg; ##### Initialization if ((int) $client <= 0) { - // if there is no client selected, display empty page + // if there is no client selected, display noti $oPage = new cPage; + $oNoti = new Contenido_Notification(); + $oPage->setContent($oNoti->returnNotification("warning", i18n("No client set!"))); $oPage->render(); return; } diff --git a/includes/include.mod_rewrite_contentexpert.php b/includes/include.mod_rewrite_contentexpert.php index f6581bc..cfd0b18 100644 --- a/includes/include.mod_rewrite_contentexpert.php +++ b/includes/include.mod_rewrite_contentexpert.php @@ -23,8 +23,10 @@ global $client, $cfg; ##### Initialization if ((int) $client <= 0) { - // if there is no client selected, display empty page + // if there is no client selected, display noti $oPage = new cPage; + $oNoti = new Contenido_Notification(); + $oPage->setContent($oNoti->returnNotification("warning", i18n("No client set!"))); $oPage->render(); return; } diff --git a/includes/include.mod_rewrite_contenttest.php b/includes/include.mod_rewrite_contenttest.php index 90a1032..52c3d09 100644 --- a/includes/include.mod_rewrite_contenttest.php +++ b/includes/include.mod_rewrite_contenttest.php @@ -31,8 +31,10 @@ global $client, $cfg; ##### Initialization if ((int) $client <= 0) { - // if there is no client selected, display empty page + // if there is no client selected, display noti $oPage = new cPage; + $oNoti = new Contenido_Notification(); + $oPage->setContent($oNoti->returnNotification("warning", i18n("No client set!"))); $oPage->render(); return; } diff --git a/scripts/mod_rewrite.js b/scripts/mod_rewrite.js index 521a65f..15230a9 100644 --- a/scripts/mod_rewrite.js +++ b/scripts/mod_rewrite.js @@ -43,7 +43,7 @@ var mrPlugin = { initializeSettingsPage: function() { $(document).ready(function() { $("#mr_use_language").change(function() { - if (true == $(this).attr("checked")) { + if (true == $(this).prop("checked")) { $("#mr_use_language_name").removeAttr("disabled"); } else { $("#mr_use_language_name").attr("disabled", "disabled"); @@ -51,7 +51,7 @@ var mrPlugin = { }); $("#mr_use_client").change(function() { - if (true == $(this).attr("checked")) { + if (true == $(this).prop("checked")) { $("#mr_use_client_name").removeAttr("disabled"); } else { $("#mr_use_client_name").attr("disabled", "disabled"); @@ -59,7 +59,7 @@ var mrPlugin = { }); $("#mr_add_startart_name_to_url").change(function() { - if (true == $(this).attr("checked")) { + if (true == $(this).prop("checked")) { $("#mr_default_startart_name").removeAttr("disabled") .removeClass("disabled"); } else { diff --git a/scripts/mod_rewrite.min.js b/scripts/mod_rewrite.min.js new file mode 100644 index 0000000..70a6846 --- /dev/null +++ b/scripts/mod_rewrite.min.js @@ -0,0 +1 @@ +var mrPlugin={lng:{more_informations:"More informations"},toggle:function(a){$("#"+a).slideToggle("slow")},showReadme:function(){},initializeSettingsPage:function(){$(document).ready(function(){$("#mr_use_language").change(function(){if(true==$(this).prop("checked")){$("#mr_use_language_name").removeAttr("disabled")}else{$("#mr_use_language_name").attr("disabled","disabled")}});$("#mr_use_client").change(function(){if(true==$(this).prop("checked")){$("#mr_use_client_name").removeAttr("disabled")}else{$("#mr_use_client_name").attr("disabled","disabled")}});$("#mr_add_startart_name_to_url").change(function(){if(true==$(this).prop("checked")){$("#mr_default_startart_name").removeAttr("disabled").removeClass("disabled")}else{$("#mr_default_startart_name").attr("disabled","disabled").addClass("disabled")}});mrPlugin._initializeTooltip()})},initializeExterpPage:function(){$(document).ready(function(){mrPlugin._initializeTooltip()})},_initializeTooltip:function(){$(".mrPlugin a.i-link").each(function(){$(this).attr("href","javascript:void(0);");$(this).attr("title",mrPlugin.lng.more_informations);var a=$(this).attr("id").substring(0,$(this).attr("id").indexOf("-link"));$(this).aToolTip({clickIt:true,xOffset:-20,yOffset:4,outSpeed:250,tipContent:$("#"+a).html()})})}}; \ No newline at end of file diff --git a/templates/content.html b/templates/content.html index 87de490..0b8f148 100644 --- a/templates/content.html +++ b/templates/content.html @@ -1,4 +1,4 @@ - + mod_rewrite_content @@ -7,7 +7,7 @@ - + diff --git a/templates/contentexpert.html b/templates/contentexpert.html index f672bbb..e19e0a7 100644 --- a/templates/contentexpert.html +++ b/templates/contentexpert.html @@ -1,4 +1,4 @@ - + mod_rewrite_content_expert @@ -6,7 +6,7 @@ - + diff --git a/templates/contenttest.html b/templates/contenttest.html index a0b3af2..8ac4506 100644 --- a/templates/contenttest.html +++ b/templates/contenttest.html @@ -1,4 +1,4 @@ - + mod_rewrite_content_test @@ -6,7 +6,7 @@ - +