diff options
| author | Michael Save <savetheinternet@tinyboard.org> | 2012-02-14 20:46:06 +1100 |
|---|---|---|
| committer | Michael Save <savetheinternet@tinyboard.org> | 2012-02-14 20:46:06 +1100 |
| commit | 42abac99cf2b3a15871063243785a70de54adc5d (patch) | |
| tree | 6ceecd21488ba344da400e47cad19db0dade80d9 /templates/themes | |
| parent | 0b421167171ab29199dbd4732c5182aaec094e21 (diff) | |
recent theme: transition to Twig template files
Diffstat (limited to 'templates/themes')
| -rw-r--r-- | templates/themes/recent/info.php | 49 | ||||
| -rw-r--r-- | templates/themes/recent/recent.html | 54 | ||||
| -rw-r--r-- | templates/themes/recent/theme.php | 175 |
3 files changed, 177 insertions, 101 deletions
diff --git a/templates/themes/recent/info.php b/templates/themes/recent/info.php index 734908c4..ab983fdc 100644 --- a/templates/themes/recent/info.php +++ b/templates/themes/recent/info.php @@ -5,7 +5,7 @@ $theme['name'] = 'RecentPosts'; // Description (you can use Tinyboard markup here) $theme['description'] = 'Show recent posts and images, like 4chan.'; - $theme['version'] = 'v0.9'; + $theme['version'] = 'v0.9.1'; // Theme configuration $theme['config'] = Array(); @@ -13,7 +13,8 @@ $theme['config'][] = Array( 'title' => 'Title', 'name' => 'title', - 'type' => 'text' + 'type' => 'text', + 'default' => 'Recent Posts' ); $theme['config'][] = Array( @@ -23,6 +24,48 @@ 'comment' => '(space seperated)' ); + $theme['config'][] = Array( + 'title' => '# of recent images', + 'name' => 'limit_images', + 'type' => 'text', + 'default' => '3', + 'comment' => '(maximum images to display)' + ); + + $theme['config'][] = Array( + 'title' => '# of recent posts', + 'name' => 'limit_posts', + 'type' => 'text', + 'default' => '30', + 'comment' => '(maximum posts to display)' + ); + + $theme['config'][] = Array( + 'title' => 'HTML file', + 'name' => 'html', + 'type' => 'text', + 'default' => 'recent.html', + 'comment' => '(eg. "recent.html")' + ); + + $theme['config'][] = Array( + 'title' => 'CSS file', + 'name' => 'css', + 'type' => 'text', + 'default' => 'recent.css', + 'comment' => '(eg. "recent.css")' + ); + // Unique function name for building everything $theme['build_function'] = 'recentposts_build'; -?>
\ No newline at end of file + $theme['install_callback'] = 'recentposts_install'; + + if(!function_exists('recentposts_install')) { + function recentposts_install($settings) { + if(!is_numeric($settings['limit_images']) || $settings['limit_images'] < 0) + return Array(false, '<strong>' . utf8tohtml($settings['limit_images']) . '</strong> is not a non-negative integer.'); + if(!is_numeric($settings['limit_posts']) || $settings['limit_posts'] < 0) + return Array(false, '<strong>' . utf8tohtml($settings['limit_posts']) . '</strong> is not a non-negative integer.'); + } + } + diff --git a/templates/themes/recent/recent.html b/templates/themes/recent/recent.html new file mode 100644 index 00000000..d02cc183 --- /dev/null +++ b/templates/themes/recent/recent.html @@ -0,0 +1,54 @@ +{% filter remove_whitespace %} +<!doctype html> +<html> +<head> + <title>{{ settings.title }}</title> + <link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}"/> + <link rel="stylesheet" media="screen" href="{{ config.root }}{{ settings.css }}"/> +</head> +<body> + {{ boardlist.top }} + <h1>{{ settings.title }}</h1> + <div class="title">{{ settings.subtitle }}</div> + + <div class="box-wrap"> + <div class="box left"> + <h2>Recent Images</h2> + <ul> + {% for post in recent_images %} + <li> + <a href="{{ post.link }}"> + <img src="{{ post.src }}" style="width:{{ post.thumbwidth }}px;height:{{ post.thumbheight }}px" alt=""> + </a> + </li> + {% endfor %} + </ul> + </div> + <div class="box right"> + <h2>Latest Posts</h2> + <ul> + {% for post in recent_posts %} + <li> + <strong>{{ post.board_name }}</strong>: + <a href="{{ post.link }}"> + {{ post.snippet }} + </a> + </li> + {% endfor %} + </ul> + </div> + <div class="box right"> + <h2>Stats</h2> + <ul> + <li>Total posts: {{ stats.total_posts }}</li> + <li>Unique posters: {{ stats.unique_posters }}</li> + <li>Active content: {{ stats.active_content|filesize }}</li> + </ul> + </div> + </div> + + <hr/> + <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2012 Tinyboard Development Group</p> +</body> +</html> +{% endfilter %} diff --git a/templates/themes/recent/theme.php b/templates/themes/recent/theme.php index 812760ff..13a5546f 100644 --- a/templates/themes/recent/theme.php +++ b/templates/themes/recent/theme.php @@ -18,129 +18,108 @@ global $config, $_theme; if($action == 'all') { - copy($config['dir']['themes'] . '/' . $_theme . '/recent.css', $config['dir']['home'] . 'recent.css'); + copy('templates/themes/recent/recent.css', $config['dir']['home'] . $settings['css']); } $this->excluded = explode(' ', $settings['exclude']); if($action == 'all' || $action == 'post') - // file_put_contents($config['dir']['home'] . $config['file_index'], $this->homepage($settings)); - file_write($config['dir']['home'] . 'recent.html', $this->homepage($settings)); + file_write($config['dir']['home'] . $settings['html'], $this->homepage($settings)); } // Build news page public function homepage($settings) { global $config, $board; - // HTML5 - $body = '<!DOCTYPE html><html>' - . '<head>' - . '<link rel="stylesheet" media="screen" href="' . $config['url_stylesheet'] . '"/>' - . '<link rel="stylesheet" media="screen" href="' . $config['root'] . 'recent.css"/>' - . '<title>' . $settings['title'] . '</title>' - . '</head><body>'; - - $boardlist = createBoardlist(); - $body .= '<div class="boardlist">' . $boardlist['top'] . '</div>'; - - $body .= '<h1>' . $settings['title'] . '</h1>'; - + $recent_images = Array(); + $recent_posts = Array(); + $stats = Array(); $boards = listBoards(); - // Wrap - $body .= '<div class="box-wrap">'; - - // Recent images - $body .= '<div class="box left"><h2>Recent Images</h2><ul>'; - $query = ''; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` WHERE `file` IS NOT NULL UNION ALL ", $_board['uri'], $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT 3', $query); - $query = query($query) or error(db_error()); - - while($post = $query->fetch()) { - openBoard($post['board']); - - $body .= '<li><a href="' . - $config['root'] . $board['dir'] . $config['dir']['res'] . ($post['thread']?$post['thread']:$post['id']) . '.html#' . $post['id'] . - '"><img src="' . $config['uri_thumb'] . $post['thumb'] . '" style="width:' . $post['thumbwidth'] . 'px;height:' . $post['thumbheight'] . 'px;" /></a></li>'; - } - $body .= '</ul></div>'; + $query = ''; + foreach($boards as &$_board) { + if(in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` WHERE `file` IS NOT NULL AND `file` != 'deleted' AND `thumb` != 'spoiler' UNION ALL ", $_board['uri'], $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_images'], $query); + $query = query($query) or error(db_error()); - // Latest posts - $body .= '<div class="box right"><h2>Latest Posts</h2><ul>'; - $query = ''; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` UNION ALL ", $_board['uri'], $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT 30', $query); - $query = query($query) or error(db_error()); + while($post = $query->fetch()) { + openBoard($post['board']); - while($post = $query->fetch()) { - openBoard($post['board']); - - $body .= '<li><strong>' . $board['name'] . '</strong>: <a href="' . - $config['root'] . $board['dir'] . $config['dir']['res'] . ($post['thread']?$post['thread']:$post['id']) . '.html#' . $post['id'] . - '">' . pm_snippet($post['body'], 30) . '</a></li>'; - } + // board settings won't be available in the template file, so generate links now + $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], ($post['thread'] ? $post['thread'] : $post['id'])) . '#' . $post['id']; + $post['src'] = $config['uri_thumb'] . $post['thumb']; - $body .= '</ul></div>'; + $recent_images[] = $post; + } - // Stats - $body .= '<div class="box right"><h2>Stats</h2><ul>'; + $query = ''; + foreach($boards as &$_board) { + if(in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` UNION ALL ", $_board['uri'], $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_posts'], $query); + $query = query($query) or error(db_error()); - // Total posts - $query = 'SELECT SUM(`top`) AS `count` FROM ('; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT MAX(`id`) AS `top` FROM `posts_%s` UNION ALL ", $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); - $query = query($query) or error(db_error()); - $res = $query->fetch(); - $body .= '<li>Total posts: ' . number_format($res['count']) . '</li>'; - - // Unique IPs - $query = 'SELECT COUNT(DISTINCT(`ip`)) AS `count` FROM ('; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT `ip` FROM `posts_%s` UNION ALL ", $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); - $query = query($query) or error(db_error()); - $res = $query->fetch(); - $body .= '<li>Unique posters: ' . number_format($res['count']) . '</li>'; + while($post = $query->fetch()) { + openBoard($post['board']); - // Active content - $query = 'SELECT SUM(`filesize`) AS `count` FROM ('; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) - continue; - $query .= sprintf("SELECT `filesize` FROM `posts_%s` UNION ALL ", $_board['uri']); - } - $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); - $query = query($query) or error(db_error()); - $res = $query->fetch(); - $body .= '<li>Active content: ' . format_bytes($res['count']) . '</li>'; + $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], ($post['thread'] ? $post['thread'] : $post['id'])) . '#' . $post['id']; + $post['snippet'] = pm_snippet($post['body'], 30); + $post['board_name'] = $board['name']; - $body .= '</ul></div>'; + $recent_posts[] = $post; + } - // End wrap - $body .= '</div>'; + // Total posts + $query = 'SELECT SUM(`top`) AS `count` FROM ('; + foreach($boards as &$_board) { + if(in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT MAX(`id`) AS `top` FROM `posts_%s` UNION ALL ", $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); + $query = query($query) or error(db_error()); + $res = $query->fetch(); + $stats['total_posts'] = number_format($res['count']); - // Finish page - $body .= '<hr/><p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a></body></html>'; + // Unique IPs + $query = 'SELECT COUNT(DISTINCT(`ip`)) AS `count` FROM ('; + foreach($boards as &$_board) { + if(in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT `ip` FROM `posts_%s` UNION ALL ", $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); + $query = query($query) or error(db_error()); + $res = $query->fetch(); + $stats['unique_posters'] = number_format($res['count']); + + // Active content + $query = 'SELECT SUM(`filesize`) AS `count` FROM ('; + foreach($boards as &$_board) { + if(in_array($_board['uri'], $this->excluded)) + continue; + $query .= sprintf("SELECT `filesize` FROM `posts_%s` UNION ALL ", $_board['uri']); + } + $query = preg_replace('/UNION ALL $/', ') AS `posts_all`', $query); + $query = query($query) or error(db_error()); + $res = $query->fetch(); + $stats['active_content'] = $res['count']; - return $body; + return Element('themes/recent/recent.html', Array( + 'settings' => $settings, + 'config' => $config, + 'boardlist' => createBoardlist(), + 'recent_images' => $recent_images, + 'recent_posts' => $recent_posts, + 'stats' => $stats + )); } }; |
