diff --git a/inc/config.php b/inc/config.php index 020120e3..ca2bcf90 100644 --- a/inc/config.php +++ b/inc/config.php @@ -402,6 +402,12 @@ $config['mod']['public_ban'] = MOD; // Manage and install themes for homepage $config['mod']['themes'] = ADMIN; + // Post news entries + $config['mod']['news'] = ADMIN; + // Custom name when posting news + $config['mod']['news_custom'] = ADMIN; + // Delete news entries + $config['mod']['news_delete'] = ADMIN; // Mod links (full HTML) // Correspond to above permission directives diff --git a/install.sql b/install.sql index 4ceb4c85..6e032007 100644 --- a/install.sql +++ b/install.sql @@ -247,3 +247,39 @@ CREATE TABLE IF NOT EXISTS `robot` ( -- Dumping data for table `robot` -- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `theme_settings` +-- + +CREATE TABLE IF NOT EXISTS `theme_settings` ( + `name` varchar(40) NOT NULL, + `value` text, + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `theme_settings` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `news` +-- + +CREATE TABLE IF NOT EXISTS `news` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` text NOT NULL, + `time` int(11) NOT NULL, + `subject` text NOT NULL, + `body` text NOT NULL, + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `news` +-- + diff --git a/mod.php b/mod.php index 3f0ad157..908bc167 100644 --- a/mod.php +++ b/mod.php @@ -135,6 +135,8 @@ ' (' . $count . ' unread)' : '') . ''; + + $fieldset['Noticeboard'] .= '
  • News
  • '; } if($mod['type'] >= $config['mod']['reports']) { @@ -449,6 +451,83 @@ 'mod'=>true ) ); + } elseif(preg_match('/^\/news\/delete\/(\d+)$/', $query, $match)) { + if($mod['type'] < $config['mod']['noticeboard_delete']) error($config['error']['noaccess']); + + $query = prepare("DELETE FROM `news` WHERE `id` = :id"); + $query->bindValue(':id', $match[1], PDO::PARAM_INT); + $query->execute() or error(db_error($query)); + + header('Location: ?/news', true, $config['redirect_http']); + } elseif(preg_match('/^\/news$/', $query)) { + $body = ''; + + if($mod['type'] >= $config['mod']['news']) { + if(isset($_POST['subject']) && isset($_POST['body']) && !empty($_POST['body'])) { + $query = prepare("INSERT INTO `news` VALUES (NULL, :name, :time, :subject, :body)"); + + if(isset($_POST['name']) && $mod['type'] >= $config['mod']['news_custom']) + $name = $_POST['name']; + else + $name = $mod['username']; + + $query->bindValue(':name', utf8tohtml($name), PDO::PARAM_INT); + $query->bindvalue(':time', time(), PDO::PARAM_INT); + $query->bindValue(':subject', utf8tohtml($_POST['subject'])); + + markup($_POST['body']); + $query->bindValue(':body', $_POST['body']); + $query->execute() or error(db_error($query)); + } + + $body .= '
    New post
    ' . + '' . + '' . + ($mod['type'] >= $config['mod']['news_custom'] ? + '' + : + '') . + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '
    ' . $mod['username'] . '
    Subject
    Body
    ' . + '
    '; + } + + $query = prepare("SELECT * FROM `news` ORDER BY `id` DESC LIMIT :limit"); + $query->bindValue(':limit', $config['mod']['noticeboard_display'], PDO::PARAM_INT); + $query->execute() or error(db_error($query)); + while($news = $query->fetch()) { + $body .= '
    ' . + ($mod['type'] >= $config['mod']['news_delete'] ? + '[delete]' + : '') . + '

    ' . + ($news['subject'] ? + $news['subject'] + : + 'no subject' + ) . + ' — by ' . + $news['name'] . + ' at ' . + date($config['post_date'], $news['time']) . + '

    ' . $news['body'] . '

    '; + } + + + echo Element('page.html', Array( + 'config'=>$config, + 'title'=>'News', + 'body'=>$body, + 'mod'=>true + ) + ); } elseif(preg_match('/^\/inbox$/', $query, $match)) { $query = prepare("SELECT `unread`,`pms`.`id`, `time`, `sender`, `to`, `message`, `username` FROM `pms` LEFT JOIN `mods` ON `mods`.`id` = `sender` WHERE `to` = :mod ORDER BY `unread` DESC, `time` DESC"); $query->bindValue(':mod', $mod['id'], PDO::PARAM_INT); diff --git a/templates/homepage/frameset/theme.php b/templates/homepage/frameset/theme.php index 3964a469..5942f3c2 100644 --- a/templates/homepage/frameset/theme.php +++ b/templates/homepage/frameset/theme.php @@ -12,12 +12,19 @@ Users never have to leave the homepage; they can do all their browsing from the // Theme configuration $theme['config'] = Array(); + $theme['config'][] = Array( - 'title' => 'Page title', + 'title' => 'Title', 'name' => 'title', 'type' => 'text' ); + $theme['config'][] = Array( + 'title' => 'Slogan', + 'name' => 'subtitle', + 'type' => 'text' + ); + // Unique function name for building everything $config['build_function'] = 'frameset_build'; @@ -32,6 +39,7 @@ Users never have to leave the homepage; they can do all their browsing from the 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)); } // Build homepage @@ -52,11 +60,52 @@ Users never have to leave the homepage; they can do all their browsing from the // Sidebar . '' // Main - . '' + . '' // Finish page . ''; } + // Build news page + public static function news($settings) { + global $config; + + // HTML5 + $body = '' + . '' + . '' + . 'News' + . ''; + + $body .= '

    ' . $settings['title'] . '

    ' + . '
    ' . ($settings['subtitle'] ? utf8tohtml($settings['subtitle']) : '') . '
    '; + + $query = query("SELECT * FROM `news` ORDER BY `time` DESC") or error(db_error()); + if($query->rowCount() == 0) { + $body .= '

    (No news to show.)

    '; + } else { + // List news + while($news = $query->fetch()) { + $body .= '
    ' . + '

    ' . + ($news['subject'] ? + $news['subject'] + : + 'no subject' + ) . + ' — by ' . + $news['name'] . + ' at ' . + date($config['post_date'], $news['time']) . + '

    ' . $news['body'] . '

    '; + } + } + + // Finish page + $body .= ''; + + return $body; + } + // Build sidebar public static function sidebar($settings) { global $config, $board;