supernova-ws /
SuperNova
| 1 | <?php |
||
| 2 | |||
| 3 | use Common\Traits\TSingleton; |
||
| 4 | use Core\GlobalContainer; |
||
| 5 | use Fleet\DbFleetStatic; |
||
| 6 | use Note\Note; |
||
| 7 | use \Pages\PageTutorial; |
||
| 8 | use Planet\DBStaticPlanet; |
||
| 9 | use Player\playerTimeDiff; |
||
| 10 | use Template\TemplateMeta; |
||
| 11 | |||
| 12 | /** |
||
| 13 | * Template manager |
||
| 14 | */ |
||
| 15 | class SnTemplate { |
||
| 16 | |||
| 17 | use TSingleton; |
||
| 18 | |||
| 19 | const TPL_HTML = '.tpl.html'; |
||
| 20 | /** |
||
| 21 | * Partial path to templates root |
||
| 22 | */ |
||
| 23 | const SN_TEMPLATES_PARTIAL_PATH = 'design/templates/'; |
||
| 24 | const SN_TEMPLATE_NAME_DEFAULT = 'OpenGame'; |
||
| 25 | const P_CONTENT = '__RENDERED_CONTENT'; |
||
| 26 | |||
| 27 | /** |
||
| 28 | * @param template|string $template |
||
| 29 | */ |
||
| 30 | public static function displayP($template) { |
||
| 31 | if (is_object($template)) { |
||
| 32 | if (empty($template->parsed)) { |
||
| 33 | self::parsetemplate($template); |
||
| 34 | } |
||
| 35 | |||
| 36 | foreach ($template->files as $section => $filename) { |
||
| 37 | $template->display($section); |
||
| 38 | } |
||
| 39 | } else { |
||
| 40 | print($template); |
||
| 41 | } |
||
| 42 | } |
||
| 43 | |||
| 44 | /** |
||
| 45 | * @param template|string $template |
||
| 46 | * @param array|bool $array |
||
| 47 | * |
||
| 48 | * @return mixed |
||
| 49 | */ |
||
| 50 | public static function parsetemplate($template, $array = false) { |
||
| 51 | if (is_object($template)) { |
||
| 52 | return self::templateObjectParse($template, $array); |
||
| 53 | } else { |
||
| 54 | $search[] = '#\{L_([a-z0-9\-_]*?)\[([a-z0-9\-_]*?)\]\}#Ssie'; |
||
| 55 | $replace[] = '((isset($lang[\'\1\'][\'\2\'])) ? $lang[\'\1\'][\'\2\'] : \'{L_\1[\2]}\');'; |
||
| 56 | |||
| 57 | $search[] = '#\{L_([a-z0-9\-_]*?)\}#Ssie'; |
||
| 58 | $replace[] = '((isset($lang[\'\1\'])) ? $lang[\'\1\'] : \'{L_\1}\');'; |
||
| 59 | |||
| 60 | $search[] = '#\{([a-z0-9\-_]*?)\}#Ssie'; |
||
| 61 | $replace[] = '((isset($array[\'\1\'])) ? $array[\'\1\'] : \'{\1}\');'; |
||
| 62 | |||
| 63 | return preg_replace($search, $replace, $template); |
||
| 64 | } |
||
| 65 | } |
||
| 66 | |||
| 67 | /** |
||
| 68 | * @param template $template |
||
| 69 | * @param array|bool $array |
||
| 70 | * |
||
| 71 | * @return mixed |
||
| 72 | */ |
||
| 73 | public static function templateObjectParse($template, $array = false) { |
||
| 74 | global $user; |
||
| 75 | |||
| 76 | if (!empty($array) && is_array($array)) { |
||
| 77 | foreach ($array as $key => $data) { |
||
| 78 | $template->assign_var($key, $data); |
||
| 79 | } |
||
| 80 | } |
||
| 81 | |||
| 82 | $template->assign_vars(array( |
||
| 83 | 'SN_TIME_NOW' => SN_TIME_NOW, |
||
| 84 | 'SN_TEMPLATE_NAME' => SnTemplate::getPlayerTemplateName(), |
||
| 85 | 'USER_AUTHLEVEL' => isset($user['authlevel']) ? $user['authlevel'] : -1, |
||
| 86 | 'SN_GOOGLE' => SN_GOOGLE, |
||
| 87 | )); |
||
| 88 | |||
| 89 | $template->parsed = true; |
||
| 90 | |||
| 91 | return $template; |
||
| 92 | } |
||
| 93 | |||
| 94 | /** |
||
| 95 | * @param array $menu |
||
| 96 | * @param array $extra |
||
| 97 | */ |
||
| 98 | public static function tpl_menu_merge_extra(&$menu, &$extra) { |
||
| 99 | if (!is_array($extra) || !is_array($menu) || empty($menu)) { |
||
| 100 | return; |
||
| 101 | } |
||
| 102 | |||
| 103 | foreach ($extra as $menu_item_id => $menu_item) { |
||
| 104 | if (empty($menu_item['LOCATION'])) { |
||
| 105 | $menu[$menu_item_id] = $menu_item; |
||
| 106 | continue; |
||
| 107 | } |
||
| 108 | |||
| 109 | $item_location = $menu_item['LOCATION']; |
||
| 110 | unset($menu_item['LOCATION']); |
||
| 111 | |||
| 112 | $is_positioned = $item_location[0]; |
||
| 113 | if ($is_positioned == '+' || $is_positioned == '-') { |
||
| 114 | $item_location = substr($item_location, 1); |
||
| 115 | } else { |
||
| 116 | $is_positioned = ''; |
||
| 117 | } |
||
| 118 | |||
| 119 | if ($item_location) { |
||
| 120 | $menu_keys = array_keys($menu); |
||
| 121 | $insert_position = array_search($item_location, $menu_keys); |
||
| 122 | if ($insert_position === false) { |
||
| 123 | $insert_position = count($menu) - 1; |
||
| 124 | $is_positioned = '+'; |
||
| 125 | $item_location = ''; |
||
| 126 | } |
||
| 127 | } else { |
||
| 128 | $insert_position = $is_positioned == '-' ? 0 : count($menu); |
||
| 129 | } |
||
| 130 | |||
| 131 | $insert_position += $is_positioned == '+' ? 1 : 0; |
||
| 132 | $spliced = array_splice($menu, $insert_position, count($menu) - $insert_position); |
||
| 133 | $menu[$menu_item_id] = $menu_item; |
||
| 134 | |||
| 135 | if (!$is_positioned && $item_location) { |
||
| 136 | unset($spliced[$item_location]); |
||
| 137 | } |
||
| 138 | $menu = array_merge($menu, $spliced); |
||
| 139 | } |
||
| 140 | |||
| 141 | $extra = array(); |
||
| 142 | } |
||
| 143 | |||
| 144 | /** |
||
| 145 | * @param array $menu |
||
| 146 | * |
||
| 147 | * @return array |
||
| 148 | */ |
||
| 149 | public static function tpl_menu_adminize($menu) { |
||
| 150 | !is_array($menu) ? $menu = [] : false; |
||
| 151 | |||
| 152 | foreach ($menu as &$menuItem) { |
||
| 153 | if (!isset($menuItem[MENU_FIELD_AUTH_LEVEL])) { |
||
| 154 | $menuItem[MENU_FIELD_AUTH_LEVEL] = AUTH_LEVEL_ADMINISTRATOR; |
||
| 155 | } |
||
| 156 | } |
||
| 157 | |||
| 158 | return $menu; |
||
| 159 | } |
||
| 160 | |||
| 161 | /** |
||
| 162 | * @param array $sn_menu |
||
| 163 | * @param template $template |
||
| 164 | */ |
||
| 165 | public static function tpl_menu_assign_to_template(&$sn_menu, &$template) { |
||
| 166 | global $lang; |
||
| 167 | |||
| 168 | if (empty($sn_menu) || !is_array($sn_menu)) { |
||
| 169 | return; |
||
| 170 | } |
||
| 171 | |||
| 172 | foreach ($sn_menu as $menu_item_id => $menu_item) { |
||
| 173 | if (!$menu_item) { |
||
| 174 | continue; |
||
| 175 | } |
||
| 176 | |||
| 177 | if (is_string($menu_item_id)) { |
||
| 178 | $menu_item['ID'] = $menu_item_id; |
||
| 179 | } |
||
| 180 | |||
| 181 | if ($menu_item['TYPE'] == 'lang') { |
||
| 182 | $lang_string = &$lang; |
||
| 183 | if (preg_match('#(\w+)(?:\[(\w+)\])?(?:\[(\w+)\])?(?:\[(\w+)\])?(?:\[(\w+)\])?#', $menu_item['ITEM'], $matches) && count($matches) > 1) { |
||
| 184 | for ($i = 1; $i < count($matches); $i++) { |
||
|
0 ignored issues
–
show
|
|||
| 185 | if (defined($matches[$i])) { |
||
| 186 | $matches[$i] = constant($matches[$i]); |
||
| 187 | } |
||
| 188 | $lang_string = &$lang_string[$matches[$i]]; |
||
| 189 | } |
||
| 190 | } |
||
| 191 | $menu_item['ITEM'] = $lang_string && is_string($lang_string) ? $lang_string : "{L_{$menu_item['ITEM']}}"; |
||
| 192 | } |
||
| 193 | |||
| 194 | $menu_item['ALT'] = htmlentities($menu_item['ALT']); |
||
| 195 | $menu_item['TITLE'] = htmlentities($menu_item['TITLE']); |
||
| 196 | |||
| 197 | if (!empty($menu_item['ICON'])) { |
||
| 198 | if (is_string($menu_item['ICON'])) { |
||
| 199 | $menu_item['ICON_PATH'] = $menu_item['ICON']; |
||
| 200 | } else { |
||
| 201 | $menu_item['ICON'] = $menu_item_id; |
||
| 202 | } |
||
| 203 | } |
||
| 204 | |||
| 205 | $template->assign_block_vars('menu', $menu_item); |
||
| 206 | } |
||
| 207 | } |
||
| 208 | |||
| 209 | /** |
||
| 210 | * @param template $template |
||
| 211 | * |
||
| 212 | * @return template |
||
| 213 | */ |
||
| 214 | public static function tpl_render_menu($template) { |
||
| 215 | global $user, $lang, $template_result, $sn_menu_admin_extra, $sn_menu_admin, $sn_menu, $sn_menu_extra; |
||
| 216 | |||
| 217 | lng_include('admin'); |
||
| 218 | |||
| 219 | $template->assign_vars(array( |
||
| 220 | 'USER_AUTHLEVEL' => $user['authlevel'], |
||
| 221 | 'USER_AUTHLEVEL_NAME' => $lang['user_level'][$user['authlevel']], |
||
| 222 | 'PAYMENT' => SN::$gc->modules->countModulesInGroup('payment'), |
||
| 223 | 'MENU_START_HIDE' => !empty($_COOKIE[SN_COOKIE . '_menu_hidden']) || SN_GOOGLE, |
||
| 224 | )); |
||
| 225 | |||
| 226 | if (isset($template_result['MENU_CUSTOMIZE'])) { |
||
| 227 | $template->assign_vars(array( |
||
| 228 | 'PLAYER_OPTION_MENU_SHOW_ON_BUTTON' => SN::$user_options[PLAYER_OPTION_MENU_SHOW_ON_BUTTON], |
||
| 229 | 'PLAYER_OPTION_MENU_HIDE_ON_BUTTON' => SN::$user_options[PLAYER_OPTION_MENU_HIDE_ON_BUTTON], |
||
| 230 | 'PLAYER_OPTION_MENU_HIDE_ON_LEAVE' => SN::$user_options[PLAYER_OPTION_MENU_HIDE_ON_LEAVE], |
||
| 231 | 'PLAYER_OPTION_MENU_UNPIN_ABSOLUTE' => SN::$user_options[PLAYER_OPTION_MENU_UNPIN_ABSOLUTE], |
||
| 232 | 'PLAYER_OPTION_MENU_ITEMS_AS_BUTTONS' => SN::$user_options[PLAYER_OPTION_MENU_ITEMS_AS_BUTTONS], |
||
| 233 | 'PLAYER_OPTION_MENU_WHITE_TEXT' => SN::$user_options[PLAYER_OPTION_MENU_WHITE_TEXT], |
||
| 234 | 'PLAYER_OPTION_MENU_OLD' => SN::$user_options[PLAYER_OPTION_MENU_OLD], |
||
| 235 | 'PLAYER_OPTION_MENU_HIDE_SHOW_BUTTON' => empty($_COOKIE[SN_COOKIE . '_menu_hidden']) && !SN_GOOGLE |
||
| 236 | ? SN::$user_options[PLAYER_OPTION_MENU_HIDE_SHOW_BUTTON] : 1, |
||
| 237 | )); |
||
| 238 | } |
||
| 239 | |||
| 240 | if (defined('IN_ADMIN') && IN_ADMIN === true && !empty($user['authlevel']) && $user['authlevel'] > 0) { |
||
| 241 | SnTemplate::tpl_menu_merge_extra($sn_menu_admin, $sn_menu_admin_extra); |
||
| 242 | $sn_menu_admin = SnTemplate::tpl_menu_adminize($sn_menu_admin); |
||
| 243 | SnTemplate::tpl_menu_assign_to_template($sn_menu_admin, $template); |
||
| 244 | } else { |
||
| 245 | SnTemplate::tpl_menu_merge_extra($sn_menu, $sn_menu_extra); |
||
| 246 | SnTemplate::tpl_menu_assign_to_template($sn_menu, $template); |
||
| 247 | } |
||
| 248 | |||
| 249 | return $template; |
||
| 250 | } |
||
| 251 | |||
| 252 | /** |
||
| 253 | * @param template[] $page |
||
| 254 | * @param array $template_result |
||
| 255 | */ |
||
| 256 | public static function renderFooter($page, $template_result) { |
||
| 257 | $templateFooter = self::gettemplate('_page/_99_footer', true); |
||
| 258 | |||
| 259 | $templateFooter->assign_vars([ |
||
| 260 | 'SN_TIME_NOW' => SN_TIME_NOW, |
||
| 261 | 'SN_VERSION' => SN_VERSION, |
||
| 262 | 'ADMIN_EMAIL' => SN::$config->game_adminEmail, |
||
| 263 | 'CURRENT_YEAR' => date('Y', SN_TIME_NOW), |
||
| 264 | 'DB_PATCH_VERSION' => dbPatchGetCurrent(), |
||
| 265 | ]); |
||
| 266 | |||
| 267 | SnTemplate::displayP($templateFooter); |
||
| 268 | } |
||
| 269 | |||
| 270 | /** |
||
| 271 | * @param $page |
||
| 272 | * @param $title |
||
| 273 | * @param $template_result |
||
| 274 | * @param $inLoginLogout |
||
| 275 | * @param $user |
||
| 276 | * @param $config |
||
| 277 | * @param $lang |
||
| 278 | * @param $planetrow |
||
| 279 | */ |
||
| 280 | public static function renderHeader($page, $title, &$template_result, $inLoginLogout, &$user, $config, $lang, $planetrow, $renderedContent) { |
||
| 281 | if (SN::$headerRendered) { |
||
| 282 | return; |
||
| 283 | } |
||
| 284 | |||
| 285 | ob_end_flush(); |
||
| 286 | |||
| 287 | ob_start(); |
||
| 288 | // pdump(microtime(true) - SN_TIME_MICRO, 'Header render started'); |
||
| 289 | $isDisplayTopNav = true; |
||
| 290 | $isDisplayMenu = true; |
||
| 291 | |||
| 292 | isset($template_result['GLOBAL_DISPLAY_MENU']) ? $isDisplayMenu = $template_result['GLOBAL_DISPLAY_MENU'] : false; |
||
| 293 | isset($template_result['GLOBAL_DISPLAY_NAVBAR']) ? $isDisplayTopNav = $template_result['GLOBAL_DISPLAY_NAVBAR'] : false; |
||
| 294 | |||
| 295 | // TODO: DEPRECATED! Use $template_result to turn menu and navbar or ond off! |
||
| 296 | if (is_object($page)) { |
||
| 297 | isset($page->_rootref['MENU']) ? $isDisplayMenu = $page->_rootref['MENU'] : false; |
||
| 298 | isset($page->_rootref['NAVBAR']) ? $isDisplayTopNav = $page->_rootref['NAVBAR'] : false; |
||
| 299 | } |
||
| 300 | |||
| 301 | $inAdmin = defined('IN_ADMIN') && IN_ADMIN === true; |
||
| 302 | $isDisplayMenu = ($isDisplayMenu || $inAdmin) && !isset($_COOKIE['menu_disable']); |
||
| 303 | $isDisplayTopNav = $isDisplayTopNav && !$inAdmin; |
||
| 304 | |||
| 305 | if ($inLoginLogout || empty($user['id']) || !is_numeric($user['id'])) { |
||
| 306 | $isDisplayMenu = false; |
||
| 307 | $isDisplayTopNav = false; |
||
| 308 | } |
||
| 309 | |||
| 310 | $template = self::gettemplate('_page/_00_header', true); |
||
| 311 | $template->assign_vars([ |
||
| 312 | 'SN_TIME_NOW' => SN_TIME_NOW, |
||
| 313 | 'SN_VERSION' => SN_VERSION, |
||
| 314 | 'ADMIN_EMAIL' => SN::$config->game_adminEmail, |
||
| 315 | 'CURRENT_YEAR' => date('Y', SN_TIME_NOW), |
||
| 316 | 'DB_PATCH_VERSION' => dbPatchGetCurrent(), |
||
| 317 | ]); |
||
| 318 | |||
| 319 | self::renderJavaScript(); |
||
| 320 | |||
| 321 | self::renderCss($inLoginLogout); |
||
| 322 | |||
| 323 | $template->assign_vars(array( |
||
| 324 | self::P_CONTENT => $renderedContent, |
||
| 325 | |||
| 326 | 'LANG_LANGUAGE' => $lang['LANG_INFO']['LANG_NAME_ISO2'], |
||
| 327 | 'LANG_ENCODING' => 'utf-8', |
||
| 328 | 'LANG_DIRECTION' => $lang['LANG_INFO']['LANG_DIRECTION'], |
||
| 329 | |||
| 330 | 'SN_ROOT_VIRTUAL' => SN_ROOT_VIRTUAL, |
||
| 331 | |||
| 332 | 'ADV_SEO_META_DESCRIPTION' => $config->adv_seo_meta_description, |
||
| 333 | 'ADV_SEO_META_KEYWORDS' => $config->adv_seo_meta_keywords, |
||
| 334 | |||
| 335 | // WARNING! This can be set by page! |
||
| 336 | // CHANGE CODE TO MAKE IT IMPOSSIBLE! |
||
| 337 | 'GLOBAL_META_TAGS' => isset($page->_rootref['GLOBAL_META_TAGS']) ? $page->_rootref['GLOBAL_META_TAGS'] : '', |
||
| 338 | |||
| 339 | 'IN_ADMIN' => $inAdmin ? 1 : '', |
||
| 340 | )); |
||
| 341 | |||
| 342 | $template->assign_vars(array( |
||
| 343 | 'GLOBAL_DISPLAY_MENU' => $isDisplayMenu, |
||
| 344 | 'GLOBAL_DISPLAY_NAVBAR' => $isDisplayTopNav, |
||
| 345 | |||
| 346 | 'USER_AUTHLEVEL' => intval($user['authlevel']), |
||
| 347 | |||
| 348 | 'FONT_SIZE' => self::playerFontSize(), |
||
| 349 | 'FONT_SIZE_PERCENT_DEFAULT_STRING' => FONT_SIZE_PERCENT_DEFAULT_STRING, |
||
| 350 | |||
| 351 | 'SN_TIME_NOW' => SN_TIME_NOW, |
||
| 352 | 'LOGIN_LOGOUT' => $template_result['LOGIN_LOGOUT'], |
||
| 353 | 'GAME_MODE_CSS_PREFIX' => $config->game_mode == GAME_BLITZ ? 'blitz_' : '', |
||
| 354 | 'TIME_DIFF_MEASURE' => playerTimeDiff::timeDiffTemplate(), // Проводить замер только если не выставлен флаг форсированного замера И (иссяк интервал замера ИЛИ замера еще не было) |
||
| 355 | |||
| 356 | 'title' => ($title ? "{$title} - " : '') . "{$lang['sys_server']} {$config->game_name} - {$lang['sys_supernova']}", |
||
| 357 | 'ADV_SEO_JAVASCRIPT' => $config->adv_seo_javascript, |
||
| 358 | |||
| 359 | 'SOUND_ENABLED' => SN::$user_options[PLAYER_OPTION_SOUND_ENABLED], |
||
| 360 | 'PLAYER_OPTION_ANIMATION_DISABLED' => SN::$user_options[PLAYER_OPTION_ANIMATION_DISABLED], |
||
| 361 | 'PLAYER_OPTION_PROGRESS_BARS_DISABLED' => SN::$user_options[PLAYER_OPTION_PROGRESS_BARS_DISABLED], |
||
| 362 | |||
| 363 | 'IMPERSONATING' => !empty($template_result[F_IMPERSONATE_STATUS]) ? sprintf($lang['sys_impersonated_as'], $user['username'], $template_result[F_IMPERSONATE_OPERATOR]) : '', |
||
| 364 | 'PLAYER_OPTION_DESIGN_DISABLE_BORDERS' => SN::$user_options[PLAYER_OPTION_DESIGN_DISABLE_BORDERS], |
||
| 365 | |||
| 366 | 'WEBP_SUPPORT_NEED_CHECK' => ($webpSupported = SN::$gc->theUser->isWebpSupported()) === null ? 1 : 0, |
||
| 367 | 'WEBP_SUPPORTED' => $webpSupported ? 1 : 0, |
||
| 368 | )); |
||
| 369 | $template->assign_recursive($template_result); |
||
| 370 | |||
| 371 | if ($isDisplayMenu) { |
||
| 372 | SnTemplate::tpl_render_menu($template); |
||
| 373 | } |
||
| 374 | |||
| 375 | if ($isDisplayTopNav) { |
||
| 376 | SN::$gc->pimp->tpl_render_topnav($user, $planetrow, $template); |
||
| 377 | } |
||
| 378 | |||
| 379 | SnTemplate::displayP($template); |
||
| 380 | ob_end_flush(); |
||
| 381 | |||
| 382 | SN::$headerRendered = true; |
||
| 383 | |||
| 384 | ob_start(); |
||
| 385 | } |
||
| 386 | |||
| 387 | /** |
||
| 388 | */ |
||
| 389 | public static function renderJavaScript() { |
||
| 390 | global $sn_mvc, $sn_page_name, $template_result; |
||
| 391 | |||
| 392 | empty($sn_mvc['javascript']) ? $sn_mvc['javascript'] = ['' => []] : false; |
||
| 393 | |||
| 394 | $standard_js = self::addFileName([ |
||
| 395 | 'js/lib/jquery', |
||
| 396 | 'js/lib/js.cookie', |
||
| 397 | 'js/lib/jquery-ui', |
||
| 398 | 'js/lib/jquery.ui.touch-punch', |
||
| 399 | 'js/lib/ion.sound', |
||
| 400 | 'js/sn_global', |
||
| 401 | 'js/sn_sound', |
||
| 402 | 'js/sn_timer', |
||
| 403 | ], [], '.js'); |
||
| 404 | |||
| 405 | $standard_js = self::addFileName(!empty($sn_mvc['javascript_filenames']) ? $sn_mvc['javascript_filenames'] : [], $standard_js, '.js'); |
||
| 406 | |||
| 407 | $standard_js = self::cacheFiles($standard_js, '.js'); |
||
| 408 | |||
| 409 | // Prepending standard CSS files |
||
| 410 | $sn_mvc['javascript'][''] = array_merge($standard_js, $sn_mvc['javascript']['']); |
||
| 411 | |||
| 412 | self::renderFileListInclude($template_result, $sn_mvc, $sn_page_name, 'javascript'); |
||
| 413 | } |
||
| 414 | |||
| 415 | /** |
||
| 416 | * @param $is_login |
||
| 417 | */ |
||
| 418 | public static function renderCss($is_login) { |
||
| 419 | global $sn_mvc, $sn_page_name, $template_result; |
||
| 420 | |||
| 421 | empty($sn_mvc['css']) ? $sn_mvc['css'] = ['' => []] : false; |
||
| 422 | |||
| 423 | $standard_css = []; |
||
| 424 | $standard_css = self::addFileName('design/css/jquery-ui', $standard_css); |
||
| 425 | $standard_css = self::addFileName('design/css/global', $standard_css); |
||
| 426 | $is_login ? $standard_css = self::addFileName('design/css/login', $standard_css) : false; |
||
| 427 | $standard_css = self::addFileName('design/css/menu_icons', $standard_css); |
||
| 428 | |||
| 429 | $standard_css = self::getCurrentTemplate()->cssAddFileName('_template', $standard_css); |
||
| 430 | |||
| 431 | $standard_css = self::addFileName(SN::$gc->theUser->getSkinPath() . 'skin', $standard_css); |
||
| 432 | $standard_css = self::addFileName('design/css/global_override', $standard_css); |
||
| 433 | |||
| 434 | // Trying to add extra CSS to cache file |
||
| 435 | foreach ($sn_mvc['css'][''] as $css => $cork) { |
||
| 436 | $cssOriginal = $css; |
||
| 437 | |||
| 438 | // At first - removing minimization flag from file name |
||
| 439 | if(($rPos = strrpos($css, '.min.css')) !== false) { |
||
| 440 | // 4 - string length of substring to cut `.min` |
||
| 441 | $css = substr_replace($css, '', $rPos, 4); |
||
| 442 | } |
||
| 443 | // Also we don't need `.css` extension |
||
| 444 | if(($rPos = strrpos($css, '.css')) !== false) { |
||
| 445 | // 4 - string length of substring to cut `.css` |
||
| 446 | $css = substr_replace($css, '', $rPos, 4); |
||
| 447 | } |
||
| 448 | |||
| 449 | // Memorizing size of css filename array |
||
| 450 | $cssWas = count($standard_css); |
||
| 451 | // Trying to add newly found filename |
||
| 452 | $standard_css = self::addFileName($css, $standard_css); |
||
| 453 | if(count($standard_css) > $cssWas) { |
||
| 454 | // Removing file from extra CSS list only if everything went well and records was added to list of CSS to cache |
||
| 455 | // Otherwise something went wrong - so we don't touch this |
||
| 456 | unset($sn_mvc['css'][''][$cssOriginal]); |
||
| 457 | } |
||
| 458 | } |
||
| 459 | |||
| 460 | // Trying to cache CSS files |
||
| 461 | $standard_css = self::cacheFiles($standard_css); |
||
| 462 | |||
| 463 | // Prepending standard CSS files |
||
| 464 | $sn_mvc['css'][''] = array_merge($standard_css, $sn_mvc['css']['']); |
||
| 465 | |||
| 466 | self::renderFileListInclude($template_result, $sn_mvc, $sn_page_name, 'css'); |
||
| 467 | } |
||
| 468 | |||
| 469 | /** |
||
| 470 | * @param $time |
||
| 471 | * @param $event |
||
| 472 | * @param $msg |
||
| 473 | * @param $prefix |
||
| 474 | * @param $is_decrease |
||
| 475 | * @param $fleet_flying_row |
||
| 476 | * @param $fleet_flying_sorter |
||
| 477 | * @param $fleet_flying_events |
||
| 478 | * @param $fleet_event_count |
||
| 479 | */ |
||
| 480 | public static function tpl_topnav_event_build_helper($time, $event, $msg, $prefix, $is_decrease, $fleet_flying_row, &$fleet_flying_sorter, &$fleet_flying_events, &$fleet_event_count) { |
||
| 481 | $fleet_flying_sorter[$fleet_event_count] = $time; |
||
| 482 | $fleet_flying_events[$fleet_event_count] = array( |
||
| 483 | 'ROW' => $fleet_flying_row, |
||
| 484 | 'FLEET_ID' => $fleet_flying_row['fleet_id'], |
||
| 485 | 'EVENT' => $event, |
||
| 486 | 'COORDINATES' => uni_render_coordinates($fleet_flying_row, $prefix), |
||
| 487 | 'COORDINATES_TYPE' => $fleet_flying_row["{$prefix}type"], |
||
| 488 | 'TEXT' => "{$msg}", |
||
| 489 | 'DECREASE' => $is_decrease, |
||
| 490 | ); |
||
| 491 | $fleet_event_count++; |
||
| 492 | } |
||
| 493 | |||
| 494 | /** |
||
| 495 | * @param template $template |
||
| 496 | * @param array $fleet_flying_list |
||
| 497 | * @param string $type |
||
| 498 | */ |
||
| 499 | public static function tpl_topnav_event_build(&$template, $fleet_flying_list, $type = 'fleet') { |
||
| 500 | if (empty($fleet_flying_list)) { |
||
| 501 | return; |
||
| 502 | } |
||
| 503 | |||
| 504 | global $lang; |
||
| 505 | |||
| 506 | $fleet_event_count = 0; |
||
| 507 | $fleet_flying_sorter = array(); |
||
| 508 | $fleet_flying_events = array(); |
||
| 509 | foreach ($fleet_flying_list as &$fleet_flying_row) { |
||
| 510 | $will_return = true; |
||
| 511 | if ($fleet_flying_row['fleet_mess'] == 0) { |
||
| 512 | // cut fleets on Hold and Expedition |
||
| 513 | if ($fleet_flying_row['fleet_start_time'] >= SN_TIME_NOW) { |
||
| 514 | $fleet_flying_row['fleet_mission'] == MT_RELOCATE ? $will_return = false : false; |
||
| 515 | SnTemplate::tpl_topnav_event_build_helper($fleet_flying_row['fleet_start_time'], EVENT_FLEET_ARRIVE, $lang['sys_event_arrive'], 'fleet_end_', !$will_return, $fleet_flying_row, $fleet_flying_sorter, $fleet_flying_events, $fleet_event_count); |
||
| 516 | } |
||
| 517 | if ($fleet_flying_row['fleet_end_stay']) { |
||
| 518 | SnTemplate::tpl_topnav_event_build_helper($fleet_flying_row['fleet_end_stay'], EVENT_FLEET_STAY, $lang['sys_event_stay'], 'fleet_end_', false, $fleet_flying_row, $fleet_flying_sorter, $fleet_flying_events, $fleet_event_count); |
||
| 519 | } |
||
| 520 | } |
||
| 521 | if ($will_return) { |
||
| 522 | SnTemplate::tpl_topnav_event_build_helper($fleet_flying_row['fleet_end_time'], EVENT_FLEET_RETURN, $lang['sys_event_return'], 'fleet_start_', true, $fleet_flying_row, $fleet_flying_sorter, $fleet_flying_events, $fleet_event_count); |
||
| 523 | } |
||
| 524 | } |
||
| 525 | |||
| 526 | asort($fleet_flying_sorter); |
||
| 527 | |||
| 528 | $fleet_flying_count = count($fleet_flying_list); |
||
| 529 | foreach ($fleet_flying_sorter as $fleet_event_id => $fleet_time) { |
||
| 530 | $fleet_event = &$fleet_flying_events[$fleet_event_id]; |
||
| 531 | $template->assign_block_vars("flying_{$type}s", array( |
||
| 532 | 'TIME' => max(0, $fleet_time - SN_TIME_NOW), |
||
| 533 | 'TEXT' => $fleet_flying_count, |
||
| 534 | 'HINT' => date(FMT_DATE_TIME, $fleet_time + SN_CLIENT_TIME_DIFF) . " - {$lang['sys_fleet']} {$fleet_event['TEXT']} {$fleet_event['COORDINATES']} {$lang['sys_planet_type_sh'][$fleet_event['COORDINATES_TYPE']]} {$lang['type_mission'][$fleet_event['ROW']['fleet_mission']]}", |
||
| 535 | )); |
||
| 536 | $fleet_event['DECREASE'] ? $fleet_flying_count-- : false; |
||
| 537 | } |
||
| 538 | } |
||
| 539 | |||
| 540 | /** |
||
| 541 | * @return mixed|string |
||
| 542 | */ |
||
| 543 | public static function playerFontSize() { |
||
| 544 | $font_size = !empty($_COOKIE[SN_COOKIE_F]) ? $_COOKIE[SN_COOKIE_F] : SN::$user_options[PLAYER_OPTION_BASE_FONT_SIZE]; |
||
| 545 | if (strpos($font_size, '%') !== false) { |
||
| 546 | // Размер шрифта в процентах |
||
| 547 | $font_size = min(max(floatval($font_size), FONT_SIZE_PERCENT_MIN), FONT_SIZE_PERCENT_MAX) . '%'; |
||
| 548 | |||
| 549 | return $font_size; |
||
| 550 | } elseif (strpos($font_size, 'px') !== false) { |
||
| 551 | // Размер шрифта в пикселях |
||
| 552 | $font_size = min(max(floatval($font_size), FONT_SIZE_PIXELS_MIN), FONT_SIZE_PIXELS_MAX) . 'px'; |
||
| 553 | |||
| 554 | return $font_size; |
||
| 555 | } else { |
||
| 556 | // Не мышонка, не лягушка... |
||
| 557 | $font_size = FONT_SIZE_PERCENT_DEFAULT_STRING; |
||
| 558 | |||
| 559 | return $font_size; |
||
| 560 | } |
||
| 561 | } |
||
| 562 | |||
| 563 | /** |
||
| 564 | * Checks if minified/full-size file variant exists - and adds it if any |
||
| 565 | * |
||
| 566 | * @param string|string[] $fileNames |
||
| 567 | * @param array $anArray |
||
| 568 | * |
||
| 569 | * @return array |
||
| 570 | */ |
||
| 571 | public static function addFileName($fileNames, $anArray, $ext = '.css') { |
||
| 572 | if(!is_array($fileNames)) { |
||
| 573 | $fileNames = [$fileNames]; |
||
| 574 | } |
||
| 575 | |||
| 576 | foreach($fileNames as $fileName) { |
||
| 577 | if (file_exists(SN_ROOT_PHYSICAL . $fileName . '.min' . $ext)) { |
||
| 578 | $anArray[$fileName . '.min' . $ext] = ''; |
||
| 579 | } elseif (file_exists(SN_ROOT_PHYSICAL . $fileName . '.css' . $ext)) { |
||
| 580 | $anArray[$fileName . $ext] = ''; |
||
| 581 | } |
||
| 582 | } |
||
| 583 | |||
| 584 | return $anArray; |
||
| 585 | } |
||
| 586 | |||
| 587 | /** |
||
| 588 | * @param array $template_result |
||
| 589 | * @param array[] $sn_mvc |
||
| 590 | * @param string $sn_page_name |
||
| 591 | * @param string $fileType - 'css' or 'javascript' |
||
| 592 | */ |
||
| 593 | public static function renderFileListInclude(&$template_result, &$sn_mvc, $sn_page_name, $fileType) { |
||
| 594 | if (empty($sn_mvc[$fileType])) { |
||
| 595 | return; |
||
| 596 | } |
||
| 597 | |||
| 598 | foreach ($sn_mvc[$fileType] as $page_name => $script_list) { |
||
| 599 | if (empty($page_name) || $page_name == $sn_page_name) { |
||
| 600 | foreach ($script_list as $filename => $content) { |
||
| 601 | $template_result['.'][$fileType][] = array( |
||
| 602 | 'FILE' => $filename, |
||
| 603 | 'CONTENT' => $content, |
||
| 604 | ); |
||
| 605 | } |
||
| 606 | } |
||
| 607 | } |
||
| 608 | } |
||
| 609 | |||
| 610 | /** |
||
| 611 | * @param $template |
||
| 612 | * @param $user |
||
| 613 | */ |
||
| 614 | public static function tpl_navbar_render_notes(&$template, &$user) { |
||
| 615 | $notes_query = doquery("SELECT * FROM {{notes}} WHERE `owner` = {$user['id']} AND `sticky` = 1 ORDER BY priority DESC, time DESC"); |
||
| 616 | while ($note_row = db_fetch($notes_query)) { |
||
| 617 | Note::note_assign($template, $note_row); |
||
| 618 | } |
||
| 619 | } |
||
| 620 | |||
| 621 | /** |
||
| 622 | * @param $template |
||
| 623 | * @param $user |
||
| 624 | * @param classConfig $config |
||
| 625 | */ |
||
| 626 | public static function tpl_navbar_render_news(&$template, &$user, $config) { |
||
| 627 | if ($config->game_news_overview) { |
||
| 628 | $user_last_read_safe = intval($user['news_lastread']); |
||
| 629 | $newsSql = "AND UNIX_TIMESTAMP(`tsTimeStamp`) >= {$user_last_read_safe} "; |
||
| 630 | $newsOverviewShowSeconds = intval($config->game_news_overview_show); |
||
| 631 | if ($newsOverviewShowSeconds) { |
||
| 632 | $newsSql .= "AND `tsTimeStamp` >= DATE_SUB(NOW(), INTERVAL {$newsOverviewShowSeconds} SECOND) "; |
||
| 633 | } |
||
| 634 | nws_render($user, $template, $newsSql, $config->game_news_overview); |
||
| 635 | } |
||
| 636 | } |
||
| 637 | |||
| 638 | /** |
||
| 639 | * @param array $sn_mvc |
||
| 640 | * @param string $blockName |
||
| 641 | * |
||
| 642 | * @return array|false |
||
| 643 | */ |
||
| 644 | public static function render_button_block(&$sn_mvc, $blockName) { |
||
| 645 | $result = false; |
||
| 646 | |||
| 647 | if (!empty($sn_mvc[$blockName]) && is_array($sn_mvc[$blockName])) { |
||
| 648 | foreach ($sn_mvc[$blockName] as $navbar_button_image => $navbar_button_url) { |
||
| 649 | $result[] = array( |
||
| 650 | 'IMAGE' => $navbar_button_image, |
||
| 651 | 'URL_RELATIVE' => $navbar_button_url, |
||
| 652 | ); |
||
| 653 | } |
||
| 654 | |||
| 655 | $result = array( |
||
| 656 | '.' => array( |
||
| 657 | $blockName => |
||
| 658 | $result |
||
| 659 | ), |
||
| 660 | ); |
||
| 661 | } |
||
| 662 | |||
| 663 | return $result; |
||
| 664 | } |
||
| 665 | |||
| 666 | /** |
||
| 667 | * @param array $sn_mvc |
||
| 668 | * @param template $template |
||
| 669 | */ |
||
| 670 | public static function tpl_navbar_extra_buttons(&$sn_mvc, $template) { |
||
| 671 | ($block = SnTemplate::render_button_block($sn_mvc, 'navbar_prefix_button')) ? $template->assign_recursive($block) : false; |
||
| 672 | ($block = SnTemplate::render_button_block($sn_mvc, 'navbar_main_button')) ? $template->assign_recursive($block) : false; |
||
| 673 | } |
||
| 674 | |||
| 675 | /** |
||
| 676 | * @param template|string $template |
||
| 677 | * |
||
| 678 | * @return false|string|null |
||
| 679 | */ |
||
| 680 | public static function templateRenderToHtml($template) { |
||
| 681 | $output = null; |
||
| 682 | |||
| 683 | ob_start(); |
||
| 684 | SnTemplate::displayP($template); |
||
| 685 | $output = ob_get_contents(); |
||
| 686 | ob_end_clean(); |
||
| 687 | |||
| 688 | return $output; |
||
| 689 | } |
||
| 690 | |||
| 691 | /** |
||
| 692 | * @param template $template |
||
| 693 | */ |
||
| 694 | public static function tpl_login_lang(&$template) { |
||
| 695 | global $language; |
||
| 696 | |||
| 697 | $url_params = array(); |
||
| 698 | |||
| 699 | $language ? $url_params[] = "lang={$language}" : false; |
||
| 700 | |||
| 701 | ($id_ref = sys_get_param_id('id_ref')) ? $url_params[] = "id_ref={$id_ref}" : false; |
||
| 702 | |||
| 703 | $template->assign_vars($q = array( |
||
| 704 | 'LANG' => $language ? $language : '', |
||
| 705 | 'referral' => $id_ref ? '&id_ref=' . $id_ref : '', |
||
| 706 | |||
| 707 | 'REQUEST_PARAMS' => !empty($url_params) ? '?' . implode('&', $url_params) : '',// "?lang={$language}" . ($id_ref ? "&id_ref={$id_ref}" : ''), |
||
| 708 | 'FILENAME' => basename($_SERVER['PHP_SELF']), |
||
| 709 | )); |
||
| 710 | |||
| 711 | foreach (lng_get_list() as $lng_id => $lng_data) { |
||
| 712 | if (isset($lng_data['LANG_VARIANTS']) && is_array($lng_data['LANG_VARIANTS'])) { |
||
| 713 | foreach ($lng_data['LANG_VARIANTS'] as $lang_variant) { |
||
| 714 | $lng_data1 = $lng_data; |
||
| 715 | $lng_data1 = array_merge($lng_data1, $lang_variant); |
||
| 716 | $template->assign_block_vars('language', $lng_data1); |
||
| 717 | } |
||
| 718 | } else { |
||
| 719 | $template->assign_block_vars('language', $lng_data); |
||
| 720 | } |
||
| 721 | } |
||
| 722 | } |
||
| 723 | |||
| 724 | /** |
||
| 725 | * @param template $template |
||
| 726 | * @param string $blockName |
||
| 727 | * @param mixed $values |
||
| 728 | * @param string $keyName - Name for key name |
||
| 729 | * @param string $valueName - Name for value name |
||
| 730 | */ |
||
| 731 | public static function tpl_assign_select(&$template, $blockName, $values, $keyName = 'KEY', $valueName = 'VALUE') { |
||
| 732 | !is_array($values) ? $values = array($values => $values) : false; |
||
| 733 | |||
| 734 | foreach ($values as $key => $value) { |
||
| 735 | $template->assign_block_vars($blockName, array( |
||
| 736 | $keyName => HelperString::htmlSafe($key), |
||
| 737 | $valueName => HelperString::htmlSafe($value), |
||
| 738 | )); |
||
| 739 | } |
||
| 740 | } |
||
| 741 | |||
| 742 | /** |
||
| 743 | * Renders unit bonus from unit data |
||
| 744 | * |
||
| 745 | * @param array $unitInfo |
||
| 746 | * |
||
| 747 | * @return string |
||
| 748 | */ |
||
| 749 | public static function tpl_render_unit_bonus_data($unitInfo) { |
||
| 750 | $strBonus = self::tplAddPlus($unitInfo[P_BONUS_VALUE]); |
||
| 751 | switch ($unitInfo[P_BONUS_TYPE]) { |
||
| 752 | case BONUS_PERCENT: |
||
| 753 | $strBonus = "{$strBonus}% "; |
||
| 754 | break; |
||
| 755 | |||
| 756 | case BONUS_ABILITY: |
||
| 757 | $strBonus = ''; |
||
| 758 | break; |
||
| 759 | |||
| 760 | case BONUS_ADD: |
||
| 761 | default: |
||
| 762 | break; |
||
| 763 | } |
||
| 764 | |||
| 765 | return $strBonus; |
||
| 766 | } |
||
| 767 | |||
| 768 | /** |
||
| 769 | * Converts number to string then adds "+" sign for positive AND ZERO numbers |
||
| 770 | * |
||
| 771 | * @param float $value |
||
| 772 | * |
||
| 773 | * @return string |
||
| 774 | */ |
||
| 775 | public static function tplAddPlus($value) { |
||
| 776 | return ($value >= 0 ? '+' : '') . $value; |
||
| 777 | } |
||
| 778 | |||
| 779 | /** |
||
| 780 | * Convert number to prettified string then adds "+" sign for positive AND ZERO numbers |
||
| 781 | * |
||
| 782 | * @param float $value |
||
| 783 | * |
||
| 784 | * @return string |
||
| 785 | */ |
||
| 786 | public static function tplPrettyPlus($value) { |
||
| 787 | return ($value >= 0 ? '+' : '') . HelperString::numberFloorAndFormat($value); |
||
| 788 | } |
||
| 789 | |||
| 790 | /** |
||
| 791 | * Add message to result box |
||
| 792 | * |
||
| 793 | * If $template specified - message would be added to template supplied. Otherwise - to $template_result |
||
| 794 | * |
||
| 795 | * @param string $message |
||
| 796 | * @param int $status |
||
| 797 | * @param null $template |
||
| 798 | */ |
||
| 799 | public static function tplAddResult($message, $status = ERR_NONE, $template = null) { |
||
| 800 | global $template_result; |
||
| 801 | |||
| 802 | $block = [ |
||
| 803 | 'STATUS' => $status, |
||
| 804 | 'MESSAGE' => $message, |
||
| 805 | ]; |
||
| 806 | |||
| 807 | if ($template instanceof template) { |
||
| 808 | $template->assign_block_vars('result', $block); |
||
| 809 | } else { |
||
| 810 | $template_result['.']['result'][] = $block; |
||
| 811 | } |
||
| 812 | } |
||
| 813 | |||
| 814 | /** |
||
| 815 | * @param string $message |
||
| 816 | * @param string $title |
||
| 817 | * @param string $redirectTo |
||
| 818 | * @param int $timeout |
||
| 819 | * @param bool|true $showHeader |
||
| 820 | */ |
||
| 821 | public static function messageBox($message, $title = '', $redirectTo = '', $timeout = 5, $showHeader = true) { |
||
| 822 | global $lang, $template_result; |
||
| 823 | |||
| 824 | if (empty($title)) { |
||
| 825 | $title = $lang['sys_error']; |
||
| 826 | } |
||
| 827 | |||
| 828 | $template = self::gettemplate('message_body', true); |
||
| 829 | |||
| 830 | $template_result['GLOBAL_DISPLAY_NAVBAR'] = $showHeader; |
||
| 831 | |||
| 832 | $template->assign_vars(array( |
||
| 833 | // 'GLOBAL_DISPLAY_NAVBAR' => $showHeader, |
||
| 834 | |||
| 835 | 'TITLE' => $title, |
||
| 836 | 'MESSAGE' => $message, |
||
| 837 | 'REDIRECT_TO' => $redirectTo, |
||
| 838 | 'TIMEOUT' => $timeout, |
||
| 839 | )); |
||
| 840 | |||
| 841 | self::display($template, $title); |
||
| 842 | } |
||
| 843 | |||
| 844 | /** |
||
| 845 | * Admin message box |
||
| 846 | * |
||
| 847 | * @param $message |
||
| 848 | * @param string $title |
||
| 849 | * @param string $redirectTo |
||
| 850 | * @param int $timeout |
||
| 851 | * |
||
| 852 | * @see SnTemplate::messageBox() |
||
| 853 | */ |
||
| 854 | public static function messageBoxAdmin($message, $title = '', $redirectTo = '', $timeout = 5) { |
||
| 855 | SnTemplate::messageBox($message, $title, $redirectTo, $timeout, false); |
||
| 856 | } |
||
| 857 | |||
| 858 | public static function messageBoxAdminAccessDenied($level = AUTH_LEVEL_ADMINISTRATOR) { |
||
| 859 | global $user, $lang; |
||
| 860 | |||
| 861 | if ($user['authlevel'] < $level) { |
||
| 862 | SnTemplate::messageBoxAdmin($lang['adm_err_denied'], $lang['admin_title_access_denied'], SN_ROOT_VIRTUAL . 'overview.php'); |
||
| 863 | } |
||
| 864 | } |
||
| 865 | |||
| 866 | /** |
||
| 867 | * @param $prevUser |
||
| 868 | * @param array $user |
||
| 869 | * @param array $planetrow |
||
| 870 | * @param template $template |
||
| 871 | * |
||
| 872 | * @return array |
||
| 873 | */ |
||
| 874 | public static function sn_tpl_render_topnav(&$prevUser, $user, $planetrow, $template) { |
||
| 875 | global $lang, $config, $sn_mvc; |
||
| 876 | |||
| 877 | // This call was not first one... Using results from previous call |
||
| 878 | if (!empty($prevUser['username'])) { |
||
| 879 | $user = $prevUser; |
||
| 880 | } |
||
| 881 | |||
| 882 | if (!is_array($user)) { |
||
| 883 | return $user; |
||
| 884 | } |
||
| 885 | |||
| 886 | $GET_mode = sys_get_param_str('mode'); |
||
| 887 | |||
| 888 | $ThisUsersPlanets = DBStaticPlanet::db_planet_list_sorted($user); |
||
| 889 | foreach ($ThisUsersPlanets as $CurPlanet) { |
||
| 890 | if ($CurPlanet['destruyed']) { |
||
| 891 | continue; |
||
| 892 | } |
||
| 893 | |||
| 894 | $fleet_listx = flt_get_fleets_to_planet($CurPlanet); |
||
| 895 | if ($CurPlanet['planet_type'] == PT_MOON) { |
||
| 896 | $parentPlanet = DBStaticPlanet::db_planet_by_id($CurPlanet['parent_planet']); |
||
| 897 | } else { |
||
| 898 | $parentPlanet = $CurPlanet; |
||
| 899 | } |
||
| 900 | |||
| 901 | $template->assign_block_vars('topnav_planets', [ |
||
| 902 | 'ID' => $CurPlanet['id'], |
||
| 903 | 'NAME' => $CurPlanet['name'], |
||
| 904 | 'TYPE' => $CurPlanet['planet_type'], |
||
| 905 | 'TYPE_TEXT' => $lang['sys_planet_type_sh'][$CurPlanet['planet_type']], |
||
| 906 | 'IS_CAPITAL' => $parentPlanet['id'] == $user['id_planet'], |
||
| 907 | 'IS_MOON' => $CurPlanet['planet_type'] == PT_MOON, |
||
| 908 | 'PLIMAGE' => $CurPlanet['image'], |
||
| 909 | 'FLEET_ENEMY' => $fleet_listx['enemy']['count'], |
||
| 910 | 'COORDS' => uni_render_coordinates($CurPlanet), |
||
| 911 | 'SELECTED' => $CurPlanet['id'] == $user['current_planet'] ? ' selected' : '', |
||
| 912 | ]); |
||
| 913 | } |
||
| 914 | |||
| 915 | $fleet_flying_list = DbFleetStatic::tpl_get_fleets_flying($user); |
||
| 916 | SnTemplate::tpl_topnav_event_build($template, $fleet_flying_list[0]); |
||
| 917 | SnTemplate::tpl_topnav_event_build($template, $fleet_flying_list[MT_EXPLORE], 'expedition'); |
||
| 918 | |||
| 919 | que_tpl_parse($template, QUE_STRUCTURES, $user, $planetrow, null, true); |
||
| 920 | que_tpl_parse($template, QUE_RESEARCH, $user, array(), null, !SN::$user_options[PLAYER_OPTION_NAVBAR_RESEARCH_WIDE]); |
||
| 921 | que_tpl_parse($template, SUBQUE_FLEET, $user, $planetrow, null, true); |
||
| 922 | que_tpl_parse($template, SUBQUE_DEFENSE, $user, $planetrow, null, true); |
||
| 923 | |||
| 924 | SnTemplate::tpl_navbar_extra_buttons($sn_mvc, $template); |
||
| 925 | SnTemplate::tpl_navbar_render_news($template, $user, $config); |
||
| 926 | SnTemplate::tpl_navbar_render_notes($template, $user); |
||
| 927 | $tutorial_enabled = PageTutorial::renderNavBar($template); |
||
| 928 | |||
| 929 | |||
| 930 | $premium_lvl = mrc_get_level($user, false, UNIT_PREMIUM, true, true); |
||
| 931 | |||
| 932 | $str_date_format = "%3$02d %2$0s %1$04d {$lang['top_of_year']} %4$02d:%5$02d:%6$02d"; |
||
| 933 | $time_now_parsed = getdate(SN_TIME_NOW); |
||
| 934 | $time_local_parsed = getdate(defined('SN_CLIENT_TIME_LOCAL') ? SN_CLIENT_TIME_LOCAL : SN_TIME_NOW); |
||
| 935 | |||
| 936 | $template->assign_vars(array( |
||
| 937 | 'QUE_ID' => QUE_RESEARCH, |
||
| 938 | 'QUE_HTML' => 'topnav', |
||
| 939 | |||
| 940 | 'RESEARCH_ONGOING' => (boolean)$user['que'], |
||
| 941 | |||
| 942 | 'TIME_TEXT' => sprintf($str_date_format, $time_now_parsed['year'], $lang['months'][$time_now_parsed['mon']], $time_now_parsed['mday'], |
||
| 943 | $time_now_parsed['hours'], $time_now_parsed['minutes'], $time_now_parsed['seconds'] |
||
| 944 | ), |
||
| 945 | 'TIME_TEXT_LOCAL' => sprintf($str_date_format, $time_local_parsed['year'], $lang['months'][$time_local_parsed['mon']], $time_local_parsed['mday'], |
||
| 946 | $time_local_parsed['hours'], $time_local_parsed['minutes'], $time_local_parsed['seconds'] |
||
| 947 | ), |
||
| 948 | |||
| 949 | 'GAME_BLITZ_REGISTER' => $config->game_blitz_register, |
||
| 950 | 'GAME_BLITZ_REGISTER_TEXT' => $lang['sys_blitz_registration_mode_list'][$config->game_blitz_register], |
||
| 951 | 'BLITZ_REGISTER_OPEN' => $config->game_blitz_register == BLITZ_REGISTER_OPEN, |
||
| 952 | 'BLITZ_REGISTER_CLOSED' => $config->game_blitz_register == BLITZ_REGISTER_CLOSED, |
||
| 953 | 'BLITZ_REGISTER_SHOW_LOGIN' => $config->game_blitz_register == BLITZ_REGISTER_SHOW_LOGIN, |
||
| 954 | 'BLITZ_REGISTER_DISCLOSURE_NAMES' => $config->game_blitz_register == BLITZ_REGISTER_DISCLOSURE_NAMES, |
||
| 955 | 'GAME_BLITZ' => $config->game_mode == GAME_BLITZ, |
||
| 956 | |||
| 957 | 'USERS_ONLINE' => $config->var_online_user_count, |
||
| 958 | 'USERS_TOTAL' => $config->users_amount, |
||
| 959 | 'USER_RANK' => $user['total_rank'], |
||
| 960 | 'USER_NICK' => $user['username'], |
||
| 961 | 'USER_AVATAR' => $user['avatar'], |
||
| 962 | 'USER_AVATARID' => $user['id'], |
||
| 963 | 'USER_PREMIUM' => $premium_lvl, |
||
| 964 | 'USER_RACE' => $user[P_RACE], |
||
| 965 | |||
| 966 | 'TOPNAV_CURRENT_PLANET' => $user['current_planet'], |
||
| 967 | 'TOPNAV_CURRENT_PLANET_NAME' => uni_render_planet_full($planetrow), // htmlspecialchars($planetrow['name']), |
||
| 968 | 'TOPNAV_CURRENT_PLANET_IMAGE' => $planetrow['image'], |
||
| 969 | 'TOPNAV_COLONIES_CURRENT' => get_player_current_colonies($user), |
||
| 970 | 'TOPNAV_COLONIES_MAX' => get_player_max_colonies($user), |
||
| 971 | 'NAVBAR_MODE' => $GET_mode, |
||
| 972 | |||
| 973 | 'TOPNAV_DARK_MATTER' => mrc_get_level($user, '', RES_DARK_MATTER), |
||
| 974 | 'TOPNAV_DARK_MATTER_TEXT' => HelperString::numberFloorAndFormat(mrc_get_level($user, '', RES_DARK_MATTER)), |
||
| 975 | 'TOPNAV_DARK_MATTER_PLAIN' => mrc_get_level($user, '', RES_DARK_MATTER, false, true), |
||
| 976 | 'TOPNAV_DARK_MATTER_PLAIN_TEXT' => HelperString::numberFloorAndFormat(mrc_get_level($user, '', RES_DARK_MATTER, false, true)), |
||
| 977 | 'TOPNAV_METAMATTER' => mrc_get_level($user, '', RES_METAMATTER), |
||
| 978 | 'TOPNAV_METAMATTER_TEXT' => HelperString::numberFloorAndFormat(mrc_get_level($user, '', RES_METAMATTER)), |
||
| 979 | |||
| 980 | // TODO ГРЯЗНЫЙ ХАК!!! |
||
| 981 | 'TOPNAV_PAYMENT' => SN::$gc->modules->countModulesInGroup('payment') && !SN_GOOGLE, |
||
| 982 | |||
| 983 | 'TOPNAV_MESSAGES_ADMIN' => $user['msg_admin'], |
||
| 984 | 'TOPNAV_MESSAGES_PLAYER' => $user['mnl_joueur'], |
||
| 985 | 'TOPNAV_MESSAGES_ALLIANCE' => $user['mnl_alliance'], |
||
| 986 | 'TOPNAV_MESSAGES_ATTACK' => $user['mnl_attaque'], |
||
| 987 | 'TOPNAV_MESSAGES_ALL' => $user['new_message'], |
||
| 988 | |||
| 989 | 'TOPNAV_FLEETS_FLYING' => empty($fleet_flying_list[0]) ? 0 : count($fleet_flying_list[0]), |
||
| 990 | 'TOPNAV_FLEETS_TOTAL' => GetMaxFleets($user), |
||
| 991 | 'TOPNAV_EXPEDITIONS_FLYING' => empty($fleet_flying_list[MT_EXPLORE]) ? 0 : count($fleet_flying_list[MT_EXPLORE]), |
||
| 992 | 'TOPNAV_EXPEDITIONS_TOTAL' => get_player_max_expeditons($user), |
||
| 993 | |||
| 994 | 'TOPNAV_QUEST_COMPLETE' => get_quest_amount_complete($user['id']), |
||
| 995 | 'TOPNAV_QUEST_IN_PROGRESS' => get_quest_amount_in_progress($user['id']), |
||
| 996 | |||
| 997 | 'GAME_NEWS_OVERVIEW' => $config->game_news_overview, |
||
| 998 | 'GAME_RESEARCH_DISABLED' => defined('GAME_RESEARCH_DISABLED') && GAME_RESEARCH_DISABLED, |
||
| 999 | 'GAME_DEFENSE_DISABLED' => defined('GAME_DEFENSE_DISABLED') && GAME_DEFENSE_DISABLED, |
||
| 1000 | 'GAME_STRUCTURES_DISABLED' => defined('GAME_STRUCTURES_DISABLED') && GAME_STRUCTURES_DISABLED, |
||
| 1001 | 'GAME_HANGAR_DISABLED' => defined('GAME_HANGAR_DISABLED') && GAME_HANGAR_DISABLED, |
||
| 1002 | |||
| 1003 | 'PLAYER_OPTION_NAVBAR_PLANET_VERTICAL' => SN::$user_options[PLAYER_OPTION_NAVBAR_PLANET_VERTICAL], |
||
| 1004 | 'PLAYER_OPTION_NAVBAR_PLANET_OLD' => SN::$user_options[PLAYER_OPTION_NAVBAR_PLANET_OLD], |
||
| 1005 | 'PLAYER_OPTION_NAVBAR_PLANET_DISABLE_STORAGE' => SN::$user_options[PLAYER_OPTION_NAVBAR_PLANET_DISABLE_STORAGE], |
||
| 1006 | 'PLAYER_OPTION_NAVBAR_DISABLE_RESEARCH' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_RESEARCH], |
||
| 1007 | 'PLAYER_OPTION_NAVBAR_DISABLE_PLANET' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_PLANET], |
||
| 1008 | 'PLAYER_OPTION_NAVBAR_DISABLE_HANGAR' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_HANGAR], |
||
| 1009 | 'PLAYER_OPTION_NAVBAR_DISABLE_DEFENSE' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_DEFENSE], |
||
| 1010 | 'PLAYER_OPTION_NAVBAR_DISABLE_FLYING_FLEETS' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_FLYING_FLEETS], |
||
| 1011 | 'PLAYER_OPTION_NAVBAR_DISABLE_EXPEDITIONS' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_EXPEDITIONS], |
||
| 1012 | 'PLAYER_OPTION_NAVBAR_DISABLE_QUESTS' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_QUESTS], |
||
| 1013 | 'PLAYER_OPTION_NAVBAR_DISABLE_META_MATTER' => SN::$user_options[PLAYER_OPTION_NAVBAR_DISABLE_META_MATTER], |
||
| 1014 | 'PLAYER_OPTION_NAVBAR_RESEARCH_WIDE' => SN::$user_options[PLAYER_OPTION_NAVBAR_RESEARCH_WIDE], |
||
| 1015 | |||
| 1016 | 'TUTORIAL_ENABLED' => $tutorial_enabled, |
||
| 1017 | |||
| 1018 | 'PT_MOON' => PT_MOON, |
||
| 1019 | 'SUBQUE_FLEET' => SUBQUE_FLEET, |
||
| 1020 | 'SUBQUE_DEFENSE' => SUBQUE_DEFENSE, |
||
| 1021 | 'QUE_RESEARCH' => QUE_RESEARCH, |
||
| 1022 | 'QUE_STRUCTURES' => QUE_STRUCTURES, |
||
| 1023 | )); |
||
| 1024 | |||
| 1025 | if ( |
||
| 1026 | (defined('SN_RENDER_NAVBAR_PLANET') && SN_RENDER_NAVBAR_PLANET === true) |
||
| 1027 | || |
||
| 1028 | ($user['option_list'][OPT_INTERFACE]['opt_int_navbar_resource_force'] && (!defined('SN_RENDER_NAVBAR_PLANET') || SN_RENDER_NAVBAR_PLANET !== false)) |
||
| 1029 | ) { |
||
| 1030 | tpl_set_resource_info($template, $planetrow); |
||
| 1031 | $template->assign_vars(array( |
||
| 1032 | 'SN_RENDER_NAVBAR_PLANET' => true, |
||
| 1033 | 'SN_NAVBAR_HIDE_FLEETS' => true, |
||
| 1034 | )); |
||
| 1035 | } |
||
| 1036 | |||
| 1037 | return $user; |
||
| 1038 | } |
||
| 1039 | |||
| 1040 | /** |
||
| 1041 | * @param array|string $files |
||
| 1042 | * @param template|null $template |
||
| 1043 | * @param string|null $template_path - path to templates root |
||
| 1044 | * |
||
| 1045 | * @return template |
||
| 1046 | */ |
||
| 1047 | public static function gettemplate($files, $template = null, $template_path = null, $fallBackPath = '') { |
||
| 1048 | global $sn_mvc, $sn_page_name; |
||
| 1049 | |||
| 1050 | $template = self::getCurrentTemplate()->getTemplate($template, $template_path, $fallBackPath); |
||
| 1051 | |||
| 1052 | // TODO ГРЯЗНЫЙ ХАК! Это нужно, что бы по возможности перезаписать инфу из языковых пакетов модулей там, где она была перезаписана раньше инфой из основного пакета. Почему? |
||
| 1053 | // - сначала грузятся модули и их языковые пакеты |
||
| 1054 | // - затем по ходу дела ОСНОВНОЙ языковой пакет может перезаписать данные из МОДУЛЬНОГО языкового пакета |
||
| 1055 | // Поэтому и нужен этот грязный хак |
||
| 1056 | // В норме же - страницы заявляют сами, какие им пакеты нужны. Так что сначала всегда должны грузится основные языковые пакеты, а уже ПОВЕРХ них - пакеты модулей |
||
| 1057 | !empty($sn_mvc['i18n']['']) ? lng_load_i18n($sn_mvc['i18n']['']) : false; |
||
| 1058 | $sn_page_name ? lng_load_i18n($sn_mvc['i18n'][$sn_page_name]) : false; |
||
| 1059 | |||
| 1060 | if (empty($files)) { |
||
| 1061 | // Make sure that all empty files will translate to empty array |
||
| 1062 | $files = []; |
||
| 1063 | } elseif (is_string($files)) { |
||
| 1064 | // If we have single filename - making array from it |
||
| 1065 | $files = [basename($files) => $files]; |
||
| 1066 | } elseif (!is_array($files)) { |
||
| 1067 | // And final touch - all other non-string and non-array inputs converted to empty array |
||
| 1068 | $files = []; |
||
| 1069 | } |
||
| 1070 | |||
| 1071 | foreach ($files as &$filename) { |
||
| 1072 | $filename = $filename . self::TPL_HTML; |
||
| 1073 | } |
||
| 1074 | |||
| 1075 | $template->set_filenames($files); |
||
| 1076 | |||
| 1077 | return $template; |
||
| 1078 | } |
||
| 1079 | |||
| 1080 | /** |
||
| 1081 | * @param template|string $page |
||
| 1082 | * @param string $title |
||
| 1083 | * |
||
| 1084 | * @return mixed |
||
| 1085 | */ |
||
| 1086 | public static function display($page, $title = '') { |
||
| 1087 | SN::$gSomethingWasRendered = true; |
||
| 1088 | |||
| 1089 | if (!defined('SN_TIME_RENDER_START')) { |
||
| 1090 | define('SN_TIME_RENDER_START', microtime(true)); |
||
| 1091 | } |
||
| 1092 | |||
| 1093 | // return sn_function_call('display', array($page, $title)); |
||
| 1094 | //} |
||
| 1095 | // |
||
| 1096 | ///** |
||
| 1097 | // * @param template|string $page |
||
| 1098 | // * @param string $title |
||
| 1099 | // */ |
||
| 1100 | //function sn_display($page, $title = '') { |
||
| 1101 | global $debug, $user, $planetrow, $config, $lang, $template_result, $sn_mvc; |
||
| 1102 | |||
| 1103 | !empty($sn_mvc['view']['']) and execute_hooks($sn_mvc['view'][''], $page, 'view', ''); |
||
| 1104 | |||
| 1105 | $exitStatus = true; |
||
| 1106 | $template_result['LOGIN_LOGOUT'] = $inLoginLogout = defined('LOGIN_LOGOUT') && LOGIN_LOGOUT === true; |
||
| 1107 | |||
| 1108 | if (is_object($page)) { |
||
| 1109 | isset($page->_rootref['PAGE_TITLE']) && empty($title) ? $title = $page->_rootref['PAGE_TITLE'] : false; |
||
| 1110 | !$title && !empty($page->_rootref['PAGE_HEADER']) ? $title = $page->_rootref['PAGE_HEADER'] : false; |
||
| 1111 | !isset($page->_rootref['PAGE_HEADER']) && $title ? $page->assign_var('PAGE_HEADER', $title) : false; |
||
| 1112 | } |
||
| 1113 | |||
| 1114 | $isRenderGlobal = is_object($page) && isset($template_result['GLOBAL_DISPLAY_HEADER']) ? $template_result['GLOBAL_DISPLAY_HEADER'] : true; |
||
| 1115 | |||
| 1116 | if (self::getCurrentTemplate()->isRenderWhole()) { |
||
| 1117 | ob_start(); |
||
| 1118 | } else { |
||
| 1119 | // Global header |
||
| 1120 | if ($isRenderGlobal) { |
||
| 1121 | SnTemplate::renderHeader($page, $title, $template_result, $inLoginLogout, $user, $config, $lang, $planetrow, null); |
||
| 1122 | } |
||
| 1123 | } |
||
| 1124 | |||
| 1125 | // Page content |
||
| 1126 | !is_array($page) ? $page = array($page) : false; |
||
| 1127 | $result_added = false; |
||
| 1128 | foreach ($page as $page_item) { |
||
| 1129 | /** |
||
| 1130 | * @var template $page_item |
||
| 1131 | */ |
||
| 1132 | if ( |
||
| 1133 | !$result_added |
||
| 1134 | && is_object($page_item) |
||
| 1135 | && ( |
||
| 1136 | isset($page_item->_tpldata['result']) |
||
| 1137 | || |
||
| 1138 | !empty($template_result['.']['result']) |
||
| 1139 | ) |
||
| 1140 | ) { |
||
| 1141 | $resultTemplate = SnTemplate::gettemplate('_result_message'); |
||
| 1142 | |||
| 1143 | $resultTemplate->_tpldata = $page_item->_tpldata; |
||
| 1144 | |||
| 1145 | // Checking that no duplicates would be merged from template_result to template itself |
||
| 1146 | $filtered = []; |
||
| 1147 | if (!empty($template_result['.']['result']) && is_array($template_result['.']['result'])) { |
||
| 1148 | foreach ($template_result['.']['result'] as $message) { |
||
| 1149 | if (empty($message['MESSAGE'])) { |
||
| 1150 | continue; |
||
| 1151 | } |
||
| 1152 | |||
| 1153 | foreach ($resultTemplate->_tpldata['result'] as $tplData) { |
||
| 1154 | if (empty($tplData['MESSAGE'])) { |
||
| 1155 | continue; |
||
| 1156 | } |
||
| 1157 | |||
| 1158 | if ($tplData['MESSAGE'] == $message['MESSAGE']) { |
||
| 1159 | continue 2; |
||
| 1160 | } |
||
| 1161 | } |
||
| 1162 | |||
| 1163 | $filtered['.']['result'][] = $message; |
||
| 1164 | } |
||
| 1165 | } |
||
| 1166 | $resultTemplate->assign_recursive($filtered); |
||
| 1167 | |||
| 1168 | SnTemplate::displayP($resultTemplate); |
||
| 1169 | $result_added = true; |
||
| 1170 | } |
||
| 1171 | |||
| 1172 | SnTemplate::displayP($page_item); |
||
| 1173 | } |
||
| 1174 | |||
| 1175 | if (is_array($template_result[TEMPLATE_EXTRA_ARRAY]) && !empty($template_result[TEMPLATE_EXTRA_ARRAY])) { |
||
| 1176 | foreach ($template_result[TEMPLATE_EXTRA_ARRAY] as $extraName => $extraTemplate) { |
||
| 1177 | /** |
||
| 1178 | * @var template $extraTemplate |
||
| 1179 | */ |
||
| 1180 | SnTemplate::displayP($extraTemplate); |
||
| 1181 | } |
||
| 1182 | } |
||
| 1183 | |||
| 1184 | if ( |
||
| 1185 | is_object($page[0]) |
||
| 1186 | && |
||
| 1187 | ( |
||
| 1188 | // Checking if hiding page hint flag is present |
||
| 1189 | empty($template_result['PAGE_HINT_HIDE']) |
||
| 1190 | && |
||
| 1191 | empty($page[0]->_rootref['PAGE_HINT_HIDE']) |
||
| 1192 | ) |
||
| 1193 | && |
||
| 1194 | ( |
||
| 1195 | isset($page[0]->_tpldata['page_hint']) |
||
| 1196 | || |
||
| 1197 | isset($page[0]->_rootref['PAGE_HINT']) |
||
| 1198 | || |
||
| 1199 | !empty($template_result['.']['page_hint']) |
||
| 1200 | || |
||
| 1201 | !empty($template_result['PAGE_HINT']) |
||
| 1202 | ) |
||
| 1203 | ) { |
||
| 1204 | $resultTemplate = self::gettemplate('page_hint'); |
||
| 1205 | |||
| 1206 | $resultTemplate->_tpldata = &$page[0]->_tpldata; |
||
| 1207 | $resultTemplate->_rootref = &$page[0]->_rootref; |
||
| 1208 | $resultTemplate->assign_recursive($template_result); |
||
| 1209 | |||
| 1210 | SnTemplate::displayP($resultTemplate); |
||
| 1211 | } |
||
| 1212 | |||
| 1213 | if (self::getCurrentTemplate()->isRenderWhole()) { |
||
| 1214 | $renderedContent = ob_get_clean(); |
||
| 1215 | // Global header |
||
| 1216 | if ($isRenderGlobal) { |
||
| 1217 | SnTemplate::renderHeader($page, $title, $template_result, $inLoginLogout, $user, $config, $lang, $planetrow, $renderedContent); |
||
| 1218 | } else { |
||
| 1219 | echo $renderedContent; |
||
| 1220 | } |
||
| 1221 | } |
||
| 1222 | |||
| 1223 | // Flushing all opened buffers |
||
| 1224 | while (@ob_end_flush()) { |
||
| 1225 | ; |
||
| 1226 | } |
||
| 1227 | |||
| 1228 | |||
| 1229 | // Global footer |
||
| 1230 | if ($isRenderGlobal) { |
||
| 1231 | SnTemplate::renderFooter($page, $template_result); |
||
| 1232 | } |
||
| 1233 | |||
| 1234 | $user['authlevel'] >= 3 && $config->debug ? $debug->echo_log() : false;; |
||
| 1235 | |||
| 1236 | SN::$db->db_disconnect(); |
||
| 1237 | |||
| 1238 | $exitStatus and die($exitStatus === true ? 0 : $exitStatus); |
||
| 1239 | |||
| 1240 | return $exitStatus; |
||
| 1241 | } |
||
| 1242 | |||
| 1243 | /** |
||
| 1244 | * @var GlobalContainer|null $gc |
||
| 1245 | */ |
||
| 1246 | protected $gc = null; |
||
| 1247 | |||
| 1248 | /** |
||
| 1249 | * @var TemplateMeta[] $templates |
||
| 1250 | */ |
||
| 1251 | protected $templates = []; |
||
| 1252 | |||
| 1253 | public function __construct($gc = null) { |
||
| 1254 | $this->gc = empty($gc) ? SN::$gc : $gc; |
||
| 1255 | } |
||
| 1256 | |||
| 1257 | public function registerTemplate($templateName) { |
||
| 1258 | if (empty($this->templates[$templateName])) { |
||
| 1259 | $this->templates[$templateName] = new TemplateMeta($this, $templateName); |
||
| 1260 | } |
||
| 1261 | |||
| 1262 | return $this->templates[$templateName]; |
||
| 1263 | } |
||
| 1264 | |||
| 1265 | |||
| 1266 | /** |
||
| 1267 | * Дефолтное имя темплейта на сервере |
||
| 1268 | * |
||
| 1269 | * @return string |
||
| 1270 | */ |
||
| 1271 | public static function getServerDefaultTemplateName() { |
||
| 1272 | return SN::$config->game_default_template ? SN::$config->game_default_template : self::SN_TEMPLATE_NAME_DEFAULT; |
||
| 1273 | } |
||
| 1274 | |||
| 1275 | /** |
||
| 1276 | * Имя темплейта у игрока |
||
| 1277 | * |
||
| 1278 | * @return string |
||
| 1279 | */ |
||
| 1280 | public static function getPlayerTemplateName() { |
||
| 1281 | return SN::$gc->theUser->getTemplateName(); |
||
| 1282 | } |
||
| 1283 | |||
| 1284 | /** |
||
| 1285 | * Относительный путь к сконфигурированному темплейту |
||
| 1286 | * 'design/templates/(имя_темплейта) |
||
| 1287 | * |
||
| 1288 | * @return string |
||
| 1289 | * @deprecated |
||
| 1290 | */ |
||
| 1291 | public static function pathRelativeToCurrentTemplate() { |
||
| 1292 | return self::SN_TEMPLATES_PARTIAL_PATH . self::getPlayerTemplateName(); |
||
| 1293 | } |
||
| 1294 | |||
| 1295 | /** |
||
| 1296 | * @return TemplateMeta |
||
| 1297 | */ |
||
| 1298 | public static function getCurrentTemplate() { |
||
| 1299 | $templateName = SnTemplate::getPlayerTemplateName(); |
||
| 1300 | $tMeta = static::me()->registerTemplate($templateName); |
||
| 1301 | |||
| 1302 | return $tMeta; |
||
| 1303 | } |
||
| 1304 | |||
| 1305 | /** |
||
| 1306 | * @param array $fileList |
||
| 1307 | * @param string $extension |
||
| 1308 | * |
||
| 1309 | * @return array|string[] |
||
| 1310 | */ |
||
| 1311 | protected static function cacheFiles($fileList, $extension = '.css') { |
||
| 1312 | // Calculating file key which include all used filenames and modification time for them |
||
| 1313 | $key = ''; |
||
| 1314 | $filesToMerge = []; |
||
| 1315 | foreach ($fileList as $fileName => $aContent) { |
||
| 1316 | // If content empty - index is a filename |
||
| 1317 | if (empty($aContent)) { |
||
| 1318 | // Checking file modification time. Also we will check if file exists |
||
| 1319 | if ($fileMTime = filemtime(SN_ROOT_PHYSICAL . $fileName)) { |
||
| 1320 | // Generating key |
||
| 1321 | $key .= "$fileName:" . date(FMT_DATE_TIME_SQL, $fileMTime) . "\n"; |
||
| 1322 | // Adding filename to list of merge |
||
| 1323 | $filesToMerge[$fileName] = "$fileName:" . date(FMT_DATE_TIME_SQL, $fileMTime); |
||
| 1324 | } |
||
| 1325 | } |
||
| 1326 | } |
||
| 1327 | // Name we will be using to address this file |
||
| 1328 | $cacheFileName = 'design/cache/' . md5($key) . $extension; |
||
| 1329 | // If no file exists - trying to create it |
||
| 1330 | if (!file_exists($fullCacheFileName = SN_ROOT_PHYSICAL . $cacheFileName)) { |
||
| 1331 | // Caching several files into one |
||
| 1332 | $contentToCache = ''; |
||
| 1333 | foreach ($filesToMerge as $fileName => $temp) { |
||
| 1334 | if (file_exists($fName = SN_ROOT_PHYSICAL . $fileName) && !empty($content = file_get_contents($fName))) { |
||
| 1335 | // Adding content of cached file |
||
| 1336 | $contentToCache .= $content . "\n"; |
||
| 1337 | // Marking that file was read OK - for future debug purposes if any |
||
| 1338 | $filesToMerge[$fileName] .= " - OK\n"; |
||
| 1339 | } |
||
| 1340 | } |
||
| 1341 | // If we have something to cache... |
||
| 1342 | if (!empty($contentToCache)) { |
||
| 1343 | // /* */ works as comment for both JS and CSS |
||
| 1344 | file_put_contents($fullCacheFileName, "/* Generated content. Safe to delete\n" . implode('', $filesToMerge) . "*/\n\n" . $contentToCache); |
||
| 1345 | } |
||
| 1346 | } |
||
| 1347 | |||
| 1348 | // If CSS cache exists for current combination of files |
||
| 1349 | if (file_exists($fullCacheFileName)) { |
||
| 1350 | // Removing from list all CSS files that already in cache |
||
| 1351 | foreach ($filesToMerge as $fileName => $temp) { |
||
| 1352 | unset($fileList[$fileName]); |
||
| 1353 | } |
||
| 1354 | // Adding to list cache file |
||
| 1355 | $fileList = [$cacheFileName => ''] + $fileList; |
||
| 1356 | } |
||
| 1357 | |||
| 1358 | return $fileList; |
||
| 1359 | } |
||
| 1360 | |||
| 1361 | } |
||
| 1362 |
If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration: