Blotter Extension

This commit is contained in:
Zach Hall 2010-02-15 16:37:00 -08:00 committed by Shish
parent 161a2d1757
commit d3c921e8f3
3 changed files with 330 additions and 0 deletions

131
contrib/blotter/main.php Normal file
View file

@ -0,0 +1,131 @@
<?php
/*
* Name: Blotter
* Author: Zach Hall <zach@sosguy.net> [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", "<br />Number of recent entries to display: ");
$sb->add_text_option("blotter_color", "<br />Color of important updates: (ABCDEF format) ");
$sb->add_choice_option("blotter_position", array("Top of page" => "subheading", "In navigation bar" => "left"), "<br>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);
}
}

188
contrib/blotter/theme.php Normal file
View file

@ -0,0 +1,188 @@
<?
class BlotterTheme extends Themelet {
public function display_editor($entries) {
global $page;
$html = $this->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", "<a href='".make_link()."'>Index</a>", "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 = "
<tr>
<th>Date</th>
<th>Message</th>
<th>Important?</th>
<th>Action</th>
</tr>";
$add_new = "
<tr class='even'>
<form action='".make_link("blotter/add")."' method='POST'>
<td colspan='2'><textarea style='text-align:left;' name='entry_text' rows='2' /></textarea></td>
<td><input type='checkbox' name='important' /></td>
<td><input type='submit' value='Add'></td>
</form>
</tr>";
// 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 .=
"<tr class='{$tr_class}'
<td>$entry_date</td>
<td>$entry_text</td>
<td>$important</td>
<td><form name='remove$id' method='post' action='".make_link("blotter/remove")."'>
<input type='hidden' name='id' value='$id' />
<input type='submit' style='width: 100%;' value='Remove' />
</form>
</td>
</tr>";
}
$html = "
<table id='blotter_entries' class='zebra'>
<thead>$table_header</thead>
<tbody>$add_new</tbody>
<tfoot>$table_rows</tfoot>
</table>
<br />
<b>Help:</b><br />
<blockquote>Add entries to the blotter, and they will be displayed.</blockquote>";
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 .= "<html><head><title>Blotter</title></head>
<body><pre>";
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 = "<font color='#{$i_color}'>"; $i_close="</font>"; }
$html .= "{$i_open}{$clean_date} - {$entry_text}{$i_close}<br /><br />";
}
$html .= "</pre></body></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 = "<style type='text/css'>
#blotter1 {font-size: 80%;
position: relative;}
#blotter2 {font-size: 80%;
}
</style>";
$html .= "<script><!--
$(document).ready(function() {
$(\"#blotter2-toggle\").click(function() {
$(\"#blotter2\").slideToggle(\"slow\", function() {
if($(\"#blotter2\").is(\":hidden\")) {
$.cookie(\"blotter2-hidden\", 'true', {path: '/'});
}
else {
$.cookie(\"blotter2-hidden\", 'false', {path: '/'});
}
});
});
if($.cookie(\"blotter2-hidden\") == 'true') {
$(\"#blotter2\").hide();
}
});
//--></script>";
$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 = "<font color='#{$i_color}'>"; $i_close="</font>"; }
$entries_list .= "<li>{$i_open}{$clean_date} - {$entry_text}{$i_close}</li>";
}
$out_text = "";
$in_text = "";
$pos_break = "";
$pos_align = "text-align: right; position: absolute; right: 0px;";
if($position == "left") { $pos_break = "<br />"; $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 = "<ul>$entries_list</ul>";
}
$html .= "<div id='blotter1'><span>$out_text</span>{$pos_break}<span style='{$pos_align}'><a href='#' id='blotter2-toggle'>Show/Hide</a> <a href='".make_link("blotter")."'>Show All</a></span></div>";
$html .= "<div id='blotter2'>$in_text</div>";
return $html;
}
}
?>

View file

@ -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%;
}