diff --git a/.gitignore b/.gitignore index d8fe4fa..84c62c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /.project +/classes/class.modrewriteurlstack_1.php diff --git a/cl_plugin.xml b/cl_plugin.xml index 242cd1d..0cb9a54 100644 --- a/cl_plugin.xml +++ b/cl_plugin.xml @@ -11,7 +11,7 @@ https://conlite.org 1.0.1 - + diff --git a/classes/class.modrewriteurlstack.php b/classes/class.modrewriteurlstack.php index dbfd893..014f583 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; } /** @@ -238,33 +209,26 @@ class ModRewriteUrlStack { * @return type */ private function _chunkSetPrettyUrlParts($sStackId) { - // 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; - } + 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) { - - if ($stackId == $sStackId) { - $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; @@ -287,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'); @@ -302,18 +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'); - + $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..a26b415 100644 --- a/classes/controller/class.modrewrite_content_controller.php +++ b/classes/controller/class.modrewrite_content_controller.php @@ -69,15 +69,15 @@ 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); } } @@ -377,7 +377,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); } } diff --git a/classes/controller/class.modrewrite_contenttest_controller.php b/classes/controller/class.modrewrite_contenttest_controller.php index 067e3f3..1f095ee 100644 --- a/classes/controller/class.modrewrite_contenttest_controller.php +++ b/classes/controller/class.modrewrite_contenttest_controller.php @@ -69,7 +69,7 @@ class ModRewrite_ContentTestController extends ModRewrite_ControllerAbstract { // Fetch complete CONTENIDO page structure $aStruct = $oMRTest->fetchFullStructure(); - ModRewriteDebugger::add($aStruct, 'mr_test.php $aStruct'); + ModRewriteDebugger::add($aStruct, 'ModRewrite_ContentTestController::testAction() $aStruct'); // Loop through the structure and compose testcases foreach ($aStruct as $idcat => $aCat) { diff --git a/includes/functions.mod_rewrite.php b/includes/functions.mod_rewrite.php index d93dd73..e007994 100644 --- a/includes/functions.mod_rewrite.php +++ b/includes/functions.mod_rewrite.php @@ -518,7 +518,7 @@ 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); @@ -688,12 +688,12 @@ function mr_setConfiguration($clientId, array $config) { if(file_exists($sConfigClientPath) && is_writable($sConfigClientPath)) { $file = $sConfigClientPath. 'config.mod_rewrite.php'; - } else { + } 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 @@ - +