Initial commit of HandBrakeCluster PHP framework

Replaced dodgy placeholder with a set of PHP classes for displaying a
HandBrake webui.
Current code uses Smarty as a templating engine, and includes an ugly
but functional set of pages.
The HandBrake classes are at present only placeholders, and offer no
real functionality.
Working class autoloader for the HandBrakeCluster_ hierarchy.
This commit is contained in:
2010-03-17 02:29:12 +00:00
parent 5b09ef44aa
commit 8db695166e
24 changed files with 469 additions and 86 deletions

10
.htaccess.dist Normal file
View File

@@ -0,0 +1,10 @@
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?l=$1
</IfModule>

View File

@@ -0,0 +1,13 @@
<?php
class HandBrakeCluster_Config {
private $filename;
public function __construct($filename) {
$this->filename = $filename;
}
};
?>

View File

@@ -0,0 +1,13 @@
<?php
class HandBrakeCluster_Database {
private $config;
public function __construct(HandBrakeCluster_Config $config) {
$this->config = $config;
}
}
?>

View File

@@ -0,0 +1,17 @@
<?php
class HandBrakeCluster_Job {
private $id;
public function __construct() {
$this->id = 42;
}
public function id() {
return $this->id;
}
};
?>

View File

@@ -0,0 +1,15 @@
<?php
class HandBrakeCluster_Log {
private $database;
private $config;
public function __construct(HandBrakeCluster_Database $database, HandBrakeCluster_Config $config) {
$this->database = $database;
$this->config = $config;
}
}
?>

View File

@@ -0,0 +1,88 @@
<?php
require 'smarty/Smarty.class.php';
class HandBrakeCluster_Main {
private static $instance;
private $smarty;
private $config;
private $database;
private $log;
private $request;
private function __construct() {
$this->smarty = new Smarty();
$this->smarty->template_dir = './templates';
$this->smarty->compile_dir = './tmp/templates';
$this->smarty->cache_dir = './tmp/cache';
$this->smarty->config_fir = './config';
$this->smarty->assign('version', '0.1');
$this->smarty->assign('base_uri', '/handbrake/');
$request_string = isset($_GET['l']) ? $_GET['l'] : '';
$this->request = new HandBrakeCluster_RequestParser($request_string);
}
public static function instance() {
if (!self::$instance) {
self::$instance = new HandBrakeCluster_Main();
}
return self::$instance;
}
public function smarty() {
return $this->smarty;
}
public function config() {
return $this->config;
}
public function database() {
return $this->database;
}
public function log() {
return $this->log;
}
public function request() {
return $this->request;
}
public static function initialise() {
spl_autoload_register(array('HandBrakeCluster_Main','autoload'));
}
public static function autoload($classname) {
// Ensure the classname contains only valid class name characters
if (!preg_match('/^[A-Z][a-zA-Z0-9_]*$/', $classname)) {
throw new Exception('Illegal characters in classname'); // TODO Subclass this exception
}
// Ensure the class to load begins with our prefix
if (!preg_match('/^HandBrakeCluster_/', $classname)) {
return;
}
// Replace any underscores with directory separators
$filename = preg_replace('/_/', '/', $classname);
// Tack on the class file suffix
$filename .= '.class.php';
// If this file exists, load it
if (file_exists($filename)) {
require_once $filename;
}
}
}
HandBrakeCluster_Main::initialise();
?>

View File

@@ -0,0 +1,41 @@
<?php
class HandBrakeCluster_Page {
private $smarty;
private $request;
private $page;
public function __construct(Smarty $smarty, HandBrakeCluster_RequestParser $request) {
$this->smarty = $smarty;
$this->request = $request;
$this->page = $request->page();
}
public function page() {
return $this->page;
}
public function template_filename() {
$template_filename = $this->page() . '.tpl';
if (!$this->smarty->template_exists($template_filename)) {
$template_filename = 'home.tpl';
}
return $template_filename;
}
public function evaluate() {
$code_filename = 'pages/' . $this->page() . '.php';
if (!file_exists($code_filename)) {
throw Exception('Template code file does not exist!');
}
eval("include '$code_filename';");
}
};
?>

View File

@@ -0,0 +1,44 @@
<?php
class HandBrakeCluster_RequestParser {
private $request_string;
private $page = 'home';
private $vars = array();
public function __construct($request_string) {
$this->request_string = $request_string;
$this->parse();
}
public function parse() {
$components = explode('/', $this->request_string);
if (!$components) {
return;
}
// The first token is the page to execute
$this->page = array_shift($components);
// The subsequent tokens are parameters for this page in key value pairs
while ($components) {
$this->vars[array_shift($components)] = $components ? array_shift($components) : null;
}
}
public function page() {
return $this->page;
}
public function get($key) {
if (isset($this->vars[$key])) {
return $this->vars[$key];
}
return null;
}
};
?>

View File

@@ -1,86 +0,0 @@
<?php
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Current HandBrake Ripping Jobs</title>
<script lang="javascript">
</script>
<style>
body {
font-family: verdana, helvetica, sans-serif;
}
a {
color: gray;
}
label {
margin-left: 1em;
margin-right: 1em;
}
table {
border-collapse: collapse;
}
tr {
border: 1px dashed darkGray;
}
tr:hover {
background-color: lightBlue;
}
#errors {
border: 1px solid firebrick;
background: peachpuff;
color: darkred;
margin: 1em;
}
#messages {
border: 1px solid cornflowerblue;
background: lightcyan;
color: darkblue;
margin: 1em;
}
.default {
background: beige;
color: darkgray;
font-style: italic;
}
.icon {
height: 16px;
width: 16px;
}
</style>
</head>
<body>
<h1>Current HandBrake Ripping Jobs</h1>
<?php if ($errors) { ?>
<div id="errors">
<ul>
<?php foreach ($errors as $error) { ?>
<li><?php echo htmlspecialchars($error); ?></li>
<?php } ?>
</ul>
</div>
<?php } ?>
<?php if ($messages) { ?>
<div id="messages">
<ul>
<?php foreach ($messages as $message) { ?>
<li><?php echo htmlspecialchars($message); ?></li>
<?php } ?>
</ul>
</div>
<?php } ?>
</body>
</html>

