| 1: | <?php | 
| 2: |  | 
| 3: |  | 
| 4: |  | 
| 5: |  | 
| 6: |  | 
| 7: |  | 
| 8: |  | 
| 9: |  | 
| 10: |  | 
| 11: |  | 
| 12: |  | 
| 13: |  | 
| 14: |  | 
| 15: |  | 
| 16: |  | 
| 17: |  | 
| 18: |  | 
| 19: |  | 
| 20: |  | 
| 21: | use Xmf\Request; | 
| 22: |  | 
| 23: | defined('XOOPS_ROOT_PATH') || exit('Restricted access'); | 
| 24: |  | 
| 25: |  | 
| 26: |  | 
| 27: |  | 
| 28: |  | 
| 29: |  | 
| 30: |  | 
| 31: |  | 
| 32: |  | 
| 33: | class xos_opal_ThemeFactory | 
| 34: | { | 
| 35: | public $xoBundleIdentifier = 'xos_opal_ThemeFactory'; | 
| 36: |  | 
| 37: |  | 
| 38: |  | 
| 39: |  | 
| 40: |  | 
| 41: | public $allowedThemes = array(); | 
| 42: |  | 
| 43: |  | 
| 44: |  | 
| 45: |  | 
| 46: |  | 
| 47: | public $defaultTheme = 'default'; | 
| 48: |  | 
| 49: |  | 
| 50: |  | 
| 51: |  | 
| 52: |  | 
| 53: | public $allowUserSelection = true; | 
| 54: |  | 
| 55: |  | 
| 56: |  | 
| 57: |  | 
| 58: |  | 
| 59: |  | 
| 60: |  | 
| 61: | public function createInstance($options = array(), $initArgs = array()) | 
| 62: | { | 
| 63: |  | 
| 64: | if (empty($options['folderName'])) { | 
| 65: | if (isset($_REQUEST['xoops_theme_select']) && ($req = $_REQUEST['xoops_theme_select']) && $this->isThemeAllowed($req)) { | 
| 66: | $options['folderName'] = $req; | 
| 67: | if (isset($_SESSION) && $this->allowUserSelection) { | 
| 68: | $_SESSION[$this->xoBundleIdentifier]['defaultTheme'] = $req; | 
| 69: | } | 
| 70: | } elseif (isset($_SESSION[$this->xoBundleIdentifier]['defaultTheme'])) { | 
| 71: | $options['folderName'] = $_SESSION[$this->xoBundleIdentifier]['defaultTheme']; | 
| 72: | } elseif (empty($options['folderName']) || !$this->isThemeAllowed($options['folderName'])) { | 
| 73: | $options['folderName'] = $this->defaultTheme; | 
| 74: | } | 
| 75: | $GLOBALS['xoopsConfig']['theme_set'] = $options['folderName']; | 
| 76: | } | 
| 77: | $testPath = isset($options['themesPath']) | 
| 78: | ? XOOPS_ROOT_PATH  . '/' . $options['themesPath'] . '/' . $options['folderName'] | 
| 79: | : XOOPS_THEME_PATH . '/' . $options['folderName']; | 
| 80: | if (!(file_exists($testPath  . '/theme.tpl') | 
| 81: | || file_exists($testPath . '/theme.html')) | 
| 82: | ) { | 
| 83: | trigger_error('Theme not found -- ' . $options['folderName']); | 
| 84: | $this->defaultTheme = 'default'; | 
| 85: | $options['folderName'] = $this->defaultTheme; | 
| 86: | $GLOBALS['xoopsConfig']['theme_set'] = $options['folderName']; | 
| 87: | } | 
| 88: | $options['path'] = XOOPS_THEME_PATH . '/' . $options['folderName']; | 
| 89: | $inst            = new xos_opal_Theme(); | 
| 90: | foreach ($options as $k => $v) { | 
| 91: | $inst->$k = $v; | 
| 92: | } | 
| 93: | $inst->xoInit(); | 
| 94: |  | 
| 95: | return $inst; | 
| 96: | } | 
| 97: |  | 
| 98: |  | 
| 99: |  | 
| 100: |  | 
| 101: |  | 
| 102: |  | 
| 103: |  | 
| 104: | public function isThemeAllowed($name) | 
| 105: | { | 
| 106: | return (empty($this->allowedThemes) || in_array($name, $this->allowedThemes)); | 
| 107: | } | 
| 108: | } | 
| 109: |  | 
| 110: |  | 
| 111: |  | 
| 112: |  | 
| 113: |  | 
| 114: |  | 
| 115: |  | 
| 116: |  | 
| 117: |  | 
| 118: |  | 
| 119: | class xos_opal_AdminThemeFactory extends xos_opal_ThemeFactory | 
| 120: | { | 
| 121: |  | 
| 122: |  | 
| 123: |  | 
| 124: |  | 
| 125: |  | 
| 126: |  | 
| 127: | public function &createInstance($options = array(), $initArgs = array()) | 
| 128: | { | 
| 129: | $options['plugins']      = array(); | 
| 130: | $options['renderBanner'] = false; | 
| 131: | $inst                    = parent::createInstance($options, $initArgs); | 
| 132: | $inst->path              = XOOPS_ADMINTHEME_PATH . '/' . $inst->folderName; | 
| 133: | $inst->url               = XOOPS_ADMINTHEME_URL . '/' . $inst->folderName; | 
| 134: | $inst->template->assign(array( | 
| 135: | 'theme_path'  => $inst->path, | 
| 136: | 'theme_tpl'   => $inst->path . '/xotpl', | 
| 137: | 'theme_url'   => $inst->url, | 
| 138: | 'theme_img'   => $inst->url . '/img', | 
| 139: | 'theme_icons' => $inst->url . '/icons', | 
| 140: | 'theme_css'   => $inst->url . '/css', | 
| 141: | 'theme_js'    => $inst->url . '/js', | 
| 142: | 'theme_lang'  => $inst->url . '/language')); | 
| 143: |  | 
| 144: | return $inst; | 
| 145: | } | 
| 146: | } | 
| 147: |  | 
| 148: |  | 
| 149: |  | 
| 150: |  | 
| 151: | class xos_opal_Theme | 
| 152: | { | 
| 153: |  | 
| 154: |  | 
| 155: |  | 
| 156: |  | 
| 157: |  | 
| 158: | public $renderBanner = true; | 
| 159: |  | 
| 160: |  | 
| 161: |  | 
| 162: |  | 
| 163: |  | 
| 164: | public $folderName = ''; | 
| 165: |  | 
| 166: |  | 
| 167: |  | 
| 168: |  | 
| 169: |  | 
| 170: | public $path = ''; | 
| 171: | public $url  = ''; | 
| 172: |  | 
| 173: |  | 
| 174: |  | 
| 175: |  | 
| 176: |  | 
| 177: |  | 
| 178: | public $bufferOutput = true; | 
| 179: |  | 
| 180: |  | 
| 181: |  | 
| 182: |  | 
| 183: |  | 
| 184: | public $canvasTemplate = 'theme.tpl'; | 
| 185: |  | 
| 186: |  | 
| 187: |  | 
| 188: |  | 
| 189: |  | 
| 190: |  | 
| 191: | public $themesPath = 'themes'; | 
| 192: |  | 
| 193: |  | 
| 194: |  | 
| 195: |  | 
| 196: |  | 
| 197: |  | 
| 198: | public $contentTemplate = ''; | 
| 199: |  | 
| 200: | public $contentCacheLifetime = 0; | 
| 201: | public $contentCacheId; | 
| 202: |  | 
| 203: |  | 
| 204: |  | 
| 205: |  | 
| 206: |  | 
| 207: |  | 
| 208: | public $content = ''; | 
| 209: |  | 
| 210: |  | 
| 211: |  | 
| 212: |  | 
| 213: |  | 
| 214: |  | 
| 215: | public $plugins     = array( | 
| 216: | 'xos_logos_PageBuilder'); | 
| 217: | public $renderCount = 0; | 
| 218: |  | 
| 219: |  | 
| 220: |  | 
| 221: |  | 
| 222: |  | 
| 223: | public $template = false; | 
| 224: |  | 
| 225: |  | 
| 226: |  | 
| 227: |  | 
| 228: |  | 
| 229: |  | 
| 230: | public $metas = array( | 
| 231: |  | 
| 232: |  | 
| 233: |  | 
| 234: | 'meta'   => array(), | 
| 235: | 'link'   => array(), | 
| 236: | 'script' => array()); | 
| 237: |  | 
| 238: |  | 
| 239: |  | 
| 240: |  | 
| 241: |  | 
| 242: |  | 
| 243: | public $htmlHeadStrings = array(); | 
| 244: |  | 
| 245: |  | 
| 246: |  | 
| 247: |  | 
| 248: |  | 
| 249: | public $templateVars = array(); | 
| 250: |  | 
| 251: |  | 
| 252: |  | 
| 253: |  | 
| 254: |  | 
| 255: |  | 
| 256: | public $use_extra_cache_id = true; | 
| 257: |  | 
| 258: |  | 
| 259: |  | 
| 260: |  | 
| 261: |  | 
| 262: |  | 
| 263: |  | 
| 264: |  | 
| 265: |  | 
| 266: |  | 
| 267: |  | 
| 268: |  | 
| 269: |  | 
| 270: |  | 
| 271: |  | 
| 272: |  | 
| 273: |  | 
| 274: |  | 
| 275: |  | 
| 276: |  | 
| 277: |  | 
| 278: | public function xoInit($options = array()) | 
| 279: | { | 
| 280: |  | 
| 281: | $configHandler = xoops_getHandler('config'); | 
| 282: |  | 
| 283: | $this->path                   = XOOPS_THEME_PATH . '/' . $this->folderName; | 
| 284: | $this->url                    = XOOPS_THEME_URL . '/' . $this->folderName; | 
| 285: | $this->template               = null; | 
| 286: | $this->template               = new XoopsTpl(); | 
| 287: | $this->template->currentTheme = $this; | 
| 288: | $this->template->assignByRef('xoTheme', $this); | 
| 289: | $GLOBALS['xoTheme']  = $this; | 
| 290: | $GLOBALS['xoopsTpl'] = $this->template; | 
| 291: | $tempPath = str_replace('\\', '/', realpath(XOOPS_ROOT_PATH) . '/'); | 
| 292: | $tempName = str_replace('\\', '/', realpath($_SERVER['SCRIPT_FILENAME'])); | 
| 293: | $xoops_page = str_replace($tempPath, '', $tempName); | 
| 294: | if (strpos($xoops_page, 'modules') !== false) { | 
| 295: | $xoops_page = str_replace('modules/', '', $xoops_page); | 
| 296: | } | 
| 297: | $tempScriptname = str_replace('\\', '/', $_SERVER['SCRIPT_NAME']); | 
| 298: | $tempRequesturi = str_replace('\\', '/', Request::getString('REQUEST_URI', '', 'SERVER')); | 
| 299: | if (strlen($tempRequesturi) > strlen($tempScriptname)) { | 
| 300: | $xoops_modulepage =  $xoops_page . str_replace($tempScriptname, '', $tempRequesturi); | 
| 301: | } else { | 
| 302: | $xoops_modulepage =  ''; | 
| 303: | } | 
| 304: | $xoops_page = str_replace('.php', '', $xoops_page); | 
| 305: | if (isset($GLOBALS['xoopsConfig']['startpage'])) { | 
| 306: | $xoops_startpage = $GLOBALS['xoopsConfig']['startpage']; | 
| 307: | if ($xoops_startpage == '--') { | 
| 308: | $xoops_startpage = 'system'; | 
| 309: | } | 
| 310: | } else { | 
| 311: | $xoops_startpage = 'system'; | 
| 312: | } | 
| 313: |  | 
| 314: | if (file_exists($this->path . "/theme_autorun.php")) { | 
| 315: | include_once($this->path . "/theme_autorun.php"); | 
| 316: | } | 
| 317: |  | 
| 318: | $searchConfig = $configHandler->getConfigsByCat(XOOPS_CONF_SEARCH); | 
| 319: | $xoops_search = (bool) (isset($searchConfig['enable_search']) && $searchConfig['enable_search'] === 1); | 
| 320: | $this->template->assign(array( | 
| 321: | 'xoops_theme'      => $GLOBALS['xoopsConfig']['theme_set'], | 
| 322: | 'xoops_imageurl'   => XOOPS_THEME_URL . '/' . $GLOBALS['xoopsConfig']['theme_set'] . '/', | 
| 323: | 'xoops_themecss'   => xoops_getcss($GLOBALS['xoopsConfig']['theme_set']), | 
| 324: | 'xoops_requesturi' => htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES), | 
| 325: | 'xoops_sitename'   => htmlspecialchars($GLOBALS['xoopsConfig']['sitename'], ENT_QUOTES), | 
| 326: | 'xoops_slogan'     => htmlspecialchars($GLOBALS['xoopsConfig']['slogan'], ENT_QUOTES), | 
| 327: | 'xoops_dirname'    => isset($GLOBALS['xoopsModule']) && is_object($GLOBALS['xoopsModule']) | 
| 328: | ? $GLOBALS['xoopsModule']->getVar('dirname') : 'system', | 
| 329: | 'xoops_page'       => $xoops_page, | 
| 330: | 'xoops_startpage'  => $xoops_startpage, | 
| 331: | 'xoops_modulepage' => $xoops_modulepage, | 
| 332: | 'xoops_banner'     => ($GLOBALS['xoopsConfig']['banners'] && $this->renderBanner) | 
| 333: | ? xoops_getbanner() : ' ', | 
| 334: | 'xoops_pagetitle'  => isset($GLOBALS['xoopsModule']) && is_object($GLOBALS['xoopsModule']) | 
| 335: | ? $GLOBALS['xoopsModule']->getVar('name') | 
| 336: | : htmlspecialchars($GLOBALS['xoopsConfig']['slogan'], ENT_QUOTES), | 
| 337: | 'xoops_search'     => $xoops_search, | 
| 338: | )); | 
| 339: | if (isset($GLOBALS['xoopsUser']) && is_object($GLOBALS['xoopsUser'])) { | 
| 340: | $this->template->assign(array( | 
| 341: | 'xoops_isuser'     => true, | 
| 342: | 'xoops_avatar'     => XOOPS_UPLOAD_URL . '/' . $GLOBALS['xoopsUser']->getVar('user_avatar'), | 
| 343: | 'xoops_userid'     => $GLOBALS['xoopsUser']->getVar('uid'), | 
| 344: | 'xoops_uname'      => $GLOBALS['xoopsUser']->getVar('uname'), | 
| 345: | 'xoops_name'       => $GLOBALS['xoopsUser']->getVar('name'), | 
| 346: | 'xoops_isadmin'    => $GLOBALS['xoopsUserIsAdmin'], | 
| 347: | 'xoops_usergroups' => $GLOBALS['xoopsUser']->getGroups(), | 
| 348: | )); | 
| 349: | } else { | 
| 350: | $this->template->assign(array( | 
| 351: | 'xoops_isuser'     => false, | 
| 352: | 'xoops_isadmin'    => false, | 
| 353: | 'xoops_usergroups' => array(XOOPS_GROUP_ANONYMOUS), | 
| 354: | )); | 
| 355: | } | 
| 356: |  | 
| 357: |  | 
| 358: | $criteria       = new CriteriaCompo(new Criteria('conf_modid', 0)); | 
| 359: | $criteria->add(new Criteria('conf_catid', XOOPS_CONF_METAFOOTER)); | 
| 360: | $config = $configHandler->getConfigs($criteria, true); | 
| 361: | foreach (array_keys($config) as $i) { | 
| 362: | $name = $config[$i]->getVar('conf_name', 'n'); | 
| 363: | $value = $config[$i]->getVar('conf_value', 'n'); | 
| 364: |  | 
| 365: | if ($name === 'footer' || $name === 'meta_copyright') { | 
| 366: | $value = str_replace('{X_SITEURL}', XOOPS_URL . '/', $value); | 
| 367: | $value = str_replace('{X_YEAR}', date('Y', time()), $value); | 
| 368: | } | 
| 369: | if (substr($name, 0, 5) === 'meta_') { | 
| 370: | $this->addMeta('meta', substr($name, 5), $value); | 
| 371: | } else { | 
| 372: |  | 
| 373: | $this->template->assign("xoops_$name", $value); | 
| 374: | } | 
| 375: | } | 
| 376: |  | 
| 377: | $this->addScript('include/xoops.js'); | 
| 378: | $this->loadLocalization(); | 
| 379: |  | 
| 380: | if ($this->bufferOutput) { | 
| 381: | ob_start(); | 
| 382: | } | 
| 383: |  | 
| 384: | foreach ($this->plugins as $k => $bundleId) { | 
| 385: | if (!is_object($bundleId)) { | 
| 386: | $this->plugins[$bundleId]        = null; | 
| 387: | $this->plugins[$bundleId]        = new $bundleId(); | 
| 388: | $this->plugins[$bundleId]->theme =& $this; | 
| 389: | $this->plugins[$bundleId]->xoInit(); | 
| 390: | unset($this->plugins[$k]); | 
| 391: | } | 
| 392: | } | 
| 393: |  | 
| 394: | return true; | 
| 395: | } | 
| 396: |  | 
| 397: |  | 
| 398: |  | 
| 399: |  | 
| 400: |  | 
| 401: |  | 
| 402: |  | 
| 403: |  | 
| 404: |  | 
| 405: |  | 
| 406: | public function generateCacheId($cache_id, $extraString = '') | 
| 407: | { | 
| 408: | static $extra_string; | 
| 409: | if (!$this->use_extra_cache_id) { | 
| 410: | return $cache_id; | 
| 411: | } | 
| 412: |  | 
| 413: | if (empty($extraString)) { | 
| 414: | if (empty($extra_string)) { | 
| 415: |  | 
| 416: | $extra_string = $GLOBALS['xoopsConfig']['language']; | 
| 417: |  | 
| 418: | if (!isset($GLOBALS['xoopsUser']) || !is_object($GLOBALS['xoopsUser'])) { | 
| 419: | $extra_string .= '-' . XOOPS_GROUP_ANONYMOUS; | 
| 420: | } else { | 
| 421: | $groups = $GLOBALS['xoopsUser']->getGroups(); | 
| 422: | sort($groups); | 
| 423: |  | 
| 424: |  | 
| 425: | $extra_string .= '-' . substr(md5(implode('-', $groups)), 0, 8) . '-' . substr(md5(XOOPS_DB_PASS . XOOPS_DB_NAME . XOOPS_DB_USER), 0, 8); | 
| 426: | } | 
| 427: | } | 
| 428: | $extraString = $extra_string; | 
| 429: | } | 
| 430: | $cache_id .= '-' . $extraString; | 
| 431: |  | 
| 432: | return $cache_id; | 
| 433: | } | 
| 434: |  | 
| 435: |  | 
| 436: |  | 
| 437: |  | 
| 438: |  | 
| 439: |  | 
| 440: | public function checkCache() | 
| 441: | { | 
| 442: | if ($_SERVER['REQUEST_METHOD'] !== 'POST' && $this->contentCacheLifetime) { | 
| 443: | $template                       = $this->contentTemplate ?: 'db:system_dummy.tpl'; | 
| 444: | $this->template->caching        = 2; | 
| 445: | $this->template->cache_lifetime = $this->contentCacheLifetime; | 
| 446: | $uri                            = str_replace(XOOPS_URL, '', $_SERVER['REQUEST_URI']); | 
| 447: |  | 
| 448: | if (defined('SID') && SID && strpos($uri, SID)) { | 
| 449: | $uri = preg_replace("/([\?&])(" . SID . "$|" . SID . '&)/', "\\1", $uri); | 
| 450: | } | 
| 451: | $this->contentCacheId = $this->generateCacheId('page_' . substr(md5($uri), 0, 8)); | 
| 452: | if ($this->template->isCached($template, $this->contentCacheId)) { | 
| 453: | $xoopsLogger = XoopsLogger::getInstance(); | 
| 454: | $xoopsLogger->addExtra($template, sprintf('Cached (regenerates every %d seconds)', $this->contentCacheLifetime)); | 
| 455: | $this->render(null, null, $template); | 
| 456: |  | 
| 457: | return true; | 
| 458: | } | 
| 459: | } | 
| 460: |  | 
| 461: | return false; | 
| 462: | } | 
| 463: |  | 
| 464: |  | 
| 465: |  | 
| 466: |  | 
| 467: |  | 
| 468: |  | 
| 469: |  | 
| 470: |  | 
| 471: |  | 
| 472: |  | 
| 473: |  | 
| 474: |  | 
| 475: |  | 
| 476: |  | 
| 477: |  | 
| 478: |  | 
| 479: |  | 
| 480: | public function render($canvasTpl = null, $pageTpl = null, $contentTpl = null, $vars = array()) | 
| 481: | { | 
| 482: | if ($this->renderCount) { | 
| 483: | return false; | 
| 484: | } | 
| 485: | $xoopsLogger = XoopsLogger::getInstance(); | 
| 486: | $xoopsLogger->startTime('Page rendering'); | 
| 487: |  | 
| 488: | xoops_load('xoopscache'); | 
| 489: | $cache = XoopsCache::getInstance(); | 
| 490: |  | 
| 491: |  | 
| 492: | if ($this->contentCacheLifetime && $this->contentCacheId && $content = $cache->read($this->contentCacheId)) { | 
| 493: |  | 
| 494: | $this->htmlHeadStrings = array_merge($this->htmlHeadStrings, $content['htmlHeadStrings']); | 
| 495: | foreach ($content['metas'] as $type => $value) { | 
| 496: | $this->metas[$type] = array_merge($this->metas[$type], $content['metas'][$type]); | 
| 497: | } | 
| 498: | $GLOBALS['xoopsOption']['xoops_pagetitle']     = $content['xoops_pagetitle']; | 
| 499: | $GLOBALS['xoopsOption']['xoops_module_header'] = $content['header']; | 
| 500: | } | 
| 501: |  | 
| 502: | if (!isset($content) || false === $content) { | 
| 503: | $content = array(); | 
| 504: | } | 
| 505: | if (!empty($GLOBALS['xoopsOption']['xoops_pagetitle'])) { | 
| 506: | $this->template->assign('xoops_pagetitle', $GLOBALS['xoopsOption']['xoops_pagetitle']); | 
| 507: | } | 
| 508: | $header = empty($GLOBALS['xoopsOption']['xoops_module_header']) ? $this->template->getTemplateVars('xoops_module_header') : $GLOBALS['xoopsOption']['xoops_module_header']; | 
| 509: |  | 
| 510: |  | 
| 511: | if ($this->contentCacheLifetime && $this->contentCacheId && !$contentTpl) { | 
| 512: | $content['htmlHeadStrings'] = $this->htmlHeadStrings; | 
| 513: | $content['metas']           = $this->metas; | 
| 514: | $content['xoops_pagetitle'] = $this->template->getTemplateVars('xoops_pagetitle'); | 
| 515: | $content['header']          = $header; | 
| 516: | $cache->write($this->contentCacheId, $content); | 
| 517: | } | 
| 518: |  | 
| 519: |  | 
| 520: | $old = array( | 
| 521: | 'robots', | 
| 522: | 'keywords', | 
| 523: | 'description', | 
| 524: | 'rating', | 
| 525: | 'author', | 
| 526: | 'copyright'); | 
| 527: | foreach ($this->metas['meta'] as $name => $value) { | 
| 528: | if (in_array($name, $old)) { | 
| 529: | $this->template->assign("xoops_meta_$name", htmlspecialchars($value, ENT_QUOTES)); | 
| 530: | unset($this->metas['meta'][$name]); | 
| 531: | } | 
| 532: | } | 
| 533: |  | 
| 534: |  | 
| 535: | $this->template->assign('xoops_module_header', $this->renderMetas(null, true) . "\n" . $header); | 
| 536: |  | 
| 537: | if ($canvasTpl) { | 
| 538: | $this->canvasTemplate = $canvasTpl; | 
| 539: | } | 
| 540: | if ($contentTpl) { | 
| 541: | $this->contentTemplate = $contentTpl; | 
| 542: | } | 
| 543: | if (!empty($vars)) { | 
| 544: | $this->template->assign($vars); | 
| 545: | } | 
| 546: | if ($this->contentTemplate) { | 
| 547: | $this->content = $this->template->fetch($this->contentTemplate, $this->contentCacheId); | 
| 548: | } | 
| 549: | if ($this->bufferOutput) { | 
| 550: | $this->content .= ob_get_contents(); | 
| 551: | ob_end_clean(); | 
| 552: | } | 
| 553: |  | 
| 554: | $this->template->assignByRef('xoops_contents', $this->content); | 
| 555: |  | 
| 556: |  | 
| 557: | $this->template->caching = 0; | 
| 558: | if (file_exists($this->path . '/' . $this->canvasTemplate)) { | 
| 559: | $this->template->display($this->path . '/' . $this->canvasTemplate); | 
| 560: | } else { | 
| 561: | $this->template->display($this->path . '/theme.html'); | 
| 562: | } | 
| 563: | $this->renderCount++; | 
| 564: | $xoopsLogger->stopTime('Page rendering'); | 
| 565: |  | 
| 566: | return true; | 
| 567: | } | 
| 568: |  | 
| 569: |  | 
| 570: |  | 
| 571: |  | 
| 572: |  | 
| 573: |  | 
| 574: |  | 
| 575: |  | 
| 576: |  | 
| 577: |  | 
| 578: |  | 
| 579: |  | 
| 580: |  | 
| 581: | public function loadLocalization($type = 'main') | 
| 582: | { | 
| 583: | $language = $GLOBALS['xoopsConfig']['language']; | 
| 584: |  | 
| 585: | if (file_exists($GLOBALS['xoops']->path('language/' . $language . '/style.css'))) { | 
| 586: | $this->addStylesheet($GLOBALS['xoops']->url('language/' . $language . '/style.css')); | 
| 587: | } | 
| 588: | $this->addLanguage($type, $language); | 
| 589: |  | 
| 590: | if (file_exists($this->path . '/language/' . $language . '/script.js')) { | 
| 591: | $this->addScript($this->url . '/language/' . $language . '/script.js'); | 
| 592: | } | 
| 593: | if (file_exists($this->path . '/language/' . $language . '/style.css')) { | 
| 594: | $this->addStylesheet($this->url . '/language/' . $language . '/style.css'); | 
| 595: | } | 
| 596: |  | 
| 597: | return true; | 
| 598: | } | 
| 599: |  | 
| 600: |  | 
| 601: |  | 
| 602: |  | 
| 603: |  | 
| 604: |  | 
| 605: |  | 
| 606: |  | 
| 607: |  | 
| 608: | public function addLanguage($type = 'main', $language = null) | 
| 609: | { | 
| 610: | $language = (null === $language) ? $GLOBALS['xoopsConfig']['language'] : $language; | 
| 611: | if (!file_exists($fileinc = $this->path . "/language/{$language}/{$type}.php")) { | 
| 612: | if (!file_exists($fileinc = $this->path . "/language/english/{$type}.php")) { | 
| 613: | return false; | 
| 614: | } | 
| 615: | } | 
| 616: | $ret = include_once $fileinc; | 
| 617: |  | 
| 618: | return $ret; | 
| 619: | } | 
| 620: |  | 
| 621: |  | 
| 622: |  | 
| 623: |  | 
| 624: |  | 
| 625: |  | 
| 626: |  | 
| 627: |  | 
| 628: |  | 
| 629: |  | 
| 630: |  | 
| 631: |  | 
| 632: |  | 
| 633: |  | 
| 634: |  | 
| 635: |  | 
| 636: |  | 
| 637: |  | 
| 638: |  | 
| 639: |  | 
| 640: |  | 
| 641: |  | 
| 642: |  | 
| 643: |  | 
| 644: |  | 
| 645: |  | 
| 646: |  | 
| 647: |  | 
| 648: |  | 
| 649: |  | 
| 650: |  | 
| 651: |  | 
| 652: |  | 
| 653: | public function addScript($src = '', $attributes = array(), $content = '', $name = '') | 
| 654: | { | 
| 655: | if (empty($attributes)) { | 
| 656: | $attributes = array(); | 
| 657: | } | 
| 658: | if (!empty($src)) { | 
| 659: | $src               = $GLOBALS['xoops']->url($this->resourcePath($src)); | 
| 660: | $attributes['src'] = $src; | 
| 661: | } | 
| 662: | if (!empty($content)) { | 
| 663: | $attributes['_'] = $content; | 
| 664: | } | 
| 665: | if (!isset($attributes['type'])) { | 
| 666: | $attributes['type'] = 'text/javascript'; | 
| 667: | } | 
| 668: | if (empty($name)) { | 
| 669: | $name = md5(serialize($attributes)); | 
| 670: | } | 
| 671: | $this->addMeta('script', $name, $attributes); | 
| 672: | } | 
| 673: |  | 
| 674: |  | 
| 675: |  | 
| 676: |  | 
| 677: |  | 
| 678: |  | 
| 679: |  | 
| 680: |  | 
| 681: |  | 
| 682: |  | 
| 683: | public function addStylesheet($src = '', $attributes = array(), $content = '', $name = '') | 
| 684: | { | 
| 685: | if (empty($attributes)) { | 
| 686: | $attributes = array(); | 
| 687: | } | 
| 688: | if (!empty($src)) { | 
| 689: | $src                = $GLOBALS['xoops']->url($this->resourcePath($src)); | 
| 690: | $attributes['href'] = $src; | 
| 691: | } | 
| 692: | if (!isset($attributes['type'])) { | 
| 693: | $attributes['type'] = 'text/css'; | 
| 694: | } | 
| 695: | if (!empty($content)) { | 
| 696: | $attributes['_'] = $content; | 
| 697: | } | 
| 698: | if (empty($name)) { | 
| 699: | $name = md5(serialize($attributes)); | 
| 700: | } | 
| 701: | $this->addMeta('stylesheet', $name, $attributes); | 
| 702: | } | 
| 703: |  | 
| 704: |  | 
| 705: |  | 
| 706: |  | 
| 707: |  | 
| 708: |  | 
| 709: |  | 
| 710: |  | 
| 711: |  | 
| 712: | public function addLink($rel, $href = '', $attributes = array(), $name = '') | 
| 713: | { | 
| 714: | if (empty($attributes)) { | 
| 715: | $attributes = array(); | 
| 716: | } | 
| 717: | if (!empty($href)) { | 
| 718: | $attributes['href'] = $href; | 
| 719: | } | 
| 720: | $attributes['rel'] = $rel; | 
| 721: | if (empty($name)) { | 
| 722: | $name = md5(serialize($attributes)); | 
| 723: | } | 
| 724: | $this->addMeta('link', $name, $attributes); | 
| 725: | } | 
| 726: |  | 
| 727: |  | 
| 728: |  | 
| 729: |  | 
| 730: |  | 
| 731: |  | 
| 732: |  | 
| 733: | public function addHttpMeta($name, $value = null) | 
| 734: | { | 
| 735: | if (isset($value)) { | 
| 736: | return $this->addMeta('http', $name, $value); | 
| 737: | } | 
| 738: | unset($this->metas['http'][$name]); | 
| 739: | return null; | 
| 740: | } | 
| 741: |  | 
| 742: |  | 
| 743: |  | 
| 744: |  | 
| 745: |  | 
| 746: |  | 
| 747: |  | 
| 748: |  | 
| 749: | public function addMeta($type = 'meta', $name = '', $value = '') | 
| 750: | { | 
| 751: | if (!isset($this->metas[$type])) { | 
| 752: | $this->metas[$type] = array(); | 
| 753: | } | 
| 754: | if (!empty($name)) { | 
| 755: | $this->metas[$type][$name] = $value; | 
| 756: | } else { | 
| 757: | $this->metas[$type][md5(serialize(array($value)))] = $value; | 
| 758: | } | 
| 759: |  | 
| 760: | return $value; | 
| 761: | } | 
| 762: |  | 
| 763: |  | 
| 764: |  | 
| 765: |  | 
| 766: |  | 
| 767: |  | 
| 768: |  | 
| 769: |  | 
| 770: |  | 
| 771: |  | 
| 772: |  | 
| 773: | public function headContent($params, $content, &$smarty, &$repeat) | 
| 774: | { | 
| 775: | if (!$repeat) { | 
| 776: | $this->htmlHeadStrings[] = $content; | 
| 777: | } | 
| 778: | } | 
| 779: |  | 
| 780: |  | 
| 781: |  | 
| 782: |  | 
| 783: |  | 
| 784: |  | 
| 785: |  | 
| 786: |  | 
| 787: | public function renderMetas($type = null, $return = false) | 
| 788: | { | 
| 789: | $str = ''; | 
| 790: | if (!isset($type)) { | 
| 791: | foreach (array_keys($this->metas) as $type) { | 
| 792: | $str .= $this->renderMetas($type, true); | 
| 793: | } | 
| 794: | $str .= implode("\n", $this->htmlHeadStrings); | 
| 795: | } else { | 
| 796: | switch ($type) { | 
| 797: | case 'script': | 
| 798: | foreach ($this->metas[$type] as $attrs) { | 
| 799: | $str .= '<script' . $this->renderAttributes($attrs) . '>'; | 
| 800: | if (isset($attrs['_'])) { | 
| 801: | $str .= "\n//<![CDATA[\n" . $attrs['_'] . "\n//]]>"; | 
| 802: | } | 
| 803: | $str .= "</script>\n"; | 
| 804: | } | 
| 805: | break; | 
| 806: | case 'link': | 
| 807: | foreach ($this->metas[$type] as $attrs) { | 
| 808: | $rel = $attrs['rel']; | 
| 809: | unset($attrs['rel']); | 
| 810: | $str .= '<link rel="' . $rel . '"' . $this->renderAttributes($attrs) . " />\n"; | 
| 811: | } | 
| 812: | break; | 
| 813: | case 'stylesheet': | 
| 814: | foreach ($this->metas[$type] as $attrs) { | 
| 815: | if (isset($attrs['_'])) { | 
| 816: | $str .= '<style' . $this->renderAttributes($attrs) . ">\n/* <![CDATA[ */\n" . (isset($attrs['_'])?$attrs['_']:'') . "\n/* //]]> */\n</style>"; | 
| 817: | } else { | 
| 818: | $str .= '<link rel="stylesheet"' . $this->renderAttributes($attrs) . " />\n"; | 
| 819: | } | 
| 820: | } | 
| 821: | break; | 
| 822: | case 'http': | 
| 823: | foreach ($this->metas[$type] as $name => $content) { | 
| 824: | $str .= '<meta http-equiv="' . htmlspecialchars($name, ENT_QUOTES) . '" content="' . htmlspecialchars($content, ENT_QUOTES) . "\" />\n"; | 
| 825: | } | 
| 826: | break; | 
| 827: | default: | 
| 828: | foreach ($this->metas[$type] as $name => $content) { | 
| 829: | $str .= '<meta name="' . htmlspecialchars($name, ENT_QUOTES) . '" content="' . htmlspecialchars($content, ENT_QUOTES) . "\" />\n"; | 
| 830: | } | 
| 831: | break; | 
| 832: | } | 
| 833: | } | 
| 834: | if ($return) { | 
| 835: | return $str; | 
| 836: | } | 
| 837: | echo $str; | 
| 838: |  | 
| 839: | return true; | 
| 840: | } | 
| 841: |  | 
| 842: |  | 
| 843: |  | 
| 844: |  | 
| 845: |  | 
| 846: |  | 
| 847: |  | 
| 848: | public function genElementId($tagName = 'xos') | 
| 849: | { | 
| 850: | static $cache = array(); | 
| 851: | if (!isset($cache[$tagName])) { | 
| 852: | $cache[$tagName] = 1; | 
| 853: | } | 
| 854: |  | 
| 855: | return $tagName . '-' . $cache[$tagName]++; | 
| 856: | } | 
| 857: |  | 
| 858: |  | 
| 859: |  | 
| 860: |  | 
| 861: |  | 
| 862: |  | 
| 863: |  | 
| 864: | public function renderAttributes($coll) | 
| 865: | { | 
| 866: | $str = ''; | 
| 867: | foreach ($coll as $name => $val) { | 
| 868: | if ($name !== '_') { | 
| 869: | $str .= ' ' . $name . '="' . htmlspecialchars($val, ENT_QUOTES) . '"'; | 
| 870: | } | 
| 871: | } | 
| 872: |  | 
| 873: | return $str; | 
| 874: | } | 
| 875: |  | 
| 876: |  | 
| 877: |  | 
| 878: |  | 
| 879: |  | 
| 880: |  | 
| 881: |  | 
| 882: | public function resourcePath($path) | 
| 883: | { | 
| 884: | $path = (string) $path; | 
| 885: | if (substr($path, 0, 1) === '/') { | 
| 886: | $path = substr($path, 1); | 
| 887: | } | 
| 888: |  | 
| 889: | if (file_exists(XOOPS_ROOT_PATH . "/{$this->themesPath}/{$this->folderName}/{$path}")) { | 
| 890: | return "{$this->themesPath}/{$this->folderName}/{$path}"; | 
| 891: | } | 
| 892: |  | 
| 893: | if (file_exists(XOOPS_ROOT_PATH . "/themes/{$this->folderName}/{$path}")) { | 
| 894: | return "themes/{$this->folderName}/{$path}"; | 
| 895: | } | 
| 896: |  | 
| 897: | return $path; | 
| 898: | } | 
| 899: | } | 
| 900: |  |