1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
14:
15: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
16:
17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
37: class cUriBuilderMR extends cUriBuilder {
38:
39: 40: 41: 42: 43:
44: private static $_instance;
45:
46: 47: 48: 49: 50: 51: 52: 53: 54:
55: private static $_cachedRootDir;
56:
57: 58: 59: 60: 61:
62: private $_sAmp = '&';
63:
64: 65: 66: 67: 68:
69: private $_bIsXHTML = false;
70:
71: 72: 73: 74: 75:
76: private $_bMREnabled = false;
77:
78: 79: 80: 81: 82:
83: private $_aMrCfg = NULL;
84:
85: 86: 87: 88: 89:
90: private function __construct() {
91: $this->sHttpBasePath = '';
92: if (ModRewrite::isEnabled()) {
93: $this->_aMrCfg = ModRewrite::getConfig();
94: $this->_bMREnabled = true;
95: $this->_bIsXHTML = (getEffectiveSetting('generator', 'xhtml', 'false') == 'false') ? false : true;
96: $this->_sAmp = ($this->_bIsXHTML) ? '&' : '&';
97: }
98: }
99:
100: 101: 102: 103: 104:
105: public static function getInstance() {
106: if (self::$_instance == NULL) {
107: self::$_instance = new self();
108: }
109: return self::$_instance;
110: }
111:
112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124:
125: public function buildUrl(array $params, $bUseAbsolutePath = false) {
126: ModRewriteDebugger::add($params, 'cUriBuilderMR::buildUrl() $params');
127: $urlDebug = array();
128: $urlDebug['in'] = $params;
129:
130: $url = self::_buildUrl($params);
131:
132: $urlPrefix = '';
133: if ($bUseAbsolutePath) {
134: $hmlPath = cRegistry::getFrontendUrl();
135: $aComp = parse_url($hmlPath);
136: $urlPrefix = $aComp['scheme'] . '://' . $aComp['host'];
137: if (mr_arrayValue($aComp, 'port', '') !== '') {
138: $urlPrefix .= ':' . $aComp['port'];
139: }
140: }
141:
142: $this->sUrl = $urlPrefix . $url;
143:
144: $urlDebug['out'] = $this->sUrl;
145: ModRewriteDebugger::add($urlDebug, 'cUriBuilderMR::buildUrl() in -> out');
146: }
147:
148: 149: 150: 151: 152: 153: 154: 155: 156:
157: private function _buildUrl(array $aParams) {
158:
159: if (isset($aParams['changelang'])) {
160: $aParams['lang'] = $aParams['changelang'];
161: }
162:
163:
164: $sQuery = http_build_query($aParams);
165:
166:
167: $oMRUrlStack = ModRewriteUrlStack::getInstance();
168: $aPretty = $oMRUrlStack->getPrettyUrlParts('front_content.php?' . $sQuery);
169:
170:
171: $sQuery = $this->_createUrlQueryPart($aParams);
172:
173:
174: $aParts = array();
175:
176:
177: $param = $this->_getClientParameter($aParams);
178: if ($param) {
179: $aParts[] = $param;
180: }
181:
182:
183: $param = $this->_getLanguageParameter($aParams);
184: if ($param) {
185: $aParts[] = $param;
186: }
187:
188:
189: $sPath = $this->_getPath($aPretty);
190: if ($sPath !== '') {
191: $aParts[] = $sPath;
192: }
193: $sPath = implode('/', $aParts) . '/';
194:
195:
196: $sArticle = $this->_getArticleName($aPretty, $aParams);
197:
198: if ($sArticle !== '') {
199: $sFileExt = $this->_aMrCfg['file_extension'];
200: } else {
201: $sFileExt = '';
202: }
203:
204: $sPathAndArticle = $sPath . $sArticle . $sFileExt;
205:
206:
207: if ($this->_aMrCfg['use_lowercase_uri'] == 1) {
208: $sPathAndArticle = strtolower($sPathAndArticle);
209: }
210:
211:
212: $sUrl = $sPathAndArticle . $sQuery;
213:
214:
215: $sUrl = mr_removeMultipleChars('/', $sUrl);
216: if (substr($sUrl, -2) == '?=') {
217: $sUrl = substr_replace($sUrl, '', -2);
218: }
219:
220:
221: $sUrl = ModRewriteUrlUtil::getInstance()->toModRewriteUrl($sUrl);
222:
223:
224:
225:
226: $sUrl = self::getMultiClientRootDir($this->_aMrCfg['rootdir']) . $sUrl;
227:
228:
229: $sUrl = mr_removeMultipleChars('/', $sUrl);
230:
231: return $sUrl;
232: }
233:
234: 235: 236: 237: 238: 239: 240: 241: 242: 243:
244: public static function getMultiClientRootDir($configuredRootDir) {
245:
246:
247: if (isset(self::$_cachedRootDir)) {
248: return self::$_cachedRootDir;
249: }
250:
251:
252: $props = cRegistry::getClient()->getProperties();
253:
254:
255:
256: if (!is_array($props)) {
257: self::$_cachedRootDir = $configuredRootDir;
258: return $configuredRootDir;
259: }
260:
261: foreach ($props as $prop) {
262:
263: if ($prop['type'] != 'client') {
264: continue;
265: }
266:
267:
268: if (false === strstr($prop['name'], 'frontend_path')) {
269: continue;
270: }
271:
272:
273: $httpHost = $_SERVER['HTTP_HOST'];
274: $httpPath = $_SERVER['REQUEST_URI'];
275:
276:
277: $propHost = parse_url($prop['value'], PHP_URL_HOST);
278: $propPath = parse_url($prop['value'], PHP_URL_PATH);
279:
280:
281:
282: if ($propHost != $httpHost && ('www.' . $propHost) != $httpHost && $propHost != 'www.' . $httpHost) {
283: continue;
284: }
285:
286:
287: if (0 !== strpos($httpPath, $propPath)) {
288: continue;
289: }
290:
291:
292: self::$_cachedRootDir = $propPath;
293: return $propPath;
294: }
295:
296:
297: self::$_cachedRootDir = $configuredRootDir;
298: return $configuredRootDir;
299: }
300:
301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313:
314: private function _createUrlQueryPart(array $aArgs) {
315:
316:
317: $aIgnoredParams = array(
318: 'idcat',
319: 'idart',
320: 'lang',
321: 'client',
322: 'idcatart',
323: 'idartlang'
324: );
325: if ($this->_aMrCfg['use_language'] == 1) {
326: $aIgnoredParams[] = 'changelang';
327: }
328: if ($this->_aMrCfg['use_client'] == 1) {
329: $aIgnoredParams[] = 'changeclient';
330: }
331:
332:
333: $sQuery = '';
334: foreach ($aArgs as $p => $v) {
335: if (!in_array($p, $aIgnoredParams)) {
336:
337:
338: $p = urlencode(urldecode($p));
339: if (is_array($v)) {
340:
341: foreach ($v as $p2 => $v2) {
342: $p2 = urlencode(urldecode($p2));
343: $v2 = urlencode(urldecode($v2));
344: $sQuery .= $p . '[' . $p2 . ']=' . $v2 . $this->_sAmp;
345: }
346: } else {
347: $v = urlencode(urldecode($v));
348: $sQuery .= $p . '=' . $v . $this->_sAmp;
349: }
350: }
351: }
352: if (strlen($sQuery) > 0) {
353: $sQuery = '?' . substr($sQuery, 0, -strlen($this->_sAmp));
354: }
355: return $sQuery;
356: }
357:
358: 359: 360: 361: 362: 363: 364: 365:
366: private function _getClientParameter(array $aArgs) {
367: global $client;
368:
369:
370: if ($this->_aMrCfg['use_client'] == 1) {
371: $iChangeClient = (isset($aArgs['changeclient'])) ? (int) $aArgs['changeclient'] : 0;
372: $idclient = ($iChangeClient > 0) ? $iChangeClient : $client;
373: if ($this->_aMrCfg['use_client_name'] == 1) {
374: return urlencode(ModRewrite::getClientName($idclient));
375: } else {
376: return $idclient;
377: }
378: }
379: return NULL;
380: }
381:
382: 383: 384: 385: 386: 387: 388: 389:
390: private function _getLanguageParameter(array $aArgs) {
391: global $lang;
392:
393:
394: if ($this->_aMrCfg['use_language'] == 1) {
395: $iChangeLang = (isset($aArgs['changelang'])) ? (int) $aArgs['changelang'] : 0;
396: $idlang = ($iChangeLang > 0) ? $iChangeLang : $lang;
397: if ($this->_aMrCfg['use_language_name'] == 1) {
398: return urlencode(ModRewrite::getLanguageName($idlang));
399: } else {
400: return $idlang;
401: }
402: }
403: return NULL;
404: }
405:
406: 407: 408: 409: 410: 411: 412: 413:
414: private function _getPath(array $aPretty) {
415: $sPath = (isset($aPretty['urlpath'])) ? $aPretty['urlpath'] : '';
416:
417:
418: if ($this->_aMrCfg['startfromroot'] == 0 && (strlen($sPath) > 0)) {
419:
420: $aCategories = explode('/', $sPath);
421:
422:
423: array_shift($aCategories);
424:
425:
426: $sPath = implode('/', $aCategories);
427: }
428:
429: return $sPath;
430: }
431:
432: 433: 434: 435: 436: 437: 438: 439: 440: 441:
442: private function _getArticleName(array $aPretty, array $aArgs) {
443: $sArticle = (isset($aPretty['urlname'])) ? $aPretty['urlname'] : '';
444:
445: $iIdCat = (isset($aArgs['idcat'])) ? (int) $aArgs['idcat'] : 0;
446: $iIdCatLang = (isset($aArgs['idcatlang'])) ? (int) $aArgs['idcatlang'] : 0;
447: $iIdCatArt = (isset($aArgs['idcatart'])) ? (int) $aArgs['idcatart'] : 0;
448: $iIdArt = (isset($aArgs['idart'])) ? (int) $aArgs['idart'] : 0;
449: $iIdArtLang = (isset($aArgs['idartlang'])) ? (int) $aArgs['idartlang'] : 0;
450:
451:
452: if (($iIdCat > 0 || $iIdCatLang > 0) && $iIdCatArt == 0 && $iIdArt == 0 && $iIdArtLang == 0) {
453: $sArticle = '';
454: if ($this->_aMrCfg['add_startart_name_to_url']) {
455: if ($this->_aMrCfg['default_startart_name'] !== '') {
456:
457: $sArticle = $this->_aMrCfg['default_startart_name'];
458: } else {
459: $sArticle = (isset($aPretty['urlname'])) ? $aPretty['urlname'] : '';
460: }
461: } else {
462:
463: $sArticle = '';
464: }
465: }
466:
467: return $sArticle;
468: }
469: }
470: