Remove HTML from SM option widget code; use forms.php utilities, which in turn use...
authorpdontthink <pdontthink@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Tue, 9 Jan 2007 05:09:28 +0000 (05:09 +0000)
committerpdontthink <pdontthink@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Tue, 9 Jan 2007 05:09:28 +0000 (05:09 +0000)
git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@12105 7612ce4b-ef26-0410-bec9-ea0150e637f0

functions/html.php
functions/options.php
include/options/display.php
include/options/folder.php
templates/default/label.tpl [new file with mode: 0644]

index 85679f10e3468b429b5f22d8d985f6d5c9822b51..ec7f90e37a186f7db2a9ce50ae3c902d36bc91ff 100644 (file)
@@ -133,6 +133,39 @@ function create_image($src, $alt='', $width='', $height='',
 }
 
 
+/**
+ * Generates a label tag
+ *
+ * @param string $value    The contents that belong inside the label
+ * @param string $for      The ID to which the label applies (OPTIONAL; 
+ *                         default not used)
+ * @param array  $aAttribs Any extra attributes: this must be an
+ *                         associative array, where keys will be
+ *                         added as the attribute name, and values
+ *                         (which are optional - should be null if
+ *                         none should be used) will be placed in
+ *                         double quotes (pending template implementation)
+ *                         as the attribute value (OPTIONAL; default empty).
+ *
+ * @return string The desired label tag.
+ *
+ * @since 1.5.2
+ *
+ */
+function create_label($value, $for='', $aAttribs=array()) {
+
+    global $oTemplate;
+
+    $oTemplate->assign('text', $value);
+    $oTemplate->assign('for', $for);
+
+    $oTemplate->assign('aAttribs', $aAttribs);
+
+    return $oTemplate->fetch('label.tpl');
+
+}
+
+
 /**
  * Generates a span tag
  *
index 24b094effe714a843a9a709a6e4bf3b4f430d4b4..d03d05babb998495fff8e47302f56773644e8177 100644 (file)
@@ -98,10 +98,12 @@ class SquirrelOption {
      */
     var $comment;
     /**
-     * additional javascript or other code added to the user input
-     * @var string
+     * additional javascript or other widget attributes added to the 
+     * user input; must be an array where keys are attribute names
+     * ("onclick", etc) and values are the attribute values.
+     * @var array
      */
-    var $script;
+    var $aExtraAttribs;
     /**
      * script (usually Javascript) that will be placed after (outside of)
      * the INPUT tag
@@ -137,8 +139,7 @@ class SquirrelOption {
      * disables html sanitizing.
      *
      * WARNING - don't use it, if user input is possible in option
-     * or use own sanitizing functions. Currently works only with
-     * SMOPT_TYPE_STRLIST.
+     * or use own sanitizing functions. Currently only works for SMOPT_TYPE_STRLIST.
      * @var bool
      */
     var $htmlencoded=false;
