Blotter Extension
This commit is contained in:
parent
161a2d1757
commit
d3c921e8f3
3 changed files with 330 additions and 0 deletions
131
contrib/blotter/main.php
Normal file
131
contrib/blotter/main.php
Normal 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
188
contrib/blotter/theme.php
Normal 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;
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -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%;
|
||||
}
|
||||
|
|
Reference in a new issue