2008-05-09 03:16:04 +01:00
< ? php
2008-12-21 00:39:55 +00:00
/**
2009-01-13 18:41:39 +00:00
* Laconica , the distributed open - source microblogging tool
2008-05-20 20:14:12 +01:00
*
2009-01-13 18:41:39 +00:00
* Base class for all actions ( ~ views )
*
* PHP version 5
*
* LICENCE : This program is free software : you can redistribute it and / or modify
2008-05-14 20:26:48 +01:00
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
2008-05-20 20:14:12 +01:00
*
2008-05-14 20:26:48 +01:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
2008-05-20 20:14:12 +01:00
*
2008-05-14 20:26:48 +01:00
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2009-01-13 18:41:39 +00:00
*
* @ category Action
* @ package Laconica
* @ author Evan Prodromou < evan @ controlyourself . ca >
* @ author Sarven Capadisli < csarven @ controlyourself . ca >
* @ copyright 2008 Control Yourself , Inc .
* @ license http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html GNU Affero General Public License version 3.0
* @ link http :// laconi . ca /
2008-05-14 20:26:48 +01:00
*/
2008-05-09 03:16:04 +01:00
2008-12-21 00:39:55 +00:00
if ( ! defined ( 'LACONICA' )) {
exit ( 1 );
}
2009-01-15 19:56:40 +00:00
require_once INSTALLDIR . '/lib/noticeform.php' ;
2009-01-14 17:01:53 +00:00
require_once INSTALLDIR . '/lib/htmloutputter.php' ;
2009-01-13 18:41:39 +00:00
/**
* Base class for all actions
*
* This is the base class for all actions in the package . An action is
* more or less a " view " in an MVC framework .
*
* Actions are responsible for extracting and validating parameters ; using
* model classes to read and write to the database ; and doing ouput .
*
* @ category Output
* @ package Laconica
* @ author Evan Prodromou < evan @ controlyourself . ca >
* @ author Sarven Capadisli < csarven @ controlyourself . ca >
* @ license http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html GNU Affero General Public License version 3.0
* @ link http :// laconi . ca /
*
* @ see HTMLOutputter
*/
2008-12-21 00:39:55 +00:00
2009-01-13 18:41:39 +00:00
class Action extends HTMLOutputter // lawsuit
{
2008-12-21 00:39:55 +00:00
var $args ;
2009-01-15 19:21:47 +00:00
/**
* Constructor
*
* Just wraps the HTMLOutputter constructor .
*
* @ param string $output URI to output to , default = stdout
* @ param boolean $indent Whether to indent output , default true
*
* @ see XMLOutputter :: __construct
* @ see HTMLOutputter :: __construct
*/
function __construct ( $output = 'php://output' , $indent = true )
2008-12-21 00:39:55 +00:00
{
2009-01-15 19:21:47 +00:00
parent :: __construct ( $output , $indent );
2008-12-21 00:39:55 +00:00
}
// For initializing members of the class
function prepare ( $argarray )
{
$this -> args =& common_copy_args ( $argarray );
return true ;
}
2009-01-13 18:41:39 +00:00
function showPage ()
{
$this -> startHTML ();
$this -> showHead ();
$this -> showBody ();
$this -> endHTML ();
}
function showHead ()
{
// XXX: attributes (profile?)
2009-01-15 19:23:28 +00:00
$this -> elementStart ( 'head' );
2009-01-13 18:41:39 +00:00
$this -> showTitle ();
$this -> showStylesheets ();
$this -> showScripts ();
$this -> showOpenSearch ();
$this -> showFeeds ();
$this -> showDescription ();
$this -> extraHead ();
2009-01-15 19:24:54 +00:00
$this -> elementEnd ( 'head' );
2009-01-13 18:41:39 +00:00
}
function showTitle ()
{
$this -> element ( 'title' , null ,
sprintf ( _ ( " %s - %s " ),
$this -> title (),
common_config ( 'site' , 'name' )));
}
// SHOULD overload
function title ()
{
return _ ( " Untitled page " );
}
function showStylesheets ()
{
2009-01-14 06:59:30 +00:00
$this -> element ( 'link' , array ( 'rel' => 'stylesheet' ,
2009-01-13 18:41:39 +00:00
'type' => 'text/css' ,
2009-01-15 19:33:45 +00:00
'href' => theme_path ( 'css/display.css' , 'base' ) . '?version=' . LACONICA_VERSION ,
2009-01-14 22:19:17 +00:00
'media' => 'screen, projection, tv' ));
$this -> element ( 'link' , array ( 'rel' => 'stylesheet' ,
'type' => 'text/css' ,
2009-01-15 19:33:45 +00:00
'href' => theme_path ( 'css/thickbox.css' , 'base' ) . '?version=' . LACONICA_VERSION ,
2009-01-14 22:19:17 +00:00
'media' => 'screen, projection, tv' ));
$this -> element ( 'link' , array ( 'rel' => 'stylesheet' ,
'type' => 'text/css' ,
2009-01-15 19:33:45 +00:00
'href' => theme_path ( 'css/display.css' , null ) . '?version=' . LACONICA_VERSION ,
2009-01-13 18:41:39 +00:00
'media' => 'screen, projection, tv' ));
foreach ( array ( 6 , 7 ) as $ver ) {
if ( file_exists ( theme_file ( 'ie' . $ver . '.css' ))) {
// Yes, IE people should be put in jail.
2009-01-14 18:57:29 +00:00
$this -> comment ( '[if lte IE ' . $ver . ']><link rel="stylesheet" type="text/css" ' .
'href="' . theme_path ( 'ie' . $ver . '.css' ) . '?version=' . LACONICA_VERSION . '" /><![endif]' );
2009-01-13 18:41:39 +00:00
}
}
}
function showScripts ()
{
2009-01-14 06:59:30 +00:00
$this -> element ( 'script' , array ( 'type' => 'text/javascript' ,
2009-01-13 18:41:39 +00:00
'src' => common_path ( 'js/jquery.min.js' )),
' ' );
2009-01-14 06:59:30 +00:00
$this -> element ( 'script' , array ( 'type' => 'text/javascript' ,
2009-01-13 18:41:39 +00:00
'src' => common_path ( 'js/jquery.form.js' )),
' ' );
2009-01-14 06:59:30 +00:00
$this -> element ( 'script' , array ( 'type' => 'text/javascript' ,
2009-01-13 18:41:39 +00:00
'src' => common_path ( 'js/xbImportNode.js' )),
' ' );
2009-01-14 06:59:30 +00:00
$this -> element ( 'script' , array ( 'type' => 'text/javascript' ,
2009-01-13 18:41:39 +00:00
'src' => common_path ( 'js/util.js?version=' . LACONICA_VERSION )),
' ' );
}
function showOpenSearch ()
{
2009-01-14 06:59:30 +00:00
$this -> element ( 'link' , array ( 'rel' => 'search' , 'type' => 'application/opensearchdescription+xml' ,
2009-01-13 18:41:39 +00:00
'href' => common_local_url ( 'opensearch' , array ( 'type' => 'people' )),
'title' => common_config ( 'site' , 'name' ) . ' People Search' ));
2009-01-14 06:59:30 +00:00
$this -> element ( 'link' , array ( 'rel' => 'search' , 'type' => 'application/opensearchdescription+xml' ,
2009-01-13 18:41:39 +00:00
'href' => common_local_url ( 'opensearch' , array ( 'type' => 'notice' )),
'title' => common_config ( 'site' , 'name' ) . ' Notice Search' ));
}
// MAY overload
function showFeeds ()
{
// does nothing by default
}
// SHOULD overload
function showDescription ()
{
// does nothing by default
}
// MAY overload
function extraHead ()
{
// does nothing by default
}
function showBody ()
{
2009-01-14 17:26:23 +00:00
$this -> elementStart ( 'body' );
$this -> elementStart ( 'wrap' );
2009-01-13 18:41:39 +00:00
$this -> showHeader ();
$this -> showCore ();
$this -> showFooter ();
2009-01-14 17:26:23 +00:00
$this -> elementEnd ( 'wrap' );
$this -> elementEnd ( 'body' );
2009-01-13 18:41:39 +00:00
}
function showHeader ()
{
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'div' , array ( 'id' => 'header' ));
2009-01-13 18:41:39 +00:00
$this -> showLogo ();
$this -> showPrimaryNav ();
$this -> showSiteNotice ();
$this -> showNoticeForm ();
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'div' );
2009-01-13 18:41:39 +00:00
}
function showLogo ()
{
2009-01-14 06:59:30 +00:00
$this -> elementStart ( 'address' , array ( 'id' => 'site_contact' ,
2009-01-14 06:34:22 +00:00
'class' => 'vcard' ));
2009-01-14 06:59:30 +00:00
$this -> elementStart ( 'a' , array ( 'class' => 'url home bookmark' ,
2009-01-14 06:34:22 +00:00
'href' => common_local_url ( 'public' )));
if (( isset ( $config [ 'site' ][ 'logo' ]) && is_string ( $config [ 'site' ][ 'logo' ]) && ( strlen ( $config [ 'site' ][ 'logo' ]) > 0 ))
|| file_exists ( theme_file ( 'logo.png' )))
{
$this -> element ( 'img' , array ( 'class' => 'logo photo' ,
'src' => isset ( $config [ 'site' ][ 'logo' ]) ?
( $config [ 'site' ][ 'logo' ]) : theme_path ( 'logo.png' ),
2009-01-14 08:44:23 +00:00
'alt' => $config [ 'site' ][ 'name' ]));
2009-01-14 06:34:22 +00:00
}
2009-01-14 08:44:23 +00:00
$this -> element ( 'span' , array ( 'class' => 'fn org' ), $config [ 'site' ][ 'name' ]);
2009-01-14 06:59:30 +00:00
$this -> elementEnd ( 'a' );
$this -> elementEnd ( 'address' );
2009-01-13 18:41:39 +00:00
}
function showPrimaryNav ()
{
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'dl' , array ( 'id' => 'site_nav_global_primary' ));
2009-01-14 17:01:53 +00:00
$this -> element ( 'dt' , null , _ ( 'Primary site navigation' ));
2009-01-15 20:31:17 +00:00
$this -> elementStart ( 'dd' );
2009-01-13 18:41:39 +00:00
$user = common_current_user ();
2009-01-14 06:59:30 +00:00
$this -> elementStart ( 'ul' , array ( 'id' => 'nav' ));
2009-01-13 18:41:39 +00:00
if ( $user ) {
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'all' , array ( 'nickname' => $user -> nickname )),
2009-01-13 18:41:39 +00:00
_ ( 'Home' ));
}
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'peoplesearch' ), _ ( 'Search' ));
2009-01-13 18:41:39 +00:00
if ( $user ) {
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'profilesettings' ),
2009-01-13 18:41:39 +00:00
_ ( 'Settings' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'invite' ),
2009-01-13 18:41:39 +00:00
_ ( 'Invite' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'logout' ),
2009-01-13 18:41:39 +00:00
_ ( 'Logout' ));
} else {
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'login' ), _ ( 'Login' ));
2009-01-13 18:41:39 +00:00
if ( ! common_config ( 'site' , 'closed' )) {
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'register' ), _ ( 'Register' ));
2009-01-13 18:41:39 +00:00
}
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'openidlogin' ), _ ( 'OpenID' ));
2009-01-13 18:41:39 +00:00
}
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'help' )),
2009-01-13 18:41:39 +00:00
_ ( 'Help' ));
2009-01-14 06:59:30 +00:00
$this -> elementEnd ( 'ul' );
2009-01-15 20:31:17 +00:00
$this -> elementEnd ( 'dd' );
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'dl' );
2009-01-13 18:41:39 +00:00
}
2009-01-14 08:44:23 +00:00
// Revist. Should probably do an hAtom pattern here
2009-01-13 18:41:39 +00:00
function showSiteNotice ()
{
2009-01-15 20:27:33 +00:00
$text = common_config ( 'site' , 'notice' );
if ( $text ) {
$this -> elementStart ( 'dl' , array ( 'id' => 'site_notice' ,
'class' => 'system_notice' ));
$this -> element ( 'dt' , null , _ ( 'Site notice' ));
$this -> element ( 'dd' , null , $text );
$this -> elementEnd ( 'dl' );
}
2009-01-13 18:41:39 +00:00
}
2009-01-15 20:27:33 +00:00
2009-01-13 18:41:39 +00:00
// MAY overload if no notice form needed... or direct message box????
function showNoticeForm ()
{
2009-01-15 20:11:55 +00:00
$notice_form = new NoticeForm ( $this );
2009-01-14 17:01:53 +00:00
$notice_form -> show ();
2009-01-13 18:41:39 +00:00
}
function showCore ()
{
2009-01-14 17:30:03 +00:00
$this -> elementStart ( 'div' , array ( 'class' => 'core' ));
2009-01-13 18:41:39 +00:00
$this -> showLocalNav ();
$this -> showContentBlock ();
$this -> showAside ();
2009-01-14 17:26:23 +00:00
$this -> elementEnd ( 'div' );
2009-01-13 18:41:39 +00:00
}
2009-01-15 19:45:08 +00:00
// SHOULD overload
2009-01-13 18:41:39 +00:00
2009-01-15 19:45:08 +00:00
function showLocalNav ()
2009-01-13 18:41:39 +00:00
{
2009-01-15 19:45:08 +00:00
// does nothing by default
2009-01-13 18:41:39 +00:00
}
function showContentBlock ()
{
2009-01-14 17:26:23 +00:00
$this -> elementStart ( 'div' , array ( 'id' => 'content' ));
2009-01-13 18:41:39 +00:00
$this -> showPageTitle ();
$this -> showPageNotice ();
$this -> showContent ();
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'div' );
2009-01-13 18:41:39 +00:00
}
function showPageTitle () {
$this -> element ( 'h1' , NULL , $this -> title ());
}
// SHOULD overload (unless there's not a notice)
function showPageNotice ()
{
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'dl' , array ( 'id' => 'page_notice' ,
'class' => 'system_notice' ));
$this -> element ( 'dt' , null , _ ( 'Page notice' ));
$this -> elementStart ( 'dd' , null );
// Output a bunch of paragraphs here
$this -> elementEnd ( 'dd' );
2009-01-15 20:20:03 +00:00
$this -> elementEnd ( 'dl' );
2009-01-13 18:41:39 +00:00
}
// MUST overload
function showContent ()
{
// show the actual content (forms, lists, whatever)
2009-01-14 17:26:23 +00:00
$this -> elementStart ( 'div' , array ( 'id' => 'content_inner' ));
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'div' );
2009-01-13 18:41:39 +00:00
}
function showAside ()
{
$this -> showExportData ();
$this -> showSections ();
}
// MAY overload if there are feeds
function showExportData ()
{
// is there structure to this?
// list of (visible!) feed links
// can we reuse list of feeds from showFeeds() ?
}
// SHOULD overload
function showSections () {
// for each section, show it
}
function showFooter ()
{
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'div' , array ( 'id' => 'footer' ));
2009-01-13 18:41:39 +00:00
$this -> showSecondaryNav ();
$this -> showLicenses ();
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'div' );
2009-01-13 18:41:39 +00:00
}
function showSecondaryNav ()
{
2009-01-15 20:24:41 +00:00
$this -> elementStart ( 'dl' , array ( 'id' => 'site_nav_global_secondary' ));
$this -> element ( 'dt' , null , _ ( 'Secondary site navigation' ));
$this -> elementStart ( 'dd' , null );
$this -> elementStart ( 'ul' , array ( 'id' => 'nav' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'help' )),
2009-01-13 18:41:39 +00:00
_ ( 'Help' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'about' )),
2009-01-13 18:41:39 +00:00
_ ( 'About' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'faq' )),
2009-01-13 18:41:39 +00:00
_ ( 'FAQ' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'privacy' )),
2009-01-13 18:41:39 +00:00
_ ( 'Privacy' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'source' )),
2009-01-13 18:41:39 +00:00
_ ( 'Source' ));
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( 'doc' , array ( 'title' => 'contact' )),
2009-01-13 18:41:39 +00:00
_ ( 'Contact' ));
2009-01-14 06:59:30 +00:00
$this -> elementEnd ( 'ul' );
2009-01-15 20:24:41 +00:00
$this -> elementEnd ( 'dd' );
$this -> elementEnd ( 'dl' );
2009-01-13 18:41:39 +00:00
}
function showLicenses ()
{
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'dl' , array ( 'id' => 'licenses' ));
2009-01-13 18:41:39 +00:00
$this -> showLaconicaLicense ();
$this -> showContentLicense ();
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'dl' );
2009-01-13 18:41:39 +00:00
}
function showLaconicaLicense ()
{
2009-01-14 17:01:53 +00:00
$this -> element ( 'dt' , array ( 'id' => 'site_laconica_license' ), _ ( 'Laconica software license' ));
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'dd' , null );
2009-01-13 18:41:39 +00:00
if ( common_config ( 'site' , 'broughtby' )) {
$instr = _ ( '**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%). ' );
} else {
$instr = _ ( '**%%site.name%%** is a microblogging service. ' );
}
$instr .= sprintf ( _ ( 'It runs the [Laconica](http://laconi.ca/) microblogging software, version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).' ), LACONICA_VERSION );
$output = common_markup_to_html ( $instr );
2009-01-15 20:24:54 +00:00
$this -> raw ( $output );
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'dd' );
2009-01-13 18:41:39 +00:00
// do it
}
function showContentLicense ()
{
2009-01-14 17:01:53 +00:00
$this -> element ( 'dt' , array ( 'id' => 'site_content_license' ), _ ( 'Laconica software license' ));
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'dd' , array ( 'id' => 'site_content_license_cc' ));
2009-01-14 06:59:30 +00:00
$this -> elementStart ( 'p' );
2009-01-15 20:24:54 +00:00
$this -> text ( _ ( 'Unless otherwise specified, contents of this site are copyright by the contributors and available under the ' ));
2009-01-14 06:59:30 +00:00
$this -> element ( 'a' , array ( 'class' => 'license' ,
2009-01-14 08:44:23 +00:00
'rel' => 'external license' ,
2009-01-13 18:41:39 +00:00
'href' => $config [ 'license' ][ 'url' ]),
$config [ 'license' ][ 'title' ]);
2009-01-15 20:24:54 +00:00
$this -> text ( _ ( '. Contributors should be attributed by full name or nickname.' ));
2009-01-14 06:59:30 +00:00
$this -> elementEnd ( 'p' );
2009-01-14 08:44:23 +00:00
$this -> element ( 'img' , array ( 'id' => 'license_cc' ,
'src' => $config [ 'license' ][ 'image' ],
'alt' => $config [ 'license' ][ 'title' ]));
$this -> elementEnd ( 'dd' );
2009-01-13 18:41:39 +00:00
}
2008-12-21 00:39:55 +00:00
// For comparison with If-Last-Modified
// If not applicable, return null
function last_modified ()
{
return null ;
}
function etag ()
{
return null ;
}
function is_readonly ()
{
return false ;
}
function arg ( $key , $def = null )
{
if ( array_key_exists ( $key , $this -> args )) {
return $this -> args [ $key ];
} else {
return $def ;
}
}
function trimmed ( $key , $def = null )
{
$arg = $this -> arg ( $key , $def );
return ( is_string ( $arg )) ? trim ( $arg ) : $arg ;
}
// Note: argarray ignored, since it's now passed in in prepare()
function handle ( $argarray = null )
{
$lm = $this -> last_modified ();
$etag = $this -> etag ();
if ( $etag ) {
header ( 'ETag: ' . $etag );
}
if ( $lm ) {
header ( 'Last-Modified: ' . date ( DATE_RFC1123 , $lm ));
$if_modified_since = $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ];
if ( $if_modified_since ) {
$ims = strtotime ( $if_modified_since );
if ( $lm <= $ims ) {
if ( ! $etag ||
$this -> _has_etag ( $etag , $_SERVER [ 'HTTP_IF_NONE_MATCH' ])) {
header ( 'HTTP/1.1 304 Not Modified' );
// Better way to do this?
exit ( 0 );
}
}
}
}
}
function _has_etag ( $etag , $if_none_match )
{
return ( $if_none_match ) && in_array ( $etag , explode ( ',' , $if_none_match ));
}
function boolean ( $key , $def = false )
{
$arg = strtolower ( $this -> trimmed ( $key ));
if ( is_null ( $arg )) {
return $def ;
} else if ( in_array ( $arg , array ( 'true' , 'yes' , '1' ))) {
return true ;
} else if ( in_array ( $arg , array ( 'false' , 'no' , '0' ))) {
return false ;
} else {
return $def ;
}
}
function server_error ( $msg , $code = 500 )
{
$action = $this -> trimmed ( 'action' );
common_debug ( " Server error ' $code ' on ' $action ': $msg " , __FILE__ );
common_server_error ( $msg , $code );
}
function client_error ( $msg , $code = 400 )
{
$action = $this -> trimmed ( 'action' );
common_debug ( " User error ' $code ' on ' $action ': $msg " , __FILE__ );
common_user_error ( $msg , $code );
}
function self_url ()
{
$action = $this -> trimmed ( 'action' );
$args = $this -> args ;
unset ( $args [ 'action' ]);
foreach ( array_keys ( $_COOKIE ) as $cookie ) {
unset ( $args [ $cookie ]);
}
return common_local_url ( $action , $args );
}
function nav_menu ( $menu )
{
2008-07-10 00:10:31 +01:00
$action = $this -> trimmed ( 'action' );
2009-01-14 06:59:30 +00:00
$this -> elementStart ( 'ul' , array ( 'id' => 'nav_views' ));
2008-07-10 00:10:31 +01:00
foreach ( $menu as $menuaction => $menudesc ) {
2009-01-15 19:31:03 +00:00
$this -> menuItem ( common_local_url ( $menuaction ,
2008-12-21 00:39:55 +00:00
isset ( $menudesc [ 2 ]) ? $menudesc [ 2 ] : null ),
$menudesc [ 0 ],
$menudesc [ 1 ],
$action == $menuaction );
2008-07-10 00:10:31 +01:00
}
2009-01-14 06:59:30 +00:00
$this -> elementEnd ( 'ul' );
2008-12-21 00:39:55 +00:00
}
2009-01-13 18:41:39 +00:00
function common_show_header ( $pagetitle , $callable = null , $data = null , $headercall = null )
{
global $config , $xw ;
global $action ; /* XXX: kind of cheating here. */
common_start_html ();
2009-01-14 06:59:30 +00:00
$this -> elementStart ( 'head' );
2009-01-13 18:41:39 +00:00
if ( $callable ) {
if ( $data ) {
call_user_func ( $callable , $data );
} else {
call_user_func ( $callable );
}
}
2009-01-14 06:59:30 +00:00
$this -> elementEnd ( 'head' );
$this -> elementStart ( 'body' , $action );
$this -> elementStart ( 'div' , array ( 'id' => 'wrap' ));
$this -> elementStart ( 'div' , array ( 'id' => 'content' ));
2009-01-13 18:41:39 +00:00
}
2009-01-15 19:45:08 +00:00
// Added @id to li for some control.
// XXX: We might want to move this to htmloutputter.php
2009-01-15 19:31:03 +00:00
2009-01-15 19:45:08 +00:00
function menuItem ( $url , $text , $id = null , $title = null , $is_selected = false )
2009-01-13 18:41:39 +00:00
{
$lattrs = array ();
if ( $is_selected ) {
$lattrs [ 'class' ] = 'current' ;
}
2009-01-14 17:01:53 +00:00
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'li' , ( is_null ( $id )) ? null : array ( 'id' => $id ), $lattrs );
2009-01-13 18:41:39 +00:00
$attrs [ 'href' ] = $url ;
if ( $title ) {
$attrs [ 'title' ] = $title ;
}
2009-01-14 06:59:30 +00:00
$this -> element ( 'a' , $attrs , $text );
$this -> elementEnd ( 'li' );
2009-01-13 18:41:39 +00:00
}
2009-01-14 04:48:05 +00:00
// Does a little before-after block for next/prev page
function pagination ( $have_before , $have_after , $page , $action , $args = null )
{
if ( $have_before || $have_after ) {
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'div' , array ( 'class' => 'pagination' ));
$this -> elementStart ( 'dl' , null );
2009-01-14 17:01:53 +00:00
$this -> element ( 'dt' , null , _ ( 'Pagination' ));
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'dd' , null );
$this -> elementStart ( 'ul' , array ( 'class' => 'nav' ));
2009-01-14 04:48:05 +00:00
}
if ( $have_before ) {
$pargs = array ( 'page' => $page - 1 );
$newargs = ( $args ) ? array_merge ( $args , $pargs ) : $pargs ;
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'li' , array ( 'class' => 'nav_prev' ));
2009-01-14 04:48:05 +00:00
$this -> element ( 'a' , array ( 'href' => common_local_url ( $action , $newargs ), 'rel' => 'prev' ),
2009-01-14 08:44:23 +00:00
_ ( 'After' ));
2009-01-14 04:48:05 +00:00
$this -> elementEnd ( 'li' );
}
if ( $have_after ) {
$pargs = array ( 'page' => $page + 1 );
$newargs = ( $args ) ? array_merge ( $args , $pargs ) : $pargs ;
2009-01-14 08:44:23 +00:00
$this -> elementStart ( 'li' , array ( 'class' => 'nav_next' ));
2009-01-14 04:48:05 +00:00
$this -> element ( 'a' , array ( 'href' => common_local_url ( $action , $newargs ), 'rel' => 'next' ),
2009-01-14 08:44:23 +00:00
_ ( 'Before' ));
2009-01-14 04:48:05 +00:00
$this -> elementEnd ( 'li' );
}
if ( $have_before || $have_after ) {
$this -> elementEnd ( 'ul' );
2009-01-14 08:44:23 +00:00
$this -> elementEnd ( 'dd' );
$this -> elementEnd ( 'dl' );
2009-01-14 04:48:05 +00:00
$this -> elementEnd ( 'div' );
}
}
2008-05-09 03:16:04 +01:00
}