]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Group theming.
authorZach Copley <zach@controlyourself.ca>
Thu, 18 Jun 2009 09:01:06 +0000 (02:01 -0700)
committerZach Copley <zach@controlyourself.ca>
Thu, 18 Jun 2009 09:01:06 +0000 (02:01 -0700)
actions/blockedfromgroup.php
actions/designsettings.php [deleted file]
actions/editgroup.php
actions/groupblock.php
actions/grouplogo.php
actions/groupmembers.php
actions/showgroup.php
lib/accountsettingsaction.php
lib/designsettings.php [new file with mode: 0644]
lib/groupnav.php
lib/router.php

index 541ebcfd90701d1074f038a97d46b08300b1d002..5c1eab35425775693a8b067741352ac297c8e68b 100644 (file)
@@ -41,7 +41,7 @@ if (!defined('LACONICA')) {
  * @link     http://laconi.ca/
  */
 
-class BlockedfromgroupAction extends Action
+class BlockedfromgroupAction extends GroupDesignAction
 {
     var $page = null;
 
diff --git a/actions/designsettings.php b/actions/designsettings.php
deleted file mode 100644 (file)
index 047059e..0000000
+++ /dev/null
@@ -1,517 +0,0 @@
-<?php
-/**
- * Laconica, the distributed open-source microblogging tool
- *
- * Change user password
- *
- * PHP version 5
- *
- * LICENCE: This program is free software: you can redistribute it and/or modify
- * 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.
- *
- * 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.
- *
- * 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/>.
- *
- * @category  Settings
- * @package   Laconica
- * @author    Sarven Capadisli <csarven@controlyourself.ca>
- * @author    Zach Copley <zach@controlyourself.ca>
- * @copyright 2008-2009 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/
- */
-
-if (!defined('LACONICA')) {
-    exit(1);
-}
-
-require_once INSTALLDIR . '/lib/accountsettingsaction.php';
-require_once INSTALLDIR . '/lib/webcolor.php';
-
-class DesignsettingsAction extends AccountSettingsAction
-{
-    /**
-     * Title of the page
-     *
-     * @return string Title of the page
-     */
-
-    function title()
-    {
-        return _('Profile design');
-    }
-
-    /**
-     * Instructions for use
-     *
-     * @return instructions for use
-     */
-
-    function getInstructions()
-    {
-        return _('Customize the way your profile looks ' .
-        'with a background image and a colour palette of your choice.');
-    }
-
-    /**
-     * Content area of the page
-     *
-     * Shows a form for changing the password
-     *
-     * @return void
-     */
-
-    function showContent()
-    {
-        $user = common_current_user();
-        $design = $user->getDesign();
-
-        if (empty($design)) {
-            $design = $this->defaultDesign();
-        }
-
-        $this->elementStart('form', array('method' => 'post',
-                                          'enctype' => 'multipart/form-data',
-                                          'id' => 'form_settings_design',
-                                          'class' => 'form_settings',
-                                          'action' =>
-                                              common_local_url('designsettings')));
-        $this->elementStart('fieldset');
-        $this->hidden('token', common_session_token());
-
-        $this->elementStart('fieldset', array('id' =>
-            'settings_design_background-image'));
-        $this->element('legend', null, _('Change background image'));
-        $this->elementStart('ul', 'form_data');
-        $this->elementStart('li');
-        $this->element('label', array('for' => 'design_background-image_file'),
-                                _('Upload file'));
-        $this->element('input', array('name' => 'design_background-image_file',
-                                      'type' => 'file',
-                                      'id' => 'design_background-image_file'));
-        $this->element('p', 'form_guide', _('You can upload your personal ' .
-            'background image. The maximum file size is 2Mb.'));
-        $this->element('input', array('name' => 'MAX_FILE_SIZE',
-                                      'type' => 'hidden',
-                                      'id' => 'MAX_FILE_SIZE',
-                                      'value' => ImageFile::maxFileSizeInt()));
-        $this->elementEnd('li');
-
-        if (!empty($design->backgroundimage)) {
-
-            $this->elementStart('li', array('id' => 'design_background-image_onoff'));
-
-            $this->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->element('input', $attrs);
-
-            $this->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->element('input', $attrs);
-
-            $this->element('label', array('for' => 'design_background-image_off',
-                                          'class' => 'radio'),
-                                          _('Off'));
-            $this->element('p', 'form_guide', _('Turn background image on or off.'));
-            $this->elementEnd('li');
-        }
-
-        $this->elementStart('li');
-        $this->checkbox('design_background-image_repeat',
-                        _('Tile background image'),
-                        ($design->disposition & BACKGROUND_TILE) ? true : false );
-        $this->elementEnd('li');
-
-        $this->elementEnd('ul');
-        $this->elementEnd('fieldset');
-
-        $this->elementStart('fieldset', array('id' => 'settings_design_color'));
-        $this->element('legend', null, _('Change colours'));
-        $this->elementStart('ul', 'form_data');
-
-        try {
-
-            $bgcolor = new WebColor($design->backgroundcolor);
-
-            $this->elementStart('li');
-            $this->element('label', array('for' => 'swatch-1'), _('Background'));
-            $this->element('input', array('name' => 'design_background',
-                                          'type' => 'text',
-                                          'id' => 'swatch-1',
-                                          'class' => 'swatch',
-                                          'maxlength' => '7',
-                                          'size' => '7',
-                                          'value' => '#' . $bgcolor->hexValue()));
-            $this->elementEnd('li');
-
-            $ccolor = new WebColor($design->contentcolor);
-
-            $this->elementStart('li');
-            $this->element('label', array('for' => 'swatch-2'), _('Content'));
-            $this->element('input', array('name' => 'design_content',
-                                          'type' => 'text',
-                                          'id' => 'swatch-2',
-                                          'class' => 'swatch',
-                                          'maxlength' => '7',
-                                          'size' => '7',
-                                          'value' => '#' . $ccolor->hexValue()));
-            $this->elementEnd('li');
-
-            $sbcolor = new WebColor($design->sidebarcolor);
-
-            $this->elementStart('li');
-            $this->element('label', array('for' => 'swatch-3'), _('Sidebar'));
-            $this->element('input', array('name' => 'design_sidebar',
-                                        'type' => 'text',
-                                        'id' => 'swatch-3',
-                                        'class' => 'swatch',
-                                        'maxlength' => '7',
-                                        'size' => '7',
-                                        'value' => '#' . $sbcolor->hexValue()));
-            $this->elementEnd('li');
-
-            $tcolor = new WebColor($design->textcolor);
-
-            $this->elementStart('li');
-            $this->element('label', array('for' => 'swatch-4'), _('Text'));
-            $this->element('input', array('name' => 'design_text',
-                                        'type' => 'text',
-                                        'id' => 'swatch-4',
-                                        'class' => 'swatch',
-                                        'maxlength' => '7',
-                                        'size' => '7',
-                                        'value' => '#' . $tcolor->hexValue()));
-            $this->elementEnd('li');
-
-            $lcolor = new WebColor($design->linkcolor);
-
-            $this->elementStart('li');
-            $this->element('label', array('for' => 'swatch-5'), _('Links'));
-            $this->element('input', array('name' => 'design_links',
-                                         'type' => 'text',
-                                         'id' => 'swatch-5',
-                                         'class' => 'swatch',
-                                         'maxlength' => '7',
-                                         'size' => '7',
-                                         'value' => '#' . $lcolor->hexValue()));
-
-           $this->elementEnd('li');
-
-       } catch (WebColorException $e) {
-           common_log(LOG_ERR, 'Bad color values in design ID: ' .
-               $design->id);
-       }
-
-       $this->elementEnd('ul');
-       $this->elementEnd('fieldset');
-
-       $this->element('input', array('id' => 'settings_design_reset',
-                                     'type' => 'reset',
-                                     'value' => 'Reset',
-                                     'class' => 'submit form_action-primary',
-                                     'title' => _('Reset back to default')));
-
-        $this->submit('save', _('Save'), 'submit form_action-secondary',
-            'save', _('Save design'));
-
-        $this->elementEnd('fieldset');
-        $this->elementEnd('form');
-    }
-
-    /**
-     * Handle a post
-     *
-     * Validate input and save changes. Reload the form with a success
-     * or error message.
-     *
-     * @return void
-     */
-
-    function handlePost()
-    {
-        // XXX: Robin's workaround for a bug in PHP where $_POST
-        // and $_FILE are empty in the case that the uploaded
-        // file is bigger than PHP is configured to handle.
-
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-            if (empty($_POST) && $_SERVER['CONTENT_LENGTH']) {
-
-                $msg = _('The server was unable to handle that much POST ' .
-                    'data (%s bytes) due to its current configuration.');
-
-                $this->showForm(sprintf($msg, $_SERVER['CONTENT_LENGTH']));
-            }
-        }
-
-        // CSRF protection
-        $token = $this->trimmed('token');
-        if (!$token || $token != common_session_token()) {
-            $this->showForm(_('There was a problem with your session token. '.
-                              'Try again, please.'));
-            return;
-        }
-
-        if ($this->arg('save')) {
-            $this->saveDesign();
-        } else if ($this->arg('reset')) {
-            $this->resetDesign();
-        } else {
-            $this->showForm(_('Unexpected form submission.'));
-        }
-    }
-
-    /**
-     * Add the Farbtastic stylesheet
-     *
-     * @return void
-     */
-
-    function showStylesheets()
-    {
-        parent::showStylesheets();
-        $farbtasticStyle =
-          common_path('theme/base/css/farbtastic.css?version='.LACONICA_VERSION);
-
-        $this->element('link', array('rel' => 'stylesheet',
-                                     'type' => 'text/css',
-                                     'href' => $farbtasticStyle,
-                                     'media' => 'screen, projection, tv'));
-    }
-
-    /**
-     * Add the Farbtastic scripts
-     *
-     * @return void
-     */
-
-    function showScripts()
-    {
-        parent::showScripts();
-
-        $farbtasticPack = common_path('js/farbtastic/farbtastic.js');
-        $userDesignGo   = common_path('js/userdesign.go.js');
-
-        $this->element('script', array('type' => 'text/javascript',
-                                       'src' => $farbtasticPack));
-        $this->element('script', array('type' => 'text/javascript',
-                                       'src' => $userDesignGo));
-    }
-
-    /**
-     * Get a default user design
-     *
-     * @return Design design
-     */
-
-    function defaultDesign()
-    {
-        $defaults = common_config('site', 'design');
-
-        $design = new Design();
-
-        try {
-
-            $color = new WebColor();
-
-            $color->parseColor($defaults['backgroundcolor']);
-            $design->backgroundcolor = $color->intValue();
-
-            $color->parseColor($defaults['contentcolor']);
-            $design->contentcolor = $color->intValue();
-
-            $color->parseColor($defaults['sidebarcolor']);
-            $design->sidebarcolor = $color->intValue();
-
-            $color->parseColor($defaults['textcolor']);
-            $design->textcolor = $color->intValue();
-
-            $color->parseColor($defaults['linkcolor']);
-            $design->linkcolor = $color->intValue();
-
-            $design->backgroundimage = $defaults['backgroundimage'];
-
-            $design->disposition = $defaults['disposition'];
-
-        } catch (WebColorException $e) {
-            common_log(LOG_ERR, _('Bad default color settings: ' .
-                $e->getMessage()));
-        }
-
-        return $design;
-    }
-
-    /**
-     * Save or update the user's design settings
-     *
-     * @return void
-     */
-
-    function saveDesign()
-    {
-        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->showForm($e->getMessage());
-            return;
-        }
-
-        $onoff = $this->arg('design_background-image_onoff');
-
-        $on   = false;
-        $off  = false;
-        $tile = false;
-
-        if ($onoff == 'on') {
-            $on = true;
-        } else {
-            $off = true;
-        }
-
-        $repeat = $this->boolean('design_background-image_repeat');
-
-        if ($repeat) {
-            $tile = true;
-        }
-
-        $user = common_current_user();
-        $design = $user->getDesign();
-
-        if (!empty($design)) {
-
-            $original = clone($design);
-
-            $design->backgroundcolor = $bgcolor->intValue();
-            $design->contentcolor    = $ccolor->intValue();
-            $design->sidebarcolor    = $sbcolor->intValue();
-            $design->textcolor       = $tcolor->intValue();
-            $design->linkcolor       = $lcolor->intValue();
-            $design->backgroundimage = $filepath;
-
-            $design->setDisposition($on, $off, $tile);
-
-            $result = $design->update($original);
-
-            if ($result === false) {
-                common_log_db_error($design, 'UPDATE', __FILE__);
-                $this->showForm(_('Couldn\'t update your design.'));
-                return;
-            }
-
-            // update design
-        } else {
-
-            $user->query('BEGIN');
-
-            // save new design
-            $design = new Design();
-
-            $design->backgroundcolor = $bgcolor->intValue();
-            $design->contentcolor    = $ccolor->intValue();
-            $design->sidebarcolor    = $sbcolor->intValue();
-            $design->textcolor       = $tcolor->intValue();
-            $design->linkcolor       = $lcolor->intValue();
-            $design->backgroundimage = $filepath;
-
-            $design->setDisposition($on, $off, $tile);
-
-            $id = $design->insert();
-
-            if (empty($id)) {
-                common_log_db_error($id, 'INSERT', __FILE__);
-                $this->showForm(_('Unable to save your design settings!'));
-                return;
-            }
-
-            $original = clone($user);
-            $user->design_id = $id;
-            $result = $user->update($original);
-
-            if (empty($result)) {
-                common_log_db_error($original, 'UPDATE', __FILE__);
-                $this->showForm(_('Unable to save your design settings!'));
-                $user->query('ROLLBACK');
-                return;
-            }
-
-            $user->query('COMMIT');
-
-        }
-
-        // Now that we have a Design ID we can add a file to the design.
-        // XXX: This is an additional DB hit, but figured having the image
-        // associated with the Design rather than the User was worth
-        // it. -- Zach
-
-        if ($_FILES['design_background-image_file']['error'] ==
-            UPLOAD_ERR_OK) {
-
-            $filepath = null;
-
-            try {
-                    $imagefile =
-                        ImageFile::fromUpload('design_background-image_file');
-                } catch (Exception $e) {
-                    $this->showForm($e->getMessage());
-                    return;
-                }
-
-            $filename = Design::filename($design->id,
-                image_type_to_extension($imagefile->type),
-                    common_timestamp());
-
-            $filepath = Design::path($filename);
-
-            move_uploaded_file($imagefile->filepath, $filepath);
-
-            $original = clone($design);
-            $design->backgroundimage = $filename;
-            $design->setDisposition(true, false, false);
-            $result = $design->update($original);
-
-            if ($result === false) {
-                common_log_db_error($design, 'UPDATE', __FILE__);
-                $this->showForm(_('Couldn\'t update your design.'));
-                return;
-            }
-        }
-
-        $this->showForm(_('Design preferences saved.'), true);
-    }
-
-}
index 29a7bce437c661c582213254767d43b0a941bab2..6aa6f8b11f20d82d59b46a57bf8129d81e9b327e 100644 (file)
@@ -23,6 +23,7 @@
  * @package   Laconica
  * @author    Evan Prodromou <evan@controlyourself.ca>
  * @author    Sarven Capadisli <csarven@controlyourself.ca>