14
index.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
require 'HandBrakeCluster/Main.class.php';
$main = HandBrakeCluster_Main::instance();
$smarty = $main->smarty();
$page = new HandBrakeCluster_Page($smarty, $main->request());
$page->evaluate();
$smarty->assign('page_content', $smarty->fetch($page->template_filename()));
$smarty->display('index.tpl');
?>

11
pages/home.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
$running_jobs = array();
$completed_jobs = array();
$running_jobs[] = new HandBrakeCluster_Job();
$this->smarty->assign('running_jobs', $running_jobs);
$this->smarty->assign('completed_jobs;', $completed_jobs);
?>

0
pages/job-details.php Normal file
View File

0
pages/jobs.php Normal file
View File

0
pages/logs.php Normal file
View File

116
styles/normal.css Normal file
View File

@@ -0,0 +1,116 @@
body {
margin: 0em;
padding: 0em;
background: #a7a09a;
font-family: verdana, helvetica, sans-serif;
}
a {
color: gray;
}
label {
margin-left: 1em;
margin-right: 1em;
}
table {
}
tr {
}
tr:hover {
background-color: lightBlue;
}
#container {
width: 75%;
min-width: 75em;
margin: auto;
}
#banner {
margin: 0em;
padding: 0em;
background: #eeeeee;
}
#banner h1 {
padding: 0.5em;
}
#navigation {
background: #eeeeee;
margin-top: 0em;
margin-bottom: 1em;
padding: 0.2em;
}
#navigation ul {
margin: 0em;
padding: 0em 5em;;
list-style: none;
}
#navigation li {
margin: 1em;
padding: 0em;
display: inline;
}
#page-container {
margin: 0em;
padding: 0em;
}
#sidebar {
float: left;
width: 20em;
margin-bottom: 1em;
background: #eeeeee;
}
#page {
margin-left: 21em;
margin-bottom: 1em;
padding: 0.5em;
background: #eeeeee;
}
#footer {
clear: both;
padding: 2em;
font-size: smaller;
font-style: italic;
background: #eeeeee;
color: #333333;
}
#errors {
background: peachpuff;
color: darkred;
margin: 1em;
}
#messages {
background: lightcyan;
color: darkblue;
margin: 1em;
}
.default {
background: beige;
color: darkgray;
font-style: italic;
}
.icon {
height: 16px;
width: 16px;
}

24
templates/home.tpl Normal file
View File

@@ -0,0 +1,24 @@
<h2>Summary</h2>
<h3>Running Jobs</h3>
{if $running_jobs}
{foreach from=$running_jobs item=job}
<li><a href="{$base_uri}job-details/id/{$job->id()}" title="View job details">Job {$job->id()}</a></li>
{/foreach}
{else}
<em>There are no currently running jobs.</em>
{/if}
<h3>Completed Jobs</h3>
{if $completed_jobs}
<ul>
{foreach from=$completed_jobs item=job}
<li><a href="{$base_uri}job-details/id/{$job->id()}" title="View job details">Job {$job->id()}</a></li>
{/foreach}
</ul>
{else}
<em>There are no recently completed jobs.</em>
{/if}

50
templates/index.tpl Normal file
View File

@@ -0,0 +1,50 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>HandBrake Cluster WebUI</title>
<script lang="javascript">
</script>
<link rel="stylesheet" type="text/css" href="{$base_uri}styles/normal.css" />
</head>
<body>
<div id="container">
<div id="banner">
<h1>HandBrake Cluster WebUI</h1>
</div>
<div id="navigation">
{include file=navigation.tpl}
</div>
<div id="page-container">
<div id="sidebar">
{include file=sidebar.tpl}
</div>
<div id="page">
{if $messages}
<div id="messages">
{foreach from=$messages item=message}
{$message}
{/foreach}
</div>
{/if}
{$page_content}
</div>
</div>
<div id="footer">
Powered by HandBrakeCluster WebUI {$version}. Written by Ben Roberts.
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
Job details...

1
templates/jobs.tpl Normal file
View File

@@ -0,0 +1 @@
Jobs

1
templates/logs.tpl Normal file
View File

@@ -0,0 +1 @@
Logs...

5
templates/navigation.tpl Normal file
View File

@@ -0,0 +1,5 @@
<ul>
<li><a href="{$base_uri}home/" title="Home">Home</a></li>
<li><a href="{$base_uri}jobs/" title="Jobs">Jobs</a></li>
<li><a href="{$base_uri}logs/" title="Logs">Logs</a></li>
</ul>

5
templates/sidebar.tpl Normal file
View File

@@ -0,0 +1,5 @@
<ul>
<li><a href="{$base_uri}home/" title="Home">Home</a></li>
<li><a href="{$base_uri}jobs/" title="Jobs">Jobs</a></li>
<li><a href="{$base_uri}logs/" title="Logs">Logs</a></li>
</ul>

0
tmp/cache/.gitignore vendored Normal file
View File

0
tmp/templates/.gitignore vendored Normal file
View File