mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 06:08:52 +00:00
The beginnings of the destruction of phpBB's greatest bottleneck, dynamic css...
As of phpBB 3.0.x, we take our "generic" CSS for a theme and later on combine it with the imagesets and languages as needed... What we did for 3.0.x involved dynamically resolving the variables in the CSS and then sending it off, caching it at several layers (except the one that mattered). The biggest issue with style.php is that it is one giant str_replace on every page load, no matter what; cache be damned. Instead, the trick is to cache the full compilation earlier on... Further work to do: kill all the old crap and fully integrate the new solution git-svn-id: file:///svn/phpbb/trunk@8649 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
parent
0ca7e81ca4
commit
0ebc5cc9ee
2 changed files with 118 additions and 1 deletions
|
@ -1060,6 +1060,9 @@ parse_css_file = {PARSE_CSS_FILE}
|
||||||
}
|
}
|
||||||
$db->sql_freeresult($result);
|
$db->sql_freeresult($result);
|
||||||
|
|
||||||
|
$theme_info['theme_id'] = $theme_id;
|
||||||
|
self::generate_stylesheets($theme_info);
|
||||||
|
|
||||||
// save changes to the theme if the user submitted any
|
// save changes to the theme if the user submitted any
|
||||||
if ($save_changes)
|
if ($save_changes)
|
||||||
{
|
{
|
||||||
|
@ -2856,6 +2859,120 @@ parse_css_file = {PARSE_CSS_FILE}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function generate_stylesheets($theme)
|
||||||
|
{
|
||||||
|
global $db, $phpbb_root_path, $config;
|
||||||
|
|
||||||
|
// get all the lang_dirs
|
||||||
|
$sql = 'SELECT lang_dir
|
||||||
|
FROM ' . LANG_TABLE;
|
||||||
|
$result = $db->sql_query($sql);
|
||||||
|
while ($row = $db->sql_fetchrow($result))
|
||||||
|
{
|
||||||
|
$lang_dirs[] = $row['lang_dir'];
|
||||||
|
}
|
||||||
|
$db->sql_freeresult($result);
|
||||||
|
|
||||||
|
// get all imagesets this theme is associated with
|
||||||
|
$sql = 'SELECT si.imageset_id, si.imageset_path, st.template_path
|
||||||
|
FROM ' . STYLES_TABLE . ' s, ' . STYLES_IMAGESET_TABLE . ' si, ' . STYLES_TEMPLATE_TABLE . ' st
|
||||||
|
WHERE s.theme_id = ' . (int) $theme['theme_id'] . '
|
||||||
|
AND s.imageset_id = si.imageset_id
|
||||||
|
AND s.template_id = st.template_id';
|
||||||
|
$result = $db->sql_query($sql);
|
||||||
|
while ($theme_row = $db->sql_fetchrow($result))
|
||||||
|
{
|
||||||
|
foreach ($lang_dirs as $lang_dir)
|
||||||
|
{
|
||||||
|
$theme['imageset_path'] = $theme_row['imageset_path'];
|
||||||
|
$theme['imageset_id'] = $theme_row['imageset_id'];
|
||||||
|
$theme['template_path'] = $theme_row['template_path'];
|
||||||
|
|
||||||
|
$user_image_lang = (file_exists($phpbb_root_path . 'styles/' . $theme['imageset_path'] . '/imageset/' . $lang_dir)) ? $lang_dir : $config['default_lang'];
|
||||||
|
|
||||||
|
// Parse Theme Data
|
||||||
|
$replace = array(
|
||||||
|
'{T_THEME_PATH}' => "./styles/" . $theme['theme_path'] . '/theme',
|
||||||
|
'{T_TEMPLATE_PATH}' => "./styles/" . $theme['template_path'] . '/template',
|
||||||
|
'{T_IMAGESET_PATH}' => "./styles/" . $theme['imageset_path'] . '/imageset',
|
||||||
|
'{T_IMAGESET_LANG_PATH}' => "./styles/" . $theme['imageset_path'] . '/imageset/' . $user_image_lang,
|
||||||
|
'{T_STYLESHEET_NAME}' => $theme['theme_name'],
|
||||||
|
'{S_USER_LANG}' => $lang_dir // this bastard forces us to make a copy for every language that is installed, not just those with an actual i18'd imageset!
|
||||||
|
);
|
||||||
|
|
||||||
|
$sql = 'SELECT image_name, image_filename, image_lang, image_width, image_height
|
||||||
|
FROM ' . STYLES_IMAGESET_DATA_TABLE . '
|
||||||
|
WHERE imageset_id = ' . $theme['imageset_id'] . "
|
||||||
|
AND image_filename <> ''
|
||||||
|
AND image_lang IN ('" . $db->sql_escape($user_image_lang) . "', '')";
|
||||||
|
$result2 = $db->sql_query($sql);
|
||||||
|
|
||||||
|
$img_array = array();
|
||||||
|
while ($row = $db->sql_fetchrow($result2))
|
||||||
|
{
|
||||||
|
$img_array[$row['image_name']] = $row;
|
||||||
|
}
|
||||||
|
$db->sql_freeresult($result2);
|
||||||
|
|
||||||
|
$specific_theme_data = str_replace(array_keys($replace), array_values($replace), $theme['theme_data']);
|
||||||
|
|
||||||
|
$matches = array();
|
||||||
|
preg_match_all('#\{IMG_([A-Za-z0-9_]*?)_(WIDTH|HEIGHT|SRC)\}#', $specific_theme_data, $matches);
|
||||||
|
|
||||||
|
$imgs = $find = $replace = array();
|
||||||
|
if (isset($matches[0]) && sizeof($matches[0]))
|
||||||
|
{
|
||||||
|
foreach ($matches[1] as $i => $img)
|
||||||
|
{
|
||||||
|
$img = strtolower($img);
|
||||||
|
$find[] = $matches[0][$i];
|
||||||
|
|
||||||
|
if (!isset($img_array[$img]))
|
||||||
|
{
|
||||||
|
$replace[] = '';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($imgs[$img]))
|
||||||
|
{
|
||||||
|
$img_data = &$img_array[$img];
|
||||||
|
$imgsrc = ($img_data['image_lang'] ? $img_data['image_lang'] . '/' : '') . $img_data['image_filename'];
|
||||||
|
$imgs[$img] = array(
|
||||||
|
'src' => $phpbb_root_path . 'styles/' . $theme['imageset_path'] . '/imageset/' . $imgsrc,
|
||||||
|
'width' => $img_data['image_width'],
|
||||||
|
'height' => $img_data['image_height'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($matches[2][$i])
|
||||||
|
{
|
||||||
|
case 'SRC':
|
||||||
|
$replace[] = $imgs[$img]['src'];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'WIDTH':
|
||||||
|
$replace[] = $imgs[$img]['width'];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'HEIGHT':
|
||||||
|
$replace[] = $imgs[$img]['height'];
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sizeof($find))
|
||||||
|
{
|
||||||
|
$specific_theme_data = str_replace($find, $replace, $specific_theme_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_put_contents($phpbb_root_path . '/store/' . $theme['theme_id'] . '_' . $theme['imageset_id'] . '_' . $lang_dir . '.css', $specific_theme_data, LOCK_EX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$db->sql_freeresult($result);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
|
|
||||||
$reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false;
|
$reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false;
|
||||||
|
|
|
@ -3416,7 +3416,7 @@ function page_header($page_title = '', $display_online_list = true)
|
||||||
'T_ICONS_PATH' => PHPBB_ROOT_PATH . $config['icons_path'] . '/',
|
'T_ICONS_PATH' => PHPBB_ROOT_PATH . $config['icons_path'] . '/',
|
||||||
'T_RANKS_PATH' => PHPBB_ROOT_PATH . $config['ranks_path'] . '/',
|
'T_RANKS_PATH' => PHPBB_ROOT_PATH . $config['ranks_path'] . '/',
|
||||||
'T_UPLOAD_PATH' => PHPBB_ROOT_PATH . $config['upload_path'] . '/',
|
'T_UPLOAD_PATH' => PHPBB_ROOT_PATH . $config['upload_path'] . '/',
|
||||||
'T_STYLESHEET_LINK' => (!$user->theme['theme_storedb']) ? PHPBB_ROOT_PATH . 'styles/' . $user->theme['theme_path'] . '/theme/stylesheet.css' : PHPBB_ROOT_PATH . 'style.' . PHP_EXT . "?sid=$user->session_id&id=" . $user->theme['style_id'] . '&lang=' . $user->data['user_lang'],
|
'T_STYLESHEET_LINK' => (!$user->theme['theme_storedb']) ? PHPBB_ROOT_PATH . 'styles/' . $user->theme['theme_path'] . '/theme/stylesheet.css' : PHPBB_ROOT_PATH . 'style.' . PHP_EXT . "?sid=$user->session_id&id=" . $user->theme['style_id'] . '&lang=' . $user->data['user_lang'], //"{$phpbb_root_path}store/{$user->theme['theme_id']}_{$user->theme['imageset_id']}_{$user->lang_name}.css"
|
||||||
'T_STYLESHEET_NAME' => $user->theme['theme_name'],
|
'T_STYLESHEET_NAME' => $user->theme['theme_name'],
|
||||||
|
|
||||||
'SITE_LOGO_IMG' => $user->img('site_logo'))
|
'SITE_LOGO_IMG' => $user->img('site_logo'))
|
||||||
|
|
Loading…
Add table
Reference in a new issue