From d3c921e8f37b729bad368d564f9ab41dbbcfe213 Mon Sep 17 00:00:00 2001 From: Zach Hall Date: Mon, 15 Feb 2010 16:37:00 -0800 Subject: [PATCH] Blotter Extension --- contrib/blotter/main.php | 131 ++++++++++++++++++++++++++ contrib/blotter/theme.php | 188 ++++++++++++++++++++++++++++++++++++++ themes/danbooru/style.css | 11 +++ 3 files changed, 330 insertions(+) create mode 100644 contrib/blotter/main.php create mode 100644 contrib/blotter/theme.php diff --git a/contrib/blotter/main.php b/contrib/blotter/main.php new file mode 100644 index 00000000..dbbc92a1 --- /dev/null +++ b/contrib/blotter/main.php @@ -0,0 +1,131 @@ + [http://seemslegit.com/] + * License: GPLv2 + * Description: Displays brief updates about whatever you want on every page. + * Colors and positioning can be configured to match your site's design. + * + * Development TODO at http://github.com/zshall/shimmie2/issues + */ +class Blotter extends SimpleExtension { + public function onInitExt(Event $event) { + /** + * I love re-using this installer don't I... + */ + global $config; + $version = $config->get_int("blotter_version", 0); + /** + * If this version is less than "1", it's time to install. + * + * REMINDER: If I change the database tables, I must change up version by 1. + */ + if($version < 1) { + /** + * Installer + */ + global $database, $config; + $database->create_table("blotter", + "id SCORE_AIPK + , entry_date SCORE_DATETIME DEFAULT SCORE_NOW + , entry_text TEXT NOT NULL + , important SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N + "); + // Insert sample data: + $database->execute("INSERT INTO blotter (id, entry_date, entry_text, important) VALUES (?, now(), ?, ?)", + array(NULL, "Installed the blotter extension!", "Y")); + log_info("blotter", "Installed tables for blotter extension."); + $config->set_int("blotter_version", 1); + } + // Set default config: + $config->set_default_int("blotter_recent", 5); + $config->set_default_string("blotter_color", "FF0000"); + $config->set_default_string("blotter_position", "subheading"); + + } + public function onSetupBuilding(Event $event) { + global $config; + $sb = new SetupBlock("Blotter"); + $sb->add_int_option("blotter_recent", "
Number of recent entries to display: "); + $sb->add_text_option("blotter_color", "
Color of important updates: (ABCDEF format) "); + $sb->add_choice_option("blotter_position", array("Top of page" => "subheading", "In navigation bar" => "left"), "
Position: "); + $event->panel->add_block($sb); + } + public function onUserBlockBuilding(Event $event) { + global $user; + if($user->is_admin()) { + $event->add_link("Blotter Editor", make_link("blotter/editor")); + } + } + public function onPageRequest(Event $event) { + if($event->page_matches("blotter")) { + switch($event->get_arg(0)) { + case "editor": + /** + * Displays the blotter editor. + */ + global $database, $user; + if(!$user->is_admin()) { + $this->theme->display_permission_denied($page); + } else { + $entries = $database->get_all("SELECT * FROM blotter ORDER BY id DESC"); + $this->theme->display_editor($entries); + } + break; + case "add": + /** + * Adds an entry + */ + global $page, $database, $user; + if(!$user->is_admin()) { + $this->theme->display_permission_denied($page); + } else { + $entry_text = $_POST['entry_text']; + if($entry_text == "") { die("No entry message!"); } + if(isset($_POST['important'])) { $important = 'Y'; } else { $important = 'N'; } + // Now insert into db: + $database->execute("INSERT INTO blotter (id, entry_date, entry_text, important) VALUES (?, now(), ?, ?)", + array(NULL, $entry_text, $important)); + log_info("blotter", "Added Message: $entry_text"); + $page->set_mode("redirect"); + $page->set_redirect(make_link("blotter/editor")); + } + break; + case "remove": + /** + * Removes an entry + */ + global $page, $database, $user; + if(!$user->is_admin()) { + $this->theme->display_permission_denied($page); + } else { + $id = $_POST['id']; + if(!isset($id)) { die("No ID!"); } + $database->Execute("DELETE FROM blotter WHERE id=$id"); + log_info("blotter", "Removed Entry #$id"); + $page->set_mode("redirect"); + $page->set_redirect(make_link("blotter/editor")); + } + break; + case "": + /** + * Displays all blotter entries + */ + global $database, $user; + $entries = $database->get_all("SELECT * FROM blotter ORDER BY id DESC"); + $this->theme->display_blotter_page($entries); + break; + } + } + /** + * Finally, display the blotter on whatever page we're viewing. + */ + $this->display_blotter(); + } + private function display_blotter() { + global $database, $config; + $limit = $config->get_int("blotter_recent", 5); + $entries = $database->get_all("SELECT * FROM blotter ORDER BY id DESC LIMIT 0,$limit"); + $this->theme->display_blotter($entries); + } +} \ No newline at end of file diff --git a/contrib/blotter/theme.php b/contrib/blotter/theme.php new file mode 100644 index 00000000..db809983 --- /dev/null +++ b/contrib/blotter/theme.php @@ -0,0 +1,188 @@ +get_html_for_blotter_editor($entries); + $page->set_title("Blotter Editor"); + $page->set_heading("Blotter Editor"); + $page->add_block(new Block("Welcome to the Blotter Editor!", $html, "main", 10)); + $page->add_block(new Block("Navigation", "Index", "left", 0)); + } + + public function display_blotter_page($entries) { + global $page; + $html = $this->get_html_for_blotter_page($entries); + $page->set_mode("data"); + $page->set_data($html); + } + + public function display_blotter($entries) { + global $page, $config; + $html = $this->get_html_for_blotter($entries); + $position = $config->get_string("blotter_position", "subheading"); + $page->add_block(new Block(null, $html, $position, 20)); + } + + private function is_odd($number) { + return $number & 1; // 0 = even, 1 = odd + } + + private function get_html_for_blotter_editor($entries) { + /** + * Long function name, but at least I won't confuse it with something else ^_^ + */ + + $html = ""; + // Add_new stuff goes here. + $table_header = " + + Date + Message + Important? + Action + "; + $add_new = " + +
+ + + +
+ "; + + + // Now, time for entries list. + $table_rows = ""; + for ($i = 0 ; $i < count($entries) ; $i++) + { + /** + * Add table rows + */ + $id = $entries[$i]['id']; + $entry_date = $entries[$i]['entry_date']; + $entry_text = $entries[$i]['entry_text']; + if($entries[$i]['important'] == 'Y') { $important = 'Y'; } else { $important = 'N'; } + + if(!$this->is_odd($i)) {$tr_class = "odd";} + if($this->is_odd($i)) {$tr_class = "even";} + // Add the new table row(s) + $table_rows .= + "$entry_date + $entry_text + $important +
+ + +
+ + "; + } + + $html = " + + $table_header + $add_new + $table_rows +
+ +
+ Help:
+
Add entries to the blotter, and they will be displayed.
"; + + return $html; + } + + private function get_html_for_blotter_page($entries) { + /** + * This one displays a list of all blotter entries. + */ + global $config; + $i_color = $config->get_string("blotter_color","#FF0000"); + $html = ""; + $html .= "Blotter +
";
+
+        for ($i = 0 ; $i < count($entries) ; $i++)
+        {
+		/**
+		 * Blotter entries
+		 */
+		 	// Reset variables:
+			$i_open = "";
+			$i_close = "";
+			$id = $entries[$i]['id'];
+			$messy_date = $entries[$i]['entry_date'];
+			$clean_date = date("m/d/y",strtotime($messy_date));
+			$entry_text = $entries[$i]['entry_text'];
+			if($entries[$i]['important'] == 'Y') { $i_open = ""; $i_close=""; }
+			$html .= "{$i_open}{$clean_date} - {$entry_text}{$i_close}

"; + } + + $html .= "
"; + return $html; + } + + private function get_html_for_blotter($entries) { + /** + * Show the blotter widget + * Although I am starting to learn PHP, I got no idea how to do javascript... to the tutorials! + */ + global $config; + $i_color = $config->get_string("blotter_color","#FF0000"); + $position = $config->get_string("blotter_position", "subheading"); + $html = ""; + $html .= ""; + $entries_list = ""; + for ($i = 0 ; $i < count($entries) ; $i++) + { + /** + * Blotter entries + */ + // Reset variables: + $i_open = ""; + $i_close = ""; + $id = $entries[$i]['id']; + $messy_date = $entries[$i]['entry_date']; + $clean_date = date("m/d/y",strtotime($messy_date)); + $entry_text = $entries[$i]['entry_text']; + if($entries[$i]['important'] == 'Y') { $i_open = ""; $i_close=""; } + $entries_list .= "
  • {$i_open}{$clean_date} - {$entry_text}{$i_close}
  • "; + } + $out_text = ""; + $in_text = ""; + $pos_break = ""; + $pos_align = "text-align: right; position: absolute; right: 0px;"; + if($position == "left") { $pos_break = "
    "; $pos_align = ""; } + if (count($entries) == 0) { $out_text = "No blotter entries yet."; $in_text = "Empty.";} + else { $clean_date = date("m/d/y",strtotime($entries[0]['entry_date'])); + $out_text = "Blotter updated: {$clean_date}"; + $in_text = ""; + } + $html .= "
    $out_text{$pos_break}Show/Hide Show All
    "; + $html .= "
    $in_text
    "; + return $html; + } +} +?> \ No newline at end of file diff --git a/themes/danbooru/style.css b/themes/danbooru/style.css index 1f6735fe..93d2f806 100644 --- a/themes/danbooru/style.css +++ b/themes/danbooru/style.css @@ -281,3 +281,14 @@ font-weight:normal; #tips { margin-left:16px; } +#blotter1 { +margin-left:16px; +margin-right:16px; +font-size: 90%; +position: relative; +} +#blotter2 { +margin-left:16px; +margin-right:16px; +font-size: 90%; +}