lots of changes, added footer and main view, implemented an initial wiki page

This commit is contained in:
tmont 2008-10-19 02:33:35 +00:00
parent 4b987ca7de
commit 6d01fe82c7
14 changed files with 493 additions and 48 deletions

View File

@ -24,17 +24,26 @@
$file = '';
switch ($className) {
case 'PanaceaControllerFactory':
case 'PanaceaWikiController':
case 'WikiViewFactory':
case 'PanaceaDefaultController':
case 'PanaceaViewFactory':
$file = "$path/lib/$className.php";
break;
case 'WikiPageView':
$file = "$path/lib/views/wiki/$className.php";
break;
case 'PanaceaView':
case 'PanaceaHomeView':
case 'PanaceaMainView':
case 'PanaceaTemplateView':
case 'PanaceaHeaderView':
case 'PanaceaLogoView':
case 'PanaceaMenuView':
case 'PanaceaFooterView':
case 'PanaceaWelcomeView':
$file = "$path/lib/views/$className.php";
break;
}

View File

@ -13,7 +13,7 @@
$uriRegex = str_replace(str_replace('/', DIRECTORY_SEPARATOR, $_SERVER['DOCUMENT_ROOT']), '', dirname(__FILE__));
$uriRegex = str_replace('\\', '/', $uriRegex);
$uriRegex = '^' . $uriRegex . '/([^/]*)(?:/(.+))?';
$uriRegex = '^' . $uriRegex . '/([^/]*)(?:/(.*))?';
Dispatcher::getInstance()->setUriRegex($uriRegex)
->setThrowExceptions(true)

View File

@ -67,17 +67,24 @@
if (isset($uriFragments[1])) {
$section = ucfirst($uriFragments[0]);
$page = $uriFragments[1];
$page = ucfirst($uriFragments[1]);
}
if (empty($section)) {
$section = 'Default';
}
if (empty($page)) {
$page = 'home';
}
$controllerName = 'Panacea' . $section . 'Controller';
if (empty($page)) {
try {
$refclass = new ReflectionClass($controllerName);
$page = $refclass->getMethod('getDefaultPageName')->invoke(null);
}
catch (ReflectionException $e) {
throw $e;
}
}
return new $controllerName($page);
}

View File

@ -36,6 +36,18 @@
$this->viewFactory = PanaceaViewFactory::getInstance();
}
/**
* Gets the default page if none is specified in the URI
*
* @author Tommy Montgomery
* @since 2008-10-18
*
* @return string
*/
public static function getDefaultPageName() {
return 'Home';
}
/**
* Handles the specified request, and generates a
* suitable response
@ -54,8 +66,9 @@
}
try {
$templateView = new PanaceaTemplateView($this->page);
$templateView->addView($this->viewFactory->getView($this->page, $templateView->getNextPriority()));
$title = (empty($this->page) || $this->page === 'Home') ? 'It doesn\'t suck' : $this->page;
$templateView = new PanaceaTemplateView($title);
$templateView->mainView->addView($this->viewFactory->getView($this->page));
return $templateView;
}
catch (ClassNotFoundException $e) {

View File

@ -44,38 +44,16 @@
}
/**
* Creates an instance of a {@link View} given a
* page name
* {@inheritdoc}
*
* @author Tommy Montgomery
* @since 2008-10-05
* @since 2008-10-18
*
* @param string $page The name of the page
* @param mixed $args Other arguments for creating the view
* @throws {@link InvalidTypeException}
* @throws {@link ClassNotFoundException}
* @return View
* @return string
*/
public function getView($page, $priority = 0) {
if (!is_string($page)) {
throw new InvalidTypeException(1, 'string', $page);
}
$viewName = 'Panacea' . ucfirst($page) . 'View';
try {
$refclass = new ReflectionClass($viewName);
$args = array_slice(func_get_args(), 1, 1);
if (!empty($args)) {
return $refclass->newInstanceArgs($args);
}
else {
return $refclass->newInstance();
}
}
catch (ReflectionException $e) {
throw new ClassNotFoundException($viewName);
}
protected function getViewName($page) {
return 'Panacea' . ucfirst($page) . 'View';
}
}

View File

