X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=actions%2Fdesignadminpanel.php;h=dd422bce91e0c0d66ee9ee18f101a38300768107;hb=dd5721848f80f4126dc2794099ecae8c42c67e62;hp=8c08581b5d1243af59bbb4ce9a2707396ccb6b41;hpb=fee6b78e2896705b831fc98025581405e3e21e27;p=quix0rs-gnu-social.git diff --git a/actions/designadminpanel.php b/actions/designadminpanel.php index 8c08581b5d..dd422bce91 100644 --- a/actions/designadminpanel.php +++ b/actions/designadminpanel.php @@ -44,10 +44,8 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ - class DesignadminpanelAction extends AdminPanelAction { - /* The default site design */ var $design = null; @@ -56,7 +54,6 @@ class DesignadminpanelAction extends AdminPanelAction * * @return string page title */ - function title() { // TRANS: Message used as title for design settings for the site. @@ -68,10 +65,10 @@ class DesignadminpanelAction extends AdminPanelAction * * @return string instructions */ - function getInstructions() { - return _('Design settings for this StatusNet site.'); + // TRANS: Instructions for design adminsitration panel. + return _('Design settings for this StatusNet site'); } /** @@ -79,7 +76,6 @@ class DesignadminpanelAction extends AdminPanelAction * * @return void */ - function showForm() { $this->design = Design::siteDesign(); @@ -93,7 +89,6 @@ class DesignadminpanelAction extends AdminPanelAction * * @return void */ - function saveSettings() { if ($this->arg('save')) { @@ -101,6 +96,7 @@ class DesignadminpanelAction extends AdminPanelAction } else if ($this->arg('defaults')) { $this->restoreDefaults(); } else { + // TRANS: Client error displayed when the submitted form contains unexpected data. $this->clientError(_('Unexpected form submission.')); } } @@ -110,7 +106,6 @@ class DesignadminpanelAction extends AdminPanelAction * * @return void */ - function saveDesignSettings() { // Workaround for PHP returning empty $_POST and $_FILES when POST @@ -120,17 +115,30 @@ class DesignadminpanelAction extends AdminPanelAction && empty($_POST) && ($_SERVER['CONTENT_LENGTH'] > 0) ) { - $msg = _('The server was unable to handle that much POST ' . - 'data (%s bytes) due to its current configuration.'); + // TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit. + // TRANS: %s is the number of bytes of the CONTENT_LENGTH. + $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', + 'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', + intval($_SERVER['CONTENT_LENGTH'])); $this->clientException(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); return; } - // check for an image upload + // check for file uploads $bgimage = $this->saveBackgroundImage(); + $customTheme = $this->saveCustomTheme(); + + $oldtheme = common_config('site', 'theme'); + if ($customTheme) { + // This feels pretty hacky :D + $this->args['theme'] = $customTheme; + $themeChanged = true; + } else { + $themeChanged = ($this->trimmed('theme') != $oldtheme); + } - static $settings = array('theme', 'logo'); + static $settings = array('theme', 'logo', 'ssllogo'); $values = array(); @@ -140,15 +148,26 @@ class DesignadminpanelAction extends AdminPanelAction $this->validate($values); - $oldtheme = common_config('site', 'theme'); - $config = new Config(); $config->query('BEGIN'); - // Only update colors if the theme has not changed. + if ($themeChanged) { + // If the theme has changed, reset custom colors and let them pick + // up the new theme's defaults. + $colors = array('background', 'content', 'sidebar', 'text', 'link'); + foreach ($colors as $colorKey) { + // Clear from global config so we see defaults on this page... + $GLOBALS['config']['design'][$colorKey . 'color'] = false; - if ($oldtheme == $values['theme']) { + // And remove old settings from DB... + $this->deleteSetting('design', $colorKey . 'color'); + } + } else { + // Only save colors from the form if the theme has not changed. + // + // @fixme a future more ajaxy form should allow theme switch + // and color customization in one step. $bgcolor = new WebColor($this->trimmed('design_background')); $ccolor = new WebColor($this->trimmed('design_content')); @@ -190,18 +209,25 @@ class DesignadminpanelAction extends AdminPanelAction Config::save('design', 'backgroundimage', $bgimage); } + if (common_config('custom_css', 'enabled')) { + $css = $this->arg('css'); + if ($css != common_config('custom_css', 'css')) { + Config::save('custom_css', 'css', $css); + } + } + $config->query('COMMIT'); } /** - * Restore the default design - * - * @return void - */ - + * Restore the default design + * + * @return void + */ function restoreDefaults() { $this->deleteSetting('site', 'logo'); + $this->deleteSetting('site', 'ssllogo'); $this->deleteSetting('site', 'theme'); $settings = array( @@ -225,12 +251,11 @@ class DesignadminpanelAction extends AdminPanelAction * * @return string $filename the filename of the image */ - function saveBackgroundImage() { $filename = null; - - if ($_FILES['design_background-image_file']['error'] == + if (isset($_FILES['design_background-image_file']['error']) && + $_FILES['design_background-image_file']['error'] == UPLOAD_ERR_OK) { $filepath = null; @@ -263,20 +288,54 @@ class DesignadminpanelAction extends AdminPanelAction } } + /** + * Save the custom theme if the user uploaded one. + * + * @return mixed custom theme name, if succesful, or null if no theme upload. + * @throws ClientException for invalid theme archives + * @throws ServerException if trouble saving the theme files + */ + function saveCustomTheme() + { + if (common_config('theme_upload', 'enabled') && + $_FILES['design_upload_theme']['error'] == UPLOAD_ERR_OK) { + + $upload = ThemeUploader::fromUpload('design_upload_theme'); + $basedir = common_config('local', 'dir'); + if (empty($basedir)) { + $basedir = INSTALLDIR . '/local'; + } + $name = 'custom'; // @todo allow multiples, custom naming? + $outdir = $basedir . '/theme/' . $name; + $upload->extract($outdir); + return $name; + } else { + return null; + } + } + /** * Attempt to validate setting values * * @return void */ - function validate(&$values) { if (!empty($values['logo']) && !Validate::uri($values['logo'], array('allowed_schemes' => array('http', 'https')))) { + // TRANS: Client error displayed when a logo URL does is not valid. $this->clientError(_('Invalid logo URL.')); } + if (!empty($values['ssllogo']) && + !Validate::uri($values['ssllogo'], array('allowed_schemes' => array('https')))) { + // TRANS: Client error displayed when an SSL logo URL is invalid. + $this->clientError(_('Invalid SSL logo URL.')); + } + if (!in_array($values['theme'], Theme::listAvailable())) { + // TRANS: Client error displayed when a theme is submitted through the form that is not in the theme list. + // TRANS: %s is the chosen unavailable theme. $this->clientError(sprintf(_("Theme not available: %s."), $values['theme'])); } } @@ -286,7 +345,6 @@ class DesignadminpanelAction extends AdminPanelAction * * @return void */ - function showStylesheets() { parent::showStylesheets(); @@ -298,7 +356,6 @@ class DesignadminpanelAction extends AdminPanelAction * * @return void */ - function showScripts() { parent::showScripts(); @@ -319,7 +376,6 @@ class DesignAdminPanelForm extends AdminForm * * @return int ID of the form */ - function id() { return 'form_design_admin_panel'; @@ -330,7 +386,6 @@ class DesignAdminPanelForm extends AdminForm * * @return string class of the form */ - function formClass() { return 'form_settings'; @@ -344,7 +399,6 @@ class DesignAdminPanelForm extends AdminForm * * @return string the method to use for submitting */ - function method() { $this->enctype = 'multipart/form-data'; @@ -357,7 +411,6 @@ class DesignAdminPanelForm extends AdminForm * * @return string URL of the action */ - function action() { return common_local_url('designadminpanel'); @@ -368,23 +421,49 @@ class DesignAdminPanelForm extends AdminForm * * @return void */ - function formData() { + $this->showLogo(); + $this->showTheme(); + $this->showBackground(); + $this->showColors(); + $this->showAdvanced(); + } + function showLogo() + { $this->out->elementStart('fieldset', array('id' => 'settings_design_logo')); + // TRANS: Fieldset legend for form to change logo. $this->out->element('legend', null, _('Change logo')); $this->out->elementStart('ul', 'form_data'); $this->li(); - $this->input('logo', _('Site logo'), 'Logo for the site (full URL)'); + $this->input('logo', + // TRANS: Field label for StatusNet site logo. + _('Site logo'), + // TRANS: Title for field label for StatusNet site logo. + 'Logo for the site (full URL)'); + $this->unli(); + + $this->li(); + $this->input('ssllogo', + // TRANS: Field label for SSL StatusNet site logo. + _('SSL logo'), + // TRANS: Title for field label for SSL StatusNet site logo. + 'Logo to show on SSL pages'); $this->unli(); $this->out->elementEnd('ul'); $this->out->elementEnd('fieldset'); + + } + + function showTheme() + { $this->out->elementStart('fieldset', array('id' => 'settings_design_theme')); + // TRANS: Fieldset legend for form change StatusNet site's theme. $this->out->element('legend', null, _('Change theme')); $this->out->elementStart('ul', 'form_data'); @@ -402,29 +481,49 @@ class DesignAdminPanelForm extends AdminForm $themes = array_combine($themes, $themes); $this->li(); + // TRANS: Field label for dropdown to choose site theme. $this->out->dropdown('theme', _('Site theme'), + // TRANS: Title for field label for dropdown to choose site theme. $themes, _('Theme for the site.'), false, $this->value('theme')); $this->unli(); + if (common_config('theme_upload', 'enabled')) { + $this->li(); + // TRANS: Field label for uploading a cutom theme. + $this->out->element('label', array('for' => 'design_upload_theme'), _('Custom theme')); + $this->out->element('input', array('id' => 'design_upload_theme', + 'name' => 'design_upload_theme', + 'type' => 'file')); + // TRANS: Form instructions for uploading a cutom StatusNet theme. + $this->out->element('p', 'form_guide', _('You can upload a custom StatusNet theme as a .ZIP archive.')); + $this->unli(); + } + $this->out->elementEnd('ul'); $this->out->elementEnd('fieldset'); + } + function showBackground() + { $design = $this->out->design; $this->out->elementStart('fieldset', array('id' => 'settings_design_background-image')); + // TRANS: Fieldset legend for theme background image. $this->out->element('legend', null, _('Change background image')); $this->out->elementStart('ul', 'form_data'); $this->li(); $this->out->element('label', array('for' => 'design_background-image_file'), + // TRANS: Field label for background image on theme designer page. _('Background')); $this->out->element('input', array('name' => 'design_background-image_file', 'type' => 'file', 'id' => 'design_background-image_file')); $this->out->element('p', 'form_guide', + // TRANS: Form guide for background image upload form on theme designer page. 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', @@ -474,11 +573,13 @@ class DesignAdminPanelForm extends AdminForm 'class' => 'radio'), // TRANS: Used as radio button label to not add a background image. _('Off')); + // TRANS: Form guide for turning background image on or off on theme designer page. $this->out->element('p', 'form_guide', _('Turn background image on or off.')); $this->unli(); $this->li(); $this->out->checkbox('design_background-image_repeat', + // TRANS: Checkbox label to title background image on theme designer page. _('Tile background image'), ($design->disposition & BACKGROUND_TILE) ? true : false); $this->unli(); @@ -486,17 +587,25 @@ class DesignAdminPanelForm extends AdminForm $this->out->elementEnd('ul'); $this->out->elementEnd('fieldset'); + } + + function showColors() + { + $design = $this->out->design; $this->out->elementStart('fieldset', array('id' => 'settings_design_color')); - $this->out->element('legend', null, _('Change colours')); + // TRANS: Fieldset legend for theme colors. + $this->out->element('legend', null, _('Change colors')); $this->out->elementStart('ul', 'form_data'); try { + // @fixme avoid loop unrolling in non-performance-critical contexts like this $bgcolor = new WebColor($design->backgroundcolor); $this->li(); + // TRANS: Field label for background color selector. $this->out->element('label', array('for' => 'swatch-1'), _('Background')); $this->out->element('input', array('name' => 'design_background', 'type' => 'text', @@ -510,6 +619,7 @@ class DesignAdminPanelForm extends AdminForm $ccolor = new WebColor($design->contentcolor); $this->li(); + // TRANS: Field label for content color selector. $this->out->element('label', array('for' => 'swatch-2'), _('Content')); $this->out->element('input', array('name' => 'design_content', 'type' => 'text', @@ -523,6 +633,7 @@ class DesignAdminPanelForm extends AdminForm $sbcolor = new WebColor($design->sidebarcolor); $this->li(); + // TRANS: Field label for sidebar color selector. $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar')); $this->out->element('input', array('name' => 'design_sidebar', 'type' => 'text', @@ -536,6 +647,7 @@ class DesignAdminPanelForm extends AdminForm $tcolor = new WebColor($design->textcolor); $this->li(); + // TRANS: Field label for text color selector. $this->out->element('label', array('for' => 'swatch-4'), _('Text')); $this->out->element('input', array('name' => 'design_text', 'type' => 'text', @@ -549,6 +661,7 @@ class DesignAdminPanelForm extends AdminForm $lcolor = new WebColor($design->linkcolor); $this->li(); + // TRANS: Field label for link color selector. $this->out->element('label', array('for' => 'swatch-5'), _('Links')); $this->out->element('input', array('name' => 'design_links', 'type' => 'text', @@ -560,6 +673,7 @@ class DesignAdminPanelForm extends AdminForm $this->unli(); } catch (WebColorException $e) { + // @fixme normalize them individually! common_log(LOG_ERR, 'Bad color values in site design: ' . $e->getMessage()); } @@ -569,6 +683,29 @@ class DesignAdminPanelForm extends AdminForm $this->out->elementEnd('ul'); } + function showAdvanced() + { + if (common_config('custom_css', 'enabled')) { + $this->out->elementStart('fieldset', array('id' => 'settings_design_advanced')); + // TRANS: Fieldset legend for advanced theme design settings. + $this->out->element('legend', null, _('Advanced')); + $this->out->elementStart('ul', 'form_data'); + + $this->li(); + // TRANS: Field label for custom CSS. + $this->out->element('label', array('for' => 'css'), _('Custom CSS')); + $this->out->element('textarea', array('name' => 'css', + 'id' => 'css', + 'cols' => '50', + 'rows' => '10'), + strval(common_config('custom_css', 'css'))); + $this->unli(); + + $this->out->elementEnd('fieldset'); + $this->out->elementEnd('ul'); + } + } + /** * Action elements * @@ -577,17 +714,25 @@ class DesignAdminPanelForm extends AdminForm function formActions() { - $this->out->submit('defaults', _('Use defaults'), 'submit form_action-default', + // TRANS: Button text for resetting theme settings. + $this->out->submit('defaults', _m('BUTTON','Use defaults'), 'submit form_action-default', + // TRANS: Title for button for resetting theme settings. 'defaults', _('Restore default designs')); $this->out->element('input', array('id' => 'settings_design_reset', 'type' => 'reset', + // TRANS: Button text for resetting theme settings. 'value' => 'Reset', 'class' => 'submit form_action-primary', + // TRANS: Title for button for resetting theme settings. 'title' => _('Reset back to default'))); - $this->out->submit('save', _('Save'), 'submit form_action-secondary', - 'save', _('Save design')); + $this->out->submit('save', + // TRANS: Button text for saving theme settings. + _m('BUTTON','Save'), + 'submit form_action-secondary', + 'save', + // TRANS: Title for button for saving theme settings. + _('Save design')); } - }