summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Copley <zach@status.net>2009-11-18 00:00:05 -0800
committerZach Copley <zach@status.net>2009-11-18 00:00:05 -0800
commit7e0af928132c8eda2f25943b9a316e8ddf6f9a41 (patch)
tree15e764f6f26154e073fb808c6bb08032c44ed32a
parent7551464d239a77d3f23b02a8f84ea78ebc282b2e (diff)
First draft of the admin panel for site design
-rw-r--r--actions/designadminpanel.php388
-rw-r--r--lib/form.php14
2 files changed, 397 insertions, 5 deletions
diff --git a/actions/designadminpanel.php b/actions/designadminpanel.php
index 9845ddb54..6b40ae021 100644
--- a/actions/designadminpanel.php
+++ b/actions/designadminpanel.php
@@ -47,6 +47,10 @@ if (!defined('STATUSNET')) {
class DesignadminpanelAction extends AdminPanelAction
{
+
+ /* The default site design */
+ var $design = null;
+
/**
* Returns the page title
*
@@ -77,6 +81,8 @@ class DesignadminpanelAction extends AdminPanelAction
function showForm()
{
+ $this->design = Design::siteDesign();
+
$form = new DesignAdminPanelForm($this);
$form->show();
return;
@@ -90,8 +96,44 @@ class DesignadminpanelAction extends AdminPanelAction
function saveSettings()
{
- static $settings = array('theme');
+ if ($this->arg('save')) {
+ $this->saveDesignSettings();
+ } else if ($this->arg('defaults')) {
+ $this->restoreDefaults();
+ } else {
+ $this->success = false;
+ $this->message = 'Unexpected form submission.';
+ }
+ }
+
+ /**
+ * Save the new design settings
+ *
+ * @return void
+ */
+
+ function saveDesignSettings()
+ {
+
+ // Workaround for PHP returning empty $_POST and $_FILES when POST
+ // length > post_max_size in php.ini
+
+ if (empty($_FILES)
+ && empty($_POST)
+ && ($_SERVER['CONTENT_LENGTH'] > 0)
+ ) {
+ $msg = _('The server was unable to handle that much POST ' .
+ 'data (%s bytes) due to its current configuration.');
+ $this->success = false;
+ $this->msg = $e->getMessage(sprintf($msg, $_SERVER['CONTENT_LENGTH']));
+ return;
+ }
+
+ // check for an image upload
+
+ $bgimage = $this->saveBackgroundImage();
+ static $settings = array('theme');
$values = array();
foreach ($settings as $setting) {
@@ -99,6 +141,30 @@ class DesignadminpanelAction extends AdminPanelAction
}
// This throws an exception on validation errors
+ try {
+ $bgcolor = new WebColor($this->trimmed('design_background'));
+ $ccolor = new WebColor($this->trimmed('design_content'));
+ $sbcolor = new WebColor($this->trimmed('design_sidebar'));
+ $tcolor = new WebColor($this->trimmed('design_text'));
+ $lcolor = new WebColor($this->trimmed('design_links'));
+ } catch (WebColorException $e) {
+ $this->success = false;
+ $this->msg = $e->getMessage();
+ return;
+ }
+
+ $onoff = $this->arg('design_background-image_onoff');
+
+ $on = false;
+ $off = false;
+
+ if ($onoff == 'on') {
+ $on = true;
+ } else {
+ $off = true;
+ }
+
+ $tile = $this->boolean('design_background-image_repeat');
$this->validate($values);
@@ -112,21 +178,163 @@ class DesignadminpanelAction extends AdminPanelAction
Config::save('site', $setting, $values[$setting]);
}
+ if (isset($bgimage)) {
+ Config::save('design', 'backgroundimage', $bgimage);
+ }
+
+ Config::save('design', 'backgroundcolor', $bgcolor->intValue());
+ Config::save('design', 'contentcolor', $ccolor->intValue());
+ Config::save('design', 'sidebarcolor', $sbcolor->intValue());
+ Config::save('design', 'textcolor', $tcolor->intValue());
+ Config::save('design', 'linkcolor', $lcolor->intValue());
+
+ // Hack to use Design's bit setter
+ $scratch = new Design();
+ $scratch->setDisposition($on, $off, $tile);
+
+ Config::save('design', 'disposition', $scratch->disposition);
+
$config->query('COMMIT');
return;
+
}
+ /**
+ * Delete a design setting
+ *
+ * @return mixed $result false if something didn't work
+ */
+
+ function deleteSetting($section, $setting)
+ {
+ $config = new Config();
+
+ $config->section = $section;
+ $config->setting = $setting;
+
+ if ($config->find(true)) {
+ $result = $config->delete();
+ if (!$result) {
+ common_log_db_error($config, 'DELETE', __FILE__);
+ $this->clientError(_("Unable to delete design setting."));
+ return null;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Restore the default design
+ *
+ * @return void
+ */
+
+ function restoreDefaults()
+ {
+ $this->deleteSetting('site', 'theme');
+
+ $settings = array(
+ 'theme', 'backgroundimage', 'backgroundcolor', 'contentcolor',
+ 'sidebarcolor', 'textcolor', 'linkcolor', 'disposition'
+ );
+
+ foreach ($settings as $setting) {
+ $this->deleteSetting('design', $setting);
+ }
+ }
+
+ /**
+ * Save the background image if the user uploaded one
+ *
+ * @return string $filename the filename of the image
+ */
+
+ function saveBackgroundImage()
+ {
+ $filename = null;
+
+ if ($_FILES['design_background-image_file']['error'] ==
+ UPLOAD_ERR_OK) {
+
+ $filepath = null;
+
+ try {
+ $imagefile =
+ ImageFile::fromUpload('design_background-image_file');
+ } catch (Exception $e) {
+ $this->success = false;
+ $this->msg = $e->getMessage();
+ return;
+ }
+
+ // Note: site design background image has a special filename
+
+ $filename = Design::filename('site-design-background',
+ image_type_to_extension($imagefile->type),
+ common_timestamp());
+
+ $filepath = Design::path($filename);
+
+ move_uploaded_file($imagefile->filepath, $filepath);
+
+ // delete any old backround img laying around
+
+ if (isset($this->design->backgroundimage)) {
+ @unlink(Design::path($design->backgroundimage));
+ }
+
+ return $filename;
+ }
+ }
+
+ /**
+ * Attempt to validate setting values
+ *
+ * @return void
+ */
+
function validate(&$values)
{
if (!in_array($values['theme'], Theme::listAvailable())) {
$this->clientError(sprintf(_("Theme not available: %s"), $values['theme']));
}
}
+
+ /**
+ * Add the Farbtastic stylesheet
+ *
+ * @return void
+ */
+
+ function showStylesheets()
+ {
+ parent::showStylesheets();
+ $this->cssLink('css/farbtastic.css','base','screen, projection, tv');
+ }
+
+ /**
+ * Add the Farbtastic scripts
+ *
+ * @return void
+ */
+
+ function showScripts()
+ {
+ parent::showScripts();
+
+ $this->script('js/farbtastic/farbtastic.js');
+ $this->script('js/userdesign.go.js');
+
+ $this->autofocus('design_background-image_file');
+ }
+
}
class DesignAdminPanelForm extends Form
{
+
/**
* ID of the form
*
@@ -150,6 +358,22 @@ class DesignAdminPanelForm extends Form
}
/**
+ * HTTP method used to submit the form
+ *
+ * For image data we need to send multipart/form-data
+ * so we set that here too
+ *
+ * @return string the method to use for submitting
+ */
+
+ function method()
+ {
+ $this->enctype = 'multipart/form-data';
+
+ return 'post';
+ }
+
+ /**
* Action of the form
*
* @return string URL of the action
@@ -168,6 +392,9 @@ class DesignAdminPanelForm extends Form
function formData()
{
+
+ $design = $this->out->design;
+
$themes = Theme::listAvailable();
asort($themes);
@@ -175,14 +402,158 @@ class DesignAdminPanelForm extends Form
$themes = array_combine($themes, $themes);
$this->out->elementStart('ul', 'form_data');
- $this->out->elementStart('li');
+ $this->out->elementStart('li');
$this->out->dropdown('theme', _('Theme'),
$themes, _('Theme for the site.'),
false, $this->value('theme'));
+ $this->out->elementEnd('li');
+ $this->out->elementStart('li');
+ $this->out->element('label', array('for' => 'design_background-image_file'),
+ _('Background'));
+ $this->out->element('input', array('name' => 'design_background-image_file',
+ 'type' => 'file',
+ 'id' => 'design_background-image_file'));
+ $this->out->element('p', 'form_guide',
+ sprintf(_('You can upload a background image for the site. ' .
+ 'The maximum file size is %1$s.'), ImageFile::maxFileSize()));
+ $this->out->element('input', array('name' => 'MAX_FILE_SIZE',
+ 'type' => 'hidden',
+ 'id' => 'MAX_FILE_SIZE',
+ 'value' => ImageFile::maxFileSizeInt()));
$this->out->elementEnd('li');
+
+ if (!empty($design->backgroundimage)) {
+
+ $this->out->elementStart('li', array('id' =>
+ 'design_background-image_onoff'));
+
+ $this->out->element('img', array('src' =>
+ Design::url($design->backgroundimage)));
+
+ $attrs = array('name' => 'design_background-image_onoff',
+ 'type' => 'radio',
+ 'id' => 'design_background-image_on',
+ 'class' => 'radio',
+ 'value' => 'on');
+
+ if ($design->disposition & BACKGROUND_ON) {
+ $attrs['checked'] = 'checked';
+ }
+
+ $this->out->element('input', $attrs);
+
+ $this->out->element('label', array('for' => 'design_background-image_on',
+ 'class' => 'radio'),
+ _('On'));
+
+ $attrs = array('name' => 'design_background-image_onoff',
+ 'type' => 'radio',
+ 'id' => 'design_background-image_off',
+ 'class' => 'radio',
+ 'value' => 'off');
+
+ if ($design->disposition & BACKGROUND_OFF) {
+ $attrs['checked'] = 'checked';
+ }
+
+ $this->out->element('input', $attrs);
+
+ $this->out->element('label', array('for' => 'design_background-image_off',
+ 'class' => 'radio'),
+ _('Off'));
+ $this->out->element('p', 'form_guide', _('Turn background image on or off.'));
+ $this->out->elementEnd('li');
+
+ $this->out->elementStart('li');
+ $this->out->checkbox('design_background-image_repeat',
+ _('Tile background image'),
+ ($design->disposition & BACKGROUND_TILE) ? true : false);
+ $this->out->elementEnd('li');
+ }
+
+ $this->out->elementEnd('ul');
+
+ $this->out->elementStart('fieldset', array('id' => 'settings_design_color'));
+ $this->out->element('legend', null, _('Change colours'));
+ $this->out->elementStart('ul', 'form_data');
+
+ try {
+
+ $bgcolor = new WebColor($design->backgroundcolor);
+
+ $this->out->elementStart('li');
+ $this->out->element('label', array('for' => 'swatch-1'), _('Background'));
+ $this->out->element('input', array('name' => 'design_background',
+ 'type' => 'text',
+ 'id' => 'swatch-1',
+ 'class' => 'swatch',
+ 'maxlength' => '7',
+ 'size' => '7',
+ 'value' => ''));
+ $this->out->elementEnd('li');
+
+ $ccolor = new WebColor($design->contentcolor);
+
+ $this->out->elementStart('li');
+ $this->out->element('label', array('for' => 'swatch-2'), _('Content'));
+ $this->out->element('input', array('name' => 'design_content',
+ 'type' => 'text',
+ 'id' => 'swatch-2',
+ 'class' => 'swatch',
+ 'maxlength' => '7',
+ 'size' => '7',
+ 'value' => ''));
+ $this->out->elementEnd('li');
+
+ $sbcolor = new WebColor($design->sidebarcolor);
+
+ $this->out->elementStart('li');
+ $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar'));
+ $this->out->element('input', array('name' => 'design_sidebar',
+ 'type' => 'text',
+ 'id' => 'swatch-3',
+ 'class' => 'swatch',
+ 'maxlength' => '7',
+ 'size' => '7',
+ 'value' => ''));
+ $this->out->elementEnd('li');
+
+ $tcolor = new WebColor($design->textcolor);
+
+ $this->out->elementStart('li');
+ $this->out->element('label', array('for' => 'swatch-4'), _('Text'));
+ $this->out->element('input', array('name' => 'design_text',
+ 'type' => 'text',
+ 'id' => 'swatch-4',
+ 'class' => 'swatch',
+ 'maxlength' => '7',
+ 'size' => '7',
+ 'value' => ''));
+ $this->out->elementEnd('li');
+
+ $lcolor = new WebColor($design->linkcolor);
+
+ $this->out->elementStart('li');
+ $this->out->element('label', array('for' => 'swatch-5'), _('Links'));
+ $this->out->element('input', array('name' => 'design_links',
+ 'type' => 'text',
+ 'id' => 'swatch-5',
+ 'class' => 'swatch',
+ 'maxlength' => '7',
+ 'size' => '7',
+ 'value' => ''));
+ $this->out->elementEnd('li');
+
+ } catch (WebColorException $e) {
+ common_log(LOG_ERR, 'Bad color values in site design: ' .
+ $e->getMessage());
+ }
+
$this->out->elementEnd('ul');
+ $this->out->elementEnd('fieldset');
+
}
/**
@@ -226,6 +597,15 @@ class DesignAdminPanelForm extends Form
function formActions()
{
- $this->out->submit('submit', _('Save'), 'submit', null, _('Save site settings'));
- }
+ $this->out->submit('defaults', _('Use defaults'), 'submit form_action-default',
+ 'defaults', _('Restore default designs'));
+
+ $this->out->element('input', array('id' => 'settings_design_reset',
+ 'type' => 'reset',
+ 'value' => 'Reset',
+ 'class' => 'submit form_action-primary',
+ 'title' => _('Reset back to default')));
+
+ $this->out->submit('save', _('Save'), 'submit form_action-secondary',
+ 'save', _('Save design')); }
}
diff --git a/lib/form.php b/lib/form.php
index 87b7a5cba..868c986b9 100644
--- a/lib/form.php
+++ b/lib/form.php
@@ -67,7 +67,7 @@ class Form extends Widget
{
$attributes = array('id' => $this->id(),
'class' => $this->formClass(),
- 'method' => 'post',
+ 'method' => $this->method(),
'action' => $this->action());
if (!empty($this->enctype)) {
@@ -120,6 +120,18 @@ class Form extends Widget
}
/**
+ * HTTP method used to submit the form
+ *
+ * Defaults to post. Subclasses can override if they need to.
+ *
+ * @return string the method to use for submitting
+ */
+ function method()
+ {
+ return 'post';
+ }
+
+ /**
* Buttons for form actions
*
* Submit and cancel buttons (or whatever)