arse/includes/core/page.inc.php
Emmanuel BENOîT 29a026e71a Improved URL rewriting support
When this code was written, it did not include an internal URL mapper
and each page was loaded by a PHP script. The internal URL was a recent,
mostly unfinished addition.

Base URL is now supported:
 * for views, when they implement the BaseURLAware interface (a base
class that does what most views will do with that is provided -
BaseURLAwareView),
 * in the menu,
 * in form actions,
 * in boxes (for buttons, and for the contents if the inner view
implements BaseURLAware).
2012-02-05 17:42:53 +01:00

214 lines
4.4 KiB
PHP

<?php
abstract class Page
{
private $baseURL;
private $controllers = array( );
protected $views = array( );
public function __construct( )
{
$this->baseURL = dirname( $_SERVER[ 'SCRIPT_NAME' ] );
}
public final function addController( Controller $controller )
{
array_push( $this->controllers , $controller );
return $this;
}
public final function addView( View $view )
{
array_push( $this->controllers , new Ctrl_Simple( $view ) );
return $this;
}
public final function getBaseURL( )
{
return $this->baseURL;
}
protected abstract function render( );
protected function handleControllerValue( $rc )
{
$rv = false;
if ( is_a( $rc , 'View' ) ) {
array_push( $this->views , $rc );
} elseif ( is_a( $rc , 'Controller' ) ) {
$rv = $this->executeController( $rc );
} elseif ( is_array( $rc ) ) {
foreach ( $rc as $rcItem ) {
if ( $this->handleControllerValue( $rcItem ) ) {
$rv = true;
break;
}
}
} elseif ( ! is_null( $rc ) ) {
if ( $rc{0} != '/' ) {
$rc = $this->baseURL . '/' . $rc;
}
header( "Location: $rc" );
$rv = true;
}
return $rv;
}
protected function executeController( Controller $controller )
{
return $this->handleControllerValue( $controller->handle( $this ) );
}
public final function handle( )
{
$mustDraw = true;
foreach ( $this->controllers as $controller ) {
if ( $this->executeController( $controller ) ) {
$mustDraw = false;
break;
}
}
if ( $mustDraw ) {
$this->render( );
}
Loader::Singleton( 'Database' )->commit( );
}
}
interface PathAware
{
public function setExtraPath( $path );
}
abstract class HTMLPage
extends Page
implements PackageAware
{
protected $title;
protected $package;
public function __construct( )
{
parent::__construct( );
}
public function setPackage( Package $package )
{
if ( $this->package !== null ) {
throw new Exception( 'trying to call setPackage() twice' );
}
$this->package = $package;
}
protected abstract function getMenu( );
private function renderMenu( )
{
$menu = $this->getMenu( );
if ( empty( $menu ) ) {
return null;
}
$html = HTML::make( 'ul' )
->setAttribute( 'class' , 'page-menu' );
foreach ( $menu as $link => $title ) {
$html->appendElement( HTML::make( 'li' )
->appendElement( HTML::make( 'a' )
->setAttribute( 'href' , $this->getBaseURL() . '/' . $link )
->setAttribute( 'title' , HTML::from( $title ) )
->appendText( $title ) ) );
}
return $html;
}
public function setTitle( $title )
{
$this->title = $title;
return $this;
}
protected function getHead( $title )
{
return HTML::make( 'head' )
->appendElement( HTML::make( 'title' )
->appendText( $title ) )
->appendElement( HTML::make( 'meta' )
->setAttribute( 'http-equiv' , 'content-type' )
->setAttribute( 'content' , 'text/html;charset=UTF-8' ) )
->appendElement( HTML::make( 'style' )
->setAttribute( 'id' , 'main-style' )
->setAttribute( 'class' , 'css-style' )
->appendText( "\n@import url('" . $this->getBaseURL( )
. "/style.css?1');\n" ) );
}
protected function getBody( $title )
{
$menu = $this->renderMenu( );
$container = HTML::make( 'div' )
->setAttribute( 'class' , 'page-container' );
$t = HTML::make( 'h1' )->appendText( $title );
if ( is_null( $menu ) ) {
$t->setAttribute( 'class' , 'no-menu' );
}
$container->appendElement( $t );
if ( !is_null( $menu ) ) {
$container->append( $menu );
}
foreach ( $this->views as $view ) {
if ( $view instanceof BaseURLAware ) {
$view->setBaseURL( $this->getBaseURL( ) );
}
$container->append( $view->render( ) );
}
return HTML::make( 'body' )->appendElement( $container );
}
public function render( )
{
$baseTitle = $this->package->config( 'pages/baseTitle' , null , false );
if ( $baseTitle === null ) {
$baseTitle = Loader::PackageConfig( 'core' )->get( 'pages/baseTitle' , '' , true );
}
$title = is_null( $this->title ) ? '' : ( ' - ' . $this->title );
$pTitle = is_null( $this->title ) ? $baseTitle : $this->title;
$title = $baseTitle . $title;
header( 'Content-type: text/html; charset=utf-8' );
echo HTML::make( 'html' )
->appendElement( $this->getHead( $title ) )
->appendElement( $this->getBody( $pTitle ) )
->getCode( );
}
}
class Page_Basic
extends HTMLPage
{
protected function getMenu( )
{
return array( );
}
}