From 785bb1831b554c0bb3dd403ee66427f12a2345fa Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2010 09:33:51 +0000 Subject: [PATCH] only explode default value by comma, if we allow multiple values (otherwise defaults containing commas are never displayed, eg. addressbook link_title or fileas_type --- preferences/inc/class.uisettings.inc.php | 670 +++++++++++++++++++++++ 1 file changed, 670 insertions(+) create mode 100755 preferences/inc/class.uisettings.inc.php diff --git a/preferences/inc/class.uisettings.inc.php b/preferences/inc/class.uisettings.inc.php new file mode 100755 index 0000000000..e7c2fd4c7b --- /dev/null +++ b/preferences/inc/class.uisettings.inc.php @@ -0,0 +1,670 @@ + True); + var $t; + var $list_shown = False; + var $show_help; + var $has_help; + var $prefix = ''; + /** + * Instance of business object + * + * @var bosettings + */ + var $bo; + + function uisettings() + { + $this->bo =& CreateObject('preferences.bosettings',$_GET['appname']); + + if($GLOBALS['egw']->acl->check('run',1,'admin')) + { + /* Don't use a global variable for this ... */ + define('HAS_ADMIN_RIGHTS',1); + + if ((int) $_GET['account_id']) + { + $GLOBALS['egw']->preferences->account_id = (int) $_GET['account_id']; + $GLOBALS['egw']->preferences->read_repository(); + } + } + } + + + /** + * add nation ACL tab to Admin >> Edit user + */ + function edit_user() + { + global $menuData; + + $menuData[] = array( + 'description' => 'Preferences', + 'url' => '/index.php', + 'extradata' => 'menuaction=preferences.uisettings.index&appname=preferences' + ); + } + + function index() + { + // make preferences called via sidebox menu of an app, to behave like a part of that app + $referer = $GLOBALS['egw']->common->get_referer('/preferences/index.php'); + if (!preg_match('/(preferences.php|menuaction=preferences.uisettings.index)+/i',$referer)) + { + $this->bo->session_data['referer'] = $referer; + } + //echo '

'."referer='{$this->bo->session_data['referer']}'

\n"; + if (substr($this->bo->session_data['referer'],0,strlen('/preferences')) != '/preferences') + { + $GLOBALS['egw_info']['flags']['currentapp'] = $_GET['appname']; + } + if($_POST['cancel']) + { + $GLOBALS['egw']->redirect_link($this->bo->session_data['referer']); + } + if (substr($_SERVER['PHP_SELF'],-15) == 'preferences.php') + { + $pref_link = '/preferences/preferences.php'; + $link_params = array( + 'appname' => $_GET['appname'], + ); + } + else + { + $pref_link = '/index.php'; + $link_params = array( + 'menuaction' => 'preferences.uisettings.index', + 'appname' => $_GET['appname'], + ); + if ($this->is_admin() && (int) $_GET['account_id']) + { + $link_params['account_id'] = (int) $_GET['account_id']; + } + } + $user = get_var('user',Array('POST')); + $forced = get_var('forced',Array('POST')); + $default = get_var('default',Array('POST')); + + $this->t =& CreateObject('phpgwapi.Template',$GLOBALS['egw']->common->get_tpl_dir('preferences')); + $this->t->set_file(array( + 'preferences' => 'preferences.tpl' + )); + $this->t->set_block('preferences','list','lists'); + $this->t->set_block('preferences','row','rowhandle'); + $this->t->set_block('preferences','help_row','help_rowhandle'); + $this->t->set_var(array('rowhandle' => '','help_rowhandle' => '','messages' => '')); + + $this->prefix = get_var('prefix',array('GET'),$this->bo->session_data['appname'] == $_GET['appname'] ? $this->bo->session_data['prefix'] : ''); + + if($this->is_admin()) + { + /* This is where we will keep track of our postion. */ + /* Developers won't have to pass around a variable then */ + + $GLOBALS['type'] = get_var('type',Array('GET','POST'),$this->bo->session_data['type']); + + if(empty($GLOBALS['type'])) + { + $GLOBALS['type'] = 'user'; + } + } + else + { + $GLOBALS['type'] = 'user'; + } + $this->show_help = isset($this->bo->session_data['show_help']) && $this->bo->session_data['appname'] == $_GET['appname'] + ? $this->bo->session_data['show_help'] + : (int)$GLOBALS['egw_info']['user']['preferences']['common']['show_help']; + + if($toggle_help = get_var('toggle_help','POST')) + { + $this->show_help = (int)(!$this->show_help); + } + $this->has_help = 0; + + if($_POST['save'] || $_POST['apply']) + { + if ($this->bo->session_data['notifies']) // notifies NEED the translation for the application loaded + { + $GLOBALS['egw']->translation->add_app($_GET['appname']); + } + /* Don't use a switch here, we need to check some permissions during the ifs */ + if($GLOBALS['type'] == 'user' || !($GLOBALS['type'])) + { + $error = $this->bo->process_array($GLOBALS['egw']->preferences->user,$user,$this->bo->session_data['notifies'],$GLOBALS['type'],$this->prefix); + } + + if($GLOBALS['type'] == 'default' && $this->is_admin()) + { + $error = $this->bo->process_array($GLOBALS['egw']->preferences->default, $default,$this->bo->session_data['notifies'],$GLOBALS['type']); + } + + if($GLOBALS['type'] == 'forced' && $this->is_admin()) + { + $error = $this->bo->process_array($GLOBALS['egw']->preferences->forced, $forced,$this->bo->session_data['notifies'],$GLOBALS['type']); + } + + if (is_array($error)) $error = false; // process_array returns the prefs-array on success + + if(!$this->is_admin() || $error) + { + $GLOBALS['egw']->redirect_link($this->bo->session_data['referer']); + } + + if($GLOBALS['type'] == 'user' && $_GET['appname'] == 'preferences' && $user['show_help'] != '') + { + $this->show_help = $user['show_help']; // use it, if admin changes his help-prefs + } + if($_POST['save']) + { + $GLOBALS['egw']->redirect_link($this->bo->session_data['referer']); + } + } + + // save our state in the app-session + $this->bo->save_session($_GET['appname'],$GLOBALS['type'],$this->show_help,$this->prefix); + + // changes for the admin itself, should have immediate feedback ==> redirect + if(!$error && ($_POST['save'] || $_POST['apply']) && $GLOBALS['type'] == 'user' && $_GET['appname'] == 'preferences') + { + $GLOBALS['egw']->redirect_link($pref_link,$link_params); + } + + $this->t->set_var('messages',$error); + $this->t->set_var('action_url',$GLOBALS['egw']->link($pref_link,$link_params)); + $this->t->set_var('th_bg', $GLOBALS['egw_info']['theme']['th_bg']); + $this->t->set_var('th_text',$GLOBALS['egw_info']['theme']['th_text']); + $this->t->set_var('row_on', $GLOBALS['egw_info']['theme']['row_on']); + $this->t->set_var('row_off',$GLOBALS['egw_info']['theme']['row_off']); + + $this->bo->read($this->check_app(),$this->prefix,$GLOBALS['type']); + //echo "prefs=
"; print_r($this->bo->prefs); echo "
\n"; + + $this->notifies = array(); + if(!$this->bo->call_hook($_GET['appname'])) + { + throw new egw_exception_wrong_parameter("Could not find settings for application: ".$_GET['appname']); + } + + foreach($this->bo->settings as $key => $valarray) + { + if(!$this->is_admin()) + { + if($valarray['admin']) + { + continue; + } + } + unset($valarray['default']); // not longer used as default, since we have default prefs + switch($valarray['type']) + { + case 'section': + $this->create_section($valarray['title']); + break; + case 'subsection': + $this->create_subsection($valarray['title']); + break; + case 'input': + $this->create_input_box( + $valarray['label'], + $valarray['name'], + $valarray['help'], + $valarray['default'], + $valarray['size'], + $valarray['maxsize'], + $valarray['type'], + $valarray['run_lang'] // if run_lang is set and false $valarray['help'] is run through lang() + ); + break; + case 'password': + $this->create_password_box( + $valarray['label'], + $valarray['name'], + $valarray['help'], + $valarray['size'], + $valarray['maxsize'], + $valarray['run_lang'] + ); + break; + case 'text': + $this->create_text_area( + $valarray['label'], + $valarray['name'], + $valarray['rows'], + $valarray['cols'], + $valarray['help'], + $valarray['default'], + $valarray['run_lang'] + ); + break; + case 'select': + case 'multiselect': + $this->create_select_box( + $valarray['label'], + $valarray['name'], + $valarray['values'], + $valarray['help'], + $valarray['default'], + $valarray['run_lang'], + $valarray['type'] == 'multiselect' + ); + break; + case 'check': + $this->create_check_box( + $valarray['label'], + $valarray['name'], + $valarray['help'], + $valarray['default'], + $valarray['run_lang'] + ); + break; + case 'notify': + $this->create_notify( + $valarray['label'], + $valarray['name'], + $valarray['rows'], + $valarray['cols'], + $valarray['help'], + $valarray['default'], + $valarray['values'], + $valarray['subst_help'], + $valarray['run_lang'] + ); + break; + } + } + + $GLOBALS['egw_info']['flags']['app_header'] = ($this->is_admin() && (int) $_GET['account_id'] ? + $GLOBALS['egw']->common->grab_owner_name((int) $_GET['account_id']).': ' : '').($_GET['appname'] == 'preferences' ? + lang('Common preferences') : lang('%1 - Preferences',$GLOBALS['egw_info']['apps'][$_GET['appname']]['title'])); + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + + if(count($this->notifies)) // there have been notifies in the hook, we need to save in the session + { + $this->bo->save_session($_GET['appname'],$GLOBALS['type'],$this->show_help,$this->prefix,$this->notifies); + //echo "notifies="; _debug_array($this->notifies); + } + if($this->is_admin()) + { + if ((int) $_GET['account_id']) + { + echo '\n
'."\n".ExecMethod('admin.uimenuclass.createHTMLCode','edit_user')."\n". + '

'. + lang('Common preferences')."

\n"; + } + $tabs[] = array( + 'label' => (int) $_GET['account_id'] ? $GLOBALS['egw']->common->grab_owner_name($_GET['account_id']) : lang('Your preferences'), + 'link' => $GLOBALS['egw']->link($pref_link,$link_params+array('type'=>'user')), + ); + $tabs[] = array( + 'label' => lang('Default preferences'), + 'link' => $GLOBALS['egw']->link($pref_link,$link_params+array('type'=>'default')), + ); + $tabs[] = array( + 'label' => lang('Forced preferences'), + 'link' => $GLOBALS['egw']->link($pref_link,$link_params+array('type'=>'forced')), + ); + + switch($GLOBALS['type']) + { + case 'user': $selected = 0; break; + case 'default': $selected = 1; break; + case 'forced': $selected = 2; break; + } + $this->t->set_var('tabs',$GLOBALS['egw']->common->create_tabs($tabs,$selected)); + } + $this->t->set_var('lang_save', lang('save')); + $this->t->set_var('lang_apply', lang('apply')); + $this->t->set_var('lang_cancel', lang('cancel')); + $this->t->set_var('show_help',(int)$this->show_help); + $this->t->set_var('help_button',$this->has_help ? '' : ''); + + if(!$this->list_shown) + { + $this->show_list(); + } + $this->t->pfp('phpgw_body','preferences'); + + if($this->is_admin() && (int) $_GET['account_id']) + { + echo "\n
\n"; + } + //echo '
'; print_r($GLOBALS['egw']->preferences->data); echo "
\n"; + + $GLOBALS['egw']->common->egw_footer(); + } + + /* Make things a little easier to follow */ + /* Some places we will need to change this if they're in common */ + function check_app() + { + if($_GET['appname'] == 'preferences') + { + return 'common'; + } + else + { + return $_GET['appname']; + } + } + + function is_forced_value($_appname,$preference_name) + { + if(isset($GLOBALS['egw']->preferences->forced[$_appname][$preference_name]) && $GLOBALS['type'] != 'forced') + { + return True; + } + else + { + return False; + } + } + + function create_password_box($label_name,$preference_name,$help='',$size='',$max_size='',$run_lang=True) + { + $_appname = $this->check_app(); + if($this->is_forced_value($_appname,$preference_name)) + { + return True; + } + $this->create_input_box($label_name,$preference_name. + ($GLOBALS['type'] != 'user' ? '' : '][pw'), // we need to show the default or forced pw, otherwise we are never able to reset it + $help,'',$size,$max_size,'password',$run_lang); + } + + function create_input_box($label,$name,$help='',$default='',$size='',$max_size='',$type='',$run_lang=True) + { + $charSet = $GLOBALS['egw']->translation->charset(); + + $_appname = $this->check_app(); + if($this->is_forced_value($_appname,$name)) + { + return True; + } + + if($type) // used to specify password + { + $options = " TYPE='$type'"; + } + if($size) + { + $options .= " SIZE='$size'"; + } + if($maxsize) + { + $options .= " MAXSIZE='$maxsize'"; + } + + if(isset($this->bo->prefs[$name]) || $GLOBALS['type'] != 'user') + { + $default = $this->bo->prefs[$name]; + } + + if($GLOBALS['type'] == 'user') + { + $def_text = !$GLOBALS['egw']->preferences->user[$_appname][$name] ? $GLOBALS['egw']->preferences->data[$_appname][$name] : $GLOBALS['egw']->preferences->default[$_appname][$name]; + + if(isset($this->notifies[$name])) // translate the substitution names + { + $def_text = $GLOBALS['egw']->preferences->lang_notify($def_text,$this->notifies[$name]); + } + $def_text = $def_text != '' ? ' '.lang('default').': '.$def_text.'' : ''; + } + $this->t->set_var('row_value',"$def_text"); + $this->t->set_var('row_name',$run_lang !== -1 ? lang($label) : $label); + $GLOBALS['egw']->nextmatchs->template_alternate_row_color($this->t); + + $this->t->fp('rows',$this->process_help($help,$run_lang) ? 'help_row' : 'row',True); + } + + function process_help($help,$run_lang=True) + { + if(!empty($help)) + { + $this->has_help = True; + + if($this->show_help) + { + $this->t->set_var('help_value',is_null($run_lang) || $run_lang ? lang($help) : $help); + + return True; + } + } + return False; + } + + function create_check_box($label,$name,$help='',$default='',$run_lang=True) + { + // checkboxes itself can't be use as they return nothing if uncheckt !!! + + if($GLOBALS['type'] != 'user') + { + $default = ''; // no defaults for default or forced prefs + } + if(isset($this->bo->prefs[$name])) + { + $this->bo->prefs[$name] = (int)(!!$this->bo->prefs[$name]); // to care for '' and 'True' + } + + return $this->create_select_box($label,$name,array( + '0' => lang('No'), + '1' => lang('Yes') + ),$help,$default,$run_lang); + } + + function create_option_string($selected,$values) + { + while(is_array($values) && list($var,$value) = each($values)) + { + $s .= '