From 641f925dfebf2540a6d7e94e23e302c4a30dc58b Mon Sep 17 00:00:00 2001 From: Savetheinternet Date: Thu, 14 Apr 2011 20:43:34 +1000 Subject: [PATCH] better rebuilding system for themes --- inc/functions.php | 14 ++++++++++---- mod.php | 22 ++++++++++++++++++---- templates/homepage/basic/theme.php | 14 ++++++++++---- templates/homepage/frameset/theme.php | 22 ++++++++++++++++------ templates/homepage/frameset/thumb.png | Bin 12142 -> 7571 bytes 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/inc/functions.php b/inc/functions.php index b90abe1b..cec25137 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -104,13 +104,13 @@ return $theme; } - function rebuildTheme() { + function rebuildTheme($action) { $query = query("SELECT `value` AS `theme` FROM `theme_settings` WHERE `name` = 'theme'") or error(db_error()); if($theme = $query->fetch()) { // A theme is installed $theme = loadThemeConfig($theme['theme']); - $theme['build_function'](themeSettings()); + $theme['build_function']($action, themeSettings()); } } @@ -799,10 +799,16 @@ $content .= '
'; break; case 6: - $content .= ''; + if(!empty($value)) + $content .= ''; + else + $content .= ''; break; case 7: - $content .= ''; + if(!empty($value)) + $content .= ''; + else + $content .= ''; break; case 8: $content .= '
'; diff --git a/mod.php b/mod.php index 8a27a44d..14bed8d1 100644 --- a/mod.php +++ b/mod.php @@ -304,7 +304,15 @@ $query->execute() or error(db_error($query)); // Build theme - $theme['build_function'](themeSettings()); + rebuildTheme('all'); + + echo Element('page.html', Array( + 'config'=>$config, + 'title'=>'Installed "' . htmlentities($theme['name']) . '"', + 'body'=>'

Successfully installed and built theme.

', + 'mod'=>true + ) + ); } else { $body = '
'; @@ -481,7 +489,7 @@ $query->bindValue(':id', $match[1], PDO::PARAM_INT); $query->execute() or error(db_error($query)); - rebuildTheme(); + rebuildTheme('news'); header('Location: ?/news', true, $config['redirect_http']); } elseif(preg_match('/^\/news$/', $query)) { @@ -504,7 +512,7 @@ $query->bindValue(':body', $_POST['body']); $query->execute() or error(db_error($query)); - rebuildTheme(); + rebuildTheme('news'); } $body .= '
New post' . @@ -1197,6 +1205,8 @@ $query->bindValue(':id', $board['id'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); + rebuildTheme('boards'); + header('Location: ?/', true, $config['redirect_http']); } else { if(isset($_POST['title']) && isset($_POST['subtitle'])) { @@ -1211,6 +1221,8 @@ $query->bindValue(':id', $board['id'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); + rebuildTheme('boards'); + openBoard($board['uri']); } @@ -1364,7 +1376,7 @@ $body = '

Rebuilding…

'; $body .= 'Regenerating theme files…
'; - rebuildTheme(); + rebuildTheme('all'); $body .= 'Generating Javascript file…
'; buildJavascript(); @@ -1510,6 +1522,8 @@ // Build the board buildIndex(); + rebuildTheme('boards'); + header('Location: ?/board/' . $board['uri'], true, $config['redirect_http']); } else { diff --git a/templates/homepage/basic/theme.php b/templates/homepage/basic/theme.php index 1251cfff..6a6f0bfa 100644 --- a/templates/homepage/basic/theme.php +++ b/templates/homepage/basic/theme.php @@ -25,16 +25,22 @@ // Unique function name for building everything $theme['build_function'] = 'basic_build'; - function basic_build($settings) { - Basic::build($settings); + function basic_build($action, $settings) { + // Possible values for $action: + // - all (rebuild everything, initialization) + // - news (news has been updated) + // - boards (board list changed) + + Basic::build($action, $settings); } // Wrap functions in a class so they don't interfere with normal Tinyboard operations class Basic { - public static function build($settings) { + public static function build($action, $settings) { global $config; - file_put_contents($config['dir']['home'] . $config['file_index'], Basic::homepage($settings)); + if($action == 'all' || $action == 'news') + file_put_contents($config['dir']['home'] . $config['file_index'], Basic::homepage($settings)); } // Build news page diff --git a/templates/homepage/frameset/theme.php b/templates/homepage/frameset/theme.php index 8b96402d..6c82f0b1 100644 --- a/templates/homepage/frameset/theme.php +++ b/templates/homepage/frameset/theme.php @@ -28,18 +28,28 @@ Users never have to leave the homepage; they can do all their browsing from the // Unique function name for building everything $theme['build_function'] = 'frameset_build'; - function frameset_build($settings) { - Frameset::build($settings); + function frameset_build($action, $settings) { + // Possible values for $action: + // - all (rebuild everything, initialization) + // - news (news has been updated) + // - boards (board list changed) + + Frameset::build($action, $settings); } // Wrap functions in a class so they don't interfere with normal Tinyboard operations class Frameset { - public static function build($settings) { + public static function build($action, $settings) { global $config; - file_put_contents($config['dir']['home'] . $config['file_index'], Frameset::homepage($settings)); - file_put_contents($config['dir']['home'] . 'sidebar.html', Frameset::sidebar($settings)); - file_put_contents($config['dir']['home'] . 'news.html', Frameset::news($settings)); + if($action == 'all') + file_put_contents($config['dir']['home'] . $config['file_index'], Frameset::homepage($settings)); + + if($action == 'all' || $action == 'boards') + file_put_contents($config['dir']['home'] . 'sidebar.html', Frameset::sidebar($settings)); + + if($action == 'all' || $action == 'news') + file_put_contents($config['dir']['home'] . 'news.html', Frameset::news($settings)); } // Build homepage diff --git a/templates/homepage/frameset/thumb.png b/templates/homepage/frameset/thumb.png index fd912d1a937d22ed2da3211725f3a8c507bacc94..df18a8e9396488f075c279836b55582ebb805a27 100644 GIT binary patch literal 7571 zcmb_>WmFvNwr%6mxP<_L#vK|75CQ~gG(ZRvBoJtz(MG#*g1bY2Ai;u5fIx6}4K4}p zE)Bs#kjFmv>~r53@9q2R))-Zv%{kXv-&$2QYE-y}x*{Py4L$$>AXHX@Xg;)lf1SA4 z57#a!=+Hy+7%8uZ)N-&ux`02y-!Qy56u4r&S0gh9f{rg~g zu;y%TA+8Bg__wWxktCB966q+;&+q2u#^)x)=iqF~FYxTyv%fS11$iG3ya*3_B-EYP z9>M�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 Bx>o=I literal 12142 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