Site-wide design configuration

I added some code so that the site-wide design can be set, using the
configuration interface.

I also moved the configuration option from
$config['site']['design']['background'] to just
$config['design']['background'], but the old syntax will still work.
This commit is contained in:
Evan Prodromou 2009-07-30 16:24:04 -04:00
parent e9ac70bfa7
commit ae81d36137
8 changed files with 160 additions and 111 deletions

17
README
View File

@ -964,9 +964,6 @@ sslserver: use an alternate server name for SSL URLs, like
shorturllength: Length of URL at which URLs in a message exceeding 140
characters will be sent to the user's chosen
shortening service.
design: a default design (colors and background) for the site.
Sub-items are: backgroundcolor, contentcolor, sidebarcolor,
textcolor, linkcolor, backgroundimage, disposition.
dupelimit: minimum time allowed for one person to say the same thing
twice. Default 60s. Anything lower is considered a user
or UI error.
@ -1432,6 +1429,20 @@ notify third-party servers of updates.
notify: an array of URLs for ping endpoints. Default is the empty
array (no notification).
design
------
Default design (colors and background) for the site. Actual appearance
depends on the theme. Null values mean to use the theme defaults.
backgroundcolor: Hex color of the site background.
contentcolor: Hex color of the content area background.
sidebarcolor: Hex color of the sidebar background.
textcolor: Hex color of all non-link text.
linkcolor: Hex color of all links.
backgroundimage: Image to use for the background.
disposition: Flags for whether or not to tile the background image.
Plugins
=======

View File

@ -55,26 +55,38 @@ class Design extends Memcached_DataObject
function showCSS($out)
{
try {
$css = '';
$bgcolor = new WebColor($this->backgroundcolor);
$ccolor = new WebColor($this->contentcolor);
$sbcolor = new WebColor($this->sidebarcolor);
$tcolor = new WebColor($this->textcolor);
$lcolor = new WebColor($this->linkcolor);
$bgcolor = Design::toWebColor($this->backgroundcolor);
} catch (WebColorException $e) {
// This shouldn't happen
common_log(LOG_ERR, "Unable to create color for design $id.",
__FILE__);
if (!empty($bgcolor)) {
$css .= 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n";
}
$css = 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n";
$css .= '#content, #site_nav_local_views .current a { background-color: #';
$css .= $ccolor->hexValue() . '} '."\n";
$css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n";
$css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n";
$css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n";
$ccolor = Design::toWebColor($this->contentcolor);
if (!empty($ccolor)) {
$css .= '#content, #site_nav_local_views .current a { background-color: #';
$css .= $ccolor->hexValue() . '} '."\n";
}
$sbcolor = Design::toWebColor($this->sidebarcolor);
if (!empty($sbcolor)) {
$css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n";
}
$tcolor = Design::toWebColor($this->textcolor);
if (!empty($tcolor)) {
$css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n";
}
$lcolor = Design::toWebColor($this->linkcolor);
if (!empty($lcolor)) {
$css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n";
}
if (!empty($this->backgroundimage) &&
$this->disposition & BACKGROUND_ON) {
@ -88,8 +100,25 @@ class Design extends Memcached_DataObject
'); ' . $repeat . ' background-attachment:fixed; }' . "\n";
}
$out->element('style', array('type' => 'text/css'), $css);
if (0 != mb_strlen($css)) {
$out->element('style', array('type' => 'text/css'), $css);
}
}
static function toWebColor($color)
{
if (is_null($color)) {
return null;
}
try {
return new WebColor($color);
} catch (WebColorException $e) {
// This shouldn't happen
common_log(LOG_ERR, "Unable to create color for design $id.",
__FILE__);
return null;
}
}
static function filename($id, $extension, $extra=null)
@ -152,4 +181,33 @@ class Design extends Memcached_DataObject
}
}
/**
* Return a design object based on the configured site design.
*
* @return Design a singleton design object for the site.
*/
static function siteDesign()
{
static $siteDesign = null;
if (empty($siteDesign)) {
$siteDesign = new Design();
$attrs = array('backgroundcolor',
'contentcolor',
'sidebarcolor',
'textcolor',
'linkcolor',
'backgroundimage',
'disposition');
foreach ($attrs as $attr) {
$siteDesign->$attr = common_config('design', $attr);
}
}
return $siteDesign;
}
}

View File

@ -18,14 +18,14 @@ $config['site']['server'] = 'localhost';
$config['site']['path'] = 'laconica';
// $config['site']['fancy'] = false;
// $config['site']['theme'] = 'default';
// Sets the site's default design values (match it with the values in the theme)
// $config['site']['design']['backgroundcolor'] = '#F0F2F5';
// $config['site']['design']['contentcolor'] = '#FFFFFF';
// $config['site']['design']['sidebarcolor'] = '#CEE1E9';
// $config['site']['design']['textcolor'] = '#000000';
// $config['site']['design']['linkcolor'] = '#002E6E';
// $config['site']['design']['backgroundimage'] = null;
// $config['site']['design']['disposition'] = 1;
// Sets the site's default design values
// $config['design']['backgroundcolor'] = '#F0F2F5';
// $config['design']['contentcolor'] = '#FFFFFF';
// $config['design']['sidebarcolor'] = '#CEE1E9';
// $config['design']['textcolor'] = '#000000';
// $config['design']['linkcolor'] = '#002E6E';
// $config['design']['backgroundimage'] = null;
// $config['design']['disposition'] = 1;
// To enable the built-in mobile style sheet, defaults to false.
// $config['site']['mobile'] = true;
// For contact email, defaults to $_SERVER["SERVER_ADMIN"]

