diff --git a/etemplate/inc/class.etemplate_widget_menupopup.inc.php b/etemplate/inc/class.etemplate_widget_menupopup.inc.php index 0581bef789..bcb64d42f5 100644 --- a/etemplate/inc/class.etemplate_widget_menupopup.inc.php +++ b/etemplate/inc/class.etemplate_widget_menupopup.inc.php @@ -186,6 +186,7 @@ class etemplate_widget_menupopup extends etemplate_widget * Fix already html-encoded options, eg. "&nbps" * * @param array $options + * @param boolean $use_array_of_options Re-indexes options, making everything more complicated */ public static function fix_encoded_options(array &$options, $use_array_of_objects=null) { @@ -193,6 +194,25 @@ class etemplate_widget_menupopup extends etemplate_widget foreach($options as $value => &$label) { + // Of course once we re-index the options, we can't detect duplicates + // so check here, as we re-index + // Duplicates might happen if app programmer isn't paying attention and + // either uses the same ID in the template, or adds the options twice + if(is_numeric($value) && is_array($label) && !array_key_exists('value',$label)) + { + $check_value = array_key_exists('value', $label) ? $label['value'] : $value; + if($value == $check_value) + { + foreach($options as $key => $existing) + { + if(is_array($existing) && $existing['value'] == $check_value && $key != $value) + { + unset($options[$value]); + continue 2; + } + } + } + } if (is_null($use_array_of_objects) && is_numeric($value)) { $options = $backup_options;