+ * @author   Zach Copley <zach@controlyourself.ca>
  * @copyright 2008-2009 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/
@@ -40,14 +41,15 @@ if (!defined('LACONICA')) {
  * @category Group
  * @package  Laconica
  * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @author   Zach Copley <zach@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/
  */
 
-class EditgroupAction extends Action
+class EditgroupAction extends GroupDesignAction
 {
+
     var $msg;
-    var $group = null;
 
     function title()
     {
index 28685b1d56fffb4e5876b58cd88482b8f885bcbb..93662da799af8977590a5be690928d7494406210 100644 (file)
@@ -151,19 +151,17 @@ class GroupblockAction extends Action
     function areYouSureForm()
     {
         $id = $this->profile->id;
-        $this->elementStart('form', array('id' => 'block-' . $id,
-                                           'method' => 'post',
-                                           'class' => 'form_settings form_entity_block',
-                                           'action' => common_local_url('groupblock')));
-        $this->elementStart('fieldset');
-        $this->hidden('token', common_session_token());
-        $this->element('legend', null, _('Block user'));
         $this->element('p', null,
                        sprintf(_('Are you sure you want to block user "%s" from the group "%s"? '.
                                  'They will be removed from the group, unable to post, and '.
                                  'unable to subscribe to the group in the future.'),
                                $this->profile->getBestName(),
                                $this->group->getBestName()));
+        $this->elementStart('form', array('id' => 'block-' . $id,
+                                           'method' => 'post',
+                                           'class' => 'block',
+                                           'action' => common_local_url('groupblock')));
+        $this->hidden('token', common_session_token());
         $this->hidden('blockto-' . $this->profile->id,
                       $this->profile->id,
                       'blockto');
@@ -175,9 +173,8 @@ class GroupblockAction extends Action
                 $this->hidden($k, $v);
             }
         }
-        $this->submit('form_action-no', _('No'), 'submit form_action-primary', 'no', _("Do not block this user from this group"));
-        $this->submit('form_action-yes', _('Yes'), 'submit form_action-secondary', 'yes', _('Block this user from this group'));
-        $this->elementEnd('fieldset');
+        $this->submit('no', _('No'));
+        $this->submit('yes', _('Yes'));
         $this->elementEnd('form');
     }
 
index fe6127da296243a0c13f15625a8fc57f162f5c83..8f6158dacaafbbd9626b525284745d3451c3f548 100644 (file)
@@ -50,7 +50,7 @@ define('MAX_ORIGINAL', 480);
  * @link     http://laconi.ca/
  */
 
-class GrouplogoAction extends Action
+class GrouplogoAction extends GroupDesignAction
 {
     var $mode = null;
     var $imagefile = null;
index abfad3f0ddadab035f186ebe01af9146c4e0f456..d132cdf9670512d5f5083a713726af77b014d90b 100644 (file)
@@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php';
  * @link     http://laconi.ca/
  */
 
-class GroupmembersAction extends Action
+class GroupmembersAction extends GroupDesignAction
 {
     var $page = null;
 
index 357f579d8f1c3d060b778ac19a3cd1ebad23624b..b6a0f4844e78a69752cd6c690203b54d869ede07 100644 (file)
@@ -47,10 +47,9 @@ define('MEMBERS_PER_SECTION', 27);
  * @link     http://laconi.ca/
  */
 
-class ShowgroupAction extends Action
+class ShowgroupAction extends GroupDesignAction
 {
-    /** group we're viewing. */
-    var $group = null;
+
     /** page we're viewing. */
     var $page = null;
 
index 86800d2a36b1e3630d61cb399dda7523be7f2d4e..4ab50abcef1134a50282bbdfb64a45a4696fa972 100644 (file)
@@ -115,7 +115,7 @@ class AccountSettingsNav extends Widget
                 'openidsettings' =>
                 array(_('OpenID'),
                       _('Add or remove OpenIDs')),
-                'designsettings' =>
+                'userdesignsettings' =>
                 array(_('Design'),
                       _('Design your profile')),
                 'othersettings' =>
diff --git a/lib/designsettings.php b/lib/designsettings.php
new file mode 100644 (file)
index 0000000..6aa6bb2
--- /dev/null
@@ -0,0 +1,402 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Change user password
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * 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.
+ *
+ * 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.
+ *
+ * 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/>.
+ *
+ * @category  Settings
+ * @package   Laconica
+ * @author    Sarven Capadisli <csarven@controlyourself.ca>
+ * @author    Zach Copley <zach@controlyourself.ca>
+ * @copyright 2008-2009 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/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+require_once INSTALLDIR . '/lib/accountsettingsaction.php';
+require_once INSTALLDIR . '/lib/webcolor.php';
+
+class DesignSettingsAction extends AccountSettingsAction
+{
+
+    var $submitaction = null;
+
+    /**
+     * Title of the page
+     *
+     * @return string Title of the page
+     */
+
+    function title()
+    {
+        return _('Profile design');
+    }
+
+    /**
+     * Instructions for use
+     *
+     * @return instructions for use
+     */
+
+    function getInstructions()
+    {
+        return _('Customize the way your profile looks ' .
+        'with a background image and a colour palette of your choice.');
+    }
+
+    function showDesignForm($design)
+    {
+
+        $this->elementStart('form', array('method' => 'post',
+                                          'enctype' => 'multipart/form-data',
+                                          'id' => 'form_settings_design',
+                                          'class' => 'form_settings',
+                                          'action' => $this->submitaction));
+        $this->elementStart('fieldset');
+        $this->hidden('token', common_session_token());
+
+        $this->elementStart('fieldset', array('id' =>
+            'settings_design_background-image'));
+        $this->element('legend', null, _('Change background image'));
+        $this->elementStart('ul', 'form_data');
+        $this->elementStart('li');
+        $this->element('label', array('for' => 'design_background-image_file'),
+                                _('Upload file'));
+        $this->element('input', array('name' => 'design_background-image_file',
+                                      'type' => 'file',
+                                      'id' => 'design_background-image_file'));
+        $this->element('p', 'form_guide', _('You can upload your personal ' .
+            'background image. The maximum file size is 2Mb.'));
+        $this->element('input', array('name' => 'MAX_FILE_SIZE',
+                                      'type' => 'hidden',
+                                      'id' => 'MAX_FILE_SIZE',
+                                      'value' => ImageFile::maxFileSizeInt()));
+        $this->elementEnd('li');
+
+        if (!empty($design->backgroundimage)) {
+
+            $this->elementStart('li', array('id' => 'design_background-image_onoff'));
+
+            $this->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->element('input', $attrs);
+
+            $this->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->element('input', $attrs);
+
+            $this->element('label', array('for' => 'design_background-image_off',
+                                          'class' => 'radio'),
+                                          _('Off'));
+            $this->element('p', 'form_guide', _('Turn background image on or off.'));
+            $this->elementEnd('li');
+        }
+
+        $this->elementStart('li');
+        $this->checkbox('design_background-image_repeat',
+                        _('Tile background image'),
+                        ($design->disposition & BACKGROUND_TILE) ? true : false );
+        $this->elementEnd('li');
+
+        $this->elementEnd('ul');
+        $this->elementEnd('fieldset');
+
+        $this->elementStart('fieldset', array('id' => 'settings_design_color'));
+        $this->element('legend', null, _('Change colours'));
+        $this->elementStart('ul', 'form_data');
+
+        try {
+
+            $bgcolor = new WebColor($design->backgroundcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-1'), _('Background'));
+            $this->element('input', array('name' => 'design_background',
+                                          'type' => 'text',
+                                          'id' => 'swatch-1',
+                                          'class' => 'swatch',
+                                          'maxlength' => '7',
+                                          'size' => '7',
+                                          'value' => '#' . $bgcolor->hexValue()));
+            $this->elementEnd('li');
+
+            $ccolor = new WebColor($design->contentcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-2'), _('Content'));
+            $this->element('input', array('name' => 'design_content',
+                                          'type' => 'text',
+                                          'id' => 'swatch-2',
+                                          'class' => 'swatch',
+                                          'maxlength' => '7',
+                                          'size' => '7',
+                                          'value' => '#' . $ccolor->hexValue()));
+            $this->elementEnd('li');
+
+            $sbcolor = new WebColor($design->sidebarcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-3'), _('Sidebar'));
+            $this->element('input', array('name' => 'design_sidebar',
+                                        'type' => 'text',
+                                        'id' => 'swatch-3',
+                                        'class' => 'swatch',
+                                        'maxlength' => '7',
+                                        'size' => '7',
+                                        'value' => '#' . $sbcolor->hexValue()));
+            $this->elementEnd('li');
+
+            $tcolor = new WebColor($design->textcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-4'), _('Text'));
+            $this->element('input', array('name' => 'design_text',
+                                        'type' => 'text',
+                                        'id' => 'swatch-4',
+                                        'class' => 'swatch',
+                                        'maxlength' => '7',
+                                        'size' => '7',
+                                        'value' => '#' . $tcolor->hexValue()));
+            $this->elementEnd('li');
+
+            $lcolor = new WebColor($design->linkcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-5'), _('Links'));
+            $this->element('input', array('name' => 'design_links',
+                                         'type' => 'text',
+                                         'id' => 'swatch-5',
+                                         'class' => 'swatch',
+                                         'maxlength' => '7',
+                                         'size' => '7',
+                                         'value' => '#' . $lcolor->hexValue()));
+
+           $this->elementEnd('li');
+
+       } catch (WebColorException $e) {
+           common_log(LOG_ERR, 'Bad color values in design ID: ' .
+               $design->id);
+       }
+
+       $this->elementEnd('ul');
+       $this->elementEnd('fieldset');
+
+       $this->element('input', array('id' => 'settings_design_reset',
+                                     'type' => 'reset',
+                                     'value' => 'Reset',
+                                     'class' => 'submit form_action-primary',
+                                     'title' => _('Reset back to default')));
+
+        $this->submit('save', _('Save'), 'submit form_action-secondary',
+            'save', _('Save design'));
+
+        $this->elementEnd('fieldset');
+        $this->elementEnd('form');
+    }
+
+    /**
+     * Handle a post
+     *
+     * Validate input and save changes. Reload the form with a success
+     * or error message.
+     *
+     * @return void
+     */
+
+    function handlePost()
+    {
+        // XXX: Robin's workaround for a bug in PHP where $_POST
+        // and $_FILE are empty in the case that the uploaded
+        // file is bigger than PHP is configured to handle.
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            if (empty($_POST) && $_SERVER['CONTENT_LENGTH']) {
+
+                $msg = _('The server was unable to handle that much POST ' .
+                    'data (%s bytes) due to its current configuration.');
+
+                $this->showForm(sprintf($msg, $_SERVER['CONTENT_LENGTH']));
+            }
+        }
+
+        // CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->showForm(_('There was a problem with your session token. '.
+                              'Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->saveDesign();
+        } else if ($this->arg('reset')) {
+            $this->resetDesign();
+        } else {
+            $this->showForm(_('Unexpected form submission.'));
+        }
+    }
+
+    /**
+     * Add the Farbtastic stylesheet
+     *
+     * @return void
+     */
+
+    function showStylesheets()
+    {
+        parent::showStylesheets();
+        $farbtasticStyle =
+          common_path('theme/base/css/farbtastic.css?version='.LACONICA_VERSION);
+
+        $this->element('link', array('rel' => 'stylesheet',
+                                     'type' => 'text/css',
+                                     'href' => $farbtasticStyle,
+                                     'media' => 'screen, projection, tv'));
+    }
+
+    /**
+     * Add the Farbtastic scripts
+     *
+     * @return void
+     */
+
+    function showScripts()
+    {
+        parent::showScripts();
+
+        $farbtasticPack = common_path('js/farbtastic/farbtastic.js');
+        $userDesignGo   = common_path('js/userdesign.go.js');
+
+        $this->element('script', array('type' => 'text/javascript',
+                                       'src' => $farbtasticPack));
+        $this->element('script', array('type' => 'text/javascript',
+                                       'src' => $userDesignGo));
+    }
+
+    /**
+     * Get a default user design
+     *
+     * @return Design design
+     */
+
+    function defaultDesign()
+    {
+        $defaults = common_config('site', 'design');
+
+        $design = new Design();
+
+        try {
+
+            $color = new WebColor();
+
+            $color->parseColor($defaults['backgroundcolor']);
+            $design->backgroundcolor = $color->intValue();
+
+            $color->parseColor($defaults['contentcolor']);
+            $design->contentcolor = $color->intValue();
+
+            $color->parseColor($defaults['sidebarcolor']);
+            $design->sidebarcolor = $color->intValue();
+
+            $color->parseColor($defaults['textcolor']);
+            $design->textcolor = $color->intValue();
+
+            $color->parseColor($defaults['linkcolor']);
+            $design->linkcolor = $color->intValue();
+
+            $design->backgroundimage = $defaults['backgroundimage'];
+
+            $design->disposition = $defaults['disposition'];
+
+        } catch (WebColorException $e) {
+            common_log(LOG_ERR, _('Bad default color settings: ' .
+                $e->getMessage()));
+        }
+
+        return $design;
+    }
+
+    function saveBackgroundImage($design) {
+
+        // Now that we have a Design ID we can add a file to the design.
+        // XXX: This is an additional DB hit, but figured having the image
+        // associated with the Design rather than the User was worth
+        // it. -- Zach
+
+        if ($_FILES['design_background-image_file']['error'] ==
+            UPLOAD_ERR_OK) {
+
+            $filepath = null;
+
+            try {
+                    $imagefile =
+                        ImageFile::fromUpload('design_background-image_file');
+                } catch (Exception $e) {
+                    $this->showForm($e->getMessage());
+                    return;
+                }
+
+            $filename = Design::filename($design->id,
+                image_type_to_extension($imagefile->type),
+                    common_timestamp());
+
+            $filepath = Design::path($filename);
+
+            move_uploaded_file($imagefile->filepath, $filepath);
+
+            $original = clone($design);
+            $design->backgroundimage = $filename;
+            $design->setDisposition(true, false, false);
+            $result = $design->update($original);
+
+            if ($result === false) {
+                common_log_db_error($design, 'UPDATE', __FILE__);
+                $this->showForm(_('Couldn\'t update your design.'));
+                return;
+            }
+        }
+    }
+
+}
index 194247982cc6ae7e6b25c71fd816125902d9d66e..9e530c447ce511bca2eabb1b3d5371a10c92dc03 100644 (file)
@@ -113,6 +113,12 @@ class GroupNav extends Widget
                                  sprintf(_('Add or edit %s logo'), $nickname),
                                  $action_name == 'grouplogo',
                                  'nav_group_logo');
+            $this->out->menuItem(common_local_url('groupdesignsettings', array('nickname' =>
+                                                                  $nickname)),
+                                 _('Design'),
+                                 sprintf(_('Add or edit %s design'), $nickname),
+                                 $action_name == 'groupdesignsettings',
+                                 'nav_group_design');
         }
         $this->out->elementEnd('ul');
     }
index 8b6f636182d7e5fc16168e306ad8dd71976ad2f8..1f39c60dc50207449c6ddba1a196560d0a1a390c 100644 (file)
@@ -132,7 +132,7 @@ class Router
         // settings
 
         foreach (array('profile', 'avatar', 'password', 'openid', 'im',
-                       'email', 'sms', 'twitter', 'design', 'other') as $s) {
+                       'email', 'sms', 'twitter', 'userdesign', 'other') as $s) {
             $m->connect('settings/'.$s, array('action' => $s.'settings'));
         }
 
@@ -223,7 +223,7 @@ class Router
                         array('nickname' => '[a-zA-Z0-9]+'));
         }
 
-        foreach (array('members', 'logo', 'rss') as $n) {
+        foreach (array('members', 'logo', 'rss', 'designsettings') as $n) {
             $m->connect('group/:nickname/'.$n,
                         array('action' => 'group'.$n),
                         array('nickname' => '[a-zA-Z0-9]+'));