@ -0,0 +1,71 @@
<?php
/**
* PanaceaWikiController
*
* @package Panacea
* @author Tommy Montgomery
* @since 2008-10-18
*/
/** Bootstraps the NowhereConcave framework */
require_once 'NowhereConcave/bootstrap.php';
/**
* Wiki controller
*
* @package Panacea
* @author Tommy Montgomery
* @since 2008-10-18
*/
class PanaceaWikiController extends PanaceaDefaultController {
public function __construct($page) {
parent::__construct($page, View::VIEWTYPE_HTML);
$this->viewFactory = WikiViewFactory::getInstance();
}
/**
* {@inheritdoc}
*
* @author Tommy Montgomery
* @since 2008-10-18
*
* @return string
*/
public static function getDefaultPageName() {
return 'MainPage';
}
/**
* {@inheritdoc}
*
* @author Tommy Montgomery
* @since 2008-10-18
* @uses Request::create()
* @uses HttpUtil::getRequestMethod()
*
* @throws {@link InvalidRequestException} if a {@link View} cannot be created
* @return PanaceaTemplateView
*/
public function handleRequest(Request $request = null) {
if (!($request instanceof Request)) {
$request = Request::create(HttpUtil::getRequestMethod());
}
try {
$templateView = new PanaceaTemplateView('Wiki :: ' . $this->page);
$mysql = MySql::getInstance('wiki', 'localhost', 'root', 'layne', 'wiki');
$wikiObject = new WikiPageObject(WikiPage::loadByPageName($mysql, $this->page));
$wikiObject->setRevision(WikiHistory::REV_LATEST, $mysql);
$templateView->mainView->addView($this->viewFactory->getView($this->page, $wikiObject));
return $templateView;
}
catch (ClassNotFoundException $e) {
throw new InvalidRequestException($request);
}
}
}
?>

View File

@ -0,0 +1,61 @@
<?php
/**
* PanaceaViewFactory
*
* @package Panacea
* @author Tommy Montgomery
* @since 2008-10-05
*/
/** Bootstraps the NowhereConcave framework */
require_once 'NowhereConcave/bootstrap.php';
/**
* Factory for generating {@link View}s
*
* @package Panacea
* @author Tommy Montgomery
* @since 2008-10-05
*/
class WikiViewFactory extends ViewFactory {
/**
* The singleton instance
*
* @var WikiViewFactory
*/
protected static $instance = null;
/**
* Gets the singleton instance
*
* @author Tommy Montgomery
* @since 2008-10-17
*
* @return WikiViewFactory
*/
public static function getInstance() {
if (static::$instance === null) {
static::$instance = new static();
}
return static::$instance;
}
/**
* {@inheritdoc}
*
* @author Tommy Montgomery
* @since 2008-10-18
*
* @param string $page The name of the page
* @return string
*/
protected function getViewName($page) {
return 'WikiPageView';
}
}
?>

View File

@ -0,0 +1,50 @@
<?php
/**
* PanaceaFooterView
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-18
*/
/** Bootstraps the NowhereConcave framework */
require_once 'NowhereConcave/bootstrap.php';
/**
* View for standard Panacea pages
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-18
*/
class PanaceaFooterView extends PanaceaView {
/**
* Renders the view
*
* @author Tommy Montgomery
* @since 2008-10-18
*/
public function send() { ?>
<div class="hrule"></div>
<div id="foot">
<ul>
<li><a href="<?php echo $this->root; ?>/about">About</a></li>
<li><a href="<?php echo $this->root; ?>/credits">Credits</a></li>
<li><a href="<?php echo $this->root; ?>/copyright">Copyright</a></li>
<li><a href="<?php echo $this->root; ?>/contact">Contact</a></li>
</ul>
<div style="clear:right"></div>
</div>
<?php
}
}
?>

View File