@@ -172,7 +173,7 @@ class SquirrelOption {
         $this->size = SMOPT_SIZE_MEDIUM;
         $this->trailing_text = '';
         $this->comment = '';
-        $this->script = '';
+        $this->aExtraAttribs = array();
         $this->post_script = '';
 
         //Check for a current value.  
@@ -238,11 +239,11 @@ class SquirrelOption {
     }
 
     /**
-     * Set the script for this option.
-     * @param string $script
+     * Set the extra attributes for this option.
+     * @param array $aExtraAttribs
      */
-    function setScript($script) {
-        $this->script = $script;
+    function setExtraAttributes($aExtraAttribs) {
+        $this->aExtraAttribs = $aExtraAttribs;
     }
 
     /**
@@ -315,6 +316,7 @@ class SquirrelOption {
                 $result = $this->createWidget_FolderList();
                 break;
             default:
+//FIXME: can we throw an error here instead?  either way, we don't want HTML here!
                $result = '<font color="' . $color[2] . '">'
                        . sprintf(_("Option Type '%s' Not Found"), $this->type)
                        . '</font>';
@@ -355,41 +357,22 @@ class SquirrelOption {
                 $width = 25;
         }
 
-        $result = "<input type=\"text\" name=\"new_$this->name\" value=\"" .
-            htmlspecialchars($this->value) .
-            "\" size=\"$width\" $this->script />$this->trailing_text\n";
-        return ($result);
+        return addInput('new_' . $this->name, $this->value, $width, 0, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text);
     }
 
     /**
      * Create selection box
+     *
+     * When $this->htmlencoded is TRUE, the keys and values in 
+     * $this->possible_values are assumed to be display-safe.  
+     * Use with care!
+     *
      * @return string html formated selection box
      */
     function createWidget_StrList() {
-        /* Begin the select tag. */
-        $result = "<select name=\"new_$this->name\" $this->script>\n";
-
-        /* Add each possible value to the select list. */
-        foreach ($this->possible_values as $real_value => $disp_value) {
-            /* Start the next new option string. */
-            $new_option = '<option value="' .
-                ($this->htmlencoded ? $real_value : htmlspecialchars($real_value)) . '"';
-
-            /* If this value is the current value, select it. */
-            if ($real_value == $this->value) {
-               $new_option .= ' selected="selected"';
-            }
-
-            /* Add the display value to our option string. */
-            $new_option .= '>' . ($this->htmlencoded ? $disp_value : htmlspecialchars($disp_value)) . "</option>\n";
 
-            /* And add the new option string to our select tag. */
-            $result .= $new_option;
-        }
+        return addSelect('new_' . $this->name, $this->possible_values, $this->value, TRUE, $this->aExtraAttribs, !$this->htmlencoded) . htmlspecialchars($this->trailing_text);
 
-        /* Close the select tag and return our happy result. */
-        $result .= "</select>$this->trailing_text\n";
-        return ($result);
     }
 
     /**
@@ -397,44 +380,31 @@ class SquirrelOption {
      * @return string html formated selection box
      */
     function createWidget_FolderList() {
-        $selected = array(strtolower($this->value));
 
-        /* set initial value */
-        $result = '';
-
-        /* Add each possible value to the select list. */
-        foreach ($this->possible_values as $real_value => $disp_value) {
-            if ( is_array($disp_value) ) {
-              /* For folder list, we passed in the array of boxes.. */
-              $new_option = sqimap_mailbox_option_list(0, $selected, 0, $disp_value, $this->folder_filter);
-            } else {
-              /* Start the next new option string. */
-              $new_option = '<option value="' . htmlspecialchars($real_value) . '"';
+        // possible values might include a nested array of 
+        // possible values (list of folders)
+        //
+        $option_list = array();
+        foreach ($this->possible_values as $value => $text) {
 
-              /* If this value is the current value, select it. */
-              if ($real_value == $this->value) {
-                 $new_option .= ' selected="selected"';
-              }
+            // list of folders (boxes array)
+            //
+            if (is_array($text)) {
+              $option_list = array_merge($option_list, sqimap_mailbox_option_array(0, array(strtolower($this->value)), 0, $text, $this->folder_filter));
 
-              /* Add the display value to our option string. */
-              $new_option .= '>' . htmlspecialchars($disp_value) . "</option>\n";
+            // just one option here
+            //
+            } else {
+              $option_list = array_merge($option_list, array($value => $text));
             }
-            /* And add the new option string to our select tag. */
-            $result .= $new_option;
+
         }
+        if (empty($option_list))
+            $option_list = array('ignore' => _("unavailable"));
 
 
-        if (empty($result)) {
-            // string is displayed when interface can't build folder selection box
-            return _("unavailable");
-        } else {
-            /* Begin the select tag. */
-            $ret = "<select name=\"new_$this->name\" $this->script>\n";
-            $ret.= $result;
-            /* Close the select tag and return our happy result. */
-            $ret.= "</select>\n";
-            return ($ret);
-        }
+        return addSelect('new_' . $this->name, $option_list, $this->value, TRUE, $this->aExtraAttribs) . htmlspecialchars($this->trailing_text);
+
     }
 
     /**
@@ -450,8 +420,6 @@ class SquirrelOption {
             case SMOPT_SIZE_NORMAL:
             default: $rows = 5; $cols =  50;
         }
-//FIXME: we need to change $this->script into $this->aExtraAttribs, and anyone who wants to add some javascript or other attributes to an options widget can put them in an array and pass them as extra attributes (key == attrib name, value == attrib value).... for now, this is the only place it is used, and there is no place in the code that text areas get extra attribs or javascript... in fact the only place that was using $this->script is include/options/display.php:200, so that's easy to change.... just have to go through this file and change all the places that use "script"
-$this->aExtraAttribs = array();
         return addTextArea('new_' . $this->name, $this->value, $cols, $rows, $this->aExtraAttribs);
     }
 
@@ -466,12 +434,12 @@ $this->aExtraAttribs = array();
         // add onChange javascript handler to a regular string widget
         // which will strip out all non-numeric chars
         if (checkForJavascript())
-           return preg_replace('/\/>/', ' onChange="origVal=this.value; newVal=\'\'; '
+           $this->aExtraAttribs['onchange'] = 'origVal=this.value; newVal=\'\'; '
                     . 'for (i=0;i<origVal.length;i++) { if (origVal.charAt(i)>=\'0\' '
                     . '&& origVal.charAt(i)<=\'9\') newVal += origVal.charAt(i); } '
-                    . 'this.value=newVal;" />', $this->createWidget_String());
-        else
-           return $this->createWidget_String();
+                    . 'this.value=newVal;';
+
+        return $this->createWidget_String();
     }
 
     /**
@@ -484,13 +452,12 @@ $this->aExtraAttribs = array();
         // add onChange javascript handler to a regular string widget
         // which will strip out all non-numeric (period also OK) chars
         if (checkForJavascript())
-           return preg_replace('/\/>/', ' onChange="origVal=this.value; newVal=\'\'; '
+           $this->aExtraAttribs['onchange'] = 'origVal=this.value; newVal=\'\'; '
                     . 'for (i=0;i<origVal.length;i++) { if ((origVal.charAt(i)>=\'0\' '
                     . '&& origVal.charAt(i)<=\'9\') || origVal.charAt(i)==\'.\') '
-                    . 'newVal += origVal.charAt(i); } this.value=newVal;" />'
-                , $this->createWidget_String());
-        else
-           return $this->createWidget_String();
+                    . 'newVal += origVal.charAt(i); } this.value=newVal;';
+
+        return $this->createWidget_String();
     }
 
     /**
@@ -498,29 +465,18 @@ $this->aExtraAttribs = array();
      * @return string html formated radio field
      */
     function createWidget_Boolean() {
-        /* Do the whole current value thing. */
-        if ($this->value != SMPREF_NO) {
-            $yes_chk = ' checked="checked"';
-            $no_chk = '';
-        } else {
-            $yes_chk = '';
-            $no_chk = ' checked="checked"';
-        }
+
+        global $oTemplate;
+        $nbsp = $oTemplate->fetch('non_breaking_space.tpl');
 
         /* Build the yes choice. */
-        $yes_option = '<input type="radio" id="new_' . $this->name . '_yes" '
-                    . 'name="new_' . $this->name . '" value="' . SMPREF_YES . '"'
-                    . $yes_chk . ' ' . $this->script . ' />&nbsp;'
-                    . '<label for="new_'.$this->name.'_yes">' . _("Yes") . '</label>';
+        $yes_option = addRadioBox('new_' . $this->name, ($this->value != SMPREF_NO), SMPREF_YES, array_merge(array('id' => 'new_' . $this->name . '_yes'), $this->aExtraAttribs)) . $nbsp . create_label(_("Yes"), 'new_' . $this->name . '_yes');
 
         /* Build the no choice. */
-        $no_option = '<input type="radio" id="new_' . $this->name . '_no" '
-                   . 'name="new_' . $this->name . '" value="' . SMPREF_NO . '"'
-                   . $no_chk . ' ' . $this->script . ' />&nbsp;'
-                    . '<label for="new_'.$this->name.'_no">' . _("No") . '</label>';
+        $no_option = addRadioBox('new_' . $this->name, ($this->value == SMPREF_NO), SMPREF_NO, array_merge(array('id' => 'new_' . $this->name . '_no'), $this->aExtraAttribs)) . $nbsp . create_label(_("No"), 'new_' . $this->name . '_no');
 
         /* Build and return the combined "boolean widget". */
-        $result = "$yes_option&nbsp;&nbsp;&nbsp;&nbsp;$no_option";
+        $result = "$yes_option$nbsp$nbsp$nbsp$nbsp$no_option";
         return ($result);
     }
 
@@ -529,10 +485,7 @@ $this->aExtraAttribs = array();
      * @return string html formated hidden input field
      */
     function createWidget_Hidden() {
-        $result = '<input type="hidden" name="new_' . $this->name
-                . '" value="' . htmlspecialchars($this->value)
-                . '" ' . $this->script . ' />';
-        return ($result);
+        return addHidden('new_' . $this->name, $this->value, $this->aExtraAttribs);
     }
 
     /**
@@ -587,7 +540,7 @@ function save_option_noop($option) {
  * @return string html formated hidden input field
  */
 function create_optpage_element($optpage) {
-    return create_hidden_element('optpage', $optpage);
+    return addHidden('optpage', $optpage);
 }
 
 /**
@@ -596,20 +549,7 @@ function create_optpage_element($optpage) {
  * @return string html formated hidden input field
  */
 function create_optmode_element($optmode) {
-    return create_hidden_element('optmode', $optmode);
-}
-
-/**
- * Create hidden field.
- * @param string $name field name
- * @param string $value field value
- * @return string html formated hidden input field
- */
-function create_hidden_element($name, $value) {
-    $result = '<input type="hidden" '
-            . 'name="' . $name . '" '
-            . 'value="' . htmlspecialchars($value) . '" />';
-    return ($result);
+    return addHidden('optmode', $optmode);
 }
 
 /**
@@ -662,9 +602,9 @@ function create_option_groups($optgrps, $optvals) {
                 $next_option->setSaveFunction($optset['save']);
             }
 
-            /* If provided, set the script for this option. */
-            if (isset($optset['script'])) {
-                $next_option->setScript($optset['script']);
+            /* If provided, set the extra attributes for this option. */
+            if (isset($optset['extra_attributes'])) {
+                $next_option->setExtraAttributes($optset['extra_attributes']);
             }
 
             /* If provided, set the "post script" for this option. */
index 6f1309e3f025b28c982af2c314a4c5e6071a4931..33ee216d38f04d5d5028cd3b5d28fb7324747664 100644 (file)
@@ -197,7 +197,7 @@ function load_optpage_data_display() {
                            SMPREF_JS_ON         => _("Always"),
                            SMPREF_JS_OFF        => _("Never")),
         'save'    => 'save_option_javascript_autodetect',
-        'script'  => 'onclick="document.forms[0].new_js_autodetect_results.value = \'' . SMPREF_JS_ON . '\';"'
+        'extra_attributes' => array('onclick' => 'document.forms[0].new_js_autodetect_results.value = \'' . SMPREF_JS_ON . '\';'),
     );
 
     $optvals[SMOPT_GRP_GENERAL][] = array(
index 4ac4f42b2603254d10ad358067a1235d99e61f73..9b10714dcd0dce0b9aa78142bfe0fc11ef6e9cf1 100644 (file)
@@ -33,8 +33,8 @@ define('SMOPT_GRP_FOLDERSELECT', 2);
  * @return array all option information
  */
 function load_optpage_data_folder() {
-    global $username, $imapServerAddress, $imapPort;
-    global $folder_prefix, $default_folder_prefix, $show_prefix_option;
+    global $username, $imapServerAddress, $imapPort, $oTemplate,
+           $folder_prefix, $default_folder_prefix, $show_prefix_option;
 
     /* Get some imap data we need later. */
     $imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
@@ -64,7 +64,7 @@ function load_optpage_data_folder() {
     }
 
     $trash_folder_values = array(SMPREF_NONE => '[ '._("Do not use Trash").' ]',
-                                 'whatever'  => $boxes);
+                                 'ignore'  => $boxes);
     $optvals[SMOPT_GRP_SPCFOLDER][] = array(
         'name'    => 'trash_folder',
         'caption' => _("Trash Folder"),
@@ -75,7 +75,7 @@ function load_optpage_data_folder() {
     );
 
     $draft_folder_values = array(SMPREF_NONE => '[ '._("Do not use Drafts").' ]',
-                                 'whatever'  => $boxes);
+                                 'ignore'  => $boxes);
     $optvals[SMOPT_GRP_SPCFOLDER][] = array(
         'name'    => 'draft_folder',
         'caption' => _("Draft Folder"),
@@ -86,7 +86,7 @@ function load_optpage_data_folder() {
     );
 
     $sent_folder_values = array(SMPREF_NONE => '[ '._("Do not use Sent").' ]',
-                                'whatever'  => $boxes);
+                                'ignore'  => $boxes);
     $optvals[SMOPT_GRP_SPCFOLDER][] = array(
         'name'    => 'sent_folder',
         'caption' => _("Sent Folder"),
@@ -227,6 +227,7 @@ function load_optpage_data_folder() {
     $optgrps[SMOPT_GRP_FOLDERSELECT] = _("Folder Selection Options");
     $optvals[SMOPT_GRP_FOLDERSELECT] = array();
 
+    $nbsp = $oTemplate->fetch('non_breaking_space.tpl');
     $delim = sqimap_get_delimiter($imapConnection);
     $optvals[SMOPT_GRP_FOLDERSELECT][] = array(
         'name'    => 'mailbox_select_style',
@@ -234,8 +235,8 @@ function load_optpage_data_folder() {
         'type'    => SMOPT_TYPE_STRLIST,
         'refresh' => SMOPT_REFRESH_NONE,
         'posvals' => array( 0 => _("Long:") . ' "' . _("Folder") . $delim . _("Subfolder") . '"',
-                            1 => _("Indented:") . ' "&nbsp;&nbsp;&nbsp;&nbsp;' . _("Subfolder") . '"',
-                            2 => _("Delimited:") . ' ".&nbsp;' . _("Subfolder") . '"'),
+                            1 => _("Indented:") . " \"$nbsp$nbsp$nbsp$nbsp" . _("Subfolder") . '"',
+                            2 => _("Delimited:") . " \".$nbsp" . _("Subfolder") . '"'),
         'htmlencoded' => true
     );
 
diff --git a/templates/default/label.tpl b/templates/default/label.tpl
new file mode 100644 (file)
index 0000000..b0f6bde
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+/**
+  * label.tpl
+  *
+  * Template for constructing a label tag.
+  *
+  * The following variables are available in this template:
+  *      + $for      - the ID to which the label applies (optional; may not be present)
+  *      + $text     - text (or other code) that goes inside the label
+  *      + $aAttribs - Any extra attributes: an associative array, where 
+  *                    keys are attribute names, and values (which are 
+  *                    optional and might be null) should be placed
+  *                    in double quotes as attribute values (optional; 
+  *                    may not be present)
+  *
+  * @copyright &copy; 1999-2006 The SquirrelMail Project Team
+  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
+  * @version $Id$
+  * @package squirrelmail
+  * @subpackage templates
+  */
+
+
+// retrieve the template vars
+//
+extract($t);
+
+
+echo '<label';
+if (!empty($for)) echo ' for="' . $for . '"';
+foreach ($aAttribs as $key => $value) {
+    echo ' ' . $key . (is_null($value) ? '' : '="' . $value . '"');
+}
+echo '>' . $text . '</label>';
+
+