View File

@ -191,6 +191,7 @@ class Action extends HTMLOutputter // lawsuit
function showStylesheets()
{
if (Event::handle('StartShowStyles', array($this))) {
if (Event::handle('StartShowLaconicaStyles', array($this))) {
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',
@ -209,6 +210,7 @@ class Action extends HTMLOutputter // lawsuit
'media' => 'print'));
Event::handle('EndShowLaconicaStyles', array($this));
}
if (Event::handle('StartShowUAStyles', array($this))) {
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('css/ie.css', 'base').'?version='.LACONICA_VERSION.'" /><![endif]');
@ -223,6 +225,21 @@ class Action extends HTMLOutputter // lawsuit
'href="'.theme_path('css/ie.css', null).'?version='.LACONICA_VERSION.'" /><![endif]');
Event::handle('EndShowUAStyles', array($this));
}
if (Event::handle('StartShowDesign', array($this))) {
$user = common_current_user();
if (empty($user) || $user->viewdesigns) {
$design = $this->getDesign();
if (!empty($design)) {
$design->showCSS($this);
}
}
Event::handle('EndShowDesign', array($this));
}
Event::handle('EndShowStyles', array($this));
}
}
@ -1074,4 +1091,15 @@ class Action extends HTMLOutputter // lawsuit
{
return null;
}
/**
* A design for this action
*
* @return Design a design object to use
*/
function getDesign()
{
return Design::siteDesign();
}
}

View File

@ -94,14 +94,6 @@ $config =
array('name' => 'Just another Laconica microblog',
'server' => $_server,
'theme' => 'default',
'design' =>
array('backgroundcolor' => '#CEE1E9',
'contentcolor' => '#FFFFFF',
'sidebarcolor' => '#C8D1D5',
'textcolor' => '#000000',
'linkcolor' => '#002E6E',
'backgroundimage' => null,
'disposition' => 1),
'path' => $_path,
'logfile' => null,
'logo' => null,
@ -261,6 +253,14 @@ $config =
'sessions' =>
array('handle' => false, // whether to handle sessions ourselves
'debug' => false), // debugging output for sessions
'design' =>
array('backgroundcolor' => null, // null -> 'use theme default'
'contentcolor' => null,
'sidebarcolor' => null,
'textcolor' => null,
'linkcolor' => null,
'backgroundimage' => null,
'disposition' => null),
);
$config['db'] = &PEAR::getStaticProperty('DB_DataObject','options');
@ -277,6 +277,10 @@ $config['db'] =
'quote_identifiers' => false,
'type' => 'mysql' );
// Backward compatibility
$config['site']['design'] =& $config['design'];
if (function_exists('date_default_timezone_set')) {
/* Work internally in UTC */
date_default_timezone_set('UTC');

View File

@ -47,33 +47,10 @@ if (!defined('LACONICA')) {
class CurrentUserDesignAction extends Action
{
/**
* Show the user's design stylesheet
*
* @return nothing
*/
function showStylesheets()
{
parent::showStylesheets();
$user = common_current_user();
if (empty($user) || $user->viewdesigns) {
$design = $this->getDesign();
if (!empty($design)) {
$design->showCSS($this);
}
}
}
/**
* A design for this action
*
* if the user attribute has been set, returns that user's
* design.
* Returns the design preferences for the current user.
*
* @return Design a design object to use
*/
@ -82,11 +59,15 @@ class CurrentUserDesignAction extends Action
{
$cur = common_current_user();
if (empty($cur)) {
return null;
if (!empty($cur)) {
$design = $cur->getDesign();
if (!empty($design)) {
return $design;
}
}
return $cur->getDesign();
return parent::getDesign();
}
}

View File

@ -49,26 +49,6 @@ class GroupDesignAction extends Action {
/** The group in question */
var $group = null;
/**
* Show the groups's design stylesheet
*
* @return nothing
*/
function showStylesheets()
{
parent::showStylesheets();
$user = common_current_user();
if (empty($user) || $user->viewdesigns) {
$design = $this->getDesign();
if (!empty($design)) {
$design->showCSS($this);
}
}
}
/**
* A design for this action
*
@ -80,10 +60,12 @@ class GroupDesignAction extends Action {
function getDesign()
{
if (empty($this->group)) {
return null;
if (!empty($this->group)) {
$design = $this->group->getDesign();
if (!empty($design)) {
return $design;
}
}
return $this->group->getDesign();
return parent::getDesign();
}
}

View File

@ -52,26 +52,6 @@ class OwnerDesignAction extends Action {
var $user = null;
/**
* Show the owner's design stylesheet
*
* @return nothing
*/
function showStylesheets()
{
parent::showStylesheets();
$user = common_current_user();
if (empty($user) || $user->viewdesigns) {
$design = $this->getDesign();
if (!empty($design)) {
$design->showCSS($this);
}
}
}
/**
* A design for this action
*
@ -83,10 +63,15 @@ class OwnerDesignAction extends Action {
function getDesign()
{
if (empty($this->user)) {
return null;
if (!empty($this->user)) {
$design = $this->user->getDesign();
if (!empty($design)) {
return $design;
}
}
return $this->user->getDesign();
return parent::getDesign();
}
}