@ -22,21 +22,30 @@
*/
class PanaceaHomeView extends PanaceaView {
/**
* Renders the view
*
* @author Tommy Montgomery
* @since 2008-10-18
* @uses addView()
* @uses PanaceaWelcomeView
*
* @param int $priority The priority of this view
*/
public function __construct($priority = 0) {
parent::__construct($priority);
$this->addView(new PanaceaWelcomeView(1));
}
/**
* Renders the view
*
* @author Tommy Montgomery
* @since 2008-10-05
*/
public function send() { ?>
<h1>Panacea</h1>
<p>
Hello!
</p>
<?php
public function send() {
parent::send();
}
}

View File

@ -0,0 +1,43 @@
<?php
/**
* PanaceaMainView
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-05
*/
/** Bootstraps the NowhereConcave framework */
require_once 'NowhereConcave/bootstrap.php';
/**
* View for standard Panacea pages
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-05
*/
class PanaceaMainView extends PanaceaView {
/**
* Renders the view
*
* @author Tommy Montgomery
* @since 2008-10-05
*/
public function send() { ?>
<div id="main">
<?php parent::send(); ?>
</div>
<?php
}
}
?>

View File

@ -59,6 +59,8 @@
$this->separator = ' - ';
$this->addView(new PanaceaHeaderView(1));
$this->addView(new PanaceaMainView(2));
$this->addView(new PanaceaFooterView(3));
}
/**
@ -101,6 +103,8 @@
case 'defaultTitle':
case 'separator':
return $this->$var;
case 'mainView':
return $this->views[1];
default:
return parent::__get($var);
}

View File

@ -0,0 +1,100 @@
<?php
/**
* PanaceaWelcomeView
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-18
*/
/** Bootstraps the NowhereConcave framework */
require_once 'NowhereConcave/bootstrap.php';
/**
* View for the welcome message
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-18
*/
class PanaceaWelcomeView extends PanaceaView {
/**
* Renders the view
*
* @author Tommy Montgomery
* @since 2008-10-18
*/
public function send() { ?>
<h2>Welcome</h2>
<div class="inset">
<p>
Welcome to <i>Panacea</i>, a web-based application that
doesn&#039;t suck. It&#039;s aimed at software developers,
software development managers, <acronym>QA</acronym> professionals,
and people who like using <a href="http://en.wikipedia.org/wiki/Wiki">wikis</a>
(which should be everybody, unless you&#039;re a robot).
</p>
</div>
<h2>What is <i>Panacea</i>?</h2>
<div class="inset">
<p>
<i>Panacea</i> is modeled after <a href="http://trac.edgewall.org/">Trac</a>,
which is a fantastic application very similar to this one. <i>Panacea</i>
aims to ease integration, configuration and installation. That is not to say
that <i>Panacea</i> is simple; it is in fact just the opposite. <i>Panacea</i> is
infintely complex and extensible; it is well documented and well-written; it
is a panacea to all your software development troubles; it&#039;s also a lot of
fun, in the sense that there&#039;s a lot of crap to mess around with.
</p>
<p>
More information about the technology and reason for <i>Panacea</i> can be
viewed at the <a href="<?php echo $this->root; ?>/wiki/About">about</a> page.
</p>
</div>
<h2>Stuff to do here</h2>
<div class="inset">
<p>
This whole site is an example of <i>Panacea</i>, except for this page.
This page is just a bunch of static <acronym>HTML</acronym>, and is not
under the control of a wiki.
</p>
<h3>Demo</h3>
<div class="inset">
<p>
Words are boring. Here is a demo: <a href="<?php echo $this->root; ?>/demo/">do
it.</a>
</p>
</div>
<h3>Download</h3>
<div class="inset">
<p>
<a href="<?php echo $this->root; ?>/wiki/Download">Click here</a> to go
to our download page.
</p>
</div>
<h3>Install</h3>
<div class="inset">
<p>
<a href="<?php echo $this->root; ?>/wiki/Install">Click here</a> to go
to view installation instructions.
</p>
</div>
</div>
<?php
}
}
?>

View File

@ -0,0 +1,44 @@
<?php
/**
* WikiPageView
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-18
*/
/** Bootstraps the NowhereConcave framework */
require_once 'NowhereConcave/bootstrap.php';
/**
* View for wiki pages
*
* @package Panacea
* @subpackage Views
* @author Tommy Montgomery
* @since 2008-10-18
*/
class WikiPageView extends PanaceaView {
protected $page;
public function __construct(WikiPageObject $page, $priority = 0) {
parent::__construct($priority);
$this->page = $page;
}
/**
* Renders the view
*
* @author Tommy Montgomery
* @since 2008-10-18
*/
public function send() {
echo $this->page;
}
}
?>

View File

@ -7,6 +7,9 @@ body {
font-size: 8pt;
color: #FFFFFF;
}
a {
text-decoration: none;
}
#wrapper {
width: 95%;
@ -38,7 +41,6 @@ body {
}
#menu ul li {
float: left;
display:block;
margin-right: 5px;
width: 100px;
height: 25px;
@ -74,3 +76,57 @@ body {
line-height: 35px;
border: 1px solid #FFFFFF;
}
#main {
position: relative;
padding: 5px;
}
#main p {
line-height: 1.5em;
}
#main a {
border-bottom: 1px dotted #000000;
color: #669966 ;
font-weight: bold;
}
#main a:hover {
color: #000000;
border-bottom: 2px solid #669966;
}
#foot {
position: relative;
padding: 5px;
margin: 2px;
}
#foot ul {
list-style-type: none;
margin: 0;
padding: 0;
}
#foot ul li {
float: right;
}
#foot ul li:first-child:after, #foot ul li:before {
content: "|";
color: #999999;
}
#foot ul li a {
text-decoration: none;
color: #999999;
}
#foot ul li a:hover {
color: #000000;
text-decoration: underline;
}
.inset {
margin-left: 20px;
}
.hrule {
height: .1em;
border-top: 1px solid #000000;
border-bottom: 1px solid #000000;
background-color: #DDDD77;
}