diff --git a/etemplate/inc/class.ajax_select_widget.inc.php b/etemplate/inc/class.ajax_select_widget.inc.php index 3ab2a789d7..b03b547253 100644 --- a/etemplate/inc/class.ajax_select_widget.inc.php +++ b/etemplate/inc/class.ajax_select_widget.inc.php @@ -79,6 +79,7 @@ } // Get Options + $options = array(); if(!is_array($cell['size'])) { list( $options['get_rows'], @@ -110,6 +111,7 @@ } elseif($value[$options['id_field']]) { $current_value = $value[$options['id_field']]; } + $extension_data['old_value'] = $value; list($title_app, $title_class, $title_method) = explode('.', $options['get_title']); if($title_app && $title_class) { @@ -150,9 +152,12 @@ // Link if readonly & link is set $search =& $widget->get_widget_by_name('search'); if(($cell['readonly'] || $readonlys['search']) && $options['link']) { + $cell['readonly'] = false; + $readonlys['search'] = true; $search['type'] = 'label'; $search['no_lang'] = 1; $search['size'] = ',' . $options['link']; + $extension_data['readonly'] = true; } else { $search['type'] = 'text'; $search['size'] = ''; @@ -165,8 +170,8 @@ $cell['obj'] = &$widget; // Save options for post_processing - $extension_data = $options; - $extension_data['required'] = $cell['required']; + $extension_data['options'] = $options; + $extension_data['needed'] = $cell['needed']; // xajax $GLOBALS['egw_info']['flags']['include_xajax'] = True; @@ -189,14 +194,14 @@ function post_process($name,&$value,&$extension_data,&$loop,&$tmpl,$value_in) { - //echo "

ajax_select_widget.post_process: $name = "; _debug_array($value_in); + //echo "

ajax_select_widget.post_process: $name = "; _debug_array($value_in);_debug_array($extension_data); if(!is_array($value_in)) { - $value_in = array(); + $value_in = $extension_data['old_value']; } // They typed something in, but didn't choose a result if(!$value_in['value'] && $value_in['search']) { - list($get_rows_app, $get_rows_class, $get_rows_method) = explode('.', $extension_data['get_rows']); + list($get_rows_app, $get_rows_class, $get_rows_method) = explode('.', $extension_data['options']['get_rows']); if($get_rows_app && $get_rows_class) { if (is_object($GLOBALS[$get_rows_class])) { // use existing instance (put there by a previous CreateObject) $get_rows_obj =& $GLOBALS[$get_rows_class]; @@ -207,11 +212,11 @@ if(!is_object($get_rows_obj) || !method_exists($get_rows_obj, $get_rows_method)) { echo "$get_rows_app.$get_rows_class.$get_rows_method is not a valid method for getting the rows"; } else { - $query = array_merge($extension_data, $value_in); + $query = array_merge($extension_data['options'], $value_in); $count = $get_rows_obj->$get_rows_method($query, $results); if($count == 1) { - $value = $results[0][$extension_data['id_field']]; + $value = $results[0][$extension_data['options']['id_field']]; return true; } elseif ($count > 1) { $GLOBALS['egw_info']['etemplate']['validation_errors'][$name] = lang("More than 1 match for '%1'",$value_in['search']); @@ -223,11 +228,28 @@ } } } + } elseif ($extension_data['readonly']) { + $value = $extension_data['old_value']; + return true; } elseif ($value_in['search'] == '') { // They're trying to clear the form $value = null; - $loop = $GLOBALS['egw_info']['etemplate']['loop'] || $extension_data['required']; - return !$extension_data['required']; + + // True if not needed, false if needed and they gave no value + $return = !($extension_data['needed'] && trim($value_in['value']) == ''); + + if(!$return) { + $value = $extension_data['old_value']; + $GLOBALS['egw_info']['etemplate']['validation_errors'][$name] = lang('Required'); + } + + // Loop if some other widget wants to loop, or if this is required and they gave no value + $loop = $GLOBALS['egw_info']['etemplate']['loop'] || !$return; + + if($this->debug && $loop) { + echo 'Looping...
Returning ' . $return . '
'; + } + return $return; } else { $value = $value_in['value']; $loop = $GLOBALS['egw_info']['etemplate']['loop'] || false; diff --git a/etemplate/inc/class.uietemplate.inc.php b/etemplate/inc/class.uietemplate.inc.php index fc8df5393b..771d39e7c7 100644 --- a/etemplate/inc/class.uietemplate.inc.php +++ b/etemplate/inc/class.uietemplate.inc.php @@ -206,6 +206,7 @@ 'content' => $GLOBALS['egw_info']['etemplate']['content'], 'hook_content' => $GLOBALS['egw_info']['etemplate']['hook_content'], 'hook_app' => $GLOBALS['egw_info']['etemplate']['hook_app'], + 'extension_data' => $GLOBALS['egw_info']['etemplate']['extension_data'] ); //echo "

hooked=".(int)!!$GLOBALS['egw_info']['etemplate']['hooked'].", content=".(int)!!$GLOBALS['egw_info']['etemplate']['content'].", hook_content=".(int)!!$GLOBALS['egw_info']['etemplate']['hook_content'].", hook_app={$GLOBALS['egw_info']['etemplate']['hook_app']}

\n"; $this->name_form =& $GLOBALS['egw_info']['etemplate']['name_form'];