Overview

Packages

  • Core
    • Authentication
    • Backend
    • Cache
    • CEC
    • Chain
    • ContentType
    • Database
    • Datatype
    • Debug
    • Exception
    • Frontend
      • Search
      • URI
      • Util
    • GenericDB
      • Model
    • GUI
      • HTML
    • I18N
    • LayoutHandler
    • Log
    • Security
    • Session
    • Util
    • Validation
    • Versioning
    • XML
  • Module
    • ContentSitemapHtml
    • ContentSitemapXml
    • ContentUserForum
    • NavigationMain
    • NavigationTop
  • mpAutoloaderClassMap
  • None
  • Plugin
    • ContentAllocation
    • CronjobOverview
    • FormAssistant
    • FrontendLogic
    • FrontendUsers
    • Linkchecker
    • ModRewrite
    • Newsletter
    • Repository
      • FrontendNavigation
      • KeywordDensity
    • SearchSolr
    • SmartyWrapper
    • UrlShortener
    • UserForum
    • Workflow
  • PluginManager
  • Setup
    • Form
    • GUI
    • Helper
      • Environment
      • Filesystem
      • MySQL
      • PHP
    • UpgradeJob

Classes

  • cUriBuilderMR
  • ModRewrite
  • ModRewrite_ContentController
  • ModRewrite_ContentExpertController
  • ModRewrite_ContentTestController
  • ModRewrite_ControllerAbstract
  • ModRewriteBase
  • ModRewriteController
  • ModRewriteDebugger
  • ModRewriteTest
  • ModRewriteUrlStack
  • ModRewriteUrlUtil

