True ); /** * Instance of Template class * @var Template */ var $t; var $list_shown = False; var $show_help; var $has_help; var $prefix = ''; /** * Instance of business object * * @var bosettings */ var $bo; function __construct() { $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 = common::get_referer('/preferences/index.php'); // for framed templates, use the index page to return, instead of the referer if (strpos($referer,'cd=yes') !== false) { $referer = substr(egw_framework::index($_GET['appname']), strlen($GLOBALS['egw_info']['server']['webserver_url'])); } 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']) { 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 = new Template(common::get_tpl_dir('preferences'),'keep'); $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_block('preferences','section_row','section_rowhandle'); $this->t->set_var(array('rowhandle' => '','help_rowhandle' => '','messages' => '', 'section_rowhandle' => '')); $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 { 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($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'] && !$error) { $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('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']); } // display verifcation errors also on entering preferences, not only after saving if (!isset($_POST['save']) && !isset($_POST['apply'])) { if (!$this->is_admin() || !in_array($GLOBALS['type'], array('user', 'default', 'forced'))) { $GLOBALS['type'] = 'user'; } $ignore = array(); $error = $this->bo->process_array($ignore, $this->bo->prefs, array(), $GLOBALS['type'], true); } $this->t->set_var('messages',$error); 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_section($valarray['title'],'prefSubSection'); 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 'vfs_file': case 'vfs_dir': case 'vfs_dirs': $this->create_vfs_box( $valarray['type'], $valarray['label'], $valarray['name'], $valarray['help'], $valarray['default'], $valarray['size'], $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', $valarray['onchange'] ); 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; case 'color': $this->create_color_box( $valarray['label'], $valarray['name'], $valarray['default'], $valarray['help'], $valarray['run_lang'] // if run_lang is set and false $valarray['help'] is run through lang() ); break; } } $GLOBALS['egw_info']['flags']['app_header'] = ($this->is_admin() && (int) $_GET['account_id'] ? common::grab_owner_name((int) $_GET['account_id']).': ' : '').($_GET['appname'] == 'preferences' ? lang('Common preferences') : lang('%1 - Preferences',$GLOBALS['egw_info']['apps'][$_GET['appname']]['title'])); 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'] ? 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',common::create_tabs($tabs,$selected)); } else { $this->t->set_var('tabs',''); } $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"; 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_vfs_box($type,$label_name,$preference_name,$help='',$default='',$size='',$run_lang=True) { $_appname = $this->check_app(); if($this->is_forced_value($_appname,$preference_name)) { return True; } //echo "

create_input_box('$label_name', '$preference_name][$type', '$help', '$default', '$size', '', '', $run_lang, '$def_text')

\n"; $this->create_input_box($label_name,$preference_name.']['.$type, $help,$default,$size,'','',$run_lang,$def_text); } function create_color_box($label,$name,$default='',$help='',$run_lang=True) { if($GLOBALS['type'] == 'user') { $_appname = $this->check_app(); $def_text = !$GLOBALS['egw']->preferences->user[$_appname][$name] ? $GLOBALS['egw']->preferences->data[$_appname][$name] : $GLOBALS['egw']->preferences->default[$_appname][$name]; $def_text = preg_match('/^#[0-9A-F]{6}$/i',$def_text) ? '   '.lang('default').': '.$def_text.'' : ''; } $this->create_input_box($label,$name,$help,$default,'','','color',$run_lang,$def_text); } function create_input_box($label,$name,$help='',$default='',$size='',$max_size='',$type='',$run_lang=True,$def_text='') { $_appname = $this->check_app(); if($this->is_forced_value($_appname,$name)) { return True; } if($size) { $options .= " size='$size'"; } if($maxsize) { $options .= " max='$maxsize'"; } // remove appended type (eg. "][vfs_file") bevor looking up current value $_name = preg_replace('/\]\[.*$/','',$name); if(substr($name, -4) != '][pw' && isset($this->bo->prefs[$_name]) || $GLOBALS['type'] != 'user') { $default = $this->bo->prefs[$_name]; } if($GLOBALS['type'] == 'user' && empty($def_text)) { $def_text = $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',html::input($GLOBALS['type']."[$name]",$default,$type,$options).$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] = (string)(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 .= '