Functions

  • mr_arrayValue
  • mr_buildGeneratedCode
  • mr_buildNewUrl
  • mr_conCopyArtLang
  • mr_conMoveArticles
  • mr_conSaveArticle
  • mr_conSyncArticle
  • mr_debugOutput
  • mr_getConfiguration
  • mr_getRequest
  • mr_header
  • mr_i18n
  • mr_loadConfiguration
  • mr_queryAndNextRecord
  • mr_removeMultipleChars
  • mr_requestCleanup
  • mr_runFrontendController
  • mr_setClientLanguageId
  • mr_setConfiguration
  • mr_strCopyCategory
  • mr_strMovedownCategory
  • mr_strMoveSubtree
  • mr_strMoveUpCategory
  • mr_strNewCategory
  • mr_strNewTree
  • mr_strRenameCategory
  • mr_strSyncCategory
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: /**
  3:  * This file contains the uri builder mod rewrite class.
  4:  *
  5:  * @package    Plugin
  6:  * @subpackage ModRewrite
  7:  * @version    SVN Revision $Rev:$
  8:  *
  9:  * @author     Murat Purc <murat@purc.de>
 10:  * @copyright  four for business AG <www.4fb.de>
 11:  * @license    http://www.contenido.org/license/LIZENZ.txt
 12:  * @link       http://www.4fb.de
 13:  * @link       http://www.contenido.org
 14:  */
 15: 
 16: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
 17: 
 18: /**
 19:  * Class to build frontend urls for advandced mod rewrite plugin.
 20:  * Extends abstract Contenido_UriBuilder class and implements singleton pattern.
 21:  *
 22:  * Usage:
 23:  * <pre>
 24:  * cInclude('classes', 'uri/class.uriBuilder.MR.php');
 25:  * $url = 'front_content.php?idart=123';
 26:  * $mrUriBuilder = cUriBuilderMR::getInstance();
 27:  * $mrUriBuilder->buildUrl(array($url));
 28:  * $newUrl = $mrUriBuilder->getUrl();
 29:  * </pre>
 30:  *
 31:  * @todo Add handling of absolute paths, standardize handling of fragments
 32:  *
 33:  * @package    Plugin
 34:  * @subpackage ModRewrite
 35:  */
 36: class cUriBuilderMR extends cUriBuilder {
 37: 
 38:     /**
 39:      * Self instance
 40:      *
 41:      * @var cUriBuilderMR
 42:      */
 43:     private static $_instance;
 44: 
 45:     /**
 46:      * Ampersant used for composing several parameter value pairs
 47:      *
 48:      * @var string
 49:      */
 50:     private $_sAmp = '&amp;';
 51: 
 52:     /**
 53:      * Is XHTML output?
 54:      *
 55:      * @var bool
 56:      */
 57:     private $_bIsXHTML = false;
 58: 
 59:     /**
 60:      * Is mod rewrite enabled?
 61:      *
 62:      * @var bool
 63:      */
 64:     private $_bMREnabled = false;
 65: 
 66:     /**
 67:      * Mod Rewrite configuration
 68:      *
 69:      * @var array
 70:      */
 71:     private $_aMrCfg = null;
 72: 
 73:     /**
 74:      * Constructor, tries to set some member variables.
 75:      */
 76:     private function __construct() {
 77:         $this->sHttpBasePath = '';
 78:         if (ModRewrite::isEnabled()) {
 79:             $this->_aMrCfg = ModRewrite::getConfig();
 80:             $this->_bMREnabled = true;
 81:             $this->_bIsXHTML = (getEffectiveSetting('generator', 'xhtml', 'false') == 'false') ? false : true;
 82:             $this->_sAmp = ($this->_bIsXHTML) ? '&amp;' : '&';
 83:         }
 84:     }
 85: 
 86:     /**
 87:      * Returns a instance of cUriBuilderMR
 88:      *
 89:      * @return cUriBuilderMR
 90:      */
 91:     public static function getInstance() {
 92:         if (self::$_instance == null) {
 93:             self::$_instance = new self();
 94:         }
 95:         return self::$_instance;
 96:     }
 97: 
 98:     /**
 99:      * Builds a URL based on defined mod rewrite settings.
100:      *
101:      * @param array $params Parameter array, provides only following parameters:
102:      *        <code>
103:      *        $params[0] = 'front_content.php?idart=123...'
104:      *        </code>
105:      * @param boolean $bUseAbsolutePath Flag to use absolute path (not used at
106:      *            the moment)
107:      * @return string New build url
108:      */
109:     public function buildUrl(array $params, $bUseAbsolutePath = false) {
110:         ModRewriteDebugger::add($params, 'cUriBuilderMR::buildUrl() $params');
111:         $urlDebug = array();
112:         $urlDebug['in'] = $params;
113: 
114:         $url = self::_buildUrl($params);
115: 
116:         $urlPrefix = '';
117:         if ($bUseAbsolutePath) {
118:             $hmlPath = cRegistry::getFrontendUrl();
119:             $aComp = parse_url($hmlPath);
120:             $urlPrefix = $aComp['scheme'] . '://' . $aComp['host'];
121:             if (mr_arrayValue($aComp, 'port', '') !== '') {
122:                 $urlPrefix .= ':' . $aComp['port'];
123:             }
124:         }
125: 
126:         $this->sUrl = $urlPrefix . $url;
127: 
128:         $urlDebug['out'] = $this->sUrl;
129:         ModRewriteDebugger::add($urlDebug, 'cUriBuilderMR::buildUrl() in -> out');
130:     }
131: 
132:     /**
133:      * Builds the SEO-URL by analyzing passed arguments (parameter value pairs)
134:      *
135:      * @param array $aParams Parameter array
136:      * @return string New build pretty url
137:      */
138:     private function _buildUrl(array $aParams) {
139:         // language should changed, set lang parameter
140:         if (isset($aParams['changelang'])) {
141:             $aParams['lang'] = $aParams['changelang'];
142:         }
143: 
144:         // build the query
145:         $sQuery = http_build_query($aParams);
146: 
147:         // get pretty url parts
148:         $oMRUrlStack = ModRewriteUrlStack::getInstance();
149:         $aPretty = $oMRUrlStack->getPrettyUrlParts('front_content.php?' . $sQuery);
150: 
151:         // get all non CONTENIDO related query parameter
152:         $sQuery = $this->_createUrlQueryPart($aParams);
153: 
154:         // some presettings of variables
155:         $aParts = array();
156: 
157:         // add client id/name if desired
158:         if ($param = $this->_getClientParameter($aParams)) {
159:             $aParts[] = $param;
160:         }
161: 
162:         // add language id/name if desired
163:         if ($param = $this->_getLanguageParameter($aParams)) {
164:             $aParts[] = $param;
165:         }
166: 
167:         // get path part of the url
168:         $sPath = $this->_getPath($aPretty);
169:         if ($sPath !== '') {
170:             $aParts[] = $sPath;
171:         }
172:         $sPath = implode('/', $aParts) . '/';
173: 
174:         // get pagename part of the url
175:         $sArticle = $this->_getArticleName($aPretty, $aParams);
176: 
177:         if ($sArticle !== '') {
178:             $sFileExt = $this->_aMrCfg['file_extension'];
179:         } else {
180:             $sFileExt = '';
181:         }
182: 
183:         $sPathAndArticle = $sPath . $sArticle . $sFileExt;
184:         if ($this->_aMrCfg['use_lowercase_uri'] == 1) {
185:             // use lowercase url
186:             $sPathAndArticle = strtolower($sPathAndArticle);
187:         }
188: 
189:         // $sUrl = $this->_aMrCfg['rootdir'] . $sPathAndArticle . $sQuery;
190:         $sUrl = $sPathAndArticle . $sQuery;
191: 
192:         // remove double or more join parameter
193:         $sUrl = mr_removeMultipleChars('/', $sUrl);
194:         if (substr($sUrl, -2) == '?=') {
195:             $sUrl = substr_replace($sUrl, '', -2);
196:         }
197: 
198:         // now convert CONTENIDO url to an AMR url
199:         $sUrl = ModRewriteUrlUtil::getInstance()->toModRewriteUrl($sUrl);
200: 
201:         return mr_removeMultipleChars('/', $this->_aMrCfg['rootdir'] . $sUrl);
202:     }
203: 
204:     /**
205:      * Loops thru passed parameter array and creates the query part of the URL.
206:      * All non CONTENIDO related parameter will be excluded from composition.
207:      *
208:      * @param array $aArgs Assoziative parameter array
209:      * @return string Composed query part for the URL like
210:      *         '?foo=bar&amp;param=value'
211:      */
212:     private function _createUrlQueryPart(array $aArgs) {
213:         // set list of parameter which are to ignore while setting additional
214:         // parameter
215:         $aIgnoredParams = array(
216:             'idcat', 'idart', 'lang', 'client', 'idcatart', 'idartlang'
217:         );
218:         if ($this->_aMrCfg['use_language'] == 1) {
219:             $aIgnoredParams[] = 'changelang';
220:         }
221:         if ($this->_aMrCfg['use_client'] == 1) {
222:             $aIgnoredParams[] = 'changeclient';
223:         }
224: 
225:         // collect additional non CONTENIDO related parameters
226:         $sQuery = '';
227:         foreach ($aArgs as $p => $v) {
228:             if (!in_array($p, $aIgnoredParams)) {
229:                 // $sQuery .= urlencode(urldecode($p)) . '=' .
230:                 // urlencode(urldecode($v)) . $this->_sAmp;
231:                 $p = urlencode(urldecode($p));
232:                 if (is_array($v)) {
233:                     // handle query parameter like foobar[0}=a&foobar[1]=b...
234:                     foreach ($v as $p2 => $v2) {
235:                         $p2 = urlencode(urldecode($p2));
236:                         $v2 = urlencode(urldecode($v2));
237:                         $sQuery .= $p . '[' . $p2 . ']=' . $v2 . $this->_sAmp;
238:                     }
239:                 } else {
240:                     $v = urlencode(urldecode($v));
241:                     $sQuery .= $p . '=' . $v . $this->_sAmp;
242:                 }
243:             }
244:         }
245:         if (strlen($sQuery) > 0) {
246:             $sQuery = '?' . substr($sQuery, 0, -strlen($this->_sAmp));
247:         }
248:         return $sQuery;
249:     }
250: 
251:     /**
252:      * Returns client id or name depending on settings.
253:      *
254:      * @param array $aArgs Additional arguments
255:      * @return mixed Client id, client name or null
256:      */
257:     private function _getClientParameter(array $aArgs) {
258:         global $client;
259: 
260:         // set client if desired
261:         if ($this->_aMrCfg['use_client'] == 1) {
262:             $iChangeClient = (isset($aArgs['changeclient'])) ? (int) $aArgs['changeclient'] : 0;
263:             $idclient = ($iChangeClient > 0) ? $iChangeClient : $client;
264:             if ($this->_aMrCfg['use_client_name'] == 1) {
265:                 return urlencode(ModRewrite::getClientName($idclient));
266:             } else {
267:                 return $idclient;
268:             }
269:         }
270:         return null;
271:     }
272: 
273:     /**
274:      * Returns language id or name depending on settings.
275:      *
276:      * @param array $aArgs Additional arguments
277:      * @return mixed Language id, language name or null
278:      */
279:     private function _getLanguageParameter(array $aArgs) {
280:         global $lang;
281: 
282:         // set language if desired
283:         if ($this->_aMrCfg['use_language'] == 1) {
284:             $iChangeLang = (isset($aArgs['changelang'])) ? (int) $aArgs['changelang'] : 0;
285:             $idlang = ($iChangeLang > 0) ? $iChangeLang : $lang;
286:             if ($this->_aMrCfg['use_language_name'] == 1) {
287:                 return urlencode(ModRewrite::getLanguageName($idlang));
288:             } else {
289:                 return $idlang;
290:             }
291:         }
292:         return null;
293:     }
294: 
295:     /**
296:      * Returns composed path of url (normally the category structure)
297:      *
298:      * @param array $aPretty Pretty url array
299:      * @return string Path
300:      */
301:     private function _getPath(array $aPretty) {
302:         $sPath = (isset($aPretty['urlpath'])) ? $aPretty['urlpath'] : '';
303: 
304:         // check start directory settings
305:         if ($this->_aMrCfg['startfromroot'] == 0 && (strlen($sPath) > 0)) {
306:             // splitt string in array
307:             $aCategories = explode('/', $sPath);
308: 
309:             // remove first category
310:             array_shift($aCategories);
311: 
312:             // implode array with categories to new string
313:             $sPath = implode('/', $aCategories);
314:         }
315: 
316:         return $sPath;
317:     }
318: 
319:     /**
320:      * Returns articlename depending on current setting
321:      *
322:      * @param array $aPretty Pretty url array
323:      * @param array $aArgs Additional arguments
324:      * @return string Articlename
325:      */
326:     private function _getArticleName(array $aPretty, array $aArgs) {
327:         $sArticle = (isset($aPretty['urlname'])) ? $aPretty['urlname'] : '';
328: 
329:         $iIdCat = (isset($aArgs['idcat'])) ? (int) $aArgs['idcat'] : 0;
330:         $iIdCatLang = (isset($aArgs['idcatlang'])) ? (int) $aArgs['idcatlang'] : 0;
331:         $iIdCatArt = (isset($aArgs['idcatart'])) ? (int) $aArgs['idcatart'] : 0;
332:         $iIdArt = (isset($aArgs['idart'])) ? (int) $aArgs['idart'] : 0;
333:         $iIdArtLang = (isset($aArgs['idartlang'])) ? (int) $aArgs['idartlang'] : 0;
334: 
335:         // category id was passed but not article id
336:         if (($iIdCat > 0 || $iIdCatLang > 0) && $iIdCatArt == 0 && $iIdArt == 0 && $iIdArtLang == 0) {
337:             $sArticle = '';
338:             if ($this->_aMrCfg['add_startart_name_to_url']) {
339:                 if ($this->_aMrCfg['default_startart_name'] !== '') {
340:                     // use default start article name
341:                     $sArticle = $this->_aMrCfg['default_startart_name'];
342:                 } else {
343:                     $sArticle = (isset($aPretty['urlname'])) ? $aPretty['urlname'] : '';
344:                 }
345:             } else {
346:                 // url is to create without article name
347:                 $sArticle = '';
348:             }
349:         }
350: 
351:         return $sArticle;
352:     }
353: 
354: }
355: 
CMS CONTENIDO 4.9.0 API documentation generated by ApiGen 2.8.0