From f76c6eedd7eefb35838c6fd84be80af400ff2160 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 28 Aug 2003 14:16:30 +0000 Subject: [PATCH] make the phpgw Version-0_9_16-branch HEAD --- about.php | 182 +- addressbook/admin.php | 69 + addressbook/csv_import.php | 150 +- addressbook/debian/changelog | 6 - addressbook/debian/control | 15 - addressbook/debian/copyright | 15 - addressbook/debian/rules | 74 - addressbook/doc/copyright.gpl | 340 ---- addressbook/help/DE/addressbook.php | 59 + addressbook/help/EN/add.php | 55 - addressbook/help/EN/addressbook.php | 56 + addressbook/help/EN/list.php | 52 - addressbook/help/EN/overview.php | 34 - addressbook/help/FI/addressbook.php | 1 + addressbook/help/JA/addressbook.php | 2 + .../tables_current.inc.php => help/index.php} | 30 +- addressbook/inc/class.boXport.inc.php | 90 +- addressbook/inc/class.boaddressbook.inc.php | 143 +- addressbook/inc/class.remote.inc.php | 134 -- addressbook/inc/class.soaddressbook.inc.php | 16 +- addressbook/inc/class.uiXport.inc.php | 156 +- addressbook/inc/class.uiaddressbook.inc.php | 1074 +++++------- addressbook/inc/class.uifields.inc.php | 24 +- addressbook/inc/class.uivcard.inc.php | 67 +- addressbook/inc/functions.inc.php | 20 +- addressbook/inc/hook_admin.inc.php | 30 +- addressbook/inc/hook_help.inc.php | 41 - addressbook/inc/hook_home.inc.php | 91 +- addressbook/inc/hook_manual.inc.php | 19 + addressbook/inc/hook_notifywindow.inc.php | 3 +- addressbook/index.php | 12 +- addressbook/setup/phpgw_de.lang | 205 +-- addressbook/setup/phpgw_en.lang | 14 +- addressbook/setup/phpgw_es.lang | 8 - addressbook/setup/phpgw_fr.lang | 16 +- addressbook/setup/phpgw_ja.lang | 2 +- addressbook/setup/setup.inc.php | 52 +- addressbook/setup/tables_baseline.inc.php | 14 - addressbook/setup/tables_update.inc.php | 36 - addressbook/templates/default/about.tpl | 16 + addressbook/templates/default/add.tpl | 13 +- addressbook/templates/default/config.tpl | 34 +- addressbook/templates/default/csv_import.tpl | 22 +- addressbook/templates/default/delete.tpl | 7 +- addressbook/templates/default/edit.tpl | 11 +- addressbook/templates/default/export.tpl | 8 +- addressbook/templates/default/form.tpl | 73 +- addressbook/templates/default/help_data.xsl | 185 -- .../templates/default/images/help_add.jpg | Bin 139360 -> 0 bytes .../templates/default/images/help_list.jpg | Bin 107234 -> 0 bytes .../templates/default/images/navbar.png | Bin 1254 -> 1401 bytes addressbook/templates/default/import.tpl | 18 +- addressbook/templates/default/index.tpl | 47 +- addressbook/templates/default/listfields.tpl | 10 +- .../templates/default/preference_acl_row.tpl | 2 +- .../templates/default/preference_colspan.tpl | 8 +- addressbook/templates/default/preferences.tpl | 38 +- addressbook/templates/default/view.tpl | 4 +- addressbook/templates/idots/images/navbar.png | Bin 0 -> 2967 bytes admin/acl2_tester.php | 113 -- admin/debian/changelog | 6 - admin/debian/control | 16 - admin/debian/copyright | 15 - admin/debian/rules | 74 - admin/doc/adminconfig.dvi | Bin 8304 -> 11588 bytes admin/doc/adminconfig.lyx | 34 +- admin/doc/adminconfig.pdf | Bin 10473 -> 19265 bytes admin/doc/adminconfig.ps | 391 +++-- admin/doc/adminconfig.sgml | 14 +- admin/doc/adminconfig.txt | 150 +- admin/help/DE/account.php | 32 + admin/help/DE/admin.php | 54 + admin/help/DE/other.php | 33 + admin/help/DE/session.php | 35 + admin/help/EN/account.php | 1 + admin/help/EN/admin.php | 1 + admin/help/EN/other.php | 1 + admin/help/EN/session.php | 1 + admin/help/FI/account.php | 1 + admin/help/FI/admin.php | 1 + admin/help/FI/other.php | 1 + admin/help/FI/session.php | 1 + admin/help/JA/account.php | 1 + admin/help/JA/admin.php | 1 + admin/help/JA/other.php | 1 + admin/help/JA/session.php | 1 + admin/help/index.php | 1 + admin/inc/class.boaccounts.inc.php | 686 ++++---- admin/inc/class.bocategories.inc.php | 57 +- admin/inc/class.soaccounts.inc.php | 41 +- admin/inc/class.soapplications.inc.php | 6 +- admin/inc/class.uiaccess_history.inc.php | 14 +- admin/inc/class.uiaccounts.inc.php | 1524 +++++++++-------- admin/inc/class.uiaclmanager.inc.php | 108 +- admin/inc/class.uiapplications.inc.php | 179 +- admin/inc/class.uicategories.inc.php | 585 ++++--- admin/inc/class.uiconfig.inc.php | 70 +- admin/inc/class.uicurrentsessions.inc.php | 36 +- admin/inc/class.uilog.inc.php | 6 + admin/inc/class.uimainscreen.inc.php | 135 +- admin/inc/class.uimenuclass.inc.php | 8 +- admin/inc/class.uiserver.inc.php | 171 +- admin/inc/hook_acl_manager.inc.php | 43 +- admin/inc/hook_admin.inc.php | 22 +- admin/inc/hook_after_navbar.inc.php | 25 +- admin/inc/hook_config.inc.php | 104 ++ admin/inc/hook_sidebox_menu.inc.php | 95 + admin/inc/hook_view_account.inc.php | 30 - admin/inc/hook_view_user.inc.php | 25 - admin/index.php | 101 +- admin/navbar-create.php | 2 + admin/phpinfo.php | 18 +- admin/templates/default/accesslog.tpl | 10 +- admin/templates/default/account_form.tpl | 93 + admin/templates/default/account_form_ldap.tpl | 125 +- admin/templates/default/accounts.tpl | 62 + admin/templates/default/acl_accounts.tpl | 4 +- admin/templates/default/acl_applist.tpl | 10 +- admin/templates/default/acl_manager_form.tpl | 21 +- admin/templates/default/app_data.xsl | 92 - admin/templates/default/application_form.tpl | 18 +- admin/templates/default/applications.tpl | 20 +- admin/templates/default/category_form.tpl | 28 + admin/templates/default/cats.xsl | 210 --- admin/templates/default/config.tpl | 115 +- admin/templates/default/config_footer.tpl | 2 +- admin/templates/default/config_head.tpl | 2 +- admin/templates/default/currentusers.tpl | 8 +- admin/templates/default/delete_cat.tpl | 35 + admin/templates/default/delete_common.tpl | 12 +- admin/templates/default/group_form.tpl | 79 + admin/templates/default/group_manager.tpl | 6 +- admin/templates/default/groups.tpl | 50 + admin/templates/default/groups.xsl | 244 --- admin/templates/default/images/navbar.png | Bin 1354 -> 1497 bytes admin/templates/default/index.tpl | 51 + admin/templates/default/kill_session.tpl | 4 +- admin/templates/default/listcats.tpl | 53 + admin/templates/default/listservers.tpl | 44 +- .../templates/default/mainscreen_message.tpl | 8 +- admin/templates/default/menurow.tpl | 6 +- admin/templates/default/nntp.tpl | 6 +- admin/templates/default/server_form.tpl | 75 +- admin/templates/default/users.xsl | 288 ---- admin/templates/idots/images/navbar.png | Bin 0 -> 2966 bytes admin/templates/idots/index.tpl | 51 + admin/templates/verdilak/images/navbar.gif | Bin 0 -> 1376 bytes admin/templates/verdilak/images/navbar.png | Bin 0 -> 1497 bytes admin/testbutton.php | 2 + favicon.ico | Bin 3890 -> 0 bytes header.inc.php.template | 6 - help.php | 43 - home.php | 182 +- index.php | 23 +- login.php | 171 +- logout.php | 24 +- notify.php | 11 +- notify_simple.php | 3 +- set_box.php | 14 +- soap.php | 1 - xmlrpc.php | 296 +++- 161 files changed, 5417 insertions(+), 6165 deletions(-) create mode 100644 addressbook/admin.php delete mode 100644 addressbook/debian/changelog delete mode 100644 addressbook/debian/control delete mode 100644 addressbook/debian/copyright delete mode 100755 addressbook/debian/rules delete mode 100644 addressbook/doc/copyright.gpl create mode 100644 addressbook/help/DE/addressbook.php delete mode 100644 addressbook/help/EN/add.php create mode 100755 addressbook/help/EN/addressbook.php delete mode 100644 addressbook/help/EN/list.php delete mode 100644 addressbook/help/EN/overview.php rename addressbook/{setup/tables_current.inc.php => help/index.php} (50%) mode change 100644 => 100755 delete mode 100644 addressbook/inc/class.remote.inc.php delete mode 100644 addressbook/inc/hook_help.inc.php create mode 100755 addressbook/inc/hook_manual.inc.php delete mode 100644 addressbook/setup/tables_baseline.inc.php delete mode 100644 addressbook/setup/tables_update.inc.php create mode 100644 addressbook/templates/default/about.tpl delete mode 100644 addressbook/templates/default/help_data.xsl delete mode 100644 addressbook/templates/default/images/help_add.jpg delete mode 100644 addressbook/templates/default/images/help_list.jpg create mode 100755 addressbook/templates/idots/images/navbar.png delete mode 100644 admin/acl2_tester.php delete mode 100644 admin/debian/changelog delete mode 100644 admin/debian/control delete mode 100644 admin/debian/copyright delete mode 100755 admin/debian/rules create mode 100644 admin/help/DE/account.php create mode 100644 admin/help/DE/admin.php create mode 100644 admin/help/DE/other.php create mode 100644 admin/help/DE/session.php create mode 100644 admin/inc/hook_config.inc.php create mode 100644 admin/inc/hook_sidebox_menu.inc.php delete mode 100644 admin/inc/hook_view_account.inc.php delete mode 100755 admin/inc/hook_view_user.inc.php create mode 100644 admin/templates/default/account_form.tpl create mode 100644 admin/templates/default/accounts.tpl delete mode 100644 admin/templates/default/app_data.xsl create mode 100644 admin/templates/default/category_form.tpl delete mode 100644 admin/templates/default/cats.xsl create mode 100644 admin/templates/default/delete_cat.tpl create mode 100644 admin/templates/default/group_form.tpl create mode 100644 admin/templates/default/groups.tpl delete mode 100644 admin/templates/default/groups.xsl create mode 100755 admin/templates/default/index.tpl create mode 100644 admin/templates/default/listcats.tpl delete mode 100644 admin/templates/default/users.xsl create mode 100755 admin/templates/idots/images/navbar.png create mode 100644 admin/templates/idots/index.tpl create mode 100755 admin/templates/verdilak/images/navbar.gif create mode 100644 admin/templates/verdilak/images/navbar.png delete mode 100644 favicon.ico delete mode 100644 help.php diff --git a/about.php b/about.php index fefaa531b8..6353e9f64c 100644 --- a/about.php +++ b/about.php @@ -1,78 +1,128 @@ xslttpl->add_file(array('about')); - - if ($app == 'phpGroupWare' || $app == 'about') + if ($app) { - $app = 'phpgwapi'; - } - - $setup_file = PHPGW_INCLUDE_ROOT . '/' . $app . '/setup/setup.inc.php'; - - if (@file_exists($setup_file)) - { - include($setup_file); - - $fields = array - ( - 'version', - 'description', - 'note', - 'author', - 'license', - 'based_on', - 'maintainer' - ); - while (list(,$field) = each($fields)) + if (!($included = $GLOBALS['phpgw']->hooks->single('about',$app))) { - $app_data[$field] = $setup_info[$app][$field]; - - if ($field == 'description') - { - $app_data[$field] = lang($setup_info[$app][$field]); - } - } - - if (isset($app_data['note']) && !empty($app_data['note'])) - { - $app_data['note'] = lang($app_data['note']); - } - } - - $data = array - ( - 'phpgw_logo' => $GLOBALS['phpgw']->common->get_image_path('phpgwapi'), - 'lang_url_statustext' => lang('phpGroupWare --> homepage'), - 'lang_version' => lang('version'), - 'phpgw_version' => 'phpGroupWare API ' . $GLOBALS['phpgw_info']['server']['versions']['phpgwapi'], - 'phpgw_descr' => lang('is a multi-user, web-based groupware suite written in PHP'), - 'about_app' => $app_data + array - ( - 'title' => lang($app), - 'icon' => $GLOBALS['phpgw']->common->image($app,'navbar','',True), - 'lang_version' => lang('version'), - 'lang_author' => lang('author'), - 'lang_based_on' => lang('based on'), - 'lang_maintainer' => lang('maintainer'), - 'lang_license' => lang('license') - ) +function about_app() +{ + global $app; + $icon = $GLOBALS['phpgw']->common->image($app,'navbar.gif'); + include (PHPGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php"); + $info = $setup_info[$app]; + $info['title'] = $GLOBALS['phpgw_info']['apps'][$app]['title']; + $other_infos = array( + 'author' => lang('Author'), + 'maintainer' => lang('Maintainer'), + 'version' => lang('Version'), + 'license' => lang('License') ); - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('about_data' => $data)); + $s = "\n"; + + if ($info['description']) + { + $info['description'] = lang($info['description']); + $s .= "\n"; + if ($info['note']) + { + $info['note'] = lang($info['note']); + $s .= "\n"; + } + } + foreach ($other_infos as $key => $val) + { + if (isset($info[$key])) + { + $s .= "\n"; + } + } + $s .= "
$info[title]
$info[description]
$info[note]
$val"; + $infos = $info[$key]; + for ($n = 0; is_array($info[$key][$n]) && ($infos = $info[$key][$n]) || !$n; ++$n) + { + if (!is_array($infos) && isset($info[$key.'_email'])) + { + $infos = array('email' => $info[$key.'_email'],'name' => $infos); + } + if (is_array($infos)) + { + $names = explode('
',$infos['name']); + $emails = split('@|
',$infos['email']); + if (count($names) < count($emails)/2) + { + $names = ''; + } + $infos = ''; + while (list($user,$domain) = $emails) + { + if ($infos) $infos .= '
'; + $name = $names ? array_shift($names) : $user; + $infos .= "$name"; + array_shift($emails); array_shift($emails); + } + } + $s .= ($n ? '
' : '') . $infos; + } + $s .= "
\n"; + + return $s; +} + $api_only = !($included = file_exists(PHPGW_INCLUDE_ROOT . "/$app/setup/setup.inc.php")); + } + } + else + { + $api_only = True; + } + + $tpl = CreateObject('phpgwapi.Template',$GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi')); + $tpl->set_file(array( + 'phpgw_about' => 'about.tpl', + 'phpgw_about_unknown' => 'about_unknown.tpl' + )); + + $tpl->set_var('webserver_url',$GLOBALS['phpgw']->common->get_image_path('phpgwapi')); + $tpl->set_var('phpgw_version','phpGroupWare API version ' . $GLOBALS['phpgw_info']['server']['versions']['phpgwapi']); + if ($included) + { + $tpl->set_var('phpgw_app_about',about_app('','')); + //about_app($tpl,"phpgw_app_about"); + } + else + { + if ($api_only) + { + $tpl->set_var('phpgw_app_about',''); + } + else + { + $tpl->set_var('app_header',$app); + $tpl->parse('phpgw_app_about','phpgw_about_unknown'); + } + } + + $title = isset($GLOBALS['phpgw_info']['apps'][$app]) ? $GLOBALS['phpgw_info']['apps'][$app]['title'] : 'phpGroupWare'; + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('About %1',$title); + $GLOBALS['phpgw']->common->phpgw_header(); + $tpl->pparse('out','phpgw_about'); + $GLOBALS['phpgw']->common->phpgw_footer(); ?> diff --git a/addressbook/admin.php b/addressbook/admin.php new file mode 100644 index 0000000000..78ac03a64e --- /dev/null +++ b/addressbook/admin.php @@ -0,0 +1,69 @@ + 'addressbook', + 'noheader' => True, + 'nonavbar' => True, + 'noappheader' => True, + 'noappfooter' => True, + 'enable_config_class' => True, + 'enable_nextmatchs_class' => True + ); + + include('../header.inc.php'); + + $phpgw->config->read_repository(); + + if ($submit) + { + if ($usecountrylist) + { + $phpgw->config->config_data['countrylist'] = True; + } + else + { + unset($phpgw->config->config_data['countrylist']); + } + + $phpgw->config->save_repository(True); + Header('Location: ' . $phpgw->link('/admin/index.php')); + } + + $phpgw->common->phpgw_header(); + echo parse_navbar(); + + $t = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $t->set_file(array('admin' => 'admin.tpl')); + + $t->set_var('action_url',$phpgw->link('/addressbook/admin.php')); + + $tr_color = $phpgw->nextmatchs->alternate_row_color($tr_color); + $t->set_var('tr_color',$tr_color); + + $t->set_var('lang_countrylist',lang('Use Country List')); + if ($phpgw->config->config_data['countrylist']) + { + $t->set_var('countrylist',' checked'); + } + else + { + $t->set_var('countrylist',''); + } + + $t->set_var('lang_admin',lang('Addressbook').' '.lang('Admin')); + $t->set_var('lang_submit',lang('submit')); + + $t->pparse('out','admin'); + $phpgw->common->phpgw_footer(); +?> diff --git a/addressbook/csv_import.php b/addressbook/csv_import.php index 7718b015c9..01cacefa28 100644 --- a/addressbook/csv_import.php +++ b/addressbook/csv_import.php @@ -12,27 +12,32 @@ /* $Id$ */ - $GLOBALS['phpgw_info'] = array(); - $GLOBALS['phpgw_info']['flags']['currentapp'] = 'addressbook'; - $GLOBALS['phpgw_info']['flags']['enable_contacts_class'] = True; + $GLOBALS['phpgw_info']['flags'] = array( + 'currentapp' => 'addressbook', + 'noheader' => True, + 'enable_contacts_class' => True, + ); include('../header.inc.php'); + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Import CSV-File into Addressbook'); + $GLOBALS['phpgw']->common->phpgw_header(); + $GLOBALS['phpgw']->contacts = createobject('phpgwapi.contacts'); - $GLOBALS['phpgw']->template->set_file(array('import_t' => 'csv_import.tpl')); - $GLOBALS['phpgw']->template->set_block('import_t','filename'); - $GLOBALS['phpgw']->template->set_block('import_t','fheader'); - $GLOBALS['phpgw']->template->set_block('import_t','fields'); - $GLOBALS['phpgw']->template->set_block('import_t','ffooter'); - $GLOBALS['phpgw']->template->set_block('import_t','imported'); - $GLOBALS['phpgw']->template->set_block('import_t','import'); + $GLOBALS['phpgw']->template->set_file(array('import' => 'csv_import.tpl')); + $GLOBALS['phpgw']->template->set_block('import','filename','filenamehandle'); + $GLOBALS['phpgw']->template->set_block('import','fheader','fheaderhandle'); + $GLOBALS['phpgw']->template->set_block('import','fields','fieldshandle'); + $GLOBALS['phpgw']->template->set_block('import','ffooter','ffooterhandle'); + $GLOBALS['phpgw']->template->set_block('import','imported','importedhandle'); - if($action == 'download' && (!$fieldsep || !$csvfile || !($fp=fopen($csvfile,'rb')))) + $csvfile = isset($_POST['csvfile']) ? $_POST['csvfile'] : $_FILES['csvfile']['tmp_name']; + + if($_POST['action'] == 'download' && (!$_POST['fieldsep'] || !$csvfile || !($fp=fopen($csvfile,'rb')))) { - $action = ''; + $_POST['action'] = ''; } $GLOBALS['phpgw']->template->set_var('action_url',$GLOBALS['phpgw']->link('/addressbook/csv_import.php')); - $GLOBALS['phpgw']->template->set_var('lang_addr_action',lang('Import CSV-File into Addressbook')); $PSep = '||'; // Pattern-Separator, separats the pattern-replacement-pairs in trans $ASep = '|>'; // Assignment-Separator, separats pattern and replacesment @@ -125,18 +130,18 @@ return $id_str; } - switch($action) + switch($_POST['action']) { case '': // Start, ask Filename $GLOBALS['phpgw']->template->set_var('lang_csvfile',lang('CSV-Filename')); $GLOBALS['phpgw']->template->set_var('lang_fieldsep',lang('Fieldseparator')); - $GLOBALS['phpgw']->template->set_var('fieldsep',$fieldsep ? $fieldsep : ','); + $GLOBALS['phpgw']->template->set_var('fieldsep',$_POST['fieldsep'] ? $_POST['fieldsep'] : ','); $GLOBALS['phpgw']->template->set_var('submit',lang('Download')); $GLOBALS['phpgw']->template->set_var('csvfile',$csvfile); $GLOBALS['phpgw']->template->set_var('enctype','ENCTYPE="multipart/form-data"'); $hiddenvars .= ''."\n"; - $GLOBALS['phpgw']->template->parse('rows','filename'); + $GLOBALS['phpgw']->template->parse('filenamehandle','filename'); break; case 'download': @@ -151,9 +156,9 @@ $GLOBALS['phpgw']->template->set_var('lang_translation',lang("Translation").' '.lang('help').''); $GLOBALS['phpgw']->template->set_var('submit',lang('Import')); $GLOBALS['phpgw']->template->set_var('lang_debug',lang('Test Import (show importable records only in browser)')); - $GLOBALS['phpgw']->template->parse('rows','fheader'); + $GLOBALS['phpgw']->template->parse('fheaderhandle','fheader'); $hiddenvars .= ''."\n" - . '\n"; + . '\n"; $addr_names = $GLOBALS['phpgw']->contacts->stock_contact_fields + array( 'cat_id' => 'Categories: @cat_id(Cat1,Cat2)', @@ -161,8 +166,7 @@ 'owner' => 'Owner: defaults to user', 'address2' => 'address line 2', 'address3' => 'address line 3', - 'ophone' => 'Other Phone', - 'ab_id' => 'Address Id: @addr_id(n_family,n_given,org_name)' + 'ophone' => 'Other Phone' ); $config = CreateObject('phpgwapi.config','addressbook'); $config->read_repository(); @@ -172,7 +176,7 @@ } unset($config); - while(list($field,$name) = each($addr_names)) + foreach($addr_names as $field => $name) { if($dn = display_name($field)) { @@ -180,23 +184,22 @@ } } $addr_name_options = "'; } - $GLOBALS['phpgw']->template->set_var('lang_cancel',lang('Cancel')); - $GLOBALS['phpgw']->template->set_var('lang_cat',lang('Select Category')); - $GLOBALS['phpgw']->template->set_var('cancel_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $GLOBALS['phpgw']->template->set_var('conversion',lang('Select the type of conversion')); - $GLOBALS['phpgw']->template->set_var('export_path',lang('Enter the path to the export file here')); - $GLOBALS['phpgw']->template->set_var('navbar_bg',$GLOBALS['phpgw_info']['theme']['navbar_bg']); - $GLOBALS['phpgw']->template->set_var('navbar_text',$GLOBALS['phpgw_info']['theme']['navbar_text']); - $GLOBALS['phpgw']->template->set_var('mark_private',lang('Mark records as private')); - $GLOBALS['phpgw']->template->set_var('help_import',lang('In Netscape, open the Addressbook and select Export from the File menu.
The file exported will be in LDIF format.

Or, in Outlook, select your Contacts folder, select Import and Export... from')); - $GLOBALS['phpgw']->template->set_var('help_import2',lang('the File menu and export your contacts into a comma separated text (CSV) file.

Or, in Palm Desktop 4.0 or greater, visit your addressbook and select Export from the File menu. The file exported will be in VCard format.

')); - $GLOBALS['phpgw']->template->set_var('none',lang('none')); - $GLOBALS['phpgw']->template->set_var('debug_browser',lang('Debug output in browser')); - $GLOBALS['phpgw']->template->set_var('import_text',lang('Import from LDIF, CSV, or VCard')); - $GLOBALS['phpgw']->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.import')); - $GLOBALS['phpgw']->template->set_var('cat_link',$this->cat_option($this->cat_id,True,False)); - $GLOBALS['phpgw']->template->set_var('tsvfilename',''); - $GLOBALS['phpgw']->template->set_var('conv',$conv); - $GLOBALS['phpgw']->template->set_var('debug',lang('Debug output in browser')); - $GLOBALS['phpgw']->template->set_var('filetype',lang('LDIF')); - $GLOBALS['phpgw']->template->set_var('download',lang('Submit')); - $GLOBALS['phpgw']->template->set_var('start',$this->start); - $GLOBALS['phpgw']->template->set_var('sort',$this->sort); - $GLOBALS['phpgw']->template->set_var('order',$this->order); - $GLOBALS['phpgw']->template->set_var('filter',$this->filter); - $GLOBALS['phpgw']->template->set_var('query',$this->query); - $GLOBALS['phpgw']->template->set_var('cat_id',$this->cat_id); - - $this->output = $GLOBALS['phpgw']->template->fp('out','import'); - $this->totpl(); + $this->template->set_var('lang_cancel',lang('Cancel')); + $this->template->set_var('lang_cat',lang('Select Category')); + $this->template->set_var('cancel_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); + $this->template->set_var('navbar_bg',$GLOBALS['phpgw_info']['theme']['navbar_bg']); + $this->template->set_var('navbar_text',$GLOBALS['phpgw_info']['theme']['navbar_text']); + $this->template->set_var('import_text',lang('Import from LDIF, CSV, or VCard')); + $this->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.import')); + $this->template->set_var('cat_link',$this->cat_option($this->cat_id,True,False)); + $this->template->set_var('tsvfilename',''); + $this->template->set_var('conv',$conv); + $this->template->set_var('debug',lang('Debug output in browser')); + $this->template->set_var('filetype',lang('LDIF')); + $this->template->set_var('download',lang('Submit')); + $this->template->set_var('start',$this->start); + $this->template->set_var('sort',$this->sort); + $this->template->set_var('order',$this->order); + $this->template->set_var('filter',$this->filter); + $this->template->set_var('query',$this->query); + $this->template->set_var('cat_id',$this->cat_id); + $this->template->pparse('out','import'); } +// $GLOBALS['phpgw']->common->phpgw_footer(); } function export() { global $convert,$tsvfilename,$cat_id,$download,$conv_type; - if($convert) + if ($convert) { - if($conv_type == 'none') + if ($conv_type == 'none') { $GLOBALS['phpgw_info']['flags']['noheader'] = False; $GLOBALS['phpgw_info']['flags']['noheader'] = True; $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo lang('No conversion type <none> could be located. Please choose a conversion type from the list'); echo ' ' . lang('OK') . ''; - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_footer(); + $GLOBALS['phpgw']->common->phpgw_exit(); } $buffer = $this->bo->export($conv_type,$cat_id); - if(($download == 'on') || ($conv_type == 'Palm_PDB')) + if(($download == 'on') || ($conv_type == 'Palm_PDB') ) { // filename, default application/octet-stream, length of file, default nocache True $this->browser->content_header($tsvfilename,'application/x-octet-stream',strlen($buffer)); echo $buffer; - exit; } else { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo "

\n";
 					echo $buffer;
 					echo "\n
\n"; echo '' . lang('OK') . ''; + $GLOBALS['phpgw']->common->phpgw_footer(); } } else { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); set_time_limit(0); - - $GLOBALS['phpgw']->template->set_file(array('export' => 'export.tpl')); + + $this->template->set_file(array('export' => 'export.tpl')); $dir_handle = opendir(PHPGW_APP_INC. SEP . 'export'); $i=0; $myfilearray = ''; - while($file = readdir($dir_handle)) + while ($file = readdir($dir_handle)) { - if((substr($file, 0, 1) != '.') && is_file(PHPGW_APP_INC . SEP . 'export' . SEP . $file) ) + if ((substr($file, 0, 1) != '.') && is_file(PHPGW_APP_INC . SEP . 'export' . SEP . $file) ) { $myfilearray[$i] = $file; $i++; @@ -222,36 +215,33 @@ } closedir($dir_handle); sort($myfilearray); - for($i=0;$i'.$fname.''."\n"; } - $GLOBALS['phpgw']->template->set_var('lang_cancel',lang('Cancel')); - $GLOBALS['phpgw']->template->set_var('lang_cat',lang('Select Category')); - $GLOBALS['phpgw']->template->set_var('cat_link',$this->cat_option($this->cat_id,False,False)); - $GLOBALS['phpgw']->template->set_var('cancel_url',$GLOBALS['phpgw']->link('/addressbook/index.php')); - $GLOBALS['phpgw']->template->set_var('navbar_bg',$GLOBALS['phpgw_info']['theme']['navbar_bg']); - $GLOBALS['phpgw']->template->set_var('navbar_text',$GLOBALS['phpgw_info']['theme']['navbar_text']); - $GLOBALS['phpgw']->template->set_var('export_text',lang('Export from Addressbook')); - $GLOBALS['phpgw']->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.export')); - $GLOBALS['phpgw']->template->set_var('filename',lang('Export file name')); - $GLOBALS['phpgw']->template->set_var('conversion',lang('Select the type of conversion')); - $GLOBALS['phpgw']->template->set_var('conv',$conv); - $GLOBALS['phpgw']->template->set_var('debug',lang('')); - $GLOBALS['phpgw']->template->set_var('download',lang('Submit')); - $GLOBALS['phpgw']->template->set_var('download_export',lang('Download export file (Uncheck to debug output in browser)')); - $GLOBALS['phpgw']->template->set_var('none',lang('none')); - $GLOBALS['phpgw']->template->set_var('start',$this->start); - $GLOBALS['phpgw']->template->set_var('sort',$this->sort); - $GLOBALS['phpgw']->template->set_var('order',$this->order); - $GLOBALS['phpgw']->template->set_var('filter',$this->filter); - $GLOBALS['phpgw']->template->set_var('query',$this->query); - $GLOBALS['phpgw']->template->set_var('cat_id',$this->cat_id); + $this->template->set_var('lang_cancel',lang('Cancel')); + $this->template->set_var('lang_cat',lang('Select Category')); + $this->template->set_var('cat_link',$this->cat_option($this->cat_id,False,False)); + $this->template->set_var('cancel_url',$GLOBALS['phpgw']->link('/addressbook/index.php')); + $this->template->set_var('navbar_bg',$GLOBALS['phpgw_info']['theme']['navbar_bg']); + $this->template->set_var('navbar_text',$GLOBALS['phpgw_info']['theme']['navbar_text']); + $this->template->set_var('export_text',lang('Export from Addressbook')); + $this->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.export')); + $this->template->set_var('filename',lang('Export file name')); + $this->template->set_var('conv',$conv); + $this->template->set_var('debug',lang('')); + $this->template->set_var('download',lang('Submit')); + $this->template->set_var('start',$this->start); + $this->template->set_var('sort',$this->sort); + $this->template->set_var('order',$this->order); + $this->template->set_var('filter',$this->filter); + $this->template->set_var('query',$this->query); + $this->template->set_var('cat_id',$this->cat_id); + $this->template->pparse('out','export'); - $this->output = $GLOBALS['phpgw']->template->fp('out','export'); - $this->totpl(); + $GLOBALS['phpgw']->common->phpgw_footer(); } } } diff --git a/addressbook/inc/class.uiaddressbook.inc.php b/addressbook/inc/class.uiaddressbook.inc.php index 68f2aa3fc3..2b283a9c61 100644 --- a/addressbook/inc/class.uiaddressbook.inc.php +++ b/addressbook/inc/class.uiaddressbook.inc.php @@ -15,7 +15,7 @@ class uiaddressbook { - var $output = ''; + var $template; var $contacts; var $bo; var $cat; @@ -25,23 +25,23 @@ var $debug = False; var $start; + var $limit; var $query; var $sort; var $order; var $filter; var $cat_id; + var $template; var $public_functions = array( - 'index' => True, - 'view' => True, - 'add' => True, - 'addfromremote' => True, + 'index' => True, + 'view' => True, + 'add' => True, 'add_email' => True, - 'copy' => True, - 'edit' => True, + 'copy' => True, + 'edit' => True, 'delete' => True, - 'preferences' => True, - 'remote_search' => True + 'preferences' => True ); var $extrafields = array( @@ -58,6 +58,7 @@ $this->fields = CreateObject('addressbook.uifields'); $this->bo = CreateObject('addressbook.boaddressbook',True); + $this->template = &$GLOBALS['phpgw']->template; $this->contacts = CreateObject('phpgwapi.contacts'); $this->cat = CreateObject('phpgwapi.categories'); $this->company = CreateObject('phpgwapi.categories','addressbook_company'); @@ -66,36 +67,24 @@ $this->_set_sessiondata(); } - function totpl() - { - if(@isset($this->output) && !empty($this->output)) - { - $GLOBALS['phpgw']->template->set_var('phpgw_body', $this->output,True); - unset($this->output); - } - } - function _set_sessiondata() { $this->start = $this->bo->start; + $this->limit = $this->bo->limit; $this->query = $this->bo->query; - $this->cquery = $this->bo->cquery; $this->sort = $this->bo->sort; $this->order = $this->bo->order; $this->filter = $this->bo->filter; $this->cat_id = $this->bo->cat_id; - if($this->debug) - { - $this->_debug_sqsof(); - } + if($this->debug) { $this->_debug_sqsof(); } } function _debug_sqsof() { $data = array( 'start' => $this->start, + 'limit' => $this->limit, 'query' => $this->query, - 'cquery' => $this->cquery, 'sort' => $this->sort, 'order' => $this->order, 'filter' => $this->filter, @@ -110,8 +99,8 @@ { $data = array( 'start' => $this->start, + 'limit' => $this->limit, 'query' => $this->query, - 'cquery' => $this->cquery, 'sort' => $this->sort, 'order' => $this->order, 'filter' => $this->filter, @@ -122,7 +111,7 @@ function formatted_list($name,$list,$id='',$default=False,$java=False) { - if($java) + if ($java) { $jselect = ' onChange="this.form.submit();"'; } @@ -132,10 +121,10 @@ { $select .= ''."\n"; } - while(list($key,$val) = each($list)) + while (list($key,$val) = each($list)) { $select .= '' . "\n"; - } - - return $search_remote; - } - - function remote_search() - { -// _debug_array($GLOBALS['HTTP_POST_VARS']); - $remote = CreateObject('addressbook.remote',$GLOBALS['HTTP_POST_VARS']['serverid']); - $entries = $remote->search($GLOBALS['HTTP_POST_VARS']['remote_query']); - $this->index($entries); - } - /* this cleans up the fieldnames for display */ function display_name($column) { @@ -256,56 +217,23 @@ 'note' => 'notes' ); - if($abc[$column]) + if ($abc[$column]) { return lang($abc[$column]); } return; } - /* - Former index.php - */ - function index($entries='') + function index() { - $GLOBALS['phpgw']->template->set_file(array('addressbook_list_t' => 'index.tpl')); - $GLOBALS['phpgw']->template->set_block('addressbook_list_t','addressbook_header','addressbook_header'); - $GLOBALS['phpgw']->template->set_block('addressbook_list_t','column','column'); - $GLOBALS['phpgw']->template->set_block('addressbook_list_t','row','row'); - $GLOBALS['phpgw']->template->set_block('addressbook_list_t','remsearch','remsearch'); - $GLOBALS['phpgw']->template->set_block('addressbook_list_t','addressbook_footer','addressbook_footer'); - $GLOBALS['phpgw']->template->set_block('addressbook_list_t','addressbook_alpha','addressbook_alpha'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); - $aar = explode(',',lang('alphabet')); - $aar[] = 'all'; - while(list(,$char) = @each($aar)) - { - if($this->cquery == $char || - ($char == 'all' && !$this->cquery)) - { - $GLOBALS['phpgw']->template->set_var('charbgcolor','#000000'); - $GLOBALS['phpgw']->template->set_var('charcolor','#FFFFFF'); - } - else - { - $GLOBALS['phpgw']->template->set_var('charbgcolor',$GLOBALS['phpgw_info']['theme']['th_bg']); - $GLOBALS['phpgw']->template->set_var('charcolor',$GLOBALS['phpgw_info']['theme']['th_text']); - } - if($char == 'all') - { - $GLOBALS['phpgw']->template->set_var('charlink', - $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index&cquery=') - ); - } - else - { - $GLOBALS['phpgw']->template->set_var('charlink', - $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index&cquery=' . $char) - ); - } - $GLOBALS['phpgw']->template->set_var('char',$char != 'all' ? strtoupper($char) : lang('all')); - $GLOBALS['phpgw']->template->fp('alphalinks','addressbook_alpha',True); - } + $this->template->set_file(array('addressbook_list_t' => 'index.tpl')); + $this->template->set_block('addressbook_list_t','addressbook_header','addressbook_header'); + $this->template->set_block('addressbook_list_t','column','column'); + $this->template->set_block('addressbook_list_t','row','row'); + $this->template->set_block('addressbook_list_t','addressbook_footer','addressbook_footer'); $custom = $this->fields->read_custom_fields(); $customfields = array(); @@ -315,11 +243,12 @@ $namedfields[$y['name']] = $y['title']; } - if(!$this->cat_id) + if ($this->cat_id == -1) { $this->cat_id = $this->prefs['default_category']; - } - if($this->prefs['autosave_category']) + } + + if ($this->prefs['autosave_category']) { $GLOBALS['phpgw']->preferences->read_repository(); $GLOBALS['phpgw']->preferences->delete('addressbook','default_category'); @@ -348,15 +277,16 @@ } /* Setup the columns for non-standard fields, since we don't allow sorting */ $nonstd = $this->extrafields + $customfields; - while($column = each($nonstd)) + while($column = @each($nonstd)) { $test = strtolower($column[1]); - if(isset($this->prefs[$test]) && $this->prefs[$test]) + if (isset($this->prefs[$test]) && $this->prefs[$test]) { $showcol = $this->display_name($column[0]); /* This must be a custom field */ if(!$showcol) { +// $showcol = $column[1]; $showcol = $namedfields[$column[1]]; } $cols .= ' ' . "\n"; @@ -369,8 +299,9 @@ $columns_to_display[$column[0]] = True; } } + /* Check if prefs were set, if not, create some defaults */ - if(!$columns_to_display ) + if(!$columns_to_display) { $columns_to_display = array( 'n_given' => 'n_given', @@ -380,13 +311,10 @@ // $columns_to_display = $columns_to_display + $customfields; /* No prefs,. so cols above may have been set to '' or a bunch of */ $cols=''; - while($column = each($columns_to_display)) + while ($column = each($columns_to_display)) { $showcol = $this->display_name($column[0]); - if(!$showcol) - { - $showcol = $column[1]; - } + if (!$showcol) { $showcol = $column[1]; } $cols .= ' ' . "\n"; $cols .= ' '; $cols .= $GLOBALS['phpgw']->nextmatchs->show_sort_order($this->sort, @@ -405,11 +333,11 @@ if($GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs'] && $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs'] > 0) { - $limit = $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs']; + $this->limit = $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs']; } else { - $limit = 30; + $this->limit = 15; } /*global $filter; */ @@ -431,7 +359,7 @@ else they may be accounts, etc. */ $qfilter = 'tid=n'; - switch($this->filter) + switch ($this->filter) { case 'blank': $nosearch = True; @@ -446,204 +374,181 @@ default: $qfilter .= ',owner=' . $this->filter; } - if($this->cat_id) + if ($this->cat_id) { $qfilter .= ',cat_id='.$this->cat_id; } - if(!$userid) + if (!$userid) { $userid = $GLOBALS['phpgw_info']['user']['account_id']; } - if($nosearch && !$this->query && !$entries) + if ($nosearch && !$this->query) { $entries = array(); $total_records = 0; } - elseif(!$entries) + else { /* read the entry list */ $entries = $this->bo->read_entries(array( 'start' => $this->start, - 'limit' => $limit, + 'limit' => $this->limit, 'fields' => $columns_to_display, 'filter' => $qfilter, 'query' => $this->query, - 'cquery' => $this->cquery, 'sort' => $this->sort, 'order' => $this->order )); $total_records = $this->bo->total; - $GLOBALS['phpgw']->template->set_var('lang_view',lang('View')); - } - else - { - $total_records = count($entries); - $GLOBALS['phpgw']->template->set_var('lang_view',lang('Add')); - $showadd = True; } + /* global here so nextmatchs accepts our setting of $query and $filter */ + $GLOBALS['query'] = $this->query; + $GLOBALS['filter'] = $this->filter; + $search_filter = $GLOBALS['phpgw']->nextmatchs->show_tpl('/index.php', $this->start, $total_records,'&menuaction=addressbook.uiaddressbook.index&fcat_id='.$this->cat_id,'75%', - $GLOBALS['phpgw_info']['theme']['th_bg'],1,1,1,1,$this->cat_id); + $GLOBALS['phpgw_info']['theme']['th_bg'],1,1,1,array('filter'=>$this->filter,'yours'=>1), + $this->cat_id); + $query = $filter = ''; $lang_showing = $GLOBALS['phpgw']->nextmatchs->show_hits($total_records,$this->start); /* set basic vars and parse the header */ - $GLOBALS['phpgw']->template->set_var('font',$GLOBALS['phpgw_info']['theme']['font']); - $GLOBALS['phpgw']->template->set_var('row_on',$GLOBALS['phpgw_info']['theme']['row_on']); -// $GLOBALS['phpgw']->template->set_var('lang_view',lang('View')); - $GLOBALS['phpgw']->template->set_var('lang_vcard',lang('VCard')); - $GLOBALS['phpgw']->template->set_var('lang_edit',lang('Edit')); - $GLOBALS['phpgw']->template->set_var('lang_owner',lang('Owner')); - $GLOBALS['phpgw']->template->set_var('lang_go',lang('Go')); + $this->template->set_var('font',$GLOBALS['phpgw_info']['theme']['font']); + $this->template->set_var('lang_view',lang('View')); + $this->template->set_var('lang_vcard',lang('VCard')); + $this->template->set_var('lang_edit',lang('Edit')); + $this->template->set_var('lang_owner',lang('Owner')); - $GLOBALS['phpgw']->template->set_var('searchreturn',$noprefs . ' ' . $searchreturn); - $GLOBALS['phpgw']->template->set_var('lang_showing',$lang_showing); - $GLOBALS['phpgw']->template->set_var('search_filter',$search_filter); - $GLOBALS['phpgw']->template->set_var('cats',lang('Category')); - $GLOBALS['phpgw']->template->set_var('cats_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - /* $GLOBALS['phpgw']->template->set_var('cats_link',$this->cat_option($this->cat_id)); */ - $GLOBALS['phpgw']->template->set_var('lang_cats',lang('Select')); - $GLOBALS['phpgw']->template->set_var('lang_addressbook',lang('Address book')); - $GLOBALS['phpgw']->template->set_var('th_bg',$GLOBALS['phpgw_info']['theme']['th_bg']); - $GLOBALS['phpgw']->template->set_var('th_font',$GLOBALS['phpgw_info']['theme']['font']); - $GLOBALS['phpgw']->template->set_var('th_text',$GLOBALS['phpgw_info']['theme']['th_text']); - $GLOBALS['phpgw']->template->set_var('lang_add',lang('Add')); - $GLOBALS['phpgw']->template->set_var('add_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.add')); - $GLOBALS['phpgw']->template->set_var('lang_addvcard',lang('AddVCard')); - $GLOBALS['phpgw']->template->set_var('vcard_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uivcard.in')); - $GLOBALS['phpgw']->template->set_var('lang_import',lang('Import Contacts')); - $GLOBALS['phpgw']->template->set_var('import_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.import')); - $GLOBALS['phpgw']->template->set_var('lang_import_alt',lang('Alt. CSV Import')); - $GLOBALS['phpgw']->template->set_var('import_alt_url',$GLOBALS['phpgw']->link('/addressbook/csv_import.php')); - $GLOBALS['phpgw']->template->set_var('lang_export',lang('Export Contacts')); - $GLOBALS['phpgw']->template->set_var('export_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.export')); + $this->template->set_var('searchreturn',$noprefs . ' ' . $searchreturn); + $this->template->set_var('lang_showing',$lang_showing); + $this->template->set_var('search_filter',$search_filter); + $this->template->set_var('cats',lang('Category')); + $this->template->set_var('cats_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); + /* $this->template->set_var('cats_link',$this->cat_option($this->cat_id)); */ + $this->template->set_var('lang_cats',lang('Select')); +// $this->template->set_var('lang_addressbook',lang('Address book')); + $this->template->set_var('th_bg',$GLOBALS['phpgw_info']['theme']['th_bg']); + $this->template->set_var('th_font',$GLOBALS['phpgw_info']['theme']['font']); + $this->template->set_var('th_text',$GLOBALS['phpgw_info']['theme']['th_text']); + $this->template->set_var('lang_add',lang('Add')); + $this->template->set_var('add_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.add')); + $this->template->set_var('lang_addvcard',lang('AddVCard')); + $this->template->set_var('vcard_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uivcard.in')); + $this->template->set_var('lang_import',lang('Import Contacts')); + $this->template->set_var('import_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.import')); + $this->template->set_var('lang_import_alt',lang('Alt. CSV Import')); + $this->template->set_var('import_alt_url',$GLOBALS['phpgw']->link('/addressbook/csv_import.php')); + $this->template->set_var('lang_export',lang('Export Contacts')); + $this->template->set_var('export_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiXport.export')); - $GLOBALS['phpgw']->template->set_var('start',$this->start); - $GLOBALS['phpgw']->template->set_var('sort',$this->sort); - $GLOBALS['phpgw']->template->set_var('order',$this->order); - $GLOBALS['phpgw']->template->set_var('filter',$this->filter); - $GLOBALS['phpgw']->template->set_var('query',$this->query); - $GLOBALS['phpgw']->template->set_var('cat_id',$this->cat_id); + $this->template->set_var('start',$this->start); + $this->template->set_var('sort',$this->sort); + $this->template->set_var('order',$this->order); + $this->template->set_var('filter',$this->filter); + $this->template->set_var('query',$this->query); + $this->template->set_var('cat_id',$this->cat_id); - $GLOBALS['phpgw']->template->set_var('qfield',$qfield); - $GLOBALS['phpgw']->template->set_var('cols',$cols); + $this->template->set_var('qfield',$qfield); + $this->template->set_var('cols',$cols); - if(@isset($GLOBALS['phpgw_info']['server']['enable_remote_addressbook'])) - { - $GLOBALS['phpgw']->template->set_var('remote_search',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.remote_search')); - $GLOBALS['phpgw']->template->set_var('remote_query',$GLOBALS['HTTP_POST_VARS']['remote_query']); - $GLOBALS['phpgw']->template->set_var('lang_remote_search',lang('Remote Search')); - $GLOBALS['phpgw']->template->set_var('search_remote',$this->remote_search_option()); - $GLOBALS['phpgw']->template->fp('remotesearch','remsearch'); - } - else - { - $GLOBALS['phpgw']->template->set_var('remotesearch',''); - } - $this->output .= $GLOBALS['phpgw']->template->parse('out','addressbook_header'); + $this->template->pparse('out','addressbook_header'); /* Show the entries */ /* each entry */ - for($i=0;$itemplate->set_var('columns',''); + $this->template->set_var('columns',''); $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); - $GLOBALS['phpgw']->template->set_var('row_tr_color',$tr_color); + $this->template->set_var('row_tr_color',$tr_color); $myid = $entries[$i]['id']; $myowner = $entries[$i]['owner']; /* each entry column */ @reset($columns_to_display); - while($column = @each($columns_to_display)) + while ($column = @each($columns_to_display)) { - $ref = $data = ''; + $ref = $data=''; $coldata = $entries[$i][$column[0]]; /* echo '
coldata="' . $coldata . '"'; */ /* Some fields require special formatting. */ - if($column[0] == 'url') + if ($column[0] == 'url') { - if(!empty($coldata) && (substr($coldata,0,7) != 'http://')) - { - $coldata = 'http://' . $coldata; - } - $ref = ''; - $data = $coldata . ''; + if ( !empty($coldata) && (substr($coldata,0,7) != 'http://') ) { $coldata = 'http://' . $coldata; } + $ref=''; + $data=$coldata.''; } - elseif(($column[0] == 'email') || ($column[0] == 'email_home')) + elseif ( ($column[0] == 'email') || ($column[0] == 'email_home') ) { - if($GLOBALS['phpgw_info']['user']['apps']['email']) + if ($GLOBALS['phpgw_info']['user']['apps']['email']) { - $ref = ''; + $ref=''; } else { - $ref = ''; + $ref=''; } - $data = $coldata . ''; + $data=$coldata . ''; } else /* But these do not */ { - $ref = ''; - $data = $coldata; + $ref = ''; $data = $coldata; } - $GLOBALS['phpgw']->template->set_var('col_data',$ref . $data); - $GLOBALS['phpgw']->template->parse('columns','column',True); + $this->template->set_var('col_data',$ref.$data); + $this->template->parse('columns','column',True); } - if(!$showadd) + if (1) { - $GLOBALS['phpgw']->template->set_var('row_view_link',$GLOBALS['phpgw']->link('/index.php', - 'menuaction=addressbook.uiaddressbook.view&ab_id=' . $entries[$i]['id'])); + $this->template->set_var('row_view_link',$GLOBALS['phpgw']->link('/index.php', + 'menuaction=addressbook.uiaddressbook.view&ab_id='.$entries[$i]['id'])); } else { - $GLOBALS['phpgw']->template->set_var('row_view_link',$GLOBALS['phpgw']->link('/index.php', - 'menuaction=addressbook.uiaddressbook.addfromremote&fields=' . urlencode(serialize($entries[$i])))); -// $GLOBALS['phpgw']->template->set_var('lang_view',lang('Add')); + $this->template->set_var('row_view_link',''); + $this->template->set_var('lang_view',lang('Private')); } - $GLOBALS['phpgw']->template->set_var('row_vcard_link',$GLOBALS['phpgw']->link('/index.php', + $this->template->set_var('row_vcard_link',$GLOBALS['phpgw']->link('/index.php', 'menuaction=addressbook.uivcard.out&ab_id='.$entries[$i]['id'])); - /* echo '
: ' . $contacts->grants[$myowner] . ' - ' . $myowner; */ - if($this->contacts->check_perms($this->contacts->grants[$myowner],PHPGW_ACL_EDIT) || - $myowner == $GLOBALS['phpgw_info']['user']['account_id']) + if ($this->contacts->check_perms($this->contacts->grants[$myowner],PHPGW_ACL_EDIT) || $myowner == $GLOBALS['phpgw_info']['user']['account_id']) { - $GLOBALS['phpgw']->template->set_var('row_edit','link('/index.php', 'menuaction=addressbook.uiaddressbook.edit&ab_id='.$entries[$i]['id']) . '">' . lang('Edit') . ''); } else { - $GLOBALS['phpgw']->template->set_var('row_edit',' '); + $this->template->set_var('row_edit',' '); } - $GLOBALS['phpgw']->template->set_var('row_owner',$GLOBALS['phpgw']->accounts->id2name($myowner)); + $this->template->set_var('row_owner',$GLOBALS['phpgw']->accounts->id2name($myowner)); - $GLOBALS['phpgw']->template->parse('rows','row',True); - $this->output .= $GLOBALS['phpgw']->template->fp('out','row'); + $this->template->parse('rows','row',True); + $this->template->pparse('out','row'); reset($columns_to_display); } - $this->output .= $GLOBALS['phpgw']->template->fp('out','addressbook_footer'); + $this->template->pparse('out','addressbook_footer'); $this->save_sessiondata(); - $this->totpl(); + /* $GLOBALS['phpgw']->common->phpgw_footer(); */ } function add_email() { - $name = $GLOBALS['HTTP_POST_VARS']['name'] ? $GLOBALS['HTTP_POST_VARS']['name'] : $GLOBALS['HTTP_GET_VARS']['name']; - $referer = $GLOBALS['HTTP_POST_VARS']['referer'] ? $GLOBALS['HTTP_POST_VARS']['referer'] : $GLOBALS['HTTP_GET_VARS']['referer']; - $add_email = $GLOBALS['HTTP_POST_VARS']['add_email'] ? $GLOBALS['HTTP_POST_VARS']['add_email'] : $GLOBALS['HTTP_GET_VARS']['add_email']; + $name = $_POST['name'] ? $_POST['name'] : $_GET['name']; + $referer = $_POST['referer'] ? $_POST['referer'] : $_GET['referer']; + $add_email = $_POST['add_email'] ? $_POST['add_email'] : $_GET['add_email']; $named = explode(' ', $name); - for($i=count($named);$i>=0;$i--) + for ($i=count($named);$i>=0;$i--) { $names[$i] = $named[$i]; } - if($names[2]) + if ($names[2]) { $fields['n_given'] = $names[0]; $fields['n_middle'] = $names[1]; @@ -673,31 +578,23 @@ function copy() { - $addnew = $this->bo->read_entry(array('id' => $GLOBALS['ab_id'], 'fields' => $this->contacts->stock_contact_fields)); + list($addnew) = $this->bo->read_entry(array( + 'id' => $_GET['ab_id'], + 'fields' => $this->contacts->stock_contact_fields + )); - $addnew[0]['note'] .= "\nCopied from " . $GLOBALS['phpgw']->accounts->id2name($addnew[0]['owner']).", record #".$addnew[0]['id'].'.'; - $addnew[0]['owner'] = $GLOBALS['phpgw_info']['user']['account_id']; - unset($addnew[0]['id']); - $fields = $addnew[0]; + $addnew['note'] .= "\n".lang("Copied by %1, from record #%2.",$GLOBALS['phpgw']->accounts->id2name($addnew['owner']),$addnew['id']); + $addnew['owner'] = $GLOBALS['phpgw_info']['user']['account_id']; + unset($addnew['id']); - $ab_id = $this->bo->add_entry($fields); + $ab_id = $this->bo->add_entry($addnew); - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.edit&ab_id=' . $ab_id)); - } - - function addfromremote() - { - $fields = get_var('fields',array('GET')); - $fields = stripslashes(urldecode($fields)); - $fields = unserialize($fields); - $fields['note'] = "\nCopied from remote search."; - $ab_id = $this->bo->add_entry($fields); - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.edit&ab_id=' . $ab_id)); + $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=addressbook.uiaddressbook.edit&ab_id=' . $ab_id); } function add() { - if($GLOBALS['HTTP_POST_VARS']['submit']) + if ($_POST['submit']) { $fields = $this->get_form(); @@ -708,19 +605,18 @@ $this->bo->add_entry($fields); $ab_id = $this->bo->get_lastid(); - $GLOBALS['ab_id'] = $ab_id; - $GLOBALS['phpgw']->hooks->process('addressbook_save'); Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.view&ab_id=' . $ab_id . '&referer=' . $referer)); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } - $GLOBALS['phpgw']->template->set_file(array('add' => 'add.tpl')); + $this->template->set_file(array('add' => 'add.tpl')); + + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); $custom = $this->fields->read_custom_fields(); - $customfields = array(); while(list($x,$y) = @each($custom)) { $customfields[$y['name']] = $y['title']; @@ -728,26 +624,22 @@ $this->addressbook_form('','menuaction=addressbook.uiaddressbook.add','Add','',$customfields,$this->cat_id); - $GLOBALS['phpgw']->template->set_var('lang_ok',lang('ok')); - $GLOBALS['phpgw']->template->set_var('lang_clear',lang('clear')); - $GLOBALS['phpgw']->template->set_var('lang_cancel',lang('cancel')); - $GLOBALS['phpgw']->template->set_var('cancel_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $this->output .= $GLOBALS['phpgw']->template->parse('out','add'); - $this->output .= $GLOBALS['phpgw']->template->parse('out','add'); - $this->totpl(); - $GLOBALS['phpgw']->hooks->process('addressbook_add'); + $this->template->set_var('lang_save',lang('Save')); + $this->template->set_var('lang_cancel',lang('Cancel')); + $this->template->set_var('cancel_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); + $this->template->parse('out','add'); + $this->template->pparse('out','add'); } function edit() { - if($GLOBALS['HTTP_POST_VARS']['submit']) + if ($_POST['submit']) { $_fields = $this->get_form(); /* _debug_array($_fields);exit; */ $check = $this->bo->read_entry(array('id' => $_fields['ab_id'], 'fields' => array('owner' => 'owner','tid' => 'tid'))); - if(($this->contacts->grants[$check[0]['owner']] & PHPGW_ACL_EDIT) && - $check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id']) + if (($this->contacts->grants[$check[0]['owner']] & PHPGW_ACL_EDIT) && $check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id']) { $userid = $check[0]['owner']; } @@ -760,28 +652,27 @@ unset($_fields['referer']); $this->bo->update_entry($_fields); - $GLOBALS['ab_id'] = $_fields['ab_id']; - $GLOBALS['phpgw']->hooks->process('addressbook_save'); Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.view&ab_id=' . $_fields['ab_id'] . '&referer=' . $referer) ); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } /* First, make sure they have permission to this entry */ - $check = $this->bo->read_entry(array('id' => $GLOBALS['HTTP_GET_VARS']['ab_id'], 'fields' => array('owner' => 'owner','tid' => 'tid'))); + $check = $this->bo->read_entry(array('id' => $_GET['ab_id'], 'fields' => array('owner' => 'owner','tid' => 'tid'))); - if(!$this->contacts->check_perms($this->contacts->grants[$check[0]['owner']],PHPGW_ACL_EDIT) && - ($check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id'])) + if ( !$this->contacts->check_perms($this->contacts->grants[$check[0]['owner']],PHPGW_ACL_EDIT) && + ($check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id']) ) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + /* Read in user custom fields, if any */ $custom = $this->fields->read_custom_fields(); $customfields = array(); @@ -792,68 +683,65 @@ /* merge in extra fields */ $qfields = $this->contacts->stock_contact_fields + $this->extrafields + $customfields; - $fields = $this->bo->read_entry(array('id' => $GLOBALS['HTTP_GET_VARS']['ab_id'], 'fields' => $qfields)); + $fields = $this->bo->read_entry(array('id' => $_GET['ab_id'], 'fields' => $qfields)); $this->addressbook_form('edit','menuaction=addressbook.uiaddressbook.edit',lang('Edit'),$fields[0],$customfields); - $GLOBALS['phpgw']->template->set_file(array('edit' => 'edit.tpl')); + $this->template->set_file(array('edit' => 'edit.tpl')); - $GLOBALS['phpgw']->template->set_var('th_bg',$GLOBALS['phpgw_info']['theme']['th_bg']); - $GLOBALS['phpgw']->template->set_var('ab_id',$GLOBALS['HTTP_GET_VARS']['ab_id']); - $GLOBALS['phpgw']->template->set_var('tid',$check[0]['tid']); - $GLOBALS['phpgw']->template->set_var('referer',$referer); - $GLOBALS['phpgw']->template->set_var('lang_ok',lang('ok')); - $GLOBALS['phpgw']->template->set_var('lang_clear',lang('clear')); - $GLOBALS['phpgw']->template->set_var('lang_cancel',lang('cancel')); - $GLOBALS['phpgw']->template->set_var('lang_submit',lang('submit')); - $GLOBALS['phpgw']->template->set_var('cancel_link','
'); - if(($this->contacts->grants[$check[0]['owner']] & PHPGW_ACL_DELETE) || - $check[0]['owner'] == $GLOBALS['phpgw_info']['user']['account_id']) + if (($this->contacts->grants[$check[0]['owner']] & PHPGW_ACL_DELETE) || $check[0]['owner'] == $GLOBALS['phpgw_info']['user']['account_id']) { - $GLOBALS['phpgw']->template->set_var('delete_link',''); - $GLOBALS['phpgw']->template->set_var('delete_button',''); + $this->template->set_var('delete_link',''); + $this->template->set_var('delete_button',''); } - $this->output .= $GLOBALS['phpgw']->template->fp('out','edit'); - $this->totpl(); - $GLOBALS['phpgw']->hooks->process('addressbook_edit'); + $this->template->pfp('out','edit'); } function delete() { - $ab_id = $GLOBALS['HTTP_POST_VARS']['entry']['ab_id'] ? $GLOBALS['HTTP_POST_VARS']['entry']['ab_id'] : $GLOBALS['HTTP_POST_VARS']['ab_id']; - $confirm = $GLOBALS['HTTP_GET_VARS']['confirm'] ? $GLOBALS['HTTP_GET_VARS']['confirm'] :$GLOBALS['HTTP_POST_VARS']['confirm']; - if(!$ab_id) + $ab_id = $_POST['entry']['ab_id'] ? $_POST['entry']['ab_id'] : $_POST['ab_id']; + $confirm = $_GET['confirm'] ? $_GET['confirm'] :$_POST['confirm']; + if (!$ab_id) { - $ab_id = $GLOBALS['HTTP_GET_VARS']['ab_id']; // else plain Link in delete does not work + $ab_id = $_GET['ab_id']; // else plain Link in delete does not work } - if(!$ab_id) + if (!$ab_id || $_POST['no']) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); } $check = $this->bo->read_entry(array('id' => $ab_id, 'fields' => array('owner' => 'owner','tid' => 'tid'))); - if(!(($this->contacts->grants[$check[0]['owner']] & PHPGW_ACL_DELETE) || - $check[0]['owner'] == $GLOBALS['phpgw_info']['user']['account_id'])) + if (!(($this->contacts->grants[$check[0]['owner']] & PHPGW_ACL_DELETE) || $check[0]['owner'] == $GLOBALS['phpgw_info']['user']['account_id'])) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } - $GLOBALS['phpgw']->template->set_file(array('delete' => 'delete.tpl')); + $this->template->set_file(array('delete' => 'delete.tpl')); - if($confirm != 'true') + if (!$_POST['yes']) { - $GLOBALS['phpgw']->template->set_var('lang_sure',lang('Are you sure you want to delete this entry ?')); - $GLOBALS['phpgw']->template->set_var('no_link',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $GLOBALS['phpgw']->template->set_var('lang_no',lang('NO')); - $GLOBALS['phpgw']->template->set_var('yes_link',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.delete&ab_id=' . $ab_id . '&confirm=true')); - $GLOBALS['phpgw']->template->set_var('lang_yes',lang('YES')); - $this->output .= $GLOBALS['phpgw']->template->parse('out','delete'); + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Addressbook').' - '.lang('Delete'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + + $this->template->set_var('lang_sure',lang('Are you sure you want to delete this entry ?')); + $this->template->set_var('no_link',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); + $this->template->set_var('lang_no',lang('NO')); + $this->template->set_var('yes_link',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.delete&ab_id=' . $ab_id . '&confirm=true')); + $this->template->set_var('lang_yes',lang('YES')); + $this->template->pparse('out','delete'); } else @@ -861,14 +749,13 @@ $this->bo->delete_entry(array('id' => $ab_id)); @Header('Location: ' . $GLOBALS['phpgw']->link('/addressbook/index.php','menuaction=addressbook.uiaddressbook.index')); } - $this->totpl(); } function view() { - $ab_id = $GLOBALS['HTTP_GET_VARS']['ab_id']; - $submit = $GLOBALS['HTTP_POST_VARS']['submit']; - $referer = $GLOBALS['HTTP_GET_VARS']['referer']; + $ab_id = $_GET['ab_id']; + $submit = $_POST['submit']; + $referer = $_GET['referer']; /* First, make sure they have permission to this entry */ $check = $this->bo->read_entry(array('id' => $ab_id, 'fields' => array('owner' => 'owner','tid' => 'tid'))); @@ -876,25 +763,29 @@ $tmp = $check[0]['owner']; $perms = $this->contacts->check_perms($this->contacts->grants[$tmp],PHPGW_ACL_READ); - if((!$perms) && ($check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id'])) + if ( (!$perms) && ($check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id']) ) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } - if(!$ab_id) + if (!$ab_id) { Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); + } + elseif (!$submit && $ab_id) + { + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Address book - view'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); } - $GLOBALS['phpgw']->template->set_file(array('view_t' => 'view.tpl')); - $GLOBALS['phpgw']->template->set_block('view_t','view_header','view_header'); - $GLOBALS['phpgw']->template->set_block('view_t','view_row','view_row'); - $GLOBALS['phpgw']->template->set_block('view_t','view_footer','view_footer'); - $GLOBALS['phpgw']->template->set_block('view_t','view_buttons','view_buttons'); + $this->template->set_file(array('view_t' => 'view.tpl')); + $this->template->set_block('view_t','view_header','view_header'); + $this->template->set_block('view_t','view_row','view_row'); + $this->template->set_block('view_t','view_footer','view_footer'); + $this->template->set_block('view_t','view_buttons','view_buttons'); $custom = $this->fields->read_custom_fields(); $customfields = array(); @@ -904,34 +795,15 @@ } /* _debug_array($this->prefs); */ - while(list($column,$x) = each($this->contacts->stock_contact_fields)) + while (list($column,$x) = each($this->contacts->stock_contact_fields)) { - if(isset($this->prefs[$column]) && $this->prefs[$column]) + if (isset($this->prefs[$column]) && $this->prefs[$column]) { $columns_to_display[$column] = True; $colname[$column] = $column; } } - /* No prefs? */ - if(!$columns_to_display ) - { - $columns_to_display = array( - 'n_given' => 'n_given', - 'n_family' => 'n_family', - 'org_name' => 'org_name', - 'tel_work' => 'tel_work', - 'tel_home' => 'tel_home', - 'email' => 'email', - 'email_home' => 'email_home' - ); - while($column = each($columns_to_display)) - { - $colname[$column[0]] = $column[1]; - } - $noprefs = ' - ' . lang('Please set your preferences for this application'); - } - /* merge in extra fields */ $qfields = $this->contacts->stock_contact_fields + $this->extrafields + $customfields; @@ -939,7 +811,7 @@ $record_owner = $fields[0]['owner']; - if($fields[0]['access'] == 'private') + if ($fields[0]['access'] == 'private') { $access_check = lang('private'); } @@ -948,41 +820,39 @@ $access_check = lang('public'); } - $GLOBALS['phpgw']->template->set_var('lang_viewpref',lang('Address book - view') . $noprefs); - unset($qfields['email_type']); // noone is useing that any more - unset($qfields['privat_email_type']); + unset($qfields['email_home_type']); @reset($qfields); - while(list($column,$null) = @each($qfields)) + while (list($column,$null) = @each($qfields)) { if($this->display_name($colname[$column])) { - $GLOBALS['phpgw']->template->set_var('display_col',$this->display_name($colname[$column])); + $this->template->set_var('display_col',$this->display_name($colname[$column])); } elseif($this->display_name($column)) { - $GLOBALS['phpgw']->template->set_var('display_col',$this->display_name($column)); + $this->template->set_var('display_col',$this->display_name($column)); } else { - $GLOBALS['phpgw']->template->set_var('display_col',ucfirst($column)); + $this->template->set_var('display_col',ucfirst($column)); } $ref = $data = ''; - if($fields[0][$column]) + if ($fields[0][$column]) { $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); - $GLOBALS['phpgw']->template->set_var('th_bg',$tr_color); + $this->template->set_var('th_bg',$tr_color); $coldata = $fields[0][$column]; /* Some fields require special formatting. */ - if(($column == 'note' || $column == 'pubkey') && $coldata) + if ( ($column == 'note' || $column == 'pubkey') && $coldata ) { $datarray = explode ("\n",$coldata); - if($datarray[1]) + if ($datarray[1]) { - while(list($key,$info) = each ($datarray)) + while (list($key,$info) = each ($datarray)) { - if($key) + if ($key) { $data .= ' ' .$info; } @@ -1004,11 +874,12 @@ $ref = ''; $data = $coldata . ''; } - elseif((($column == 'email') || ($column == 'email_home')) && $coldata) + elseif ( (($column == 'email') || ($column == 'email_home')) && $coldata) { - if($GLOBALS['phpgw_info']['user']['apps']['email']) + if ($GLOBALS['phpgw_info']['user']['apps']['email']) { - $ref = ''; + $ref=''; } else { @@ -1027,34 +898,34 @@ $ref = ''; $data = $coldata; } - if(!$data) + if (!$data) { - $GLOBALS['phpgw']->template->set_var('ref_data',' '); + $this->template->set_var('ref_data',' '); } else { - $GLOBALS['phpgw']->template->set_var('ref_data',$ref . $data); + $this->template->set_var('ref_data',$ref . $data); } - $GLOBALS['phpgw']->template->parse('cols','view_row',True); + $this->template->parse('cols','view_row',True); } } /* Following cleans up view_row, since we were only using it to fill {cols} */ - $GLOBALS['phpgw']->template->set_var('view_row',''); + $this->template->set_var('view_row',''); $fields['cat_id'] = is_array($this->cat_id) ? implode(',',$this->cat_id) : $this->cat_id; $cats = explode(',',$fields[0]['cat_id']); - if($cats[1]) + if ($cats[1]) { - while(list($key,$contactscat) = each($cats)) + while (list($key,$contactscat) = each($cats)) { - if($contactscat) + if ($contactscat) { $catinfo = $this->cat->return_single(intval($contactscat)); $catname .= $catinfo[0]['name'] . '; '; } } - if(!$this->cat_id) + if (!$this->cat_id) { $this->cat_id = $cats[0]; } @@ -1064,57 +935,52 @@ $fields[0]['cat_id'] = ereg_replace(',','',$fields[0]['cat_id']); $catinfo = $this->cat->return_single(intval($fields[0]['cat_id'])); $catname = $catinfo[0]['name']; - if(!$this->cat_id) + if (!$this->cat_id) { $this->cat_id = $fields[0]['cat_id']; } } - if(!$catname) - { - $catname = lang('none'); - } + if (!$catname) { $catname = lang('none'); } /* These are in the footer */ - $GLOBALS['phpgw']->template->set_var('lang_owner',lang('Record owner')); - $GLOBALS['phpgw']->template->set_var('owner',$GLOBALS['phpgw']->common->grab_owner_name($record_owner)); - $GLOBALS['phpgw']->template->set_var('lang_access',lang('Record access')); - $GLOBALS['phpgw']->template->set_var('access',$access_check); - $GLOBALS['phpgw']->template->set_var('lang_category',lang('Category')); - $GLOBALS['phpgw']->template->set_var('catname',$catname); + $this->template->set_var('lang_owner',lang('Record owner')); + $this->template->set_var('owner',$GLOBALS['phpgw']->common->grab_owner_name($record_owner)); + $this->template->set_var('lang_access',lang('Record access')); + $this->template->set_var('access',$access_check); + $this->template->set_var('lang_category',lang('Category')); + $this->template->set_var('catname',$catname); - if(($this->contacts->grants[$record_owner] & PHPGW_ACL_EDIT) || - ($record_owner == $GLOBALS['phpgw_info']['user']['account_id'])) + if (($this->contacts->grants[$record_owner] & PHPGW_ACL_EDIT) || ($record_owner == $GLOBALS['phpgw_info']['user']['account_id'])) { $extra_vars = array('cd' => 16,'query' => $this->query,'cat_id' => $this->cat_id); - if($referer) + if ($referer) { $extra_vars += array('referer' => urlencode($referer)); } - $GLOBALS['phpgw']->template->set_var('edit_button',$this->html_1button_form('edit','Edit', + $this->template->set_var('edit_button',$this->html_1button_form('edit','Edit', $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.edit&ab_id=' .$ab_id))); } - $GLOBALS['phpgw']->template->set_var('copy_button',$this->html_1button_form('submit','copy', + $this->template->set_var('copy_button',$this->html_1button_form('submit','copy', $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.copy&ab_id=' . $fields[0]['id']))); - if($fields[0]['n_family'] && $fields[0]['n_given']) + if ($fields[0]['n_family'] && $fields[0]['n_given']) { - $GLOBALS['phpgw']->template->set_var('vcard_button',$this->html_1button_form('VCardForm','VCard', + $this->template->set_var('vcard_button',$this->html_1button_form('VCardForm','VCard', $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uivcard.out&ab_id=' .$ab_id))); } else { - $GLOBALS['phpgw']->template->set_var('vcard_button',lang('no vcard')); + $this->template->set_var('vcard_button',lang('no vcard')); } - $GLOBALS['phpgw']->template->set_var('done_button',$this->html_1button_form('DoneForm','Done', + $this->template->set_var('done_button',$this->html_1button_form('DoneForm','Done', $referer ? $referer : $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.index'))); - $GLOBALS['phpgw']->template->set_var('access_link',$access_link); + $this->template->set_var('access_link',$access_link); - $this->output .= $GLOBALS['phpgw']->template->fp('out','view_t'); - $this->totpl(); + $this->template->pfp('phpgw_body','view_t'); $GLOBALS['phpgw']->hooks->process(array( 'location' => 'addressbook_view', @@ -1132,12 +998,11 @@ function preferences() { - $submit = $GLOBALS['HTTP_POST_VARS']['submit']; - $prefs = $GLOBALS['HTTP_POST_VARS']['prefs']; - $other = $GLOBALS['HTTP_POST_VARS']['other']; - $fcat_id = $GLOBALS['HTTP_POST_VARS']['fcat_id']; + $submit = $_POST['submit']; + $prefs = $_POST['prefs']; + $other = $_POST['other']; + $fcat_id = (int) $_POST['fcat_id']; - /* _debug_array($this->prefs); */ $custom = $this->fields->read_custom_fields(); $customfields = array(); while(list($x,$y) = @each($custom)) @@ -1147,139 +1012,149 @@ $qfields = $this->contacts->stock_contact_fields + $this->extrafields + $customfields; - if($submit) + if ($submit) { $totalerrors = 0; - if(!count($prefs)) + if (!count($prefs)) { $errors[$totalerrors++] = lang('You must select at least 1 column to display'); } - if(!$totalerrors) + if (!$totalerrors) { @reset($qfields); $this->bo->save_preferences($prefs,$other,$qfields,$fcat_id); } } - if($totalerrors) + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + + if ($totalerrors) { echo '

' . $GLOBALS['phpgw']->common->error_list($errors) . '
'; } - $GLOBALS['phpgw']->template->set_file(array('preferences' => 'preferences.tpl')); + $this->template->set_file(array('preferences' => 'preferences.tpl')); - $GLOBALS['phpgw']->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.preferences')); + $this->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.preferences')); $i = 0; $j = 0; $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); - while(list($col, $descr) = each($qfields)) + while (list($col, $descr) = each($qfields)) { /* echo '
test: $col - $i $j - ' . count($abc); */ $i++; $j++; $showcol = $this->display_name($col); - if(!$showcol) - { - $showcol = $col; - } + if (!$showcol) { $showcol = $col; } /* yank the *'s prior to testing for a valid column description */ $coltest = ereg_replace('\*','',$showcol); - if($coltest) + if ($coltest) { - $GLOBALS['phpgw']->template->set_var($col,$showcol); - if($GLOBALS['phpgw_info']['user']['preferences']['addressbook'][$col]) + $this->template->set_var($col,$showcol); + if ($GLOBALS['phpgw_info']['user']['preferences']['addressbook'][$col]) { - $GLOBALS['phpgw']->template->set_var($col.'_checked',' checked'); + $this->template->set_var($col.'_checked',' checked'); } else { - $GLOBALS['phpgw']->template->set_var($col.'_checked',''); + $this->template->set_var($col.'_checked',''); } } } - if($customfields) + if ($customfields) { $custom_var = ' - '.lang('Custom').' '.lang('Fields').': - - + '.lang('Custom Fields').': '; - while(list($cf) = each($customfields)) + $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); + $i = 0; + while( list($cf) = each($customfields) ) { - $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); - $custom_var .= "\n" . '' . "\n"; + if (!($i % 6)) + { + $custom_var .= "\n \n"; + } $custom_var .= ' prefs[$cf] ? ' checked' : '') - . '>' . $cf . '' . "\n" - . '' . "\n"; + . '>' . str_replace('_',' ',$cf) . '' . "\n"; + + if (!(++$i % 6)) + { + echo "\n"; + } } - $GLOBALS['phpgw']->template->set_var('custom_fields',$custom_var); + if ($i = 6 - ($i % 6)) + { + $custom_var .= "  \n \n"; + } + $this->template->set_var('custom_fields',$custom_var); } else { - $GLOBALS['phpgw']->template->set_var('custom_fields',''); + $this->template->set_var('custom_fields',''); } $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); - $GLOBALS['phpgw']->template->set_var(tr_color,$tr_color); - $GLOBALS['phpgw']->template->set_var('lang_showbirthday',lang('show birthday reminders on main screen')); + $this->template->set_var(tr_color,$tr_color); + $this->template->set_var('lang_showbirthday',lang('show birthday reminders on main screen')); - if($this->prefs['mainscreen_showbirthdays']) + if ($this->prefs['mainscreen_showbirthdays']) { - $GLOBALS['phpgw']->template->set_var('show_birthday',' checked'); + $this->template->set_var('show_birthday',' checked'); } else { - $GLOBALS['phpgw']->template->set_var('show_birthday',''); + $this->template->set_var('show_birthday',''); } $list = array( - '' => lang('All'), - 'private' => lang('Private'), - 'blank' => lang('Blank') + 'none' => lang('Show all'), + 'yours' => lang('Only yours'), + 'private' => lang('Private') /*, + 'blank' => lang('Blank') */ ); - $GLOBALS['phpgw']->template->set_var('lang_default_filter',lang('Default Filter')); - $GLOBALS['phpgw']->template->set_var('filter_select',$this->formatted_list('other[default_filter]',$list,$this->prefs['default_filter'])); + $this->template->set_var('lang_default_filter',lang('Default Filter')); + $this->template->set_var('filter_select',$this->formatted_list('other[default_filter]',$list,$this->prefs['default_filter'])); - $GLOBALS['phpgw']->template->set_var('lang_autosave',lang('Autosave default category')); - if($this->prefs['autosave_category']) + $this->template->set_var('lang_autosave',lang('Autosave default category')); + if ($this->prefs['autosave_category']) { - $GLOBALS['phpgw']->template->set_var('autosave',' checked'); + $this->template->set_var('autosave',' checked'); } else { - $GLOBALS['phpgw']->template->set_var('autosave',''); + $this->template->set_var('autosave',''); } - $GLOBALS['phpgw']->template->set_var('lang_defaultcat',lang('Default Category')); - $GLOBALS['phpgw']->template->set_var('cat_select',$this->cat_option($this->prefs['default_category'])); - $GLOBALS['phpgw']->template->set_var('lang_abprefs',lang('Addressbook').' '.lang('Preferences')); - $GLOBALS['phpgw']->template->set_var('lang_fields',lang('Fields to show in address list')); - $GLOBALS['phpgw']->template->set_var('lang_personal',lang('Personal')); - $GLOBALS['phpgw']->template->set_var('lang_business',lang('Business')); - $GLOBALS['phpgw']->template->set_var('lang_home',lang('Home')); - $GLOBALS['phpgw']->template->set_var('lang_phones',lang('Extra').' '.lang('Phone Numbers')); - $GLOBALS['phpgw']->template->set_var('lang_other',lang('Other').' '.lang('Fields')); - $GLOBALS['phpgw']->template->set_var('lang_otherprefs',lang('Other').' '.lang('Preferences')); - $GLOBALS['phpgw']->template->set_var('lang_submit',lang('submit')); - $GLOBALS['phpgw']->template->set_var('th_bg', $GLOBALS['phpgw_info']['theme']['th_bg']); - $GLOBALS['phpgw']->template->set_var('th_text',$GLOBALS['phpgw_info']['theme']['th_text']); - $GLOBALS['phpgw']->template->set_var('row_on', $GLOBALS['phpgw_info']['theme']['row_on']); - $GLOBALS['phpgw']->template->set_var('row_off',$GLOBALS['phpgw_info']['theme']['row_off']); + $this->template->set_var('lang_defaultcat',lang('Default Category')); + $this->template->set_var('cat_select',$this->cat_option($this->prefs['default_category'], false, false)); + $this->template->set_var('lang_abprefs',lang('Addressbook').' '.lang('Preferences')); + $this->template->set_var('lang_fields',lang('Fields to show in address list')); + $this->template->set_var('lang_personal',lang('Personal')); + $this->template->set_var('lang_business',lang('Business')); + $this->template->set_var('lang_home',lang('Home')); + $this->template->set_var('lang_phones',lang('Extra').' '.lang('Phone Numbers')); + $this->template->set_var('lang_other',lang('Other').' '.lang('Fields')); + $this->template->set_var('lang_otherprefs',lang('Other').' '.lang('Preferences')); + $this->template->set_var('lang_submit',lang('submit')); + $this->template->set_var('th_bg', $GLOBALS['phpgw_info']['theme']['th_bg']); + $this->template->set_var('th_text',$GLOBALS['phpgw_info']['theme']['th_text']); + $this->template->set_var('row_on', $GLOBALS['phpgw_info']['theme']['row_on']); + $this->template->set_var('row_off',$GLOBALS['phpgw_info']['theme']['row_off']); - $this->output .= $GLOBALS['phpgw']->template->parse('out','preferences'); - $this->totpl(); + $this->template->pparse('out','preferences'); } function get_form() { - $entry = $GLOBALS['HTTP_POST_VARS']['entry']; - $fcat_id = $GLOBALS['HTTP_POST_VARS']['fcat_id']; - $referer = $entry['referer'] ? $entry['referer'] : $GLOBALS['HTTP_GET_VARS']['referer']; - $referer = $referer ? $referer : $GLOBALS['HTTP_POST_VARS']['referer']; + $entry = $_POST['entry']; + $fcat_id = $_POST['fcat_id']; + $referer = $entry['referer'] ? $entry['referer'] : $_GET['referer']; + $referer = $referer ? $referer : $_POST['referer']; $test = @unserialize(rawurldecode($entry)); if($test && ($test != $entry)) @@ -1288,14 +1163,14 @@ } /* _debug_array($entry); exit; */ - if(!$entry['bday_month'] && !$entry['bday_day'] && !$entry['bday_year']) + if (!$entry['bday_month'] && !$entry['bday_day'] && !$entry['bday_year']) { $fields['bday'] = ''; } else { $bday_day = $entry['bday_day']; - if(strlen($bday_day) == 1) + if (strlen($bday_day) == 1) { $bday_day = '0' . $entry['bday_day']; } @@ -1305,6 +1180,7 @@ $fields['url'] = $entry['url'] == 'http://' ? '' : $entry['url']; + $fields['lid'] = $entry['lid']; $fields['org_name'] = $entry['company']; $fields['org_unit'] = $entry['department']; $fields['n_given'] = $entry['firstname']; @@ -1312,9 +1188,9 @@ $fields['n_middle'] = $entry['middle']; $fields['n_prefix'] = $entry['prefix']; $fields['n_suffix'] = $entry['suffix']; - if($entry['prefix']) { $pspc = ' '; } - if($entry['middle']) { $mspc = ' '; } else { $nspc = ' '; } - if($entry['suffix']) { $sspc = ' '; } + if ($entry['prefix']) { $pspc = ' '; } + if ($entry['middle']) { $mspc = ' '; } else { $nspc = ' '; } + if ($entry['suffix']) { $sspc = ' '; } $fields['fn'] = $entry['prefix'].$pspc.$entry['firstname'].$nspc.$mspc.$entry['middle'].$mspc.$entry['lastname'].$sspc.$entry['suffix']; $fields['email'] = $entry['email']; $fields['email_type'] = $entry['email_type']; @@ -1384,7 +1260,7 @@ $custom = $this->fields->read_custom_fields(); while(list($name,$val) = @each($custom)) { - @$fields[$name] = $entry[$val]; + $fields[$val['name']] = $entry[$val['name']]; } $fields['ophone'] = $entry['ophone']; @@ -1393,7 +1269,7 @@ $fields['note'] = $entry['notes']; $fields['label'] = $entry['label']; - if($entry['access'] == True) + if ($entry['access'] == True) { $fields['access'] = 'private'; } @@ -1402,7 +1278,7 @@ $fields['access'] = 'public'; } - if(is_array($fcat_id)) + if (is_array($fcat_id)) { $fields['cat_id'] = count($fcat_id) > 1 ? ','.implode(',',$fcat_id).',' : $fcat_id[0]; } @@ -1413,7 +1289,7 @@ $fields['ab_id'] = $entry['ab_id']; $fields['tid'] = $entry['tid']; - if(!$fields['tid']) + if (!$fields['tid']) { $fields['tid'] = 'n'; } @@ -1426,11 +1302,11 @@ /* Following used for add/edit */ function addressbook_form($format,$action,$title='',$fields='',$customfields='',$cat_id='') { - $referer = $GLOBALS['HTTP_GET_VARS']['referer'] ? $GLOBALS['HTTP_GET_VARS']['referer'] : $GLOBALS['HTTP_POST_VARS']['referer']; + $referer = $_GET['referer'] ? $_GET['referer'] : $_POST['referer']; - $GLOBALS['phpgw']->template->set_file(array('form' => 'form.tpl')); + $this->template->set_file(array('form' => 'form.tpl')); - if(($GLOBALS['phpgw_info']['server']['countrylist'] == 'user_choice' && + if ( ($GLOBALS['phpgw_info']['server']['countrylist'] == 'user_choice' && $GLOBALS['phpgw_info']['user']['preferences']['common']['countrylist'] == 'use_select') || ($GLOBALS['phpgw_info']['server']['countrylist'] == 'force_select')) { @@ -1497,7 +1373,7 @@ } $cats_link = $this->cat_option($cat_id,True,False,True); - if($access == 'private') + if ($access == 'private') { $access_check = ' checked'; } @@ -1506,7 +1382,7 @@ $access_check = ''; } - if($customfields) + if ($customfields) { while(list($name,$value) = each($customfields)) { @@ -1521,24 +1397,24 @@ } } - if($format != "view") + if ($format != "view") { /* Preferred phone number radio buttons */ $pref[0] = ''; $pref[1] = '(' . lang('pref') . ')'; - while(list($name,$val) = each($this->contacts->tel_types)) + while (list($name,$val) = each($this->contacts->tel_types)) { $str[$name] = "\n".' template->set_var("pref_".$name,$str[$name]); + $this->template->set_var("pref_".$name,$str[$name]); } - if(strlen($bday) > 2) + if (strlen($bday) > 2) { list( $month, $day, $year ) = split( '/', $bday ); $temp_month[$month] = ' selected'; @@ -1582,14 +1458,14 @@ } $time_zone = '' . "\n"; $email_type = ''; reset($this->contacts->email_types); $hemail_type = ''; reset($this->contacts->adr_types); - while(list($type,$val) = each($this->contacts->adr_types)) + while (list($type,$val) = each($this->contacts->adr_types)) { $badrtype .= "\n".'contacts->adr_types); - while(list($type,$val) = each($this->contacts->adr_types)) + while (list($type,$val) = each($this->contacts->adr_types)) { $hadrtype .= "\n".''; - if($bday == '//') + if ($bday == '//') { $bday = ''; } } - if($action) + if ($action) { echo '
'; } - if(!ereg('^http://',$url)) + if (!ereg('^http://',$url)) { $url = 'http://' . $url; } $birthday = $GLOBALS['phpgw']->common->dateformatorder($bday_year,$bday_month,$bday_day) . '(e.g. 1969)'; - if($format == 'edit') + if ($format == 'edit') { $create .= '' . lang("Created by") . ':' . '' @@ -1688,137 +1558,137 @@ $create .= ''; } - $GLOBALS['phpgw']->template->set_var('lang_home',lang('Home')); - $GLOBALS['phpgw']->template->set_var('lang_business',lang('Business')); - $GLOBALS['phpgw']->template->set_var('lang_personal',lang('Personal')); + $this->template->set_var('lang_home',lang('Home')); + $this->template->set_var('lang_business',lang('Business')); + $this->template->set_var('lang_personal',lang('Personal')); - $GLOBALS['phpgw']->template->set_var('lang_lastname',lang('Last Name')); - $GLOBALS['phpgw']->template->set_var('lastname',$lastname); - $GLOBALS['phpgw']->template->set_var('lang_firstname',lang('First Name')); - $GLOBALS['phpgw']->template->set_var('firstname',$firstname); - $GLOBALS['phpgw']->template->set_var('lang_middle',lang('Middle Name')); - $GLOBALS['phpgw']->template->set_var('middle',$middle); - $GLOBALS['phpgw']->template->set_var('lang_prefix',lang('Prefix')); - $GLOBALS['phpgw']->template->set_var('prefix',$prefix); - $GLOBALS['phpgw']->template->set_var('lang_suffix',lang('Suffix')); - $GLOBALS['phpgw']->template->set_var('suffix',$suffix); - $GLOBALS['phpgw']->template->set_var('lang_birthday',lang('Birthday')); - $GLOBALS['phpgw']->template->set_var('birthday',$birthday); + $this->template->set_var('lang_lastname',lang('Last Name')); + $this->template->set_var('lastname',$lastname); + $this->template->set_var('lang_firstname',lang('First Name')); + $this->template->set_var('firstname',$firstname); + $this->template->set_var('lang_middle',lang('Middle Name')); + $this->template->set_var('middle',$middle); + $this->template->set_var('lang_prefix',lang('Prefix')); + $this->template->set_var('prefix',$prefix); + $this->template->set_var('lang_suffix',lang('Suffix')); + $this->template->set_var('suffix',$suffix); + $this->template->set_var('lang_birthday',lang('Birthday')); + $this->template->set_var('birthday',$birthday); - $GLOBALS['phpgw']->template->set_var('lang_company',lang('Company Name')); - $GLOBALS['phpgw']->template->set_var('company',$company); - $GLOBALS['phpgw']->template->set_var('lang_department',lang('Department')); - $GLOBALS['phpgw']->template->set_var('department',$department); - $GLOBALS['phpgw']->template->set_var('lang_title',lang('Title')); - $GLOBALS['phpgw']->template->set_var('title',$title); - $GLOBALS['phpgw']->template->set_var('lang_email',lang('Business Email')); - $GLOBALS['phpgw']->template->set_var('email',$email); - $GLOBALS['phpgw']->template->set_var('lang_email_type',lang('Business EMail Type')); - $GLOBALS['phpgw']->template->set_var('email_type',$email_type); - $GLOBALS['phpgw']->template->set_var('lang_url',lang('URL')); - $GLOBALS['phpgw']->template->set_var('url',$url); - $GLOBALS['phpgw']->template->set_var('lang_timezone',lang('time zone offset')); - $GLOBALS['phpgw']->template->set_var('timezone',$time_zone); - $GLOBALS['phpgw']->template->set_var('lang_fax',lang('Business Fax')); - $GLOBALS['phpgw']->template->set_var('fax',$fax); - $GLOBALS['phpgw']->template->set_var('lang_wphone',lang('Business Phone')); - $GLOBALS['phpgw']->template->set_var('wphone',$wphone); - $GLOBALS['phpgw']->template->set_var('lang_pager',lang('Pager')); - $GLOBALS['phpgw']->template->set_var('pager',$pager); - $GLOBALS['phpgw']->template->set_var('lang_mphone',lang('Cell Phone')); - $GLOBALS['phpgw']->template->set_var('mphone',$mphone); - $GLOBALS['phpgw']->template->set_var('lang_msgphone',lang('Message Phone')); - $GLOBALS['phpgw']->template->set_var('msgphone',$msgphone); - $GLOBALS['phpgw']->template->set_var('lang_isdnphone',lang('ISDN Phone')); - $GLOBALS['phpgw']->template->set_var('isdnphone',$isdnphone); - $GLOBALS['phpgw']->template->set_var('lang_carphone',lang('Car Phone')); - $GLOBALS['phpgw']->template->set_var('carphone',$carphone); - $GLOBALS['phpgw']->template->set_var('lang_vidphone',lang('Video Phone')); - $GLOBALS['phpgw']->template->set_var('vidphone',$vidphone); + $this->template->set_var('lang_company',lang('Company Name')); + $this->template->set_var('company',$company); + $this->template->set_var('lang_department',lang('Department')); + $this->template->set_var('department',$department); + $this->template->set_var('lang_title',lang('Title')); + $this->template->set_var('title',$title); + $this->template->set_var('lang_email',lang('Business Email')); + $this->template->set_var('email',$email); + $this->template->set_var('lang_email_type',lang('Business EMail Type')); + $this->template->set_var('email_type',$email_type); + $this->template->set_var('lang_url',lang('URL')); + $this->template->set_var('url',$url); + $this->template->set_var('lang_timezone',lang('time zone offset')); + $this->template->set_var('timezone',$time_zone); + $this->template->set_var('lang_fax',lang('Business Fax')); + $this->template->set_var('fax',$fax); + $this->template->set_var('lang_wphone',lang('Business Phone')); + $this->template->set_var('wphone',$wphone); + $this->template->set_var('lang_pager',lang('Pager')); + $this->template->set_var('pager',$pager); + $this->template->set_var('lang_mphone',lang('Cell Phone')); + $this->template->set_var('mphone',$mphone); + $this->template->set_var('lang_msgphone',lang('Message Phone')); + $this->template->set_var('msgphone',$msgphone); + $this->template->set_var('lang_isdnphone',lang('ISDN Phone')); + $this->template->set_var('isdnphone',$isdnphone); + $this->template->set_var('lang_carphone',lang('Car Phone')); + $this->template->set_var('carphone',$carphone); + $this->template->set_var('lang_vidphone',lang('Video Phone')); + $this->template->set_var('vidphone',$vidphone); - $GLOBALS['phpgw']->template->set_var('lang_ophone',lang('Other Number')); - $GLOBALS['phpgw']->template->set_var('ophone',$ophone); - $GLOBALS['phpgw']->template->set_var('lang_bstreet',lang('Business Street')); - $GLOBALS['phpgw']->template->set_var('bstreet',$bstreet); - $GLOBALS['phpgw']->template->set_var('lang_address2',lang('Address Line 2')); - $GLOBALS['phpgw']->template->set_var('address2',$address2); - $GLOBALS['phpgw']->template->set_var('lang_address3',lang('Address Line 3')); - $GLOBALS['phpgw']->template->set_var('address3',$address3); - $GLOBALS['phpgw']->template->set_var('lang_bcity',lang('Business City')); - $GLOBALS['phpgw']->template->set_var('bcity',$bcity); - $GLOBALS['phpgw']->template->set_var('lang_bstate',lang('Business State')); - $GLOBALS['phpgw']->template->set_var('bstate',$bstate); - $GLOBALS['phpgw']->template->set_var('lang_bzip',lang('Business Zip Code')); - $GLOBALS['phpgw']->template->set_var('bzip',$bzip); - $GLOBALS['phpgw']->template->set_var('lang_bcountry',lang('Business Country')); - $GLOBALS['phpgw']->template->set_var('bcountry',$bcountry); - if($countrylist) + $this->template->set_var('lang_ophone',lang('Other Number')); + $this->template->set_var('ophone',$ophone); + $this->template->set_var('lang_bstreet',lang('Business Street')); + $this->template->set_var('bstreet',$bstreet); + $this->template->set_var('lang_address2',lang('Address Line 2')); + $this->template->set_var('address2',$address2); + $this->template->set_var('lang_address3',lang('Address Line 3')); + $this->template->set_var('address3',$address3); + $this->template->set_var('lang_bcity',lang('Business City')); + $this->template->set_var('bcity',$bcity); + $this->template->set_var('lang_bstate',lang('Business State')); + $this->template->set_var('bstate',$bstate); + $this->template->set_var('lang_bzip',lang('Business Zip Code')); + $this->template->set_var('bzip',$bzip); + $this->template->set_var('lang_bcountry',lang('Business Country')); + $this->template->set_var('bcountry',$bcountry); + if ($countrylist) { - $GLOBALS['phpgw']->template->set_var('bcountry',$GLOBALS['phpgw']->country->form_select($bcountry,'entry[bcountry]')); + $this->template->set_var('bcountry',$GLOBALS['phpgw']->country->form_select($bcountry,'entry[bcountry]')); } else { - $GLOBALS['phpgw']->template->set_var('bcountry',''); + $this->template->set_var('bcountry',''); } - $GLOBALS['phpgw']->template->set_var('lang_badrtype',lang('Address Type')); - $GLOBALS['phpgw']->template->set_var('badrtype',$badrtype); + $this->template->set_var('lang_badrtype',lang('Address Type')); + $this->template->set_var('badrtype',$badrtype); - $GLOBALS['phpgw']->template->set_var('lang_hphone',lang('Home Phone')); - $GLOBALS['phpgw']->template->set_var('hphone',$hphone); - $GLOBALS['phpgw']->template->set_var('lang_hemail',lang('Home Email')); - $GLOBALS['phpgw']->template->set_var('hemail',$hemail); - $GLOBALS['phpgw']->template->set_var('lang_hemail_type',lang('Home EMail Type')); - $GLOBALS['phpgw']->template->set_var('hemail_type',$hemail_type); - $GLOBALS['phpgw']->template->set_var('lang_hstreet',lang('Home Street')); - $GLOBALS['phpgw']->template->set_var('hstreet',$hstreet); - $GLOBALS['phpgw']->template->set_var('lang_hcity',lang('Home City')); - $GLOBALS['phpgw']->template->set_var('hcity',$hcity); - $GLOBALS['phpgw']->template->set_var('lang_hstate',lang('Home State')); - $GLOBALS['phpgw']->template->set_var('hstate',$hstate); - $GLOBALS['phpgw']->template->set_var('lang_hzip',lang('Home Zip Code')); - $GLOBALS['phpgw']->template->set_var('hzip',$hzip); - $GLOBALS['phpgw']->template->set_var('lang_hcountry',lang('Home Country')); - if($countrylist) + $this->template->set_var('lang_hphone',lang('Home Phone')); + $this->template->set_var('hphone',$hphone); + $this->template->set_var('lang_hemail',lang('Home Email')); + $this->template->set_var('hemail',$hemail); + $this->template->set_var('lang_hemail_type',lang('Home EMail Type')); + $this->template->set_var('hemail_type',$hemail_type); + $this->template->set_var('lang_hstreet',lang('Home Street')); + $this->template->set_var('hstreet',$hstreet); + $this->template->set_var('lang_hcity',lang('Home City')); + $this->template->set_var('hcity',$hcity); + $this->template->set_var('lang_hstate',lang('Home State')); + $this->template->set_var('hstate',$hstate); + $this->template->set_var('lang_hzip',lang('Home Zip Code')); + $this->template->set_var('hzip',$hzip); + $this->template->set_var('lang_hcountry',lang('Home Country')); + if ($countrylist) { - $GLOBALS['phpgw']->template->set_var('hcountry',$GLOBALS['phpgw']->country->form_select($hcountry,'entry[hcountry]')); + $this->template->set_var('hcountry',$GLOBALS['phpgw']->country->form_select($hcountry,'entry[hcountry]')); } else { - $GLOBALS['phpgw']->template->set_var('hcountry',''); + $this->template->set_var('hcountry',''); } - $GLOBALS['phpgw']->template->set_var('lang_hadrtype',lang('Address Type')); - $GLOBALS['phpgw']->template->set_var('hadrtype',$hadrtype); + $this->template->set_var('lang_hadrtype',lang('Address Type')); + $this->template->set_var('hadrtype',$hadrtype); - $GLOBALS['phpgw']->template->set_var('create',$create); - $GLOBALS['phpgw']->template->set_var('lang_notes',lang('notes')); - $GLOBALS['phpgw']->template->set_var('notes',$notes); - $GLOBALS['phpgw']->template->set_var('lang_label',lang('label')); - $GLOBALS['phpgw']->template->set_var('label',$label); - $GLOBALS['phpgw']->template->set_var('lang_pubkey',lang('Public Key')); - $GLOBALS['phpgw']->template->set_var('pubkey',$pubkey); - $GLOBALS['phpgw']->template->set_var('access_check',$access_check); + $this->template->set_var('create',$create); + $this->template->set_var('lang_notes',lang('notes')); + $this->template->set_var('notes',$notes); + $this->template->set_var('lang_label',lang('label')); + $this->template->set_var('label',$label); + $this->template->set_var('lang_pubkey',lang('Public Key')); + $this->template->set_var('pubkey',$pubkey); + $this->template->set_var('access_check',$access_check); - $GLOBALS['phpgw']->template->set_var('lang_private',lang('Private')); + $this->template->set_var('lang_private',lang('Private')); - $GLOBALS['phpgw']->template->set_var('lang_cats',lang('Category')); - $GLOBALS['phpgw']->template->set_var('cats_link',$cats_link); - if($customfields) + $this->template->set_var('lang_cats',lang('Category')); + $this->template->set_var('cats_link',$cats_link); + if ($customfields) { - $GLOBALS['phpgw']->template->set_var('lang_custom',lang('Custom Fields').':'); - $GLOBALS['phpgw']->template->set_var('custom',$custom); + $this->template->set_var('lang_custom',lang('Custom Fields').':'); + $this->template->set_var('custom',$custom); } else { - $GLOBALS['phpgw']->template->set_var('lang_custom',''); - $GLOBALS['phpgw']->template->set_var('custom',''); + $this->template->set_var('lang_custom',''); + $this->template->set_var('custom',''); } - $GLOBALS['phpgw']->template->set_var('th_bg', $GLOBALS['phpgw_info']['theme']['th_bg']); - $GLOBALS['phpgw']->template->set_var('th_text', $GLOBALS['phpgw_info']['theme']['th_text']); - $GLOBALS['phpgw']->template->set_var('row_on', $GLOBALS['phpgw_info']['theme']['row_on']); - $GLOBALS['phpgw']->template->set_var('row_off', $GLOBALS['phpgw_info']['theme']['row_off']); - $GLOBALS['phpgw']->template->set_var('row_text',$GLOBALS['phpgw_info']['theme']['row_text']); + $this->template->set_var('th_bg', $GLOBALS['phpgw_info']['theme']['th_bg']); + $this->template->set_var('th_text', $GLOBALS['phpgw_info']['theme']['th_text']); + $this->template->set_var('row_on', $GLOBALS['phpgw_info']['theme']['row_on']); + $this->template->set_var('row_off', $GLOBALS['phpgw_info']['theme']['row_off']); + $this->template->set_var('row_text',$GLOBALS['phpgw_info']['theme']['row_text']); - $this->output .= $GLOBALS['phpgw']->template->fp('out','form'); + $this->template->pfp('out','form'); } /* end form function */ } ?> diff --git a/addressbook/inc/class.uifields.inc.php b/addressbook/inc/class.uifields.inc.php index 2da9f8ad32..562ead7612 100644 --- a/addressbook/inc/class.uifields.inc.php +++ b/addressbook/inc/class.uifields.inc.php @@ -24,8 +24,8 @@ function uifields() { -// $GLOBALS['phpgw']->template = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); -// $GLOBALS['phpgw']->nextmatchs = CreateObject('phpgwapi.nextmatchs'); + $GLOBALS['phpgw']->template = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $GLOBALS['phpgw']->nextmatchs = CreateObject('phpgwapi.nextmatchs'); $this->config = CreateObject('phpgwapi.config','addressbook'); } @@ -34,9 +34,9 @@ if(!$GLOBALS['phpgw']->acl->check('run',1,'admin')) { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo lang('access not permitted'); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } $GLOBALS['phpgw']->template->set_file(array( @@ -80,6 +80,7 @@ $total_records = count($fields); $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); $GLOBALS['phpgw']->template->set_var('left',$GLOBALS['phpgw']->nextmatchs->left('/index.php',$start,$total_records,'menuaction=addressbook.uifields.index')); $GLOBALS['phpgw']->template->set_var('right',$GLOBALS['phpgw']->nextmatchs->right('/index.php',$start,$total_records,'menuaction=addressbook.uifields.index')); @@ -128,9 +129,9 @@ if(!$GLOBALS['phpgw']->acl->check('run',1,'admin')) { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo lang('access not permitted'); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } $field = stripslashes($GLOBALS['HTTP_POST_VARS']['field']); @@ -166,6 +167,7 @@ } $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); if($errorcount) { @@ -204,9 +206,9 @@ if(!$GLOBALS['phpgw']->acl->check('run',1,'admin')) { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo lang('access not permitted'); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } $field = stripslashes($GLOBALS['HTTP_POST_VARS']['field'] ? $GLOBALS['HTTP_POST_VARS']['field'] : $GLOBALS['HTTP_GET_VARS']['field']); @@ -245,6 +247,7 @@ } $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); if($errorcount) { @@ -296,9 +299,9 @@ if(!$GLOBALS['phpgw']->acl->check('run',1,'admin')) { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo lang('access not permitted'); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } $field = $GLOBALS['HTTP_POST_VARS']['field'] ? $GLOBALS['HTTP_POST_VARS']['field'] : $GLOBALS['HTTP_GET_VARS']['field']; @@ -320,6 +323,7 @@ else { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); $hidden_vars = '' . "\n" . '' . "\n" diff --git a/addressbook/inc/class.uivcard.inc.php b/addressbook/inc/class.uivcard.inc.php index 6d95c6c334..9b35f3dd69 100644 --- a/addressbook/inc/class.uivcard.inc.php +++ b/addressbook/inc/class.uivcard.inc.php @@ -26,7 +26,7 @@ 'out' => True ); - var $extrafields = array( + var $extrafields = array( 'ophone' => 'ophone', 'address2' => 'address2', 'address3' => 'address3' @@ -43,13 +43,14 @@ function in() { - $action = $GLOBALS['HTTP_POST_VARS']['action']; + $action = $GLOBALS['HTTP_POST_VARS']['action'] ? $GLOBALS['HTTP_POST_VARS']['action'] : $GLOBALS['HTTP_GET_VARS']['action']; $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); echo ''; - if($action == 'GetFile') + if ($action == 'GetFile') { echo '
' . lang('You must select a vcard. (*.vcf)') . '


'; } @@ -64,43 +65,39 @@ $this->template->set_var('group_option',$group_option); $this->template->pparse('out','vcardin'); + + $GLOBALS['phpgw']->common->phpgw_footer(); } function out() { - $ab_id = get_var('ab_id',array('GET','POST')); - $nolname = get_var('nolname',array('GET','POST')); - $nofname = get_var('nofname',array('GET','POST')); + $ab_id = $GLOBALS['HTTP_GET_VARS']['ab_id'] ? $GLOBALS['HTTP_GET_VARS']['ab_id'] : $GLOBALS['HTTP_POST_VARS']['ab_id']; + $nolname = $GLOBALS['HTTP_GET_VARS']['nolname']; + $nofname = $GLOBALS['HTTP_GET_VARS']['nofname']; if($nolname || $nofname) { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); } if(!$ab_id) { Header('Location: ' . $GLOBALS['phpgw']->link('/addressbook/index.php')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } // First, make sure they have permission to this entry - $check = $this->bo->read_entry(array( - 'id' => $ab_id, - 'fields' => array( - 'owner' => 'owner' - ) - )); + $check = $this->bo->read_entry(array('id' => $ab_id, 'fields' => array('owner' => 'owner'))); $perms = $this->contacts->check_perms($this->contacts->grants[$check[0]['owner']],PHPGW_ACL_READ); - if((!$perms) && ($check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id'])) + if ( (!$perms) && ($check[0]['owner'] != $GLOBALS['phpgw_info']['user']['account_id']) ) { - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.get_list')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + Header("Location: " . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.get_list')); + $GLOBALS['phpgw']->common->phpgw_exit(); } - $extrafields = array('address2' => 'address2'); + $extrafields = array('address2' => 'address2'); $qfields = $this->contacts->stock_contact_fields + $extrafields; $fieldlist = $this->bo->read_entry(array('id' => $ab_id, 'fields' => $qfields)); @@ -127,49 +124,50 @@ if($lastname == '') { /* Run away here. */ - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uivcard.out&nolname=1&ab_id=' . $ab_id)); + Header('Location: ' . $GLOBALS['phpgw']->link('/index.php',"menuaction=addressbook.uivcard.out&nolname=1&ab_id=$ab_id")); } if($firstname == '') { - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uivcard.out&nofname=1&ab_id=' . $ab_id)); + Header('Location: ' . $GLOBALS['phpgw']->link('/index.php',"menuaction=addressbook.uivcard.out&nofname=1&ab_id=$ab_id")); } if ($email) { $fn = explode('@',$email); - $filename = sprintf('%s.vcf', $fn[0]); + $filename = sprintf("%s.vcf", $fn[0]); } elseif ($hemail) { $fn = explode('@',$hemail); - $filename = sprintf('%s.vcf', $fn[0]); + $filename = sprintf("%s.vcf", $fn[0]); } else { $fn = strtolower($firstname); - $filename = sprintf('%s.vcf', $fn); + $filename = sprintf("%s.vcf", $fn); } // set translation variable $myexport = $this->vcard->export; // check that each $fields exists in the export array and // set a new array to equal the translation and original value - while(list($name,$value) = each($fields)) + while( list($name,$value) = each($fields) ) { - if($myexport[$name] && ($value != '')) + if ($myexport[$name] && ($value != "") ) { - //echo '
'.$name.'='.$fields[$name]."\n"; + //echo '
'.$name."=".$fields[$name]."\n"; $buffer[$myexport[$name]] = $value; } } // create a vcard from this translated array - $entry = $this->vcard->out($buffer); + $entry = $this->vcard->out($buffer); // print it using browser class for headers // filename, mimetype, no length, default nocache True $this->browser->content_header($filename,'text/x-vcard'); echo $entry; - $GLOBALS['phpgw']->common->exit; + exit; + //$GLOBALS['phpgw']->common->exit; } /* !nolname && !nofname */ if($nofname) @@ -177,7 +175,8 @@ echo '

'; echo lang("This person's first name was not in the address book.") .'
'; echo lang('Vcards require a first name entry.') . '

'; - echo '
' . lang('OK') . ''; + echo '' . lang('OK') . ''; echo '
'; } @@ -186,9 +185,15 @@ echo '

'; echo lang("This person's last name was not in the address book.") . '
'; echo lang('Vcards require a last name entry.') . '

'; - echo '' . lang('OK') . ''; + echo '' . lang('OK') . ''; echo '
'; } + + if($nolname || $nofname) + { + //$GLOBALS['phpgw']->common->phpgw_footer(); + } } } ?> diff --git a/addressbook/inc/functions.inc.php b/addressbook/inc/functions.inc.php index cba49654ef..4dcc53672f 100755 --- a/addressbook/inc/functions.inc.php +++ b/addressbook/inc/functions.inc.php @@ -43,8 +43,6 @@ /* Return a select form element with the categories option dialog in it */ function cat_option($cat_id='',$notall=False,$java=True,$multiple=False) { - global $phpgw; - if ($java) { $jselect = ' onChange="this.form.submit();"'; @@ -62,7 +60,7 @@ } /* Get global and app-specific category listings */ - $cats_link .= $phpgw->categories->formatted_list('select','all',$cat_id,True); + $cats_link .= $GLOBALS['phpgw']->categories->formated_list('select','all',$cat_id,True); $cats_link .= ''."\n"; return $cats_link; } @@ -134,12 +132,10 @@ function read_custom_fields() { - global $phpgw_info; - $i = 0; $j = 0; $fields = array(); - @reset($phpgw_info['user']['preferences']['addressbook']); - while (list($col,$descr) = @each($phpgw_info['user']['preferences']['addressbook'])) + @reset($GLOBALS['phpgw_info']['user']['preferences']['addressbook']); + while (list($col,$descr) = @each($GLOBALS['phpgw_info']['user']['preferences']['addressbook'])) { if ( substr($col,0,6) == 'extra_' ) { @@ -166,17 +162,15 @@ function save_custom_field($old='',$new='') { - global $phpgw,$phpgw_info; - - $phpgw->preferences->read_repository($phpgw_info['user']['account_id']); + $GLOBALS['phpgw']->preferences->read_repository($GLOBALS['phpgw_info']['user']['account_id']); if ($old) { - $phpgw->preferences->delete("addressbook","extra_".$old); + $GLOBALS['phpgw']->preferences->delete("addressbook","extra_".$old); } if($new) { - $phpgw->preferences->add("addressbook","extra_".$new); + $GLOBALS['phpgw']->preferences->add("addressbook","extra_".$new); } - $phpgw->preferences->save_repository(1); + $GLOBALS['phpgw']->preferences->save_repository(1); } ?> diff --git a/addressbook/inc/hook_admin.inc.php b/addressbook/inc/hook_admin.inc.php index d13b4665a9..290e519306 100644 --- a/addressbook/inc/hook_admin.inc.php +++ b/addressbook/inc/hook_admin.inc.php @@ -2,24 +2,24 @@ /**************************************************************************\ * phpGroupWare * * http://www.phpgroupware.org * - * Written by coreteam * - * ----------------------------------------------------- * + * Written by Joseph Engo * + * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ - /* $Id$ */ - { -// Only Modify the $file variable..... - $file = Array - ( - 'Site Configuration' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname), - 'Edit custom fields' => $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uifields.index'), - 'Global Categories' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicategories.index&appname=' . $appname . '&global_cats=True') - ); -//Do not modify below this line - $GLOBALS['phpgw']->common->display_mainscreen($appname,$file); - } -?> + // $Id$ + // $Source$ + + // Only Modify the $file and $title variables..... + $title = $appname; + $file = Array( + 'Site Configuration' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname), + 'Edit custom fields' => $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uifields.index'), + 'Global Categories' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicategories.index&appname=addressbook') + ); + //Do not modify below this line + display_section($appname,$title,$file); +?> \ No newline at end of file diff --git a/addressbook/inc/hook_help.inc.php b/addressbook/inc/hook_help.inc.php deleted file mode 100644 index 8191bc9918..0000000000 --- a/addressbook/inc/hook_help.inc.php +++ /dev/null @@ -1,41 +0,0 @@ -help->set_params(array('app_name' => 'addressbook', - 'title' => lang('addressbook'), - 'app_version' => $setup_info['addressbook']['version'])); - - $GLOBALS['phpgw']->help->data[] = array - ( - 'text' => lang('owerview'), - 'link' => $GLOBALS['phpgw']->help->check_help_file('overview.php'), - 'lang_link_statustext' => lang('owerview') - ); - - $GLOBALS['phpgw']->help->data[] = array - ( - 'text' => lang('list'), - 'link' => $GLOBALS['phpgw']->help->check_help_file('list.php'), - 'lang_link_statustext' => lang('list') - ); - - $GLOBALS['phpgw']->help->data[] = array - ( - 'text' => lang('add'), - 'link' => $GLOBALS['phpgw']->help->check_help_file('add.php'), - 'lang_link_statustext' => lang('add') - ); - - $GLOBALS['phpgw']->help->draw(); -?> diff --git a/addressbook/inc/hook_home.inc.php b/addressbook/inc/hook_home.inc.php index 4e8471b86a..da604e7ddf 100644 --- a/addressbook/inc/hook_home.inc.php +++ b/addressbook/inc/hook_home.inc.php @@ -1,55 +1,83 @@ \n"; - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } unset($d1); if ($GLOBALS['phpgw_info']['user']['apps']['addressbook'] && $GLOBALS['phpgw_info']['user']['preferences']['addressbook']['mainscreen_showbirthdays']) { + echo "\n\n"; + $c = CreateObject('phpgwapi.contacts'); - $qfields = array - ( + $qfields = array( 'n_given' => 'n_given', 'n_family' => 'n_family', 'bday' => 'bday' ); $now = time() - ((60 * 60) * intval($GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset'])); $today = $GLOBALS['phpgw']->common->show_date($now,'n/d/'); - + $bdays = $c->read(0,15,$qfields,$today,'tid=n','','',$GLOBALS['phpgw_info']['user']['account_id']); + + $title = '
'.lang('Birthdays').'
'; + $portalbox = CreateObject('phpgwapi.listbox', + Array( + 'title' => $title, + 'primary' => $GLOBALS['phpgw_info']['theme']['navbar_bg'], + 'secondary' => $GLOBALS['phpgw_info']['theme']['navbar_bg'], + 'tertiary' => $GLOBALS['phpgw_info']['theme']['navbar_bg'], + 'width' => '100%', + 'outerborderwidth' => '0', + 'header_background_image' => $GLOBALS['phpgw']->common->image('phpgwapi/templates/default','bg_filler') + ) + ); $app_id = $GLOBALS['phpgw']->applications->name2id('addressbook'); $GLOBALS['portal_order'][] = $app_id; + $var = Array( + 'up' => Array('url' => '/set_box.php', 'app' => $app_id), + 'down' => Array('url' => '/set_box.php', 'app' => $app_id), + 'close' => Array('url' => '/set_box.php', 'app' => $app_id), + 'question' => Array('url' => '/set_box.php', 'app' => $app_id), + 'edit' => Array('url' => '/set_box.php', 'app' => $app_id) + ); + + while(list($key,$value) = each($var)) + { + $portalbox->set_controls($key,$value); + } + + $portalbox->data = Array(); - $GLOBALS['phpgw']->portalbox->set_params(array('app_id' => $app_id, - 'title' => lang('addressbook'))); while(list($key,$val) = @each($bdays)) { if (substr($val['bday'],0,strlen($today)) == $today) { - $GLOBALS['phpgw']->portalbox->data[] = array - ( - 'text' => lang("Today is %1's birthday!", $val['n_given'] . ' ' . $val['n_family']), - 'link' => $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.view&ab_id=' . $val['id']), - 'lang_link_statustext' => lang('show contact') + $portalbox->data[] = array( + 'text' => lang("Today is %1's birthday!", $val['n_given'] . ' ' . $val['n_family']), + 'link' => $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.view&ab_id=' . $val['id']) ); } +// $tmp = '' +// . $val['n_given'] . ' ' . $val['n_family'] . ''; +// echo '' . lang("Today is %1's birthday!", $tmp) . '' . "\n"; } $tomorrow = $GLOBALS['phpgw']->common->show_date($now + 86400,'n/d/'); @@ -60,14 +88,21 @@ { if (substr($val['bday'],0,strlen($tomorrow)) == $tomorrow) { - $GLOBALS['phpgw']->portalbox->data[] = array - ( - 'text' => lang("Tomorrow is %1's birthday.", $val['n_given'] . ' ' . $val['n_family']), - 'link' => $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.view&ab_id='.$val['id']), - 'lang_link_statustext' => lang('show contact') + $portalbox->data[] = array( + 'text' => lang("Tomorrow is %1's birthday.",$val['n_given'] . ' ' . $val['n_family']), + 'link' => $GLOBALS['phpgw']->link('/index.php','menuaction=addressbook.uiaddressbook.view&ab_id='.$val['id']) ); } +// $tmp = '' +// . $val['n_given'] . ' ' . $val["n_family"] . ''; +// echo '' . lang("Tomorrow is %1's birthday.", $tmp) . '' . "\n"; } - $GLOBALS['phpgw']->portalbox->draw(); + if(count($portalbox->data)) + { + echo $portalbox->draw(); + } + unset($portalbox); + echo "\n\n"; } ?> diff --git a/addressbook/inc/hook_manual.inc.php b/addressbook/inc/hook_manual.inc.php new file mode 100755 index 0000000000..365e315b61 --- /dev/null +++ b/addressbook/inc/hook_manual.inc.php @@ -0,0 +1,19 @@ + * + * -------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * + \**************************************************************************/ + + /* $Id$ */ + +// Only Modify the $file variable..... + $file = Array(); +//Do not modify below this line + display_manual_section($appname,$file); +?> diff --git a/addressbook/inc/hook_notifywindow.inc.php b/addressbook/inc/hook_notifywindow.inc.php index eb4f0a4bc2..7e49f68309 100644 --- a/addressbook/inc/hook_notifywindow.inc.php +++ b/addressbook/inc/hook_notifywindow.inc.php @@ -15,8 +15,7 @@ if($d1 == 'htt' || $d1 == 'ftp' ) { echo "Failed attempt to break in via an old Security Hole!
\n"; - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } unset($d1); diff --git a/addressbook/index.php b/addressbook/index.php index 47c69e63e6..62e54f74d3 100755 --- a/addressbook/index.php +++ b/addressbook/index.php @@ -1,10 +1,10 @@ * - * and Miles Lott * + * -------------------------------------------- * + * Funding for this program was provided by http://www.checkwithmom.com * * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * @@ -17,10 +17,14 @@ $GLOBALS['phpgw_info'] = array(); $GLOBALS['phpgw_info']['flags'] = array( - 'currentapp' => 'addressbook' + 'currentapp' => 'addressbook', + 'noheader' => True, + 'nonavbar' => True ); include('../header.inc.php'); $obj = CreateObject('addressbook.uiaddressbook'); $obj->index(); + + $GLOBALS['phpgw']->common->phpgw_footer(); ?> diff --git a/addressbook/setup/phpgw_de.lang b/addressbook/setup/phpgw_de.lang index 641c9a515a..5c465c8b80 100644 --- a/addressbook/setup/phpgw_de.lang +++ b/addressbook/setup/phpgw_de.lang @@ -1,15 +1,19 @@ +%1 records imported addressbook de %1 Datensätze importiert +%1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook de %1 Datensätze gelesen (noch nicht importiert, sie können %2zurück%3 gehen und Test-Import auschalten) no conversion type <none> could be located. please choose a conversion type from the list addressbook de Kein Übersetzungstyp <none> konnte gefunden werden. Bitte wählen Sie einen Übersetzungstype aus der Liste -no conversion type could be located. please choose a conversion type from the list addressbook de Kein Übersetzungstyp <none> konnte gefunden werden. Bitte wählen Sie einen Übersetzungstype aus der Liste +@-eval() is only availible to admins!!! addressbook de @-eval() ist nur verfügbar für Administratoren!!! +add a single entry by passing the fields. addressbook de Hinzufügen eines einzelnen Eintrags durch Übergeben der Felder. add custom field addressbook de Benutzerdefiniertes Feld hinzufügen address book common de Adressbuch +address book - vcard in addressbook de Adressbuch - VCard in address book - view addressbook de Adressbuch - Anzeigen address line 2 addressbook de Adreßzeile 2 address line 3 addressbook de Adreßzeile 3 address type addressbook de Adreßtyp addressbook common de Adressbuch addressbook preferences addressbook de Adressbuch Einstellungen +addressbook-fieldname addressbook de Adressbuch Feldname addvcard addressbook de VCard hinzufügen -alphabet addressbook de a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z alt. csv import addressbook de Alt. CSV Import are you sure you want to delete this field? addressbook de Sind Sie sicher, dass sie dieses Feld löschen wollen? bbs phone addressbook de BBS @@ -35,27 +39,32 @@ company name common de Firmenname contact common de Kontakt contact application admin de Kontakt Anwendung contact settings admin de Kontakt Einstellungen +copied by %1, from record #%2. addressbook de Kopiert von %1, vom Datensatz Nr. %2. country common de Land +csv-fieldname addressbook de CSV-Feldname +csv-filename addressbook de CSV-Dateiname custom addressbook de Benutzerdefiniert custom fields addressbook de Benutzerdefinierte Felder -debug output in browser addressbook de Ausgaben zur Fehlersuche im Webbrowser +debug output in browser addressbook de Debugausgaben in Browser default filter addressbook de Standardfilter +delete a single entry by passing the id. addressbook de Löscht einen einzelnen Eintrag durch Übergabe seiner Id. department common de Abteilung domestic addressbook de Wohnung -download export file (uncheck to debug output in browser) addressbook de Exportdatei herunterladen (nicht auswählen um eine Test-Ausgabe im Browser zu bekommen) +download addressbook de Herunterladen edit custom field addressbook de Benutzerdefiniertes Feld bearbeiten edit custom fields admin de Benutzerdefinierte Felder bearbeiten -enable remote search admin de Fern-Suche zulassen -enter the path to the export file here addressbook de Geben Sie hier den Pfad zur exportierent Datei an export contacts addressbook de Kontakte exportieren export file name addressbook de Dateiname zum Exportieren +export from addressbook addressbook de Export vom Addressbuch extra addressbook de Extra fax addressbook de Telefax fax number common de Telefaxnummer -field name addressbook de Feldname field %1 has been added ! addressbook de Feld %1 wurde hinzugefügt ! +field %1 has been updated ! addressbook de Feld %1 wurde aktualisiert ! +field name addressbook de Feldname fields addressbook de Felder fields to show in address list addressbook de Felder, die in der Adressliste angezeigt werden sollen +fieldseparator addressbook de Feldtrenner full name addressbook de vollständiger Name geo addressbook de GEO grant addressbook access common de Berechtigungen @@ -68,10 +77,12 @@ home phone addressbook de Tel privat home state addressbook de Land (priv) home street addressbook de Straße (priv) home zip code addressbook de PLZ (priv) +import addressbook de Import import contacts addressbook de Kontakte importieren +import csv-file into addressbook addressbook de Import CSV-Datei ins Addressbuch import file addressbook de Datei importieren +import from ldif, csv, or vcard addressbook de Import von LDIF, CSV oder VCard import from outlook addressbook de Aus Outlook importieren -in netscape, open the addressbook and select export from the file menu.
the file exported will be in ldif format.

or, in outlook, select your contacts folder, select import and export... from addressbook de international addressbook de International isdn phone addressbook de ISDN Tel. label addressbook de Adreßetikett @@ -79,15 +90,16 @@ ldap context for contacts admin de LDAP Kontext f ldap host for contacts admin de LDAP Host für Kontakte ldap root dn for contacts admin de LDAP rootdn für Kontakte ldap root pw for contacts admin de LDAP Paswort für Kontakte +ldif addressbook de LDIF line 2 addressbook de Zeile 2 -mark records as private addressbook de Einträge als privat markieren message phone addressbook de Anrufbeantworter middle name addressbook de Zweiter Vorname mobile addressbook de Mobil mobile phone addressbook de Mobil-Telefon modem phone addressbook de Modem no vcard addressbook de Keine VCard -none addressbook de keine +number of records to read (<=200) addressbook de Nummer der einzulesenden Datensätze (<= 200) +on addressbook de an other addressbook de Andere other number addressbook de andere Nr. other phone addressbook de Anderes Telefon @@ -96,182 +108,43 @@ parcel addressbook de Lieferadresse personal addressbook de Persönlich phone number common de Telefon phone numbers common de Telefonnummern +please enter a name for that field ! addressbook de Bitte geben sie einen Namen für das Feld an ! +please select addressbook de Bitte auswählen postal common de Postanschrift pref addressbook de pref prefix addressbook de Prefix public key addressbook de öffentlicher Schlüssel +read a list of entries. addressbook de Liest eine Liste von Einträgen. +read a single entry by passing the id and fieldlist. addressbook de Liest einen einzelnen Eintrag über seine Id und Feldliste. +read this list of methods. addressbook de Liest diese Liste der Methoden. record access addressbook de Zugriffsrechte record owner addressbook de Datensatz Eigentümer retrieve contacts admin de Kontakte laden -select the type of conversion addressbook de Art der Umsetzung auswählen +select addressbook de Auswählen select where you want to store admin de Auswählen wo Sie speichern wollen show birthday reminders on main screen addressbook de Geburtstags-Mahner auf der Startseite anzeigen +startrecord addressbook de Startdatensatz state common de Land street common de Straße successfully imported %1 records into your addressbook. addressbook de %1 Kontakte wurden erfolgreich in ihr Adressbuch importiert suffix addressbook de Zusatz -the file menu and export your contacts into a comma separated text (csv) file.

or, in palm desktop 4.0 or greater, visit your addressbook and select export from the file menu. the file exported will be in vcard format.

addressbook de +test import (show importable records only in browser) addressbook de Test-Import (zeigt importierbare Datensätze nur im Browser an) +that field name has been used already ! addressbook de Dieser Feldname wird bereits benutzt ! this person's first name was not in the address book. addressbook de Der Vorname dieser Person ist nicht im Adressbuch. +this person's last name was not in the address book. addressbook de Der Nachname dieser Person ist nicht im Adressbuch. today is %1's birthday! common de Heute ist der Geburtstag von %1! tomorrow is %1's birthday. common de Morgen ist der Geburtstag von %1. +translation addressbook de Übersetzung +update a single entry by passing the fields. addressbook de Aktualisiert einen einzelnen Eintrag durch Übergabe seiner Felder. +use country list addressbook de Länderliste benutzen vcard common de VCard vcards require a first name entry. addressbook de VCards benötigen einen Vornamen. +vcards require a last name entry. addressbook de VCards benötigen einen Nachnamen. video phone addressbook de Bildtelefon voice phone addressbook de Telefon warning!! ldap is valid only if you are not using contacts for accounts storage! admin de WARNUNG!! LDAP darf nur verwendet werden, wenn sie die Benutzerkonten nicht im Adressbuch speichern! work phone addressbook de Tel dienstl. +you appear to be running addressbook de Sie benutzen gerade einen +you must select a vcard. (*.vcf) addressbook de Sie müssen eine VCard auswählen (*.vcf) +you must select at least 1 column to display addressbook de Sie müssen mindestens eine Spalte zum Anzeigen auswählen zip code common de PLZ -
-Fatal error: Call to undefined function: phpgw_exit() in /www/drock/html/cvs_phpgroupware/developer_tools/inc/class.uilangfile.inc.php on line 566
- - - - - - - - - - - - - phpGroupWare@CVS@granit - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Admin -
- E-Mail -
- Calendar -
- Addressbook -
- News Admin -
- Notes -
- Developer Tools -
- eTemplate -
- sitemgr* -
- Filemanager -
- Projects -
- InfoLog -
- Stock Quotes -
- Chora -
- Registration -
- et_media* -
-
- - - diff --git a/addressbook/setup/phpgw_en.lang b/addressbook/setup/phpgw_en.lang index 87f3f9d1b7..efe0872b3b 100644 --- a/addressbook/setup/phpgw_en.lang +++ b/addressbook/setup/phpgw_en.lang @@ -1,6 +1,7 @@ %1 records imported addressbook en %1 records imported %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook en %1 records read (not yet imported, you may go %2back%3 and uncheck Test Import) no conversion type <none> could be located. please choose a conversion type from the list addressbook en No conversion type <none> could be located. Please choose a conversion type from the list +@-eval() is only availible to admins!!! addressbook en @-eval() is only availible to admins!!! add a single entry by passing the fields. addressbook en Add a single entry by passing the fields. add custom field addressbook en Add Custom Field address book common en Address Book @@ -13,7 +14,6 @@ addressbook common en Addressbook addressbook preferences addressbook en Addressbook preferences addressbook-fieldname addressbook en Addressbook-Fieldname addvcard addressbook en Add VCard -alphabet addressbook en a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z alt. csv import addressbook en Alt. CSV Import are you sure you want to delete this field? addressbook en Are you sure you want to delete this field? bbs phone addressbook en BBS Phone @@ -39,6 +39,7 @@ company name common en Company Name contact common en Contact contact application admin en Contact application contact settings admin en Contact Settings +copied by %1, from record #%2. addressbook en Copied by %1, from record #%2. country common en Country csv-fieldname addressbook en CSV-Fieldname csv-filename addressbook en CSV-Filename @@ -50,10 +51,8 @@ delete a single entry by passing the id. addressbook en Delete a single entry by department common en Department domestic addressbook en Domestic download addressbook en Download -download export file (uncheck to debug output in browser) addressbook en Download export file (Uncheck to debug output in browser) edit custom field addressbook en Edit Custom Field edit custom fields admin en Edit Custom Fields -enter the path to the export file here addressbook en Enter the path to the export file here export contacts addressbook en Export Contacts export file name addressbook en Export file name export from addressbook addressbook en Export from Addressbook @@ -67,7 +66,6 @@ fields to show in address list addressbook en Fields to show in address list fieldseparator addressbook en Fieldseparator full name addressbook en Full Name geo addressbook en GEO -go addressbook en Go grant addressbook access common en Grant Addressbook Access home address type addressbook en Home Address Type home city addressbook en Home City @@ -84,7 +82,6 @@ import csv-file into addressbook addressbook en Import CSV-File into Addressbook import file addressbook en Import File import from ldif, csv, or vcard addressbook en Import from LDIF, CSV, or VCard import from outlook addressbook en Import from Outlook -In Netscape, open the Addressbook and select Export from the File menu.
The file exported will be in LDIF format.

Or, in Outlook, select your Contacts folder, select Import and Export... from addressbook en In Netscape, open the Addressbook and select Export from the File menu.
The file exported will be in LDIF format.

Or, in Outlook, select your Contacts folder, select Import and Export... from international addressbook en International isdn phone addressbook en ISDN Phone label addressbook en Label @@ -94,7 +91,6 @@ ldap root dn for contacts admin en LDAP root dn for contacts ldap root pw for contacts admin en LDAP root pw for contacts ldif addressbook en LDIF line 2 addressbook en Line 2 -mark records as private addressbook en Mark records as private message phone addressbook en Message Phone middle name addressbook en Middle Name mobile addressbook en Mobile @@ -104,7 +100,6 @@ no vcard addressbook en No VCard number of records to read (<=200) addressbook en Number of records to read (<=200) other number addressbook en Other Number other phone addressbook en Other Phone -owerview addressbook en owerview pager common en Pager parcel addressbook en Parcel phone number common en Phone Number @@ -118,24 +113,21 @@ read a list of entries. addressbook en Read a list of entries. read a single entry by passing the id and fieldlist. addressbook en Read a single entry by passing the id and fieldlist. record access addressbook en Record Access record owner addressbook en Record owner -remote search addressbook en Remote Search retrieve contacts admin en retrieve contacts -select the type of conversion addressbook en Select the type of conversion select where you want to store admin en Select where you want to store show birthday reminders on main screen addressbook en Show birthday reminders on main screen -show contact addressbook en show contact startrecord addressbook en Startrecord state common en State street common en Street suffix addressbook en Suffix test import (show importable records only in browser) addressbook en Test Import (show importable records only in browser) that field name has been used already ! addressbook en That field name has been used already ! -the File menu and export your contacts into a comma separated text (CSV) file.

Or, in Palm Desktop 4.0 or greater, visit your addressbook and select Export from the File menu. The file exported will be in VCard format.

addressbook en the File menu and export your contacts into a comma separated text (CSV) file.

Or, in Palm Desktop 4.0 or greater, visit your addressbook and select Export from the File menu. The file exported will be in VCard format.

this person's first name was not in the address book. addressbook en This person's first name was not in the address book. this person's last name was not in the address book. addressbook en This person's last name was not in the address book. today is %1's birthday! common en Today is %1's birthday! tomorrow is %1's birthday. common en Tomorrow is %1's birthday. update a single entry by passing the fields. addressbook en Update a single entry by passing the fields. +use country list addressbook en Use Country List vcard common en VCard vcards require a first name entry. addressbook en VCards require a first name entry. vcards require a last name entry. addressbook en Vcards require a last name entry. diff --git a/addressbook/setup/phpgw_es.lang b/addressbook/setup/phpgw_es.lang index 0eda483ee5..e29a881fd7 100644 --- a/addressbook/setup/phpgw_es.lang +++ b/addressbook/setup/phpgw_es.lang @@ -37,16 +37,13 @@ country common es Pais csv-fieldname addressbook es Campo CSV csv-filename addressbook es Archivo CSV custom fields addressbook es Campos Personalizados -debug output in browser addressbook es Visualizar depuracion default filter preferences es Filtro por Defecto department common es Departmento domestic common es Nacional download addressbook es Descargar Archivo -download export file (uncheck to debug output in browser) addressbook es Descargar archivo exportado edit custom field admin es Editar Campo Personalizado edit custom fields admin es Editar Campos Personalizados e-mail addressbook es E-Mail -enter the path to the export file here addressbook es Ingrese la ruta al archivo exportado aqui export contacts addressbook es Exportar Contactos export file name addressbook es Nombre del Archivo a Exportar export from addressbook addressbook es Exportar de la Libreta de Direcciones @@ -76,8 +73,6 @@ import file addressbook es Importar Archivo import from ldif, csv, or vcard addressbook es Importar desde LDIF, CSV o VCard import from netscape addressbook es Importar desde Netscape import from outlook addressbook es Importar desde Outlook -In Netscape, open the Addressbook and select Export from the File menu.
The file exported will be in LDIF format.

Or, in Outlook, select your Contacts folder, select Import and Export... from addressbook es

-the File menu and export your contacts into a comma separated text (CSV) file.

Or, in Palm Desktop 4.0 or greater, visit your addressbook and select Export from the File menu. The file exported will be in VCard format.

addressbook es Desde Outlook, seleccione su carpeta de contactos, seleccione Importar y Exportar del menu Archivo y exporte sus contactos en un archivo de Texto separado por comas (CSV).

international common es Internacional isdn phone addressbook es Telefono ISDN label addressbook es Etiqueta @@ -87,14 +82,12 @@ ldap host for contacts admin es Host LDAP para contacts ldap root dn for contacts admin es Raiz LDAP dn para contactos ldap root pw for contacts admin es Raiz LDAP pw para contactos line 2 addressbook es Linea 2 -mark records as private addressbook es Marcar registros como Privados message phone addressbook es Telefono de Mensajes middle name addressbook es Segundo Nombre mobile addressbook es Tel.Celular mobile phone addressbook es Telefono Movil modem phone addressbook es Telefono Modem no vcard common es Sin VCard -none addressbook es Ninguno number of records to read (<=200) addressbook es Registros a leer (menos de 200) other number addressbook es Otro Numero other phone addressbook es Otro Telefono @@ -112,7 +105,6 @@ record access addressbook es Acceso al registro record owner addressbook es Dueño del registro records read (not yet imported, you may go back and uncheck test import) addressbook es registros leidos (aun no importados, usted puede volver y desmarcar Testear) retrieve contacts admin es Recuperar Contactos -select the type of conversion addressbook es Seleccione el tipo de conversion select where you want to store admin es Seleccione donde desea almacenar show birthday reminders on main screen addressbook es Mostrar recordatorios de Cumpleaños en la Pantalla Principal startrecord addressbook es Registro Inicial diff --git a/addressbook/setup/phpgw_fr.lang b/addressbook/setup/phpgw_fr.lang index 71ad3e2691..f5e03e30db 100644 --- a/addressbook/setup/phpgw_fr.lang +++ b/addressbook/setup/phpgw_fr.lang @@ -1,6 +1,7 @@ %1 records imported addressbook fr %1 enregistrements importés -%1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook fr %1 enregistrements lus (pas encore importés, vous pouvez revenir %2en arrière%3 et décocher Tester l'import) +%1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook fr %1 enregistrements lus (pas no conversion type <none> could be located. please choose a conversion type from the list addressbook fr Aucun type de conversion <aucun> n'a pu être trouvé. SVP choisissez un type de conversion depuis la liste +@-eval() is only availible to admins!!! addressbook fr @-eval() est disponible uniquement pour les administrateurs!!! add a single entry by passing the fields. addressbook fr Ajouter une seule entrée en passant les champs. add custom field addressbook fr Ajouter champ personnalisé address book common fr Carnet d'adresses @@ -13,7 +14,6 @@ addressbook common fr Carnet d'adresses addressbook preferences addressbook fr Préférences du carnet d'adresses addressbook-fieldname addressbook fr Carnet d'adresses-nomdechamp addvcard addressbook fr Ajouter VCard -alphabet addressbook fr a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z alt. csv import addressbook fr Import Alt. CSV are you sure you want to delete this field? addressbook fr Etes-vous sûr de vouloir effacer ce champ? bbs phone addressbook fr Téléphone BBS @@ -39,6 +39,7 @@ company name common fr Nom de la soci contact common fr Contact contact application admin fr Application contact contact settings admin fr Paramètres du contact +copied by %1, from record #%2. addressbook fr Copié par %1, depuis l'enregistrement #%2. country common fr Pays csv-fieldname addressbook fr CSV-Nomdechamp csv-filename addressbook fr CSV-Nomdefichier @@ -50,10 +51,8 @@ delete a single entry by passing the id. addressbook fr Effacer une seule entr department common fr Département domestic addressbook fr Domestique download addressbook fr Downloader -download export file (uncheck to debug output in browser) addressbook fr Downloader le fichier d'export (Décocher pour débogger la sortie dans le navigateur) edit custom field addressbook fr Editer le champ personnalisé edit custom fields admin fr Editer les champs personnalisés -enter the path to the export file here addressbook fr Entrez le chemin vers le fichier d'export ici export contacts addressbook fr Exporter les contacts export file name addressbook fr Nom du fichier d'export export from addressbook addressbook fr Exporter depuis le carnet d'adresses @@ -67,7 +66,6 @@ fields to show in address list addressbook fr Champs fieldseparator addressbook fr Séparateur de champ full name addressbook fr Nom complet geo addressbook fr GEO -go addressbook fr Allez grant addressbook access common fr Régler les droits d'accès au carnet d'adresses home address type addressbook fr Type d'adresse (domicile) home city addressbook fr Ville (domicile) @@ -84,7 +82,6 @@ import csv-file into addressbook addressbook fr Importer le fichier CSV dans le import file addressbook fr Importer le fichier import from ldif, csv, or vcard addressbook fr Importer depuis LDIF, CSV ou VCard import from outlook addressbook fr Importer depuis Outlook -In Netscape, open the Addressbook and select Export from the File menu.
The file exported will be in LDIF format.

Or, in Outlook, select your Contacts folder, select Import and Export... from addressbook fr Dans Netscape, ouvrez le carnet d'adresses et choisissez Exporter dans le menu Fichier.
Le fichier exporté sera dans le format LDIF.

Ou, dans Outlook, choisissez votre dossier Contacts, choisissez Importer et Exporter... depuis international addressbook fr International isdn phone addressbook fr Téléphone RNIS label addressbook fr Label @@ -94,7 +91,6 @@ ldap root dn for contacts admin fr Racine LDAP dn pour les contacts ldap root pw for contacts admin fr Racine LDAP pw pour les contacts ldif addressbook fr LDIF line 2 addressbook fr Ligne 2 -mark records as private addressbook fr Marquer les enregistrements comme privés message phone addressbook fr Téléphone de message middle name addressbook fr Deuxième prénom mobile addressbook fr Portable @@ -104,7 +100,6 @@ no vcard addressbook fr Pas de VCard number of records to read (<=200) addressbook fr Nombre d'enregistrements à lire (<=200) other number addressbook fr Autre numéro other phone addressbook fr Autre téléphone -owerview addressbook fr Vue globale pager common fr Pager parcel addressbook fr Paquet phone number common fr Numéro de téléphone @@ -118,24 +113,21 @@ read a list of entries. addressbook fr Lire une liste d'entr read a single entry by passing the id and fieldlist. addressbook fr Lire une seule entrée en passant l'ID et la liste des champs. record access addressbook fr Enregistrer l'accès record owner addressbook fr Enregistrer le propriétaire -remote search addressbook fr Recherche à distance retrieve contacts admin fr Récupérer les contacts -select the type of conversion addressbook fr Choisissez le type de conversion select where you want to store admin fr Choisissez où vous voulez stocker show birthday reminders on main screen addressbook fr Montrer les rappels d'anniversaires sur la page principale -show contact addressbook fr Montrer le contact startrecord addressbook fr Enregistrement de départ state common fr Région street common fr Rue suffix addressbook fr Suffixe test import (show importable records only in browser) addressbook fr Tester l'import (montrer seulement les enregistrements importables dans le navigateur) that field name has been used already ! addressbook fr Ce nom de champ a déjà été utilisé ! -the File menu and export your contacts into a comma separated text (CSV) file.

Or, in Palm Desktop 4.0 or greater, visit your addressbook and select Export from the File menu. The file exported will be in VCard format.

addressbook fr le menu Fichier et exportez vos contacts dans un fichier aux champs séparés par des virgules (CSV).

Ou, dans Palm Desktop 4.0 ou plus, allez dans votre carnet d'adresses et choisissez Exporter depuis le menu Fichier. Le fichier exporté sera dans le format VCard.

this person's first name was not in the address book. addressbook fr Le prénom de cette personne n'était pas dans le carnet d'adresses. this person's last name was not in the address book. addressbook fr Le nom de cette personne n'était pas dans le carnet d'adresses. today is %1's birthday! common fr Aujourd'hui c'est l'anniversaire de %1 ! tomorrow is %1's birthday. common fr Demain c'est l'anniversaire de %1. update a single entry by passing the fields. addressbook fr Mettre à jour une seule entrée en passant les champs. +use country list addressbook fr Utiliser la liste des pays vcard common fr VCard vcards require a first name entry. addressbook fr Les VCards nécessitent une entrée Prénom. vcards require a last name entry. addressbook fr Les Vcards nécessitent une entrée nom de famille. diff --git a/addressbook/setup/phpgw_ja.lang b/addressbook/setup/phpgw_ja.lang index 95af2fa994..97c01dfffe 100644 --- a/addressbook/setup/phpgw_ja.lang +++ b/addressbook/setup/phpgw_ja.lang @@ -88,7 +88,7 @@ suffix addressbook ja that field name has been used already ! addressbook ja ¹àÌÜ̾¤Ï´û¤Ë¸ºß¤·¤Æ¤¤¤Þ¤¹¡£ this person's first name was not in the address book. addressbook ja ¥¢¥É¥ì¥¹Ä¢¤Ë̾Á°¤¬¤¢¤ê¤Þ¤»¤ó¡£ today is %1's birthday! common ja º£Æü¤Ï %1 ¤µ¤ó¤ÎÃÂÀ¸Æü¤Ç¤¹¡£ -tomorrow is %1's birthday. common ja ÌÀÆü¤Ï %1 ¤µ¤ó¤ÎÃÂÀ¸Æü¤Ç¤¹¡£ +tommorow is %1's birthday. common ja ÌÀÆü¤Ï %1 ¤µ¤ó¤ÎÃÂÀ¸Æü¤Ç¤¹¡£ url addressbook ja URL vcard common ja VCard vcards require a first name entry. addressbook ja VCard ¤Ë¤Ï¡¢Ì¾Á°¤¬É¬ÍפǤ¹¡£ diff --git a/addressbook/setup/setup.inc.php b/addressbook/setup/setup.inc.php index 9f9e15eb2f..77a3288772 100755 --- a/addressbook/setup/setup.inc.php +++ b/addressbook/setup/setup.inc.php @@ -13,23 +13,13 @@ /* Basic information about this app */ $setup_info['addressbook']['name'] = 'addressbook'; - $setup_info['addressbook']['version'] = '0.9.13.003'; + $setup_info['addressbook']['title'] = 'Addressbook'; + $setup_info['addressbook']['version'] = '0.9.13.002'; $setup_info['addressbook']['app_order'] = 4; $setup_info['addressbook']['enable'] = 1; - $setup_info['addressbook']['author'][] = array - ( - 'name' => 'Joseph Engo', - 'email' => 'jengo@phpgroupware.org' - ); - - $setup_info['addressbook']['author'][] = array - ( - 'name' => 'Miles Lott', - 'email' => 'milos@speakeasy.net' - ); - - $setup_info['addressbook']['note'] = 'The phpgwapi manages contact data. Addressbook manages servers for its remote capability'; + $setup_info['addressbook']['author'] = 'Joseph Engo, Miles Lott'; + $setup_info['addressbook']['note'] = 'The phpgwapi manages contact data. Addressbook manages servers for its remote capability.'; $setup_info['addressbook']['license'] = 'GPL'; $setup_info['addressbook']['description'] = 'Contact manager with Vcard support.
@@ -37,28 +27,24 @@ It makes use of the phpgroupware contacts class to store and retrieve contact information via SQL or LDAP.'; - $setup_info['addressbook']['maintainer'] = ''; - - /* Tables */ - $setup_info['addressbook']['tables'][] = 'phpgw_addressbook_servers'; + $setup_info['addressbook']['maintainer'] = 'phpGroupWare coreteam'; + $setup_info['addressbook']['maintainer_email'] = 'phpgroupware-developers@gnu.org'; /* The hooks this app includes, needed for hooks registration */ - $setup_info['addressbook']['hooks'] = array - ( - 'admin', - 'add_def_pref', - 'config_validate', - 'home', - 'deleteaccount', - 'notifywindow', - 'preferences', - 'help' - ); + $setup_info['addressbook']['hooks'][] = 'admin'; + $setup_info['addressbook']['hooks'][] = 'add_def_pref'; + $setup_info['addressbook']['hooks'][] = 'config_validate'; + $setup_info['addressbook']['hooks'][] = 'home'; + $setup_info['addressbook']['hooks'][] = 'manual'; + $setup_info['addressbook']['hooks'][] = 'addaccount'; + $setup_info['addressbook']['hooks'][] = 'editaccount'; + $setup_info['addressbook']['hooks'][] = 'deleteaccount'; + $setup_info['addressbook']['hooks'][] = 'notifywindow'; + $setup_info['addressbook']['hooks'][] = 'preferences'; /* Dependencies for this app to work */ - $setup_info['addressbook']['depends'][] = array - ( - 'appname' => 'phpgwapi', - 'versions' => Array('0.9.15', '0.9.16') + $setup_info['addressbook']['depends'][] = array( + 'appname' => 'phpgwapi', + 'versions' => Array('0.9.13', '0.9.14') ); ?> diff --git a/addressbook/setup/tables_baseline.inc.php b/addressbook/setup/tables_baseline.inc.php deleted file mode 100644 index 51f6ebdce4..0000000000 --- a/addressbook/setup/tables_baseline.inc.php +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/addressbook/setup/tables_update.inc.php b/addressbook/setup/tables_update.inc.php deleted file mode 100644 index 392e965e26..0000000000 --- a/addressbook/setup/tables_update.inc.php +++ /dev/null @@ -1,36 +0,0 @@ -oProc->CreateTable( - 'phpgw_addressbook_servers', array( - 'fd' => array( - 'name' => array('type' => 'varchar', 'precision' => 64, 'nullable' => False), - 'basedn' => array('type' => 'varchar', 'precision' => 255, 'nullable' => True), - 'search' => array('type' => 'varchar', 'precision' => 32, 'nullable' => True), - 'attrs' => array('type' => 'varchar', 'precision' => 255, 'nullable' => True), - 'enabled' => array('type' => 'int', 'precision' => 4) - ), - 'pk' => array('name'), - 'fk' => array(), - 'ix' => array(), - 'uc' => array() - ) - ); - - $GLOBALS['setup_info']['addressbook']['currentver'] = '0.9.13.003'; - return $GLOBALS['setup_info']['addressbook']['currentver']; - } -?> diff --git a/addressbook/templates/default/about.tpl b/addressbook/templates/default/about.tpl new file mode 100644 index 0000000000..0b819b76e9 --- /dev/null +++ b/addressbook/templates/default/about.tpl @@ -0,0 +1,16 @@ + + + + + + + + + + + + + +
+ {alt} +
{about_addressbook}
{appear} {agent} {version} {on} {platform}.

diff --git a/addressbook/templates/default/add.tpl b/addressbook/templates/default/add.tpl index a2c7f29ab8..1389086489 100644 --- a/addressbook/templates/default/add.tpl +++ b/addressbook/templates/default/add.tpl @@ -1,17 +1,14 @@ - +
- - - - diff --git a/addressbook/templates/default/config.tpl b/addressbook/templates/default/config.tpl index 1810de2825..36f5d7f27d 100644 --- a/addressbook/templates/default/config.tpl +++ b/addressbook/templates/default/config.tpl @@ -1,25 +1,28 @@
   - - + +  
- + +  
- - + + - + - + + + + - + - + - + - + - + - + - + - - - - - + diff --git a/addressbook/templates/default/csv_import.tpl b/addressbook/templates/default/csv_import.tpl index 3e6838960c..837d0da6c0 100644 --- a/addressbook/templates/default/csv_import.tpl +++ b/addressbook/templates/default/csv_import.tpl @@ -1,3 +1,9 @@ + +
+ + +
 {title}
 {title}
 {error}
 
 {lang_Addressbook}/{lang_Contact_Settings}
{lang_Contact_application}:
{lang_WARNING!!_LDAP_is_valid_only_if_you_are_NOT_using_contacts_for_accounts_storage!}
{lang_Select_where_you_want_to_store}/{lang_retrieve_contacts}.
{lang_LDAP_host_for_contacts}:
{lang_LDAP_context_for_contacts}:
{lang_LDAP_root_dn_for_contacts}:
{lang_LDAP_root_pw_for_contacts}:
{lang_Enable_remote_search}: - {lang_no} - {lang_yes} -
 
+ @@ -36,7 +42,7 @@ {lang_max} - + - -

{lang_addr_action}
-


-
- - -
{lang_csvfile}
{lang_debug} {lang_debug}
 

{help_on_trans} @@ -52,17 +58,7 @@

- {rows} -
- {hiddenvars} - + +{hiddenvars} - diff --git a/addressbook/templates/default/delete.tpl b/addressbook/templates/default/delete.tpl index 9072d06e05..c3ded90e41 100644 --- a/addressbook/templates/default/delete.tpl +++ b/addressbook/templates/default/delete.tpl @@ -1,6 +1,9 @@ +

{lang_sure}

- {lang_no}         - {lang_yes} +
+         + +
diff --git a/addressbook/templates/default/edit.tpl b/addressbook/templates/default/edit.tpl index 45a304281b..80715c0c10 100644 --- a/addressbook/templates/default/edit.tpl +++ b/addressbook/templates/default/edit.tpl @@ -3,14 +3,12 @@ - +
- - - - @@ -20,7 +18,6 @@ {delete_button} -
   - + +   + {cancel_link}  
diff --git a/addressbook/templates/default/export.tpl b/addressbook/templates/default/export.tpl index 366845cef7..cd8ac8fbdf 100644 --- a/addressbook/templates/default/export.tpl +++ b/addressbook/templates/default/export.tpl @@ -1,5 +1,5 @@ - +
@@ -10,13 +10,13 @@
    -
  1. {conversion}: +
  2. Select the type of conversion:

  3. {filename}:
  4. {lang_cat}:{cat_link}
  5. -
  6. {download_export}
  7. +
  8. Download export file (Uncheck to debug output in browser)
diff --git a/addressbook/templates/default/form.tpl b/addressbook/templates/default/form.tpl index 4fba2fc627..2b41af2287 100755 --- a/addressbook/templates/default/form.tpl +++ b/addressbook/templates/default/form.tpl @@ -1,18 +1,17 @@ -{search} - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + {custom} diff --git a/addressbook/templates/default/help_data.xsl b/addressbook/templates/default/help_data.xsl deleted file mode 100644 index 3ce386bc01..0000000000 --- a/addressbook/templates/default/help_data.xsl +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
{lang_personal}:
  {lang_prefix}:
  {lang_firstname}: @@ -23,29 +22,29 @@
  {lang_lastname}:
  {lang_suffix}:
  {lang_birthday}: {birthday}
{lang_business}:
  {lang_title}: @@ -54,7 +53,7 @@
  {lang_company}: @@ -67,7 +66,7 @@
  {lang_email}: @@ -80,7 +79,7 @@ {email_type}
  {lang_department}: @@ -89,28 +88,28 @@
  {lang_bstreet}:
  {lang_address2}:
  {lang_address3}:
  {lang_bcity}: @@ -120,14 +119,14 @@
  {lang_bzip}:
  {lang_bcountry}: @@ -137,14 +136,14 @@ {timezone}
  {lang_badrtype}: {badrtype}
  {lang_wphone}: @@ -155,7 +154,7 @@ {pref_fax}
  {lang_pager}: @@ -166,7 +165,7 @@ {pref_cell}
  {lang_msgphone}: @@ -177,7 +176,7 @@ {pref_isdn}
  {lang_carphone}: @@ -188,20 +187,20 @@ {pref_video}
  {lang_label}: {label}
  {lang_pubkey}: {pubkey}
{lang_home}:
  {lang_hemail}: @@ -211,12 +210,12 @@ {hemail_type}
  {lang_hstreet}:
  {lang_hcity}: @@ -227,28 +226,28 @@
  {lang_hzip}:
  {lang_hcountry}: {hcountry}
  {lang_hadrtype}: {hadrtype}
  {lang_hphone}: @@ -258,22 +257,22 @@
{lang_notes}: {notes}
{lang_private}:
{lang_cats}: {cats_link}  
{lang_custom}
- - - - - - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-
- - - - - - - - - - - - - - - - - - - - - -
- -
1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
::
::
::
::
::
::
::
::
::
-
2
-
diff --git a/addressbook/templates/default/images/help_add.jpg b/addressbook/templates/default/images/help_add.jpg deleted file mode 100644 index f80671ec2deea6184f00d80a54fa4bc6c17682c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139360 zcmeFZ2Ut_vwl=&F6)T7h5CJ<10wMwmLN+2IC`P4=fJl>;&=QmY*@}XSfJze(q99#* z3B?c<=^&i|Aw+r!Nu(u^`Yqh$?0s(i?mgfA&;6f0^Q^^Uwl!uObBuS4x%hqjZ@@Og z3kDYefi(iaMeqmksXMP+y#x1!``m$h?o&}b0h~T(U?fQ0bluSh?vC(vfx`eWY+KC> z2!Ov||E}g*yH)&x#Xfy^_-#A)eV1LF@A$gFocHO#oZTH)%d7=2=^yzdw*M`kj=Qgm zFT&x^IRqCrU-fo@`R=>mZs+U+mfN^m!D_>t$Aq#tRr+jbh- zdD_7oeH{1wxe{O#Sp1i;=0~fR#B|~AaPNH=?cAMw;V{R2#*V(LG_St#BB12t1m<@K z@9TdQ68JUdZG6J-F(<(k0pJFB|1FQ|j~Io&#r$~F@~>|)@wS8cI5~R%@lBp!um7t- za0;yD|3TW1G1#zPAK~KQxY|^3G*?>ztoiAe3;3mvrMH@1zq}8QboBQAHRI|C{*tz5 zy|KHC{V%2cz{p=(znToJIR#z@;KOFX4sZZ}-hd%EK4<5% zI^9-VBk-e+ExWEb`t37!fjPkaeD;~#L3rGT*}1rb9h1762fV;B0>J+Tt^z>#M=(AV z5C;VK|JwSY0m3>C@Y{}n!_QzD0X`9U2yEG~VZ+7^TQ+XoBD#6gX3jbx`fQh1lYxi$gUZ-=-ZpQ(y`zP1$eDSvM+`&V;u7A3%a?1Nb zhpy1!m&V_R=j?q{cc&BuA2}ao;-L3A)mKfd({#jfzW8BH7h-hbf^77=M

|y2lpN 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ξ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 diff --git a/addressbook/templates/default/images/help_list.jpg b/addressbook/templates/default/images/help_list.jpg deleted file mode 100644 index 9fe55307e2f99c52fe20b4d11d85e6d7b9aec469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107234 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 G`QHFFq4Zb) diff --git a/addressbook/templates/default/images/navbar.png b/addressbook/templates/default/images/navbar.png index f7f3e3eccaf4596f88e17cbf138ad42e4cd74fb7..bcc658c9ba81d26af81c57acc14064d388ae6498 100644 GIT binary patch literal 1401 zcmX9+acmN26lY%-oYxigOqj#wR?%UH6ZPya8?`uTOIy^7(uOJ9I*WyBtEkvfMN5^% zs$?N6$!f+Fw`yy|hE_DVQKebUa6{#ft1@%d)0`_RTISH9t@YSfeaZLU@BM!7z2y78 zcW@P1mV<~89*>t(QC^~f@x6)jRu=U6TjSY0UKVfFimK8~CIcCh!|N6SmHvQKRc}K9 z=L8~L%Q3Ch2=MDgC?<Iv91Vq7TX!a9r1$;I8Uw@V>_o?>V=nc%Fz>$1X> z#HICChZOKNYBfORVl3a~4RLHoBAJwHtudPBxJVa)P&#+DNU@?GMWdg{|GMRFp#r8ZH(GH4=)787)q)Ka`Axsa4(x8f*X@juz$^qhtxkZ5Q+~3ve8VittE`O{UZF zL;{oGP!dVYFqv8?R!F2vIL0McYEiL*NhG5*168fnW3+oTW;YPbr)U;IX2cjquCptZ zYL%(o;_@kVR&Ou@fQV*U6wMoRPOK#mD)hDv2*zx{`RcPE4h%#QvC7`+fLNxgM=^q8 zSco0%T^?_cX5tXPHWZbZ9bSkvruL3NSZ9UnA&5{hzL0obAi@YKG4bHg;Dz}J27nOZ z3!^j}V^}U7e#HZe5Z%?48=uh?v;X*AU4>38PU81y@i@0nPyH|r`?buc2k*N#-e`GXZD z%c^$J>(~7>_v3VS&r@ns+4+?A$K2{WZPlKQ&Bl+gQP&Zu&!qUL!Q=eIn#aQ@kBX6eGmwXsjmewV#; zEPko)pVgC&Ju9g%*p3{0Ed81PWpw`VjiSOe1UWo!!@{8Aw^4U&QtfEruluWy8iSPX z;%5cJ_NycNE_7;;a?0}Jos&Cv-G0IyzBe4r5>EbLXy2R#yC04mx<2S^el`tV&OV=l zRs@O#?%NII@vH~i#{%hY-;8aKeJ>w9R8PH|@=v~$5cFpc?UAbW>^oVENT)QCDe4ukY^Ww=LNV5NA!}yf8ufn&?()cx|@YLI1Pm|hm*K$QU zSBeH~s~1`K>c{K;d?}o=VqIz`v5Co?*p;=a^uNOmV5l$pR}Xz@)~PxB7uI}}`1kvH z*QXD~vPt97<2!1XnS0Kj9?YyPci!lobvj@f96j{w z`&{JAqQ#3F@H1CGJbCE8D*Hr^x23yM-()bnd!^^;8Dfdg(WWNuo7!%k*Z&?55Vvw> c5>wmm@;VLuohy5*THrVHDoV)`pK_i3e=f629RL6T literal 1254 zcmWkse{2(V6fX~G;K&M`tkDAwQ>DTIrxff$g*uz9tOd#(qhcX-*=7w>5DKZJU?Bwy zlu_LvO{`tPGA7npO^Ib~Of?l7t?o=JG;qu_mT-d(k8qL-m3-&zkM}e0N8bBe1*d zC<mBDrD_`z97Ud&s*vDCD2f6Q3ig@-N)t)SjN@z_m1v`3WG@dW0BJ6yvd&np6Scr4}$dd~$_4 z!?3=AJjwt~Yi!Ikv5aNX{+J}PzfGHL!il!_chGo6M0l-uU zl{rCZafNVP-5bvXC=522*B^|h^A?LWMgxjLxmp!$0CICOTc{x94rMY$zQ}SGXGpA8 z)wCfV^h8L=P!LIEwe3DRp`*2CxAYK9jZ;?A=;G|)kEXK>gOC79O%+u!g({P0tnO$v zsx!6+1cdAu=xAEnA5AkDC~}2DktIE~0Ec8c zqc(Ke-JxhQpD%E7oaV#|R~EH4pEH=DHF}ED8SP$>t3at25kdn{5-Q$61jWG<$%K+w zwp6mXW7z^H{iwtXa_Mk|nbcTy1}jPFGX>5YV+g%Nw1Y}xE{he0lgOaV<{41XEv_hF zv^2F?DoY1N0SYWD$5b58>#S}Z{0=4tV+x%vVc)s zxtz@xKy3%0IYG=6%aKG*p)wo0LY!FjM6!Ovt8t0nllHb)Hp%MwYmSMaecjpy*|Dkf znH@zvGF+-TTL${IM}>(RmNI zt#USPXgcr>_H675vA8F4Xm&&Q#bIuqZ26J8^Kvqhzi?2o+5UGU8mynyapr?{!=E0h z363_;xx4e))eAEmYo?v49J=0re79KJIrWzmcgt}1z}K76U8e5jSLd&;IWe0$^jB`t zbl$w9G{^q(Z^wG>kK|G9uBoF;-;LF&Nu8ss=P$n=hNs8Fr?nlkvPbrej$jyRip<#k zBENEIrsnxa;T7j*^*+P&om#qVU%&pt@kN_Xc)1i=dv*I*o$K5~aU`|&)RL$Eb^MV` z{nUQymhSV!5^`CX=^KkZ$U8d2{VPq2zjPkGv8ub(DQqkKuxD3&LtwJ(AbED7*e>=< OkjhMrmWH^Y&HF!f`%K^f diff --git a/addressbook/templates/default/import.tpl b/addressbook/templates/default/import.tpl index f2230b7221..b94948de5f 100644 --- a/addressbook/templates/default/import.tpl +++ b/addressbook/templates/default/import.tpl @@ -12,18 +12,24 @@

    -
  1. {help_import} {help_import2} +
  2. In Netscape, open the Addressbook and select Export from the File menu. + The file exported will be in LDIF format. +

    Or, in Outlook, select your Contacts folder, select Import + and Export... from the File + menu and export your contacts into a comma separated text (CSV) file. +

    Or, in Palm Desktop 4.0 or greater, visit your addressbook and select Export from the File menu. + The file exported will be in VCard format.

  3. -
  4. {export_path}: +
  5. Enter the path to the exported file here:

  6. -
  7. {conversion}: +
  8. Select the type of conversion:

  9. {lang_cat}:{cat_link}
  10. -
  11. {mark_private}
  12. -
  13. {debug_browser}
  14. +
  15. Mark records as private
  16. +
  17. Debug output in browser
diff --git a/addressbook/templates/default/index.tpl b/addressbook/templates/default/index.tpl index b0f904f200..301ad5dd66 100644 --- a/addressbook/templates/default/index.tpl +++ b/addressbook/templates/default/index.tpl @@ -1,19 +1,15 @@ -
{lang_addressbook} -
{lang_showing} -
{searchreturn}{search_filter}{remotesearch} - - - {alphalinks} - -
- - {cols} +
+{lang_showing} +
{searchreturn} +{search_filter} +
+{cols} - + @@ -21,34 +17,18 @@ - {columns} +{columns} - + - -
{lang_view} {lang_vcard} {lang_edit} {lang_owner}
{lang_view} {lang_vcard} {row_edit} {row_owner}
- - - - - - - -
{lang_remote_search}: - -
- -
- - +
+ @@ -56,8 +36,5 @@
-
+ - -{char} - diff --git a/addressbook/templates/default/listfields.tpl b/addressbook/templates/default/listfields.tpl index d51682fb14..9338fead4f 100644 --- a/addressbook/templates/default/listfields.tpl +++ b/addressbook/templates/default/listfields.tpl @@ -19,14 +19,14 @@
 
- - {sort_field} - {lang_edit} - {lang_delete} + + {sort_field} + {lang_edit} + {lang_delete} - + {cfield} {lang_edit_entry} {lang_delete_entry} diff --git a/addressbook/templates/default/preference_acl_row.tpl b/addressbook/templates/default/preference_acl_row.tpl index 378507ec6d..5fbfcc6b0a 100755 --- a/addressbook/templates/default/preference_acl_row.tpl +++ b/addressbook/templates/default/preference_acl_row.tpl @@ -1,5 +1,5 @@ - + {user} diff --git a/addressbook/templates/default/preference_colspan.tpl b/addressbook/templates/default/preference_colspan.tpl index 03dded0da5..aea9424902 100755 --- a/addressbook/templates/default/preference_colspan.tpl +++ b/addressbook/templates/default/preference_colspan.tpl @@ -1,6 +1,6 @@ - + {string} - {read_lang} - {edit_lang} - {delete_lang} + {lang_read} + {lang_edit} + {lang_delete} diff --git a/addressbook/templates/default/preferences.tpl b/addressbook/templates/default/preferences.tpl index 57ba74482c..1e8facdca0 100644 --- a/addressbook/templates/default/preferences.tpl +++ b/addressbook/templates/default/preferences.tpl @@ -2,13 +2,13 @@

{lang_abprefs}:


- + - + - + @@ -16,7 +16,7 @@ - + @@ -27,10 +27,10 @@ - + - + @@ -38,7 +38,7 @@ - + @@ -46,7 +46,7 @@ - + @@ -56,10 +56,10 @@ - + - + @@ -67,7 +67,7 @@ - + @@ -77,10 +77,10 @@ - + - + @@ -88,7 +88,7 @@ - + @@ -99,10 +99,10 @@ - + - + @@ -117,10 +117,10 @@ - + - + - + - + @@ -31,10 +31,10 @@ {rows_access} - + - +
{lang_fields}:
{lang_personal}:
{fn} {n_given} {n_family}   
{n_prefix} {n_suffix} {bday}
 
{lang_business}:
{org_name} {org_unit} {title}   
{adr_one_street} {address2} {address3}{adr_one_region} {adr_one_postalcode}
{adr_one_countryname} {adr_one_type} {tel_work}
 
{lang_home}:
{adr_two_street} {adr_two_locality} {adr_two_region}   
{adr_two_countryname} {adr_two_type} {tel_home}
 
{lang_phones}:
{tel_voice} {tel_fax} {tel_msg}{tel_pager} {tel_bbs}
{tel_modem} {tel_car} {tel_isdn}
 
{lang_other}:
{geo} {url} {tz}
 
{lang_otherprefs}:
{lang_default_filter} {filter_select} @@ -129,7 +129,7 @@
{lang_defaultcat} {cat_select} diff --git a/addressbook/templates/default/view.tpl b/addressbook/templates/default/view.tpl index 662b18be4e..28c8b317aa 100644 --- a/addressbook/templates/default/view.tpl +++ b/addressbook/templates/default/view.tpl @@ -1,9 +1,9 @@ -

 {lang_viewpref}


+
- + diff --git a/addressbook/templates/idots/images/navbar.png b/addressbook/templates/idots/images/navbar.png new file mode 100755 index 0000000000000000000000000000000000000000..745489ae93d8d0792822ff3cd0234459f1b7d9a8 GIT binary patch literal 2967 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 N002ovPDHLkV1n1)); - $sec = New acl2(1,'##DEFAULT##'); -//echo 'phpgw:
'; print_r($GLOBALS['phpgw']); echo '
'; - $sec->get_memberships(); -//echo 'memberships_sql: '.$sec->memberships_sql.'
'; -//echo 'memberships:
'; print_r($sec->memberships); echo '
'; - function ttt($location, $rights) - { - GLOBAL $sec; - if ($sec->check($location, $rights)) - { - echo $rights.' is valid
'; - } - else - { - echo $rights.' is invalid
'; - } - } - - echo 'This test is going to delete all your phpgw_acl2 records to ensure that the tests run as expected.
'; - $GLOBALS['phpgw']->db->query('DELETE FROM phpgw_acl2',__LINE__,__FILE__); - echo 'Action: DELETE FROM phpgw_acl2

'; - echo 'Running checks on .one.two.three after changing directly granted rights as well as ones it will inherit from
'; - - echo '
1: check rights for .one.two which will get inherited by .one.two.three
'; - ttt('.one.two', 1); - ttt('.one.two', 2); - ttt('.one.two', 4); - ttt('.one.two', 8); - echo 'You can see that no rights are set, so none will be inherited
'; - - echo '
2: checking .one.two.three
'; - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - echo 'You can see that no rights are set directly as well
'; - - echo '
3: add rights 4 to .one.two.three
'; - echo 'Action: $acl2->add(\'.one.two.three\',4,0);
'; - $sec->add('.one.two.three',4,0); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - - echo '
4: add rights 8 to .one.two.three
'; - echo 'Action: $acl2->add(\'.one.two.three\',8,0);
'; - $sec->add('.one.two.three',8,0); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - - echo '
5: remove rights 4 from .one.two.three
'; - echo 'Action: $acl2->remove(\'.one.two.three\',4,0);
'; - $sec->remove('.one.two.three',4,0); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - - echo '
5: set rights to 2 on .one.two.three
'; - echo 'Action: $acl2->set(\'.one.two.three\', 2,0);
'; - $sec->set('.one.two.three', 2,0); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - - echo '
Now to see inheritance in action...
'; - echo '6: add rights 8 to .one.two
'; - echo 'Action: $acl2->add(\'.one.two\',8,0);
'; - $sec->add('.one.two',8,0); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - echo 'You can see here that it has inherited rights 8 from .one.two
'; - - echo '
7: add rights 4 to .one.two
'; - echo 'Action: $acl2->add(\'.one.two\',4,0);
'; - $sec->add('.one.two',4,0); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - echo 'You can see here that it has also inherited rights 4 from .one.two
'; - - echo '
Now to see inherited rights masks in action...
'; - echo '8: add rights mask for 8 to .one.two
'; - echo 'Action: $acl2->add(\'.one.two\',8,1);
'; - $sec->add('.one.two',8,1); - ttt('.one.two.three', 1); - ttt('.one.two.three', 2); - ttt('.one.two.three', 4); - ttt('.one.two.three', 8); - echo 'You can see here that it no longer inherited rights 8 from .one.two
'; - - echo '
It will help to see the rights for .one.two at this point to clearly see the rights mask doing its work
'; - echo '9: display rights for .one.two
'; - ttt('.one.two', 1); - ttt('.one.two', 2); - ttt('.one.two', 4); - ttt('.one.two', 8); - echo 'You can see here that it has rights for 4 and 8, and yet above you saw that .one.two.three did not inherited rights 4 from it
'; - - //echo 'rights_cache:
'; print_r($sec->rights_cache); echo '
'; -?> diff --git a/admin/debian/changelog b/admin/debian/changelog deleted file mode 100644 index bc99bb2465..0000000000 --- a/admin/debian/changelog +++ /dev/null @@ -1,6 +0,0 @@ -phpgroupware-admin (0.9.14-0.RC3.3) unstable; urgency=low - - * New release. - - Source is now splitted into modules. - - -- Luca - De Whiskey's - De Vitis Mon, 21 May 2001 15:00:56 +0200 diff --git a/admin/debian/control b/admin/debian/control deleted file mode 100644 index 84926e89cb..0000000000 --- a/admin/debian/control +++ /dev/null @@ -1,16 +0,0 @@ -Source: phpgroupware-admin -Section: web -Priority: optional -Maintainer: Luca - De Whiskey's - De Vitis -Build-Depends: debhelper (>> 3.0.0) -Standards-Version: 3.5.2 - -Package: phpgroupware-admin -Section: web -Architecture: all -Depends: phpgroupware (>= ${Source-Version}), php3-pgsql | php3-cgi-pgsql | php4-pgsql | php3-mysql | php3-cgi-mysql | php4-mysql -Description: The phpGroupWare administration module - This phpGroupWare module provide the administration facilities for - phpGroupWare (add and remove groups, users, modules, session handling - etc.). - diff --git a/admin/debian/copyright b/admin/debian/copyright deleted file mode 100644 index 900148502e..0000000000 --- a/admin/debian/copyright +++ /dev/null @@ -1,15 +0,0 @@ -This package was debianized by Luca - De Whiskey's - De Vitis on -Sat, 29 Jun 2002 17:13:40 +0200 - -It was downloaded from the CVS repository at subversion.gnu.org. Try: -prompt$ CVSROOT=:pserver:anoncvs@subversions.gnu.org:/cvsroot/phpgroupware -prompt$ CVS_RSH=ssh -prompt$ cvs login -prompt$ cvs get all packages - -Upstream Author(s): -Please, see credits.txt, the README file or visit http://apps.phpgroupware.org/ - -Copyright: -A copy of the GNU General Public License, version 2, can be found in -/usr/share/common-licenses/GPL . diff --git a/admin/debian/rules b/admin/debian/rules deleted file mode 100755 index 96af18a79d..0000000000 --- a/admin/debian/rules +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/make -f -# Sample debian/rules that uses debhelper. -# GNU copyright 1997 by Joey Hess. -# -# This version is for a hypothetical package that builds an -# architecture-dependant package, as well as an architecture-independent -# package. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - - -# This is the debhelper compatability version to use. -export DH_COMPAT=3 - -APP = admin -PACKAGE = debian/phpgroupware-$(APP)/usr/share/phpgroupware/$(APP) -PACKAGEDOC = debian/phpgroupware-$(APP)/usr/share/doc/phpgroupware-$(APP) - -COPYRIGHT = -iname copyright\* -or -iname license -CHANGELOG = -iname change\* -INSTALL = -iname install -FINDOPT = -type f -not \( -path \*CVS\* -or -path \*debian\* -or -name .cvsignore \) -SPECIAL = -size 0 -or $(INSTALL) -or $(CHANGELOG) -or $(COPYRIGHT) -or -name \*.sgml -STAMPS = -name configure-stamp -or -name build-stamp -APPFILES = -not \( -path \*doc\* -or -path \. -or -name '*.pl' -or -name '*.py' -or $(STAMPS) \) -DOCFILES = -not \( $(SPECIAL) \) - -configure: configure-stamp -configure-stamp: - dh_testdir - # No configuration needed. - touch configure-stamp - -build: configure-stamp build-stamp -build-stamp: - dh_testdir - # Here should go the commands necessary to build the sgml documentation... - touch build-stamp - -clean: - dh_testdir - rm -f build-stamp configure-stamp - rm -f debian/.builded - rm -f debian/files - # Here should go the commands to clean the builded sgml documents. - dh_clean - -install: build - dh_testdir - - # Install $(APP) files in $(PACKAGE) - find $(FINDOPT) $(APPFILES) \ - -exec install -D --mode=644 {} $(PACKAGE)/{} \; - - # Install $(APP) doc files in $(PACKAGEDOC) - cd doc ;\ - find $(FINDOPT) $(DOCFILES) \ - -exec install -D --mode=644 {} ../$(PACKAGEDOC)/{} \; - -binary-indep: build install - dh_testdir - dh_testroot - dh_installdocs - dh_installchangelogs - dh_compress - dh_fixperms - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb | tee debian/.builded - -binary: binary-indep -.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/admin/doc/adminconfig.dvi b/admin/doc/adminconfig.dvi index 35dbcc1a7d9d8403d00fab62a02a234732330f9b..53c4225c7e9832dec4b655957345a38a0d491d53 100644 GIT binary patch literal 11588 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 XTc_Et_GZ7S`|Dh;@Xtg4NuS>VdtRTY literal 8304 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 ae&UkP;d}H8*8f)hy`G-ooxOkIfByp~!-d`e diff --git a/admin/doc/adminconfig.lyx b/admin/doc/adminconfig.lyx index 889ad7c6ae..b442d4f0ca 100644 --- a/admin/doc/adminconfig.lyx +++ b/admin/doc/adminconfig.lyx @@ -69,10 +69,6 @@ and the following special types: \layout Enumerate {hook_XXX} - Calls a function named XXX (will be discussed later). -\layout Enumerate - -{checked_XXX+YYY} - Handles checkbox/radio values set to YYY or '' (will - be discussed later). \layout Standard Following is an example from the addressbook application: @@ -179,35 +175,7 @@ Let's take a look at part of the preferences/default/config.tpl: \layout Standard Here, we are adding a new element, {hook_country_set}. - This brings up the next file we will need to parse this value, hook_config.inc.ph -p. - But first, let's look at the last template type, 'checked': -\layout Code - -{lang_no} -\layout Code - -{lang_yes} -\layout Standard - -We want to check the value of the setting 'enable_remote_addressbook'. - The value could be '' or 'True'. - We use the '+' character to isolate the config name from the check value. - If the value is empty or unset in the phpgw_config table, {checked_enable_remot -e_addressbook+} is replaced with ' checked'. - If the value is 'True',{checked_enable_remote_addressbook+True} is replaced - with ' checked'. - Note that the part after the '+' character matches what is in the value= -\begin_inset Quotes erd -\end_inset - -XXX -\begin_inset Quotes erd -\end_inset - - part in the html for this form element. + This brings up the next file we will need to parse this value... \layout Subsection hook_config.inc.php (optional) diff --git a/admin/doc/adminconfig.pdf b/admin/doc/adminconfig.pdf index 7658da426ec3ca2d19d1d9ec995f017665072713..34dd19a17f904392e850bfade665641ae2ed5c9c 100644 GIT binary patch literal 19265 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 B=+*!L delta 8897 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�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 b(Dec)47 -b(22,)f(2001.)91 b(Files)k(con\002g.tpl)45 b(\(required\))91 -b(In)46 b(your)f(application/templates/def)o(ault)e(directory)-5 -b(,)-600 -218 y(create)38 b(a)g(ne)n(w)g(template)g(\002le)h(named)e -('con\002g.tpl'.)e(This)k(will)g(be)f(included)e(by)i(con\002g.php)d -(and)j(used)g(to)g(dra)o(w)g(the)g(page.)f(This)h(template)g(should)f -(include)-600 -118 y(a)45 b(POST)g(method)f(form.)f(The)i(follo)n(wing) -e(template)h(tags)h(may)f(be)h(used:)89 b({action_url})43 -b(-)i(A)g(phpgw->link)d(to)j(con\002g.php)d(will)k(be)e(inserted.)89 -b({title})-600 -19 y(-)50 b(This)g(will)g(be)f(parsed)g(to)h(display)f -('Site)h(Con\002guration'.)97 b({th_bg},{th_te)o(xt},{ro)n(w_)o(on})o -(,{ro)m(w_)o(of)n(f)o(})44 b(-)50 b(Replaced)f(with)h(the)f(current)g -(theme)g(colors.)-600 81 y(and)c(the)g(follo)n(wing)e(special)i(types:) -91 b({lang_XXX})44 b(-)h(Filled)h(with)f(lang\('XXX'\).)89 -b({v)n(alue_XXX})43 b(-)i(Filled)h(with)f(the)g(current)f(v)n(alue)h -(of)f(con\002g)h(item)-600 180 y('XXX'.)95 b({selected_XXX})47 -b(-)h(set)h(to)e(\224,)h(or)g(')g(selected')f(if)h(an)g(option)e(v)n -(alue)h(is)i(current.)94 b({hook_XXX})46 b(-)i(Calls)h(a)f(function)e -(named)g(XXX)i(\(will)-600 280 y(be)54 b(discussed)g(later\).)109 -b({check)o(ed_XXX+YYY})51 b(-)k(Handles)f(checkbox/radio)c(v)n(alues)k -(set)h(to)g(YYY)f(or)g(\224)h(\(will)f(be)h(discussed)f(later\).)108 -b(F)o(ollo)n(wing)-600 380 y(is)70 b(an)f(e)o(xample)e(from)h(the)h -(addressbook)e(application:)g()e()-600 -479 y()c( )o({title})o()e -()96 b()-600 579 y( {erro)o(r})o()56 -b()61 b()i()i -()c( ) -28 b()33 b()27 b( {lang_Ad)o(dre)o(ssbook)o(}/{lan)o(g_)o -(Contact_)o(Setting)o(s})-600 778 y()121 -b()g()116 b -(
)25 b()31 -b(...)62 b(Note)30 b(the)h(\002eldname,)e(ne)n -(wsettings[contact_application].)d(This)31 b(array)f(name)g(must)h(be)f -(used)h(for)f(the)-600 977 y(form)e(v)n(alues.)h(Ne)o(xt,)g(note)f(the) -i(v)n(alue)e(setting)h(for)g(this)h(form)e(element,)h({v)n -(alue_contact_application}.)23 b(This)30 b(indicates)f(that)g(we)h(w)o -(ant)f(the)g(current)f(v)n(alue)h(of)g(the)-600 1077 -y(con\002g)21 b(setting,)h('contact_application',)c(to)k(be)g(set)h -(and)e(displayed)g(on)h(the)g(form.)f(Lastly)-5 b(,)21 -b(look)g(at)i(the)f(template)g(element,)f({lang_Contact_application}.)c -(Here,)22 b(the)-600 1177 y(v)n(alue)k(from)g(the)h(lang)f(db)g(table)h -(will)h(be)e(inserted)h(if)g(a)n(v)n(ailable.)53 b(Let')-5 -b(s)28 b(tak)o(e)e(a)i(look)e(at)h(part)f(of)h(the)g(preferences/def)o -(ault/con\002g.tpl:)49 b()-600 -1276 y()35 b()f()70 -b(Here,)34 b(we)h(are)g(adding)e(a)i(ne)n(w)f(element,)g -({hook_country_set}.)29 b(This)35 b(brings)f(up)g(the)g(ne)o(xt)g -(\002le)i(we)e(will)i(need)e(to)g(parse)h(this)g(v)n(alue,)-600 -1476 y(hook_con\002g.inc.php.)56 b(But)62 b(\002rst,)g(let')-5 -b(s)63 b(look)d(at)j(the)e(last)i(template)e(type,)g('check)o(ed':)f -()o({lang)o(_n)o(o})c({lang)o(_y)o(es})g(W)-7 -b(e)20 b(w)o(ant)f(to)f(check)g(the)h(v)n(alue)e(of)i(the)f(setting)h -('enable_remote_addressboo)o(k')o(.)13 b(The)-600 1774 -y(v)n(alue)18 b(could)h(be)g(\224)g(or)g('T)m(rue'.)f(W)-7 -b(e)20 b(use)g(the)f('+')g(character)f(to)h(isolate)h(the)f(con\002g)f -(name)h(from)f(the)h(check)f(v)n(alue.)h(If)g(the)g(v)n(alue)f(is)i -(empty)f(or)g(unset)g(in)g(the)g(phpgw_con\002g)-600 -1874 y(table,)38 b({check)o(ed_enable_remote_ad)o(dr)o(essboo)o(k+})32 -b(is)40 b(replaced)d(with)h(')h(check)o(ed'.)d(If)j(the)f(v)n(alue)g -(is)h('T)m(rue',{check)o(ed_enable_r)o(emo)o(te_ad)o(dr)o(essboo)o(k+T) -l(rue)o(})-600 1974 y(is)29 b(replaced)d(with)i(')g(check)o(ed'.)e -(Note)h(that)h(the)g(part)f(after)g(the)h('+')f(character)g(matches)g -(what)h(is)g(in)g(the)g(v)n(alue=\224XXX\224)e(part)i(in)g(the)f(html)h -(for)f(this)h(form)f(element.)-600 2073 y(hook_con\002g.inc.php)19 -b(\(optional\))49 b(At)26 b(each)f(in)m(v)n(ocation)e(of)i -(con\002g.php,)e(a)i(call)h(to)f(the)g(common)f(class)i(function)d -(hook_single\(\))f(is)27 b(made.)d(It)h(attempts)g(to)h(include)-600 -2173 y(a)31 b(\002le,)g(hook_con\002g.inc.php)24 b(as)31 -b(a)g(set)g(of)f(code)g(for)g(con\002g.php)d(to)k(use.)f(In)g(the)h -(case)f(of)g(the)h(preferences)d(e)o(xample)h(abo)o(v)o(e,)g(using)g -(hook_country_set,)d(here)k(is)-600 2273 y(the)39 b(corresponding)d -(function)i(in)i(preferences/inc/hook_con)o(\002g.in)o(c.ph)o(p:)34 -b(function)j(country_set\($con\002g\))e({)40 b($country)d(=)j(array\()e -('user_choice')f(=>)j('Users)-600 2372 y(Choice',)30 -b('force_select')e(=>)j('F)o(orce)e(Selectbox')h(\);)g(while)h(\(list)g -(\($k)o(e)o(y)-5 b(,)29 b($v)n(alue\))g(=)h(each)h(\($country\)\))c({)k -(if)f(\($con\002g['countrylist'])c(==)31 b($k)o(e)o(y\))e({)i -($selected)f(=)h(')-600 2472 y(selected';)23 b(})g(else)h({)g -($selected)e(=)i(\224;)f(})h($descr)e(=)i(lang\($v)n(alue\);)c($out)i -(.=)i('')g(.)g($descr)g(.)g('')e(.)i("\\n";)g(})h -(return)-600 2571 y($out;)31 b(})63 b(Note)31 b(again)g(the)g(template) -g(v)n(alue)g(we)g(used)g(earlier)m(,)g({hook_country_set}.)26 -b(This)31 b(causes)h(con\002g.php)d(to)i(look)g(for)f(a)i(function)e -(named)g(country_set\(\).)-600 2671 y(Since)j(we)g(included)e(the)i -(\002le)h(with)f(this)g(function)e(via)i(the)g(hook_single\(\))c(call,) -34 b(this)f(function)e(is)j(e)o(x)o(ecuted.)c(It')-5 -b(s)34 b(return)e(is)h(a)h(string,)e(and)g(the)h(function)e(prints)-600 -2771 y(nothing)25 b(itself.)54 b(hook_con\002g_v)n(alidate.in)o(c.p)o -(hp)20 b(\(optional\))52 b(Once)26 b(the)h(admin)e(clicks)i(the)f -(submit)g(b)n(utton)g(to)g(post)h(the)f(form,)g(we)g(can)h(optionally)d -(v)n(alidate)i(their)-600 2870 y(input)j(using)h(one)g(or)g(man)o(y)f -(dif)n(ferent)f(functions.)h(This)h(is)h(done)e(by)h(\002rst)h(making)e -(another)f(call)j(to)f(hook_single\(\))d(in)k(the)f(API)g(common)e -(class.)j(This)g(time,)f(the)-600 2970 y(name)k(con\002g_v)n(alidate)e -(is)j(used,)f(so)h(common)d(tries)j(to)g(include)e -('application/inc/hook_con\002g_)o(v)n(alid)o(ate.in)o(c.ph)o(p')o(.)64 -b(If)34 b(this)h(\002le)g(e)o(xists,)g(it)g(sets)h(a)f(v)n(ar)f(to)g -(tell)-600 3070 y(con\002g.php)c(it)j(w)o(as)g(found.)e(F)o(ollo)n -(wing)g(then)h(are)h(functions)e(named)g(after)h(each)g(con\002g)g(we)h -(w)o(ant)f(to)h(v)n(alidate.)f(The)g(follo)n(wing)f(e)o(xample)g(is)i -(for)f(addressbook:)-600 3169 y($GLOB)m(ALS['phpgw_info'][')-5 -b(serv)n(er')o(][)o('fo)o(un)o(d_)o(v)n(alid)o(ation)o(_h)o(oo)o(k'])35 -b(=)41 b(T)m(rue;)f(/*)h(Check)g(a)g(speci\002c)g(setting.)f(Name)h -(must)g(match)f(the)h(setting.)g(*/)g(function)-600 3269 -y(ldap_contact_conte)o(xt\($v)n(a)o(lue=\224\))e({)45 -b(if\($v)n(alue)f(==)h($GLOB)m(ALS['phpgw_info'][')-6 -b(serv)o(er)o('][)o(')o(ldap)o(_c)o(on)o(te)o(xt')o(]\))39 -b({)46 b($GLOB)m(ALS['con\002g_error'])40 b(=)45 b('Contact)-600 -3368 y(conte)o(xt)17 b(for)g(ldap)h(must)g(be)g(dif)n(ferent)f(from)g -(the)h(conte)o(xt)f(used)h(for)f(accounts';)g(})h(elseif\($v)n(alue)f -(==)h($GLOB)m(ALS['phpgw_info'][')-5 b(serv)n(er')o(][')n(ldap)o(_g)o -(rou)o(p_)o(con)o(te)o(x)o(t']\))-600 3468 y({)22 b($GLOB)m -(ALS['con\002g_error'])16 b(=)21 b('Contact)g(conte)o(xt)e(for)i(ldap)f -(must)i(be)f(dif)n(ferent)e(from)h(the)h(conte)o(xt)f(used)h(for)f -(groups';)g(})h(else)h({)f($GLOB)m(ALS['con\002g_error'])16 -b(=)-600 3568 y(\224;)24 b(})h(})48 b(Here)24 b(we)g(created)f(a)h -(function)f(to)h(check)f(the)g(entered)g(v)n(alue)g(for)h(the)f -(con\002g)g(item,)h(ldap_contact_conte)o(xt.)19 b(W)-7 -b(e)25 b(w)o(ant)f(to)g(mak)o(e)g(sure)f(the)h(admin)f(did)h(not)f(set) --600 3667 y(this)d(v)n(alue)f(to)g(one)g(which)g(w)o(ould)g(con\003ict) -g(with)h(another)e(con\002g)g(item,)i(used)f(for)g(accounts)f(or)h -(groups)f(in)i(phpGroupW)-7 b(are.)36 b(con\002g.php)17 -b(calls)k(this)e(function,)f(sending)-600 3767 y(it)j(the)g(POST)-6 -b(ed)21 b(v)n(alue.)f(con\002g.php)e(continues,)h(adding)g(all)j(other) -e(con\002g)f(items)j(from)d(the)i(POST)-6 b(ed)21 b(v)n(alues.)41 -b(The)21 b(v)n(ariable)e($GLOB)m(ALS['con\002g_error'])d(is)22 -b(parsed)-600 3867 y(through)e(lang\(\),)h(then)h(appended)e(to)j(the)f -(local)h(v)n(ariable,)e($error)-5 b(.)21 b(If)h(this)h(has)g(an)o(y)f -(v)n(alue)f(after)h(the)h(POST)-6 b(ed)22 b(v)n(ariables)g(are)g(check) -o(ed,)f(the)i(form)e(then)h(has)h(its)g({error})-600 -3966 y(tag)f(\002lled)g(with)f(this)i(result.)e(The)g(form)g(is)h -(displayed)f(again,)f(with)i(the)g(error)-5 b(.)20 b(If)i($error)e(has) -i(no)f(v)n(alue,)g(con\002g.php)e(redirects)i(to)g(admin/inde)o(x.php.) -40 b(Ho)n(we)n(v)o(er)m(,)19 b(there)-600 4066 y(is)i(one)e(more)g -(function)f(that)i(may)g(be)g(included)e(in)i(hook_con\002g_v)n -(alidate.inc.)o(ph)o(p:)35 b(/*)20 b(Check)g(all)g(settings)g(to)g(v)n -(alidate)f(input.)g(Name)h(must)g(be)g('\002nal_v)n(alidation')d(*/) --600 4165 y(function)36 b(\002nal_v)n(alidation\($v)n(alue=\224\))c({) -38 b(if\($v)n(alue['contact_repository)o('])32 b(==)38 -b(')o(ldap')e(&&)i(!$v)n(alue[')o(ldap_contact_d)o(n')o(]\))32 -b({)38 b($GLOB)m(ALS['con\002g_error'])32 b(=)-600 4265 -y('Contact)37 b(dn)g(must)h(be)f(set';)h(})g(elseif\($v)n -(alue['contact_repositor)o(y'])31 b(==)38 b(')o(ldap')f(&&)g(!$v)n -(alue[')o(ldap_contact_co)o(nte)n(xt'])o(\))32 b({)38 -b($GLOB)m(ALS['con\002g_error'])32 b(=)-600 4365 y('Contact)24 -b(conte)o(xt)f(must)i(be)f(set';)h(})g(else)h({)f($GLOB)m -(ALS['con\002g_error'])19 b(=)25 b(\224;)g(})g(})50 b(con\002g.php)22 -b(checks)i(for)g(the)g(e)o(xistence)g(of)g(the)h(function)e('\002nal_v) -n(alidation\(\)'.)-600 4464 y(This)31 b(function)e(can)i(be)g(used)g -(to)g(check)f(all)i(form)e(v)n(alues)g(at)i(once.)e(It)h(gets)h(sent)f -(the)g(entire)g($ne)n(wsettings)f(array)g(POST)-6 b(ed)31 -b(from)f(the)h(form.)f(As)h(with)h(the)f(other)-600 4564 -y(functions)19 b(in)h(this)h(\002le,)f(\002nal_v)n(alidation\(\))e -(should)h(set)i($GLOB)m(ALS['con\002g_error'])15 b(if)20 -b(there)g(is)h(a)g(problem.)p Black Black eop +1 0 bop Black 0 TeXcolorgray Black Black 505 647 a Ff(phpGr)l(oupW)-8 +b(are)58 b(admin/con\002g.php)695 879 y Fe(A)21 b(brief)e(introduction) +f(to)i(writing)g(hooks)f(and)h(templates)g(for)f(an)o(y)h(application)e +(to)j(use)f(this)695 987 y(admin)f(interf)o(ace,)h(by)695 +1136 y(Miles)h(Lott)f()15 +b(Dec)20 b(22,)g(2001.)-2 1854 y Fd(1.)39 b(Files)-2 +2182 y Fc(1.1.)34 b(con\002g.tpl)h(\(required\))396 2350 +y Fe(In)20 b(your)f(application/templates/def)o(ault)e(directory)-5 +b(,)18 b(create)i(a)g(ne)n(w)g(template)g(\002le)h(named)e +('con\002g.tpl'.)f(This)i(will)396 2458 y(be)g(included)f(by)h +(con\002g.php)d(and)j(used)g(to)g(dra)o(w)g(the)g(page.)f(This)i +(template)e(should)h(include)f(a)h(POST)h(method)396 +2566 y(form.)e(The)h(follo)n(wing)f(template)g(tags)i(may)e(be)i(used:) +p Black 463 2798 a(1.)p Black 40 w({action_url})e(-)h(A)h(phpgw->link)c +(to)j(con\002g.php)e(will)j(be)f(inserted.)p Black 463 +2947 a(2.)p Black 40 w({title})h(-)f(This)h(will)g(be)f(parsed)f(to)i +(display)e('Site)i(Con\002guration'.)p Black 463 3097 +a(3.)p Black 40 w({th_bg},{th_te)o(xt},{ro)n(w_on)o(},{r)o(o)n(w_)o(of) +m(f})15 b(-)20 b(Replaced)g(with)g(the)g(current)f(theme)h(colors.)396 +3246 y(and)g(the)g(follo)n(wing)f(special)h(types:)p +Black 463 3479 a(1.)p Black 40 w({lang_XXX})f(-)i(Filled)f(with)h +(lang\('XXX'\).)p Black 463 3628 a(2.)p Black 40 w({v)n(alue_XXX})e(-)h +(Filled)h(with)f(the)g(current)f(v)n(alue)h(of)g(con\002g)f(item)h +('XXX'.)p Black 463 3778 a(3.)p Black 40 w({selected_XXX})g(-)g(set)h +(to)f(\224,)h(or)f(')g(selected')g(if)g(an)h(option)d(v)n(alue)i(is)h +(current.)p Black 463 3927 a(4.)p Black 40 w({hook_XXX})d(-)j(Calls)g +(a)g(function)d(named)h(XXX)i(\(will)f(be)h(discussed)f(later\).)396 +4077 y(F)o(ollo)n(wing)f(is)i(an)f(e)o(xample)f(from)g(the)h +(addressbook)e(application:)396 4257 y Fb()396 4354 y()441 4451 y()486 +4548 y( {title}<)o(/td>)441 +4645 y()i()486 4742 y( {error})441 +4840 y()p Black 3842 5278 a Fa(1)p Black eop +%%Page: 2 2 +2 1 bop Black 0 TeXcolorgray Black 2778 67 a Fa(phpGr)l(oupW)-8 +b(ar)m(e)19 b(admin/con\002g)o(.php)p Black 396 579 a +Fb()396 676 y()441 +773 y()486 870 y( )441 967 y()441 1065 y()486 1162 y( {lang_Addressbook}/{)o(lang_C)o(ontact)o(_Setti)o +(ngs}<)o(/b>)396 1259 y()441 1356 y()441 +1453 y()486 1550 y +()486 1647 y()441 1745 y()396 +1842 y(...)396 2130 y Fe(Note)20 b(the)h(\002eldname,)e(ne)n +(wsettings[contact_application].)c(This)20 b(array)f(name)h(must)g(be)g +(used)g(for)g(the)g(form)f(v)n(alues.)396 2238 y(Ne)o(xt,)h(note)g(the) +g(v)n(alue)f(setting)i(for)e(this)i(form)e(element,)g({v)n +(alue_contact_application}.)c(This)20 b(indicates)g(that)h(we)396 +2346 y(w)o(ant)g(the)f(current)f(v)n(alue)g(of)h(the)g(con\002g)g +(setting,)g('contact_application',)c(to)k(be)g(set)h(and)f(displayed)f +(on)g(the)i(form.)396 2454 y(Lastly)-5 b(,)20 b(look)f(at)i(the)f +(template)g(element,)f({lang_Contact_application}.)d(Here,)j(the)i(v)n +(alue)e(from)g(the)i(lang)e(db)h(table)396 2561 y(will)h(be)f(inserted) +g(if)g(a)n(v)n(ailable.)396 2711 y(Let')-5 b(s)21 b(tak)o(e)f(a)h(look) +e(at)i(part)f(of)g(the)g(preferences/def)o(ault/con\002g.tpl:)441 +2891 y Fb()486 2988 y +()441 3571 y()396 3859 y Fe(Here,)20 b(we)h(are)f(adding)f +(a)h(ne)n(w)g(element,)f({hook_country_set}.)d(This)k(brings)f(up)h +(the)g(ne)o(xt)g(\002le)h(we)f(will)h(need)f(to)396 3967 +y(parse)g(this)h(v)n(alue...)-2 4337 y Fc(1.2.)34 b +(hook_con\002g.inc.php)j(\(optional\))396 4504 y Fe(At)21 +b(each)f(in)m(v)n(ocation)e(of)i(con\002g.php,)d(a)k(call)g(to)f(the)g +(common)f(class)i(function)d(hook_single\(\))f(is)k(made.)f(It)g +(attempts)396 4612 y(to)h(include)e(a)h(\002le,)h +(hook_con\002g.inc.php)14 b(as)21 b(a)g(set)g(of)f(code)f(for)h +(con\002g.php)d(to)k(use.)f(In)g(the)g(case)h(of)f(the)g(preferences) +396 4720 y(e)o(xample)f(abo)o(v)o(e,)f(using)i(hook_country_set,)15 +b(here)20 b(is)h(the)f(corresponding)d(function)i(in)396 +4828 y(preferences/inc/hook_con\002g.)o(inc.p)o(hp)o(:)p +Black 3842 5278 a Fa(2)p Black eop +%%Page: 3 3 +3 2 bop Black 0 TeXcolorgray Black 2778 67 a Fa(phpGr)l(oupW)-8 +b(ar)m(e)19 b(admin/con\002g)o(.php)p Black 396 579 a +Fb(function)44 b(country_set\($config\))396 676 y({)576 +773 y($country)f(=)i(array\()f('user_choice')e(=>)j('Users)f(Choice',)f +('force_select')f(=>)j('Force)f(Se-)396 870 y(lectbox')g(\);)576 +967 y(while)g(\(list)g(\($key,)f($value\))h(=)h(each)f(\($country\)\)) +576 1065 y({)755 1162 y(if)g(\($config['countrylist'])d(==)k($key\))755 +1259 y({)934 1356 y($selected)f(=)g(')h(selected';)755 +1453 y(})755 1550 y(else)755 1647 y({)934 1745 y($selected)f(=)g(\224;) +755 1842 y(})755 1939 y($descr)g(=)g(lang\($value\);)755 +2036 y($out)g(.=)h('')f(.)h($descr)f(.)g('')f(.)i("\\n";)576 +2133 y(})576 2230 y(return)e($out;)396 2327 y(})396 2615 +y Fe(Note)20 b(again)g(the)g(template)f(v)n(alue)h(we)h(used)e(earlier) +m(,)h({hook_country_set}.)15 b(This)20 b(causes)h(con\002g.php)c(to)k +(look)e(for)h(a)396 2723 y(function)f(named)g(country_set\(\).)e(Since) +j(we)h(included)d(the)j(\002le)g(with)f(this)h(function)d(via)i(the)g +(hook_single\(\))d(call,)396 2831 y(this)k(function)d(is)k(e)o(x)o +(ecuted.)c(It')-5 b(s)21 b(return)e(is)i(a)f(string,)g(and)g(the)g +(function)e(prints)i(nothing)f(itself.)-2 3201 y Fc(1.3.)34 +b(hook_con\002g_v)n(alidate)r(.inc.php)39 b(\(optional\))396 +3369 y Fe(Once)20 b(the)g(admin)g(clicks)g(the)g(submit)g(b)n(utton)f +(to)i(post)f(the)g(form,)f(we)i(can)f(optionally)e(v)n(alidate)i(their) +g(input)f(using)396 3477 y(one)h(or)g(man)o(y)f(dif)n(ferent)f +(functions.)h(This)h(is)h(done)e(by)h(\002rst)h(making)e(another)g +(call)h(to)h(hook_single\(\))c(in)j(the)g(API)396 3584 +y(common)f(class.)h(This)h(time,)f(the)g(name)g(con\002g_v)n(alidate)d +(is)k(used,)f(so)h(common)d(tries)j(to)f(include)396 +3692 y('application/inc/hook_con\002g_)o(v)n(a)o(lidate.in)o(c.p)o(hp)o +('.)396 3842 y(If)g(this)h(\002le)g(e)o(xists,)f(it)h(sets)g(a)g(v)n +(ar)f(to)g(tell)h(con\002g.php)d(it)i(w)o(as)i(found.)c(F)o(ollo)n +(wing)h(then)g(are)h(functions)f(named)g(after)396 3950 +y(each)h(con\002g)f(we)i(w)o(ant)f(to)h(v)n(alidate.)e(The)h(follo)n +(wing)e(e)o(xample)h(is)i(for)f(addressbook:)576 4130 +y Fb($GLOBALS['phpgw_info']['server']['fou)o(nd_val)o(idatio)o(n_hook)o +('])39 b(=)45 b(True;)576 4227 y(/*)f(Check)g(a)h(specific)e(setting.)h +(Name)g(must)g(match)g(the)g(setting.)g(*/)576 4324 y(function)f +(ldap_contact_context\($value=\224\))576 4421 y({)755 +4518 y(if\($value)g(==)i($GLOBALS['phpgw_info']['server']['ldap)o +(_conte)o(xt']\))755 4616 y({)934 4713 y($GLOBALS['config_error'])c(=)k +('Contact)e(context)h(for)g(ldap)g(must)g(be)h(differ-)396 +4810 y(ent)g(from)f(the)g(context)g(used)g(for)g(accounts';)p +Black 3842 5278 a Fa(3)p Black eop +%%Page: 4 4 +4 3 bop Black 0 TeXcolorgray Black 2778 67 a Fa(phpGr)l(oupW)-8 +b(ar)m(e)19 b(admin/con\002g)o(.php)p Black 755 579 a +Fb(})755 676 y(elseif\($value)43 b(==)h +($GLOBALS['phpgw_info']['server']['ldap_g)o(roup_)o(contex)o(t']\))755 +773 y({)934 870 y($GLOBALS['config_error'])d(=)k('Contact)e(context)h +(for)g(ldap)g(must)g(be)h(differ-)396 967 y(ent)g(from)f(the)g(context) +g(used)g(for)g(groups';)755 1065 y(})755 1162 y(else)755 +1259 y({)934 1356 y($GLOBALS['config_error'])d(=)k(\224;)755 +1453 y(})576 1550 y(})396 1838 y Fe(Here)20 b(we)f(created)g(a)h +(function)e(to)i(check)e(the)i(entered)e(v)n(alue)h(for)g(the)g +(con\002g)g(item,)g(ldap_contact_conte)o(xt.)c(W)-7 b(e)21 +b(w)o(ant)396 1946 y(to)g(mak)o(e)e(sure)h(the)h(admin)e(did)h(not)g +(set)h(this)f(v)n(alue)g(to)g(one)g(which)g(w)o(ould)f(con\003ict)h +(with)g(another)f(con\002g)g(item,)h(used)396 2054 y(for)g(accounts)f +(or)h(groups)f(in)h(phpGroupW)-7 b(are.)396 2204 y(con\002g.php)18 +b(calls)j(this)g(function,)d(sending)h(it)i(the)f(POST)-6 +b(ed)20 b(v)n(alue.)f(con\002g.php)f(continues,)h(adding)g(all)h(other) +g(con\002g)396 2312 y(items)h(from)e(the)h(POST)-6 b(ed)21 +b(v)n(alues.)396 2461 y(The)f(v)n(ariable)f($GLOB)m +(ALS['con\002g_error'])c(is)21 b(parsed)f(through)e(lang\(\),)h(then)g +(appended)f(to)j(the)f(local)g(v)n(ariable,)396 2569 +y($error)-5 b(.)19 b(If)h(this)h(has)f(an)o(y)g(v)n(alue)f(after)h(the) +g(POST)-6 b(ed)20 b(v)n(ariables)g(are)g(check)o(ed,)f(the)h(form)f +(then)h(has)g(its)h({error})e(tag)396 2677 y(\002lled)i(with)f(this)h +(result.)f(The)g(form)f(is)i(displayed)e(again,)g(with)h(the)g(error)-5 +b(.)20 b(If)g($error)e(has)j(no)e(v)n(alue,)h(con\002g.php)396 +2785 y(redirects)g(to)g(admin/inde)o(x.php.)396 2934 +y(Ho)n(we)n(v)o(er)m(,)e(there)i(is)h(one)f(more)f(function)g(that)h +(may)g(be)g(included)e(in)j(hook_con\002g_v)n(alidate.inc)o(.ph)o(p:) +576 3114 y Fb(/*)44 b(Check)g(all)g(settings)g(to)g(validate)g(input.)g +(Name)g(must)g(be)h('final_validation')c(*/)576 3212 +y(function)i(final_validation\($value=\224\))576 3309 +y({)755 3406 y(if\($value['contact_repository'])d(==)k('ldap')g(&&)g +(!$value['ldap_contact_dn']\))755 3503 y({)934 3600 y +($GLOBALS['config_error'])d(=)k('Contact)e(dn)i(must)f(be)g(set';)755 +3697 y(})755 3794 y(elseif\($value['contact_repository'])39 +b(==)44 b('ldap')g(&&)h(!$value['ldap_contact_context']\))755 +3891 y({)934 3989 y($GLOBALS['config_error'])c(=)k('Contact)e(context)h +(must)g(be)h(set';)755 4086 y(})755 4183 y(else)755 4280 +y({)934 4377 y($GLOBALS['config_error'])c(=)k(\224;)755 +4474 y(})576 4571 y(})p Black 3842 5278 a Fa(4)p Black +eop +%%Page: 5 5 +5 4 bop Black 0 TeXcolorgray Black 2778 67 a Fa(phpGr)l(oupW)-8 +b(ar)m(e)19 b(admin/con\002g)o(.php)p Black 396 579 a +Fe(con\002g.php)f(checks)i(for)f(the)h(e)o(xistence)g(of)g(the)g +(function)e('\002nal_v)n(alidation\(\)'.)f(This)j(function)e(can)i(be)g +(used)g(to)396 687 y(check)g(all)g(form)g(v)n(alues)f(at)i(once.)e(It)i +(gets)f(sent)h(the)f(entire)g($ne)n(wsettings)f(array)g(POST)-6 +b(ed)21 b(from)e(the)h(form.)f(As)i(with)396 795 y(the)f(other)g +(functions)f(in)h(this)h(\002le,)f(\002nal_v)n(alidation\(\))d(should)j +(set)h($GLOB)m(ALS['con\002g_error'])15 b(if)20 b(there)g(is)h(a)396 +903 y(problem.)p Black 3842 5278 a Fa(5)p Black eop +%%Page: 6 6 +6 5 bop Black 0 TeXcolorgray Black 2778 67 a Fa(phpGr)l(oupW)-8 +b(ar)m(e)19 b(admin/con\002g)o(.php)p Black Black 3840 +5278 a(6)p Black eop %%Trailer end userdict /end-hook known{end-hook}if diff --git a/admin/doc/adminconfig.sgml b/admin/doc/adminconfig.sgml index cf4123e770..e1251c01b5 100644 --- a/admin/doc/adminconfig.sgml +++ b/admin/doc/adminconfig.sgml @@ -67,11 +67,6 @@ {hook_XXX} - Calls a function named XXX (will be discussed later). - - - - {checked_XXX+YYY} - Handles checkbox/radio values set to YYY or '' (will be discussed later). - @@ -117,14 +112,7 @@ ]]> ]]> - Here, we are adding a new element, {hook_country_set}. This brings up the next file we will need to parse this value, hook_config.inc.php. But first, let's look at the last template type, 'checked': - - -{lang_no} -]]>{lang_yes} -]]> - - We want to check the value of the setting 'enable_remote_addressbook'. The value could be '' or 'True'. We use the '+' character to isolate the config name from the check value. If the value is empty or unset in the phpgw_config table, {checked_enable_remote_addressbook+} is replaced with ' checked'. If the value is 'True',{checked_enable_remote_addressbook+True} is replaced with ' checked'. Note that the part after the '+' character matches what is in the value=”XXX” part in the html for this form element. + Here, we are adding a new element, {hook_country_set}. This brings up the next file we will need to parse this value... diff --git a/admin/doc/adminconfig.txt b/admin/doc/adminconfig.txt index 55cc0c8354..1f1fdaa659 100644 --- a/admin/doc/adminconfig.txt +++ b/admin/doc/adminconfig.txt @@ -1,15 +1,10 @@ - phpGroupWare admin/config.php Abstract -A brief introduction to writing hooks and templates for any -application to use this admin interface, by - -Abstract - -Miles Lott Dec 22, 2001. +A brief introduction to writing hooks and templates for any application to use +this admin interface, by Miles Lott Dec 22, 2001. 1 Files @@ -22,70 +17,39 @@ include a POST method form. The following template tags may be used: 1. {action_url} - A phpgw->link to config.php will be inserted. - 2. {title} - This will be parsed to display 'Site Configuration'. - -3. {th_bg},{th_text},{row_on},{row_off} - Replaced with the - current theme colors. +3. {th_bg},{th_text},{row_on},{row_off} - Replaced with the current theme colors. and the following special types: 1. {lang_XXX} - Filled with lang('XXX'). - -2. {value_XXX} - Filled with the current value of config item - 'XXX'. - -3. {selected_XXX} - set to '', or ' selected' if an option - value is current. - -4. {hook_XXX} - Calls a function named XXX (will be discussed - later). - -5. {checked_XXX+YYY} - Handles checkbox/radio values set to - YYY or '' (will be discussed later). +2. {value_XXX} - Filled with the current value of config item 'XXX'. +3. {selected_XXX} - set to '', or ' selected' if an option value is current. +4. {hook_XXX} - Calls a function named XXX (will be discussed later). Following is an example from the addressbook application: -
{display_col}:{ref_data}
{lang_Contact_application}:)g(
{lang_Country_Selection})35 b(\({lang_T)-6 -b(e)o(xt_Entry}/{lang_)o(SelectBox}\))o(:)40 -b()36 b -({hook_country_set})-600 1376 y()f(
{lang_Contact_application}:
{lang_Country_Selection})c +(\({lang_Text_Entry}/{lang_SelectBox}\):)486 +3085 y()531 3182 y()396 +3280 y({hook_country_set})531 3377 y()486 3474 +y(
- - - - - - - - - - - - - - - - - ... Note the fieldname, newsettings[contact_application]. This @@ -100,40 +64,16 @@ if available. Let's take a look at part of the preferences/default/config.tpl: - - - Here, we are adding a new element, {hook_country_set}. This -brings up the next file we will need to parse this value, -hook_config.inc.php. But first, let's look at the last template -type, 'checked': - -{lang_no} - -{lang_yes} - -We want to check the value of the setting 'enable_remote_addressbook'. -The value could be '' or 'True'. We use the '+' character -to isolate the config name from the check value. If the -value is empty or unset in the phpgw_config table, {checked_enable_remote_addressbook+} -is replaced with ' checked'. If the value is 'True',{checked_enable_remote_addressbook+True} -is replaced with ' checked'. Note that the part after the -'+' character matches what is in the value="XXX" -part in the html for this form element. +brings up the next file we will need to parse this value... 1.2 hook_config.inc.php (optional) @@ -145,41 +85,22 @@ hook_country_set, here is the corresponding function in preferences/inc/hook_config.inc.php: function country_set($config) - { - - $country = array( 'user_choice' => 'Users Choice', 'force_select' -=> 'Force Selectbox' ); - + $country = array( 'user_choice' => 'Users Choice', 'force_select' => 'Force Selectbox' ); while (list ($key, $value) = each ($country)) - { - if ($config['countrylist'] == $key) - { - $selected = ' selected'; - } - else - { - $selected = ''; - } - $descr = lang($value); - - $out .= '' . "\n"; - + $out .= '' . "\n"; } - return $out; - } Note again the template value we used earlier, {hook_country_set}. @@ -202,42 +123,24 @@ was found. Following then are functions named after each config we want to validate. The following example is for addressbook: - $GLOBALS['phpgw_info']['server']['found_validation_hook'] -= True; + $GLOBALS['phpgw_info']['server']['found_validation_hook'] = True; - /* Check a specific setting. Name must match the setting. -*/ + /* Check a specific setting. Name must match the setting. */ function ldap_contact_context($value='') - { - if($value == $GLOBALS['phpgw_info']['server']['ldap_context']) - { - - $GLOBALS['config_error'] = 'Contact context for -ldap must be different from the context used for accounts'; - + $GLOBALS['config_error'] = 'Contact context for ldap must be different from the context used for accounts'; } - elseif($value == $GLOBALS['phpgw_info']['server']['ldap_group_context']) - { - - $GLOBALS['config_error'] = 'Contact context for -ldap must be different from the context used for groups'; - + $GLOBALS['config_error'] = 'Contact context for ldap must be different from the context used for groups'; } - else - { - $GLOBALS['config_error'] = ''; - } - } Here we created a function to check the entered value for @@ -260,40 +163,21 @@ config.php redirects to admin/index.php. However, there is one more function that may be included in hook_config_validate.inc.php: - /* Check all settings to validate input. Name must be -'final_validation' */ - + /* Check all settings to validate input. Name must be 'final_validation' */ function final_validation($value='') - { - if($value['contact_repository'] == 'ldap' && !$value['ldap_contact_dn']) - { - - $GLOBALS['config_error'] = 'Contact dn must be -set'; - + $GLOBALS['config_error'] = 'Contact dn must be set'; } - - elseif($value['contact_repository'] == 'ldap' && -!$value['ldap_contact_context']) - + elseif($value['contact_repository'] == 'ldap' && !$value['ldap_contact_context']) { - - $GLOBALS['config_error'] = 'Contact context must -be set'; - + $GLOBALS['config_error'] = 'Contact context must be set'; } - else - { - $GLOBALS['config_error'] = ''; - } - } config.php checks for the existence of the function 'final_validation()'. diff --git a/admin/help/DE/account.php b/admin/help/DE/account.php new file mode 100644 index 0000000000..fe2abe1f2a --- /dev/null +++ b/admin/help/DE/account.php @@ -0,0 +1,32 @@ + 'manual', + 'admin_header' => True, + ); + $phpgw_info['flags'] = $phpgw_flags; + include('../../../header.inc.php'); + $appname = 'admin'; +?> + +

   +Diese Funktion ist normalerweise nur für den Administrator zugänglich. Administration aller Programme, Benutzer und Benutzergruppen und Sitzungs/Logging Kontrolle. +

    +
  • Benutzerkonten-Verwaltung:

       +Benutzerkonten:
    +Erstellen, Edittieren und löschen von Benutzerkonten. Setzen von Gruppenmidgliedschaft und der Zugriff auf Programme.

       +Benutzergruppen:
    +Erstellen, Edittieren und löschen von Benutzergruppen.

       +

+common->phpgw_footer(); ?> diff --git a/admin/help/DE/admin.php b/admin/help/DE/admin.php new file mode 100644 index 0000000000..6e6806309d --- /dev/null +++ b/admin/help/DE/admin.php @@ -0,0 +1,54 @@ + 'manual', + 'admin_header' => True, + ); + $phpgw_info['flags'] = $phpgw_flags; + include('../../../header.inc.php'); + $appname = 'admin'; +?> + +

     +Diese Funktion ist normalerweise nur für den Administrator zugänglich. Administration aller Programme, Benutzer und Benutzergruppen und Sitzungs/Logging Kontrolle. +

    +
  • Benutzerkonten-Verwaltung:
    +Benutzerkonten:
    +Erstellen, Edittieren und löschen von Benutzerkonten. Setzen von Gruppenmidgliedschaft und der Zugriff auf Programme.
    Benutzergruppen:
    + Erstellen, Editieren und löschen von Benutzergruppen. +

         +

  • Sitzungs-Verwaltung:
    + Session's anzeigen::
    +Aktuelle Sitzungen, IP's, Login-Zeit, Inaktivitätszeit und die Möglichkeit sessions zu beenden (kill).
    +Zugriffsaufzeichnungen (Access Log) anzeigen:
    + LoginId, IP, Login Time (Zeit), Logout Time (Zeit), Total time spent (gesamte + Verbrachte Zeit).
  • +

         +

  • Headline-Seiten (Schlagzeilen):
    + Administrieren von Headline-Seiten die von den Benutzern im Headline Programm + gesehen werden.
    +Edit: Optionen für die Headline-Seiten:
    + Anzeige, BasisURL, NewsDatei, Minuten zwischen Neuladungen (reloads), Angezeigte + Auflistung und die Art der Neuigkeiten.
    + Löschen:Entfernen von einer existierenden Headline-Seite, klicken + auf Löschen bringt Sie auf eine Überprüffungsseite, um das löschen + zu verifizieren.
    +Anzeigen:Zeigt die Optionen wie in Edit.
    +Hinzufügen:Formular um eine neue Headline-Seite hinzuzufügen, wie in Edit.
  •      +

  • Netzwerk News:
    +Manuelle Aktualisierung für Newsgruppen.
  •      +

  • Server Information:
    +Zeigt die phpinfo(); des Servers an.
  •      +

+common->phpgw_footer(); ?> diff --git a/admin/help/DE/other.php b/admin/help/DE/other.php new file mode 100644 index 0000000000..36539853d9 --- /dev/null +++ b/admin/help/DE/other.php @@ -0,0 +1,33 @@ + 'manual', + 'admin_header' => True, + 'enable_utilities_class' => True + ); + $phpgw_info['flags'] = $phpgw_flags; + include('../../../header.inc.php'); + $appname = 'admin'; +?> + +

    +Diese Funktion ist normalerweise nur für den Administrator zugänglich. Administration +aller Programme, Benutzer und Benutzergruppen und Sitzung's/Logging Kontrolle. +

  • Netzwerk News:
    +Manuelle Aktualisierung für Newsgruppen.
  •     +

  • Server Information:
    + Zeigt die phpinfo(); des Server's an.
  • +

        +

+common->phpgw_footer(); ?> diff --git a/admin/help/DE/session.php b/admin/help/DE/session.php new file mode 100644 index 0000000000..07ea40e73f --- /dev/null +++ b/admin/help/DE/session.php @@ -0,0 +1,35 @@ + 'manual', + 'admin_header' => True, + 'enable_utilities_class' => True + ); + $phpgw_info['flags'] = $phpgw_flags; + include('../../../header.inc.php'); + $appname = 'admin'; +?> + + +

+Diese Funktion ist normalerweise nur für den Administrator zugänglich. Administration aller Programme, Benutzer und Benutzergruppen und Sitzungs/Logging Kontrolle. +

    +
  • Session : +

    Sessions anzeigen: +
    Aktuelle Sitzungen, IP's, Login-Zeit, Inaktivitätszeit und die Möglichkeit sessions zu beenden (kill). +

    Zugriffsaufzeichnungen (Access Log) anzeigen: +
    + LoginId, IP, Login Time (Zeit), Logout Time (Zeit), Total time spent (gesamte + verbrachte Zeit).

+common->phpgw_footer(); ?> diff --git a/admin/help/EN/account.php b/admin/help/EN/account.php index bcb28134b7..c259892d75 100755 --- a/admin/help/EN/account.php +++ b/admin/help/EN/account.php @@ -30,3 +30,4 @@ Create, edit and delete users accounts. Set membership of groups, and access to User groups:
Create, edit and delete groups.

+common->phpgw_footer(); ?> diff --git a/admin/help/EN/admin.php b/admin/help/EN/admin.php index cb474dbaf8..cafc5aff26 100755 --- a/admin/help/EN/admin.php +++ b/admin/help/EN/admin.php @@ -46,3 +46,4 @@ Manual update for news groups.

  • Server information:
    At present phpinfo of the server that is running.
  • +common->phpgw_footer(); ?> diff --git a/admin/help/EN/other.php b/admin/help/EN/other.php index a0524dbe63..236d78f639 100755 --- a/admin/help/EN/other.php +++ b/admin/help/EN/other.php @@ -29,3 +29,4 @@ Manual update for news groups.

  • Server information:
    At present phpinfo of the server that is running.
  • +common->phpgw_footer(); ?> diff --git a/admin/help/EN/session.php b/admin/help/EN/session.php index 86e7853d00..31a68f2501 100755 --- a/admin/help/EN/session.php +++ b/admin/help/EN/session.php @@ -32,3 +32,4 @@ Administration of all applications, user and group accounts, session logging and

    View Access Log:
    LoginId, IP, Login Time, Logout Time, Total time spent. +common->phpgw_footer(); ?> diff --git a/admin/help/FI/account.php b/admin/help/FI/account.php index 52628033ea..5c52f1d97d 100644 --- a/admin/help/FI/account.php +++ b/admin/help/FI/account.php @@ -32,3 +32,4 @@ ryhm Käyttäjäryhmät:
    Toiminnolla voit lisätä, muuttaa ja poistaa käyttäjäryhmiä.

    +common->phpgw_footer(); ?> diff --git a/admin/help/FI/admin.php b/admin/help/FI/admin.php index bd893b8238..50998b5cd4 100644 --- a/admin/help/FI/admin.php +++ b/admin/help/FI/admin.php @@ -50,3 +50,4 @@ Uutisryhmien p

  • Palvelimen tiedot:
    Tällä hetkellä palvelimen phpinfo.
  • +common->phpgw_footer(); ?> diff --git a/admin/help/FI/other.php b/admin/help/FI/other.php index 0936a17b69..f2cc7269cd 100644 --- a/admin/help/FI/other.php +++ b/admin/help/FI/other.php @@ -30,3 +30,4 @@ Uutisryhmien p

  • Palvelimen tiedot:
    Tällä hetkellä palvelimen phpinfo.
  • +common->phpgw_footer(); ?> diff --git a/admin/help/FI/session.php b/admin/help/FI/session.php index 5d6ead5d42..10f78bac5b 100644 --- a/admin/help/FI/session.php +++ b/admin/help/FI/session.php @@ -34,3 +34,4 @@ on ollut tekem

    Näytä käyttöloki:
    Tunnus, IP-osoite, Sisäänkirjautumisaika, Uloskirjautumisaika, Istunnon kesto. +common->phpgw_footer(); ?> diff --git a/admin/help/JA/account.php b/admin/help/JA/account.php index d37e04e78a..e97c8894ed 100644 --- a/admin/help/JA/account.php +++ b/admin/help/JA/account.php @@ -30,3 +30,4 @@ ¥æ¡¼¥¶¥°¥ë¡¼¥×:
    ¥æ¡¼¥¶¤¬½ê°¤¹¤ë¥°¥ë¡¼¥×¤òÄɲá¢ÄûÀµºï½ü¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

    +common->phpgw_footer(); ?> diff --git a/admin/help/JA/admin.php b/admin/help/JA/admin.php index edff4e6b98..4218bac9cc 100644 --- a/admin/help/JA/admin.php +++ b/admin/help/JA/admin.php @@ -51,3 +51,4 @@ you a checking page to be sure you do want to delete.

  • ¥µ¡¼¥Ð¾ðÊó:
    ¥µ¡¼¥Ð¤ÇÆ°ºî¤·¤Æ¤¤¤ë PHP ¤Î¾ðÊó¤ò¡¢phpinfo() ¤Çɽ¼¨¤·¤Þ¤¹¡£
  • +common->phpgw_footer(); ?> diff --git a/admin/help/JA/other.php b/admin/help/JA/other.php index 606df88473..af359ce4ba 100644 --- a/admin/help/JA/other.php +++ b/admin/help/JA/other.php @@ -29,3 +29,4 @@

  • ¥µ¡¼¥Ð¾ðÊó:
    ¥µ¡¼¥Ð¤ÇÆ°ºî¤·¤Æ¤¤¤ë PHP ¤Î¾ðÊó¤ò¡¢phpinfo() ¤Çɽ¼¨¤·¤Þ¤¹¡£
  • +common->phpgw_footer(); ?> diff --git a/admin/help/JA/session.php b/admin/help/JA/session.php index f3bcedef4e..807bdc1260 100644 --- a/admin/help/JA/session.php +++ b/admin/help/JA/session.php @@ -32,3 +32,4 @@

    ¥¢¥¯¥»¥¹¥í¥°»²¾È:
    phpGroupWare¤Ø¤Î¥¢¥¯¥»¥¹¥í¥°¤òɽ¼¨¤·¤Þ¤¹¡£¥í¥°¥¤¥óID,IP¥¢¥É¥ì¥¹,¥í¥°¥¤¥ó»þ´Ö,¥í¥°¥¢¥¦¥È»þ´Ö,ÍøÍÑ»þ´Ö¤òɽ¼¨¤·¤Þ¤¹¡£ +common->phpgw_footer(); ?> diff --git a/admin/help/index.php b/admin/help/index.php index 30d99b641b..cb180ca5dd 100755 --- a/admin/help/index.php +++ b/admin/help/index.php @@ -24,3 +24,4 @@ Version: +common->phpgw_footer(); ?> diff --git a/admin/inc/class.boaccounts.inc.php b/admin/inc/class.boaccounts.inc.php index 1318246769..ba33115697 100755 --- a/admin/inc/class.boaccounts.inc.php +++ b/admin/inc/class.boaccounts.inc.php @@ -1,37 +1,35 @@ * - * ----------------------------------------------------- * + * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ + /* $Id$ */ class boaccounts { var $so; - var $public_functions = array - ( - 'add_group' => True, - 'delete_group' => True, - 'delete_user' => True, - 'edit_group' => True, - 'save_user' => True, + var $public_functions = array( + 'add_group' => True, + 'add_user' => True, + 'delete_group' => True, + 'delete_user' => True, + 'edit_group' => True, + 'edit_user' => True, 'set_group_managers' => True ); var $xml_functions = array(); - var $soap_functions = array - ( - 'add_user' => array - ( - 'in' => array('int','struct'), - 'out' => array() + var $soap_functions = array( + 'add_user' => array( + 'in' => array('int', 'struct'), + 'out' => array() ) ); @@ -77,28 +75,113 @@ } } - function check_rights($action, $access = 'group_access') + function delete_group() { - switch($action) + if (!@isset($_POST['account_id']) || !@$_POST['account_id'] || $GLOBALS['phpgw']->acl->check('group_access',32,'admin')) { - case 'view': $right = '8'; break; - case 'add': $right = '4'; break; - case 'edit': $right = '16'; break; - case 'delete': $right = '32'; break; - case 'search': $right = '2'; break; + ExecMethod('admin.uiaccounts.list_groups'); + return False; + } + + $account_id = intval($_POST['account_id']); + + $GLOBALS['phpgw']->db->lock( + Array( + 'phpgw_accounts', + 'phpgw_acl' + ) + ); + + $old_group_list = $GLOBALS['phpgw']->acl->get_ids_for_location($account_id,1,'phpgw_group'); + + @reset($old_group_list); + while($old_group_list && $id = each($old_group_list)) + { + $GLOBALS['phpgw']->acl->delete_repository('phpgw_group',$account_id,intval($id[1])); + $GLOBALS['phpgw']->session->delete_cache(intval($id[1])); } - if (!$GLOBALS['phpgw']->acl->check($access,$right,'admin')) + $GLOBALS['phpgw']->acl->delete_repository('%%','run',$account_id); + + if (! @rmdir($GLOBALS['phpgw_info']['server']['files_dir'].SEP.'groups'.SEP.$GLOBALS['phpgw']->accounts->id2name($account_id))) { - return True; + $cd = 38; } - return False; + else + { + $cd = 32; + } + + $GLOBALS['phpgw']->accounts->delete($account_id); + + $GLOBALS['phpgw']->db->unlock(); + + Header('Location: '.$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups')); + $GLOBALS['phpgw']->common->phpgw_exit(); } - - function add_group($values) + function delete_user() { - $temp_users = ($values['account_user']?$values['account_user']:Array()); + if (isset($_POST['cancel']) || $GLOBALS['phpgw']->acl->check('account_access',32,'admin')) + { + ExecMethod('admin.uiaccounts.list_users'); + return False; + } + elseif($_POST['delete_account']) + { + $accountid = $_POST['account_id']; + settype($account_id,'integer'); + $account_id = get_account_id($accountid); + // make this information also in hook available + $lid = $GLOBALS['phpgw']->accounts->id2name($account_id); + $db = $GLOBALS['phpgw']->db; + $db->query('SELECT app_name,app_order FROM phpgw_applications WHERE app_enabled!=0 ORDER BY app_order',__LINE__,__FILE__); + if($db->num_rows()) + { + while($db->next_record()) + { + $appname = $db->f('app_name'); + + if($appname <> 'admin') + { + $GLOBALS['phpgw']->hooks->single('deleteaccount', $appname); + } + } + } + + $GLOBALS['hook_values']['account_id'] = $account_id; + $GLOBALS['hook_values']['account_lid'] = $lid; + + $GLOBALS['phpgw']->hooks->single('deleteaccount','preferences'); + $GLOBALS['phpgw']->hooks->single('deleteaccount','admin'); + + $GLOBALS['phpgw']->hooks->process('deleteaccount'); + + $basedir = $GLOBALS['phpgw_info']['server']['files_dir'] . SEP . 'users' . SEP; + + if (! @rmdir($basedir . $lid)) + { + $cd = 34; + } + else + { + $cd = 29; + } + + ExecMethod('admin.uiaccounts.list_users'); + return False; + } + } + + function add_group() + { + if ($GLOBALS['phpgw']->acl->check('group_access',4,'admin')) + { + ExecMethod('admin.uiaccounts.list_groups'); + return False; + } + + $temp_users = ($_POST['account_user']?$_POST['account_user']:Array()); $account_user = Array(); @reset($temp_users); while(list($key,$user_id) = each($temp_users)) @@ -107,7 +190,7 @@ } @reset($account_user); - $group_permissions = ($values['account_apps']?$values['account_apps']:Array()); + $group_permissions = ($_POST['account_apps']?$_POST['account_apps']:Array()); $account_apps = Array(); @reset($group_permissions); while(list($key,$value) = each($group_permissions)) @@ -119,30 +202,31 @@ } @reset($account_apps); - $group_info = Array - ( - 'account_id' => ($values['account_id']?intval($values['account_id']):0), - 'account_name' => ($values['account_name']?$values['account_name']:''), + $group_info = Array( + 'account_id' => ($_POST['account_id']?intval($_POST['account_id']):0), + 'account_name' => ($_POST['account_name']?$_POST['account_name']:''), 'account_user' => $account_user, 'account_apps' => $account_apps ); - $GLOBALS['phpgw']->db->lock(array - ( - 'phpgw_accounts', - 'phpgw_nextid', - 'phpgw_preferences', - 'phpgw_sessions', - 'phpgw_acl', - 'phpgw_applications', - 'phpgw_app_sessions', - 'phpgw_hooks' - )); + $this->validate_group($group_info); + + $GLOBALS['phpgw']->db->lock( + Array( + 'phpgw_accounts', + 'phpgw_nextid', + 'phpgw_preferences', + 'phpgw_sessions', + 'phpgw_acl', + 'phpgw_applications', + 'phpgw_app_sessions', + 'phpgw_hooks' + ) + ); $group = CreateObject('phpgwapi.accounts',$group_info['account_id'],'g'); $group->acct_type = 'g'; - $account_info = array - ( + $account_info = array( 'account_type' => 'g', 'account_lid' => $group_info['account_name'], 'account_passwd' => '', @@ -181,7 +265,7 @@ $GLOBALS['pref'] = CreateObject('phpgwapi.preferences',$user_id); $t = $GLOBALS['pref']->read_repository(); @reset($new_apps); - while(list($app_key,$app_name) = each($new_apps)) + while(is_array($new_apps) && list($app_key,$app_name) = each($new_apps)) { if (!$t[($app_name=='admin'?'common':$app_name)]) { @@ -204,17 +288,92 @@ { $cd = 37; } + $GLOBALS['phpgw']->db->unlock(); + + ExecMethod('admin.uiaccounts.list_groups'); + return False; } - function edit_group($values) + function add_user() + { + if ($GLOBALS['phpgw']->acl->check('account_access',4,'admin')) + { + ExecMethod('admin.uiaccounts.list_users'); + return False; + } + + if ($_POST['submit']) + { + $userData = array( + 'account_type' => 'u', + 'account_lid' => $_POST['account_lid'], + 'account_firstname' => $_POST['account_firstname'], + 'account_lastname' => $_POST['account_lastname'], + 'account_passwd' => $_POST['account_passwd'], + 'status' => ($_POST['account_status'] ? 'A' : ''), + 'account_status' => ($_POST['account_status'] ? 'A' : ''), + 'old_loginid' => ($_GET['old_loginid']?rawurldecode($_GET['old_loginid']):''), + 'account_id' => ($_GET['account_id']?$_GET['account_id']:0), + 'account_passwd_2' => $_POST['account_passwd_2'], + 'account_groups' => $_POST['account_groups'], + 'anonymous' => $_POST['anonymous'], + 'changepassword' => $_POST['changepassword'], + 'account_permissions' => $_POST['account_permissions'], + 'homedirectory' => $_POST['homedirectory'], + 'loginshell' => $_POST['loginshell'], + 'account_expires_never' => $_POST['never_expires'] + /* 'file_space' => $_POST['account_file_space_number'] . "-" . $_POST['account_file_space_type'] */ + ); + if ($_POST['expires'] !== '' && !$_POST['never_expires']) + { + $jscal = CreateObject('phpgwapi.jscalendar',False); + $userData += $jscal->input2date($_POST['expires'],False,'account_expires_day','account_expires_month','account_expires_year'); + } + if (!$errors = $this->validate_user($userData)) + { + $account_id = $this->so->add_user($userData); + + if ($userData['anonymous']) + { + $GLOBALS['phpgw']->acl->add_repository('phpgwapi','anonymous',$account_id,1); + } + else + { + $GLOBALS['phpgw']->acl->delete_repository('phpgwapi','anonymous',$account_id); + } + // make this information for the hooks available + $GLOBALS['hook_values']['account_lid'] = $userData['account_lid']; + $GLOBALS['hook_values']['account_id'] = $account_id; + $GLOBALS['hook_values']['new_passwd'] = $userData['account_passwd']; + $GLOBALS['hook_values']['account_firstname'] = $userData['account_firstname']; + $GLOBALS['hook_values']['account_lastname'] = $userData['account_lastname']; + $GLOBALS['phpgw']->hooks->process('addaccount'); + ExecMethod('admin.uiaccounts.list_users'); + return False; + } + else + { + $ui = createobject('admin.uiaccounts'); + $ui->create_edit_user($userData['account_id'],$userData,$errors); + } + } + else + { + ExecMethod('admin.uiaccounts.list_users'); + return False; + } + } + + function edit_group() { if ($GLOBALS['phpgw']->acl->check('group_access',16,'admin')) { - $error[] = lang('no permission to create groups'); + ExecMethod('admin.uiaccounts.list_groups'); + return False; } - $temp_users = ($values['account_user']?$values['account_user']:Array()); + $temp_users = ($_POST['account_user']?$_POST['account_user']:Array()); $account_user = Array(); @reset($temp_users); while($temp_users && list($key,$user_id) = each($temp_users)) @@ -223,7 +382,7 @@ } @reset($account_user); - $group_permissions = ($values['account_apps']?$values['account_apps']:Array()); + $group_permissions = ($_POST['account_apps']?$_POST['account_apps']:Array()); $account_apps = Array(); @reset($group_permissions); while(list($key,$value) = each($group_permissions)) @@ -236,12 +395,14 @@ @reset($account_apps); $group_info = Array( - 'account_id' => ($values['account_id']?intval($values['account_id']):0), - 'account_name' => ($values['account_name']?$values['account_name']:''), + 'account_id' => ($_POST['account_id']?intval($_POST['account_id']):0), + 'account_name' => ($_POST['account_name']?$_POST['account_name']:''), 'account_user' => $account_user, 'account_apps' => $account_apps ); + $this->validate_group($group_info); + // Lock tables $GLOBALS['phpgw']->db->lock( Array( @@ -365,198 +526,140 @@ /* // Update any other options here, since the above save_repository () depends // on a group having users - $group->data['file_space'] = $GLOBALS['HTTP_POST_VARS']['account_file_space_number'] . "-" . $GLOBALS['HTTP_POST_VARS']['account_file_space_type']; + $group->data['file_space'] = $_POST['account_file_space_number'] . "-" . $_POST['account_file_space_type']; $group->save_repository(); */ $GLOBALS['phpgw']->db->unlock(); + + ExecMethod('admin.uiaccounts.list_groups'); + return False; } - function save_user($values) + function edit_user() { - if (is_array($values)) + if ($GLOBALS['phpgw']->acl->check('account_access',16,'admin')) { - if($values['expires_never']) - { - $values['expires'] = $values['account_expires'] = -1; - } - else - { - $values['expires'] = $values['account_expires'] = mktime(2,0,0,$values['account_expires_month'],$values['account_expires_day'],$values['account_expires_year']); - } + ExecMethod('admin.uiaccounts.list_users'); + return False; + } - $userData = array - ( - 'account_type' => 'u', - 'account_lid' => $values['account_lid'], - 'account_firstname' => $values['account_firstname'], - 'account_lastname' => $values['account_lastname'], - 'account_passwd' => $values['account_passwd'], - 'status' => ($values['account_status'] ? 'A' : ''), - 'account_status' => ($values['account_status'] ? 'A' : ''), - 'old_loginid' => ($values['old_loginid']?rawurldecode($GLOBALS['HTTP_GET_VARS']['old_loginid']):''), - 'account_id' => ($values['account_id']?$GLOBALS['HTTP_GET_VARS']['account_id']:0), - 'account_passwd_2' => $values['account_passwd_2'], - 'account_groups' => $values['account_groups'], - 'account_permissions' => $values['account_permissions'], - 'homedirectory' => $values['homedirectory'], - 'loginshell' => $values['loginshell'], - 'account_expires_month' => $values['account_expires_month'], - 'account_expires_day' => $values['account_expires_day'], - 'account_expires_year' => $values['account_expires_year'], - 'account_expires_never' => $values['expires'], - 'expires' => $values['expires'], - 'account_expires' => $values['expires'] - /* 'file_space' => $GLOBALS['HTTP_POST_VARS']['account_file_space_number'] . "-" . $GLOBALS['HTTP_POST_VARS']['account_file_space_type'] */ + if ($_POST['submit']) + { + $userData = array( + 'account_lid' => $_POST['account_lid'], + 'firstname' => $_POST['account_firstname'], + 'lastname' => $_POST['account_lastname'], + 'account_passwd' => $_POST['account_passwd'], + 'status' => ($_POST['account_status'] ? 'A' : ''), + 'account_status' => ($_POST['account_status'] ? 'A' : ''), + 'old_loginid' => ($_GET['old_loginid']?rawurldecode($_GET['old_loginid']):''), + 'account_id' => ($_GET['account_id']?$_GET['account_id']:0), + 'account_passwd_2' => $_POST['account_passwd_2'], + 'account_groups' => $_POST['account_groups'], + 'anonymous' => $_POST['anonymous'], + 'changepassword' => $_POST['changepassword'], + 'account_permissions' => $_POST['account_permissions'], + 'homedirectory' => $_POST['homedirectory'], + 'loginshell' => $_POST['loginshell'], + 'account_expires_never' => $_POST['never_expires'] + /* 'file_space' => $_POST['account_file_space_number'] . "-" . $_POST['account_file_space_type'] */ ); - - if ($values['account_id']) + if ($_POST['expires'] !== '' && !$_POST['never_expires']) { - $userData['account_id'] = $values['account_id']; - $this->update_user($userData); - /* check if would create a menu + $jscal = CreateObject('phpgwapi.jscalendar',False); + $userData += $jscal->input2date($_POST['expires'],False,'account_expires_day','account_expires_month','account_expires_year'); + } + if (!$errors = $this->validate_user($userData)) + { + $this->save_user($userData); + $GLOBALS['hook_values']['account_id'] = $userData['account_id']; + $GLOBALS['hook_values']['account_lid'] = $userData['account_lid']; + $GLOBALS['hook_values']['account_firstname'] = $userData['account_firstname']; + $GLOBALS['hook_values']['account_lastname'] = $userData['account_lastname']; + $GLOBALS['phpgw']->hooks->process('editaccount'); + + // check if would create a menu // if we do, we can't return to the users list, because // there are also some other plugins if (!ExecMethod('admin.uimenuclass.createHTMLCode','edit_user')) { - }*/ - } - else - { - $account_id = $this->so->add_user($userData); - $GLOBALS['hook_values']['account_lid'] = $userData['account_lid']; - $GLOBALS['hook_values']['account_id'] = $account_id; //$userData['account_id']; - $GLOBALS['hook_values']['new_passwd'] = $userData['account_passwd']; - $GLOBALS['phpgw']->hooks->process('addaccount'); - } - } - } - - /* stores the userdata */ - function update_user($userData) - { - $account = CreateObject('phpgwapi.accounts',$userData['account_id'],'u'); - $account->update_data($userData); - $account->save_repository(); - if ($userData['account_passwd']) - { - $auth = CreateObject('phpgwapi.auth'); - $auth->change_password($old_passwd,$userData['account_passwd'],$userData['account_id']); - $GLOBALS['hook_values']['account_id'] = $userData['account_id']; - $GLOBALS['hook_values']['old_passwd'] = $old_passwd; - $GLOBALS['hook_values']['new_passwd'] = $userData['account_passwd']; - $GLOBALS['phpgw']->hooks->process('changepassword'); - } - - $apps = CreateObject('phpgwapi.applications',array(intval($userData['account_id']),'u')); - - $apps->account_id = $userData['account_id']; - if ($_userData['account_permissions']) - { - while($app = each($userData['account_permissions'])) - { - if($app[1]) + ExecMethod('admin.uiaccounts.list_users'); + return False; + } + else { - $apps->add($app[0]); + ExecMethod('admin.uiaccounts.edit_user',$_GET['account_id']); + return False; } } - } - $apps->save_repository(); - - $account = CreateObject('phpgwapi.accounts',$userData['account_id'],'u'); - $allGroups = $account->get_list('groups'); - - if ($userData['account_groups']) - { - reset($userData['account_groups']); - while (list($key,$value) = each($userData['account_groups'])) - { - $newGroups[$value] = $value; - } - } - - $acl = CreateObject('phpgwapi.acl',$userData['account_id']); - - reset($allGroups); - while (list($key,$groupData) = each($allGroups)) - { - /* print "$key,". $groupData['account_id'] ."
    ";*/ - /* print "$key,". $userData['account_groups'][1] ."
    "; */ - - if ($newGroups[$groupData['account_id']]) - { - $acl->add_repository('phpgw_group',$groupData['account_id'],$userData['account_id'],1); - } else { - $acl->delete_repository('phpgw_group',$groupData['account_id'],$userData['account_id']); + $ui = createobject('admin.uiaccounts'); + $ui->create_edit_user($userData['account_id'],$userData,$errors); } } - $GLOBALS['phpgw']->session->delete_cache(intval($userData['account_id'])); } function set_group_managers() { - if($GLOBALS['phpgw']->acl->check('group_access',16,'admin') || $GLOBALS['HTTP_POST_VARS']['cancel']) + if($GLOBALS['phpgw']->acl->check('group_access',16,'admin') || $_POST['cancel']) { $GLOBALS['phpgw']->redirect($GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } - elseif($GLOBALS['HTTP_POST_VARS']['submit']) + elseif($_POST['submit']) { - $acl = CreateObject('phpgwapi.acl',intval($GLOBALS['HTTP_POST_VARS']['account_id'])); + $acl = CreateObject('phpgwapi.acl',intval($_POST['account_id'])); - $users = $GLOBALS['phpgw']->accounts->member($GLOBALS['HTTP_POST_VARS']['account_id']); + $users = $GLOBALS['phpgw']->accounts->member($_POST['account_id']); @reset($users); while($managers && list($key,$user) = each($users)) { - $acl->add_repository('phpgw_group',intval($GLOBALS['HTTP_POST_VARS']['account_id']),$user['account_id'],1); + $acl->add_repository('phpgw_group',intval($_POST['account_id']),$user['account_id'],1); } - $managers = $GLOBALS['HTTP_POST_VARS']['managers']; + $managers = $_POST['managers']; @reset($managers); while($managers && list($key,$manager) = each($managers)) { - $acl->add_repository('phpgw_group',intval($GLOBALS['HTTP_POST_VARS']['account_id']),$manager,(1 + PHPGW_ACL_GROUP_MANAGERS)); + $acl->add_repository('phpgw_group',intval($_POST['account_id']),$manager,(1 + PHPGW_ACL_GROUP_MANAGERS)); } } $GLOBALS['phpgw']->redirect($GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->common->phpgw_exit(); } - function validate_group($values) + function validate_group($group_info) { - $group = CreateObject('phpgwapi.accounts',$values['account_id'],'g'); + $errors = Array(); + + $group = CreateObject('phpgwapi.accounts',$group_info['account_id'],'g'); $group->read_repository(); - if (!$values['account_id'] && $GLOBALS['phpgw']->acl->check('group_access',4,'admin')) + if(!$group_info['account_name']) { - $error[] = lang('no permission to add groups'); + $errors[] = lang('You must enter a group name.'); } - if(!$values['account_name']) + if($group_info['account_name'] != $group->id2name($group_info['account_id'])) { - $error[] = lang('You must enter a group name.'); - } - - if($values['account_name'] != $group->id2name($values['account_id'])) - { - if ($group->exists($values['account_name'])) + if ($group->exists($group_info['account_name'])) { - $error[] = lang('Sorry, that group name has already been taken.'); + $errors[] = lang('Sorry, that group name has already been taken.'); } } /* if (preg_match ("/\D/", $account_file_space_number)) { - $error[] = lang ('File space must be an integer'); + $errors[] = lang ('File space must be an integer'); } */ - if(is_array($error)) + if(count($errors)) { - return $error; + $ui = createobject('admin.uiaccounts'); + $ui->create_edit_group($group_info,$errors); + $GLOBALS['phpgw']->common->phpgw_exit(); } } @@ -564,69 +667,76 @@ returns FALSE if the data are correct otherwise the error array */ - function validate_user($values) + function validate_user(&$_userData) { - if (!$values['account_id'] && $GLOBALS['phpgw']->acl->check('account_access',4,'admin')) - { - $error[] = lang('no permission to add users'); - } + $totalerrors = 0; /* - if ($GLOBALS['phpgw_info']['server']['account_repository'] == 'ldap' && ! $values['allow_long_loginids']) + if ($GLOBALS['phpgw_info']['server']['account_repository'] == 'ldap' && ! $allow_long_loginids) { - if (strlen($values['account_lid']) > 8) + if (strlen($_userData['account_lid']) > 8) { - $error[] = lang('The loginid can not be more then 8 characters'); + $error[$totalerrors] = lang('The loginid can not be more then 8 characters'); + $totalerrors++; } } */ - if (!$values['account_lid']) + if (!$_userData['account_lid']) { - $error[] = lang('You must enter a loginid'); + $error[$totalerrors] = lang('You must enter a loginid'); + $totalerrors++; } - if ($values['old_loginid'] != $values['account_lid']) + if ($_userData['old_loginid'] != $_userData['account_lid']) { - if ($GLOBALS['phpgw']->accounts->exists($values['account_lid'])) + if ($GLOBALS['phpgw']->accounts->exists($_userData['account_lid'])) { - $error[] = lang('That loginid has already been taken'); + $error[$totalerrors] = lang('That loginid has already been taken'); + $totalerrors++; } } - if ($values['account_passwd'] || $values['account_passwd_2']) + if ($_userData['account_passwd'] || $_userData['account_passwd_2']) { - if ($values['account_passwd'] != $values['account_passwd_2']) + if ($_userData['account_passwd'] != $_userData['account_passwd_2']) { - $error[] = lang('The two passwords are not the same'); + $error[$totalerrors] = lang('The two passwords are not the same'); + $totalerrors++; } + } - /* $temp_msgbox_data = $GLOBALS['phpgw_info']['flags']['msgbox_data']; - unset($GLOBALS['phpgw_info']['flags']['msgbox_data']); - if(!sanitize($_userData['account_passwd'],'password')) + if (!count($_userData['account_permissions']) && !count($_userData['account_groups'])) + { + $error[$totalerrors] = lang('You must add at least 1 permission or group to this account'); + $totalerrors++; + } + + if ($_userData['account_expires_month'] || $_userData['account_expires_day'] || $_userData['account_expires_year'] || $_userData['account_expires_never']) + { + if($_userData['account_expires_never']) { - reset($GLOBALS['phpgw_info']['flags']['msgbox_data']); - while(list($key) = each($GLOBALS['phpgw_info']['flags']['msgbox_data'])) + $_userData['expires'] = -1; + $_userData['account_expires'] = $_userData['expires']; + } + else + { + if (! checkdate($_userData['account_expires_month'],$_userData['account_expires_day'],$_userData['account_expires_year'])) { - $error[$totalerrors] = lang($key); + $error[$totalerrors] = lang('You have entered an invalid expiration date'); $totalerrors++; } + else + { + $_userData['expires'] = mktime(2,0,0,$_userData['account_expires_month'],$_userData['account_expires_day'],$_userData['account_expires_year']); + $_userData['account_expires'] = $_userData['expires']; + } } - $GLOBALS['phpgw_info']['flags']['msgbox_data'] = $temp_msgbox_data; - unset($temp_msgbox_data); */ } - - if (!count($values['account_permissions']) && !count($values['account_groups'])) + else { - $error[] = lang('You must add at least 1 permission or group to this account'); - } - - if ($values['account_expires_month'] || $values['account_expires_day'] || $values['account_expires_year'] || $values['account_expires_never']) - { - if (! checkdate($values['account_expires_month'],$values['account_expires_day'],$values['account_expires_year'])) - { - $error[] = lang('You have entered an invalid expiration date'); - } + $_userData['expires'] = -1; + $_userData['account_expires'] = $_userData['expires']; } /* @@ -638,99 +748,93 @@ } */ - if (is_array($error)) + if ($totalerrors == 0) + { + return FALSE; + } + else { return $error; } } - - function delete_group($account_id) + /* stores the userdata */ + function save_user($_userData) { - if ($GLOBALS['phpgw']->acl->check('group_access',32,'admin')) + $account = CreateObject('phpgwapi.accounts',$_userData['account_id'],'u'); + $account->update_data($_userData); + $account->save_repository(); + if ($_userData['account_passwd']) { - return False; + $auth = CreateObject('phpgwapi.auth'); + $auth->change_password($old_passwd, $_userData['account_passwd'], $_userData['account_id']); + $GLOBALS['hook_values']['account_id'] = $_userData['account_id']; + $GLOBALS['hook_values']['old_passwd'] = $old_passwd; + $GLOBALS['hook_values']['new_passwd'] = $_userData['account_passwd']; + $GLOBALS['phpgw']->hooks->process('changepassword'); } - $GLOBALS['phpgw']->db->lock(array - ( - 'phpgw_accounts', - 'phpgw_acl' - ) - ); + $apps = CreateObject('phpgwapi.applications',array(intval($_userData['account_id']),'u')); - $old_group_list = $GLOBALS['phpgw']->acl->get_ids_for_location($account_id,1,'phpgw_group'); - - @reset($old_group_list); - while($old_group_list && $id = each($old_group_list)) + $apps->account_id = $_userData['account_id']; + if ($_userData['account_permissions']) { - $GLOBALS['phpgw']->acl->delete_repository('phpgw_group',$account_id,intval($id[1])); - $GLOBALS['phpgw']->session->delete_cache(intval($id[1])); - } - - $GLOBALS['phpgw']->acl->delete_repository('%%','run',$account_id); - - if (! @rmdir($GLOBALS['phpgw_info']['server']['files_dir'].SEP.'groups'.SEP.$GLOBALS['phpgw']->accounts->id2name($account_id))) - { - $cd = 38; - } - else - { - $cd = 32; - } - - $GLOBALS['phpgw']->accounts->delete($account_id); - $GLOBALS['phpgw']->db->unlock(); - } - - function delete_user() - { - if (isset($GLOBALS['HTTP_POST_VARS']['cancel']) || $GLOBALS['phpgw']->acl->check('account_access',32,'admin')) - { - ExecMethod('admin.uiaccounts.list_users'); - return False; - } - elseif($GLOBALS['HTTP_POST_VARS']['delete_account']) - { - $accountid = $GLOBALS['HTTP_POST_VARS']['account_id']; - settype($account_id,'integer'); - $account_id = get_account_id($accountid); - $lid = $GLOBALS['phpgw']->accounts->id2name($account_id); - $db = $GLOBALS['phpgw']->db; - $db->query('SELECT app_name,app_order FROM phpgw_applications WHERE app_enabled!=0 ORDER BY app_order',__LINE__,__FILE__); - if($db->num_rows()) + while($app = each($_userData['account_permissions'])) { - while($db->next_record()) + if($app[1]) { - $appname = $db->f('app_name'); - - if($appname <> 'admin') - { - $GLOBALS['phpgw']->hooks->single('deleteaccount', $appname); - } + $apps->add($app[0]); } } + } + $apps->save_repository(); - $GLOBALS['phpgw']->hooks->single('deleteaccount','preferences'); - $GLOBALS['phpgw']->hooks->single('deleteaccount','admin'); + $account = CreateObject('phpgwapi.accounts',$_userData['account_id'],'u'); + $allGroups = $account->get_list('groups'); - $GLOBALS['hook_values']['account_id'] = $account_id; - $GLOBALS['phpgw']->hooks->process('deleteaccount'); - - $basedir = $GLOBALS['phpgw_info']['server']['files_dir'] . SEP . 'users' . SEP; - - if (! @rmdir($basedir . $lid)) + if ($_userData['account_groups']) + { + reset($_userData['account_groups']); + while (list($key,$value) = each($_userData['account_groups'])) { - $cd = 34; + $newGroups[$value] = $value; + } + } + + $acl = CreateObject('phpgwapi.acl',$_userData['account_id']); + + reset($allGroups); + while (list($key,$groupData) = each($allGroups)) + { + /* print "$key,". $groupData['account_id'] ."
    ";*/ + /* print "$key,". $_userData['account_groups'][1] ."
    "; */ + + if ($newGroups[$groupData['account_id']]) + { + $acl->add_repository('phpgw_group',$groupData['account_id'],$_userData['account_id'],1); } else { - $cd = 29; + $acl->delete_repository('phpgw_group',$groupData['account_id'],$_userData['account_id']); } - - ExecMethod('admin.uiaccounts.list_users'); - return False; } + if ($_userData['anonymous']) + { + $acl->add_repository('phpgwapi','anonymous',$_userData['account_id'],1); + } + else + { + $acl->delete_repository('phpgwapi','anonymous',$_userData['account_id']); + } + if ($_userData['changepassword']) + { + $GLOBALS['phpgw']->acl->add_repository('preferences','changepassword',$_userData['account_id'],1); + } + else + { + $GLOBALS['phpgw']->acl->delete_repository('preferences','changepassword',$_userData['account_id']); + } + $GLOBALS['phpgw']->session->delete_cache(intval($_userData['account_id'])); } function load_group_users($account_id) diff --git a/admin/inc/class.bocategories.inc.php b/admin/inc/class.bocategories.inc.php index 0f8b2a6ba7..b5fc2f4a7c 100644 --- a/admin/inc/class.bocategories.inc.php +++ b/admin/inc/class.bocategories.inc.php @@ -28,9 +28,9 @@ function bocategories() { - if ($GLOBALS['appname']) + if ($_GET['appname']) { - $this->cats = CreateObject('phpgwapi.categories',-1,$GLOBALS['appname']); + $this->cats = CreateObject('phpgwapi.categories',-1,$_GET['appname']); } else { @@ -39,24 +39,19 @@ $this->read_sessiondata(); - /* _debug_array($GLOBALS['HTTP_POST_VARS']); */ - - $start = intval(get_var('start',array('POST','GET'))); + /* _debug_array($_POST); */ + /* Might change this to '' at the end---> */ + $start = get_var('start',array('POST','GET')); $query = get_var('query',array('POST','GET')); - $sort = get_var('sort',array('POST','GET')); + $sort = get_var('sort', array('POST','GET')); $order = get_var('order',array('POST','GET')); - $cat_id = intval(get_var('cat_id', array('POST','GET'))); + $cat_id = get_var('cat_id',array('POST','GET')); - if(!empty($start) || $start == 0) + if(!empty($start) || $start == '0' || $start == 0) { if($this->debug) { echo '
    overriding start: "' . $this->start . '" now "' . $start . '"'; } $this->start = $start; } - else - { - $this->start = 0; - } - if((empty($query) && !empty($this->query)) || !empty($query)) { if($this->debug) { echo '
    setting query to: "' . $query . '"'; } @@ -67,17 +62,14 @@ { $this->cat_id = $cat_id; } - - if($cat_id == 0) + if($cat_id == '0' || $cat_id == 0 || $cat_id == '') { unset($this->cat_id); } - if(isset($sort) && !empty($sort)) { $this->sort = $sort; } - if(isset($order) && !empty($order)) { $this->order = $order; @@ -105,23 +97,15 @@ } } - function get_list($global_cats=False) + function get_list() { if($this->debug) { echo '
    querying: "' . $this->query . '"'; } - - if ($global_cats) - { - return $this->cats->return_sorted_array($this->start,True,$this->query,$this->sort,$this->order,True); - } - else - { - return $this->cats->return_sorted_array($this->start,True,$this->query,$this->sort,$this->order); - } + return $this->cats->return_sorted_array($this->start,True,$this->query,$this->sort,$this->order,True); } function save_cat($values) { - if ($values['cat_id'] && $values['cat_id'] != 0) + if ($values['id'] && $values['id'] != 0) { return $this->cats->edit($values); } @@ -133,20 +117,19 @@ function exists($data) { - return $this->cats->exists($data); + $data['type'] = $data['type'] ? $data['type'] : ''; + $data['cat_id'] = $data['cat_id'] ? $data['cat_id'] : ''; + return $this->cats->exists($data['type'],$data['cat_name'],$data['cat_id']); } function formatted_list($data) { - return $this->cats->formatted_list($data); + return $this->cats->formated_list($data['select'],$data['all'],$data['cat_parent'],True); } - function delete($data) + function delete($cat_id,$subs=False) { - if (is_array($data)) - { - $this->cats->delete($data); - } + return $this->cats->delete($cat_id,$subs); } function check_values($values) @@ -168,7 +151,7 @@ ( 'type' => 'appandmains', 'cat_name' => $values['name'], - 'cat_id' => $values['cat_id'] + 'cat_id' => $values['id'] )); } else @@ -177,7 +160,7 @@ ( 'type' => 'appandsubs', 'cat_name' => $values['name'], - 'cat_id' => $values['cat_id'] + 'cat_id' => $values['id'] )); } diff --git a/admin/inc/class.soaccounts.inc.php b/admin/inc/class.soaccounts.inc.php index f40e38c097..1aa86f73b6 100755 --- a/admin/inc/class.soaccounts.inc.php +++ b/admin/inc/class.soaccounts.inc.php @@ -19,10 +19,9 @@ function add_user($userData) { - $GLOBALS['phpgw']->db->lock - ( - array - ( + $userData['account_expires'] = $userData['expires']; + $GLOBALS['phpgw']->db->lock( + Array( 'phpgw_accounts', 'phpgw_nextid', 'phpgw_preferences', @@ -37,10 +36,9 @@ $GLOBALS['phpgw']->accounts->create($userData); $userData['account_id'] = $GLOBALS['phpgw']->accounts->name2id($userData['account_lid']); - - $apps = CreateObject('phpgwapi.applications',array($userData['account_id'],'u')); + + $apps = CreateObject('phpgwapi.applications',$userData['account_id']); $apps->read_installed_apps(); - // Read Group Apps if ($userData['account_groups']) { @@ -63,7 +61,7 @@ $apps->account_type = 'u'; $apps->account_id = $userData['account_id']; - $apps->account_apps = Array(Array()); + $apps->data = Array(Array()); if ($userData['account_permissions']) { @@ -82,8 +80,10 @@ } $apps->save_repository(); - $GLOBALS['phpgw']->acl->add_repository('preferences','changepassword',$userData['account_id'],1); - + if ($userData['changepassword']) + { + $GLOBALS['phpgw']->acl->add_repository('preferences','changepassword',$userData['account_id'],1); + } // Assign user to groups if ($userData['account_groups']) { @@ -94,32 +94,11 @@ } } -/* if ($apps_after) - { - $GLOBALS['pref'] = CreateObject('phpgwapi.preferences',$userData['account_id']); - $GLOBALS['phpgw']->hooks->single('add_def_pref','admin'); - while ($apps = each($apps_after)) - { - if (strcasecmp ($apps[0], 'admin') != 0) - { - $GLOBALS['phpgw']->hooks->single('add_def_pref', $apps[1]); - } - } - $GLOBALS['pref']->save_repository(False); - } */ - $apps->account_apps = array(array()); $apps_after = array(array()); $GLOBALS['phpgw']->db->unlock(); -/* - // start inlcuding other admin tools - while($app = each($apps_after)) - { - $GLOBALS['phpgw']->hooks->single('add_user_data', $value); - } -*/ return $userData['account_id']; } } diff --git a/admin/inc/class.soapplications.inc.php b/admin/inc/class.soapplications.inc.php index da6ea945be..92ddd72d23 100644 --- a/admin/inc/class.soapplications.inc.php +++ b/admin/inc/class.soapplications.inc.php @@ -28,7 +28,7 @@ $this->db->next_record(); $app_info = array( $this->db->f('app_name'), - $this->db->f('app_name'), + $GLOBALS['phpgw_info']['apps'][$this->db->f('app_name')]['title'], $this->db->f('app_enabled'), $this->db->f('app_name'), $this->db->f('app_order') @@ -44,7 +44,7 @@ while ($this->db->next_record()) { $apps[$this->db->f('app_name')] = array( - 'title' => str_replace('- ','-',ucwords(str_replace('_','- ',$this->db->f('app_name')))), + 'title' => $GLOBALS['phpgw_info']['apps'][$this->db->f('app_name')], 'name' => $this->db->f('app_name'), 'status' => $this->db->f('app_enabled') ); @@ -74,7 +74,7 @@ function save($data) { $sql = "UPDATE phpgw_applications SET app_name='" . addslashes($data['n_app_name']) . "'," - . "app_enabled='" . $data['n_app_status'] . "',app_order='" . $data['app_order'] + . "app_enabled='" . $data['n_app_status'] . "',app_order='" . $data['app_order'] . "' WHERE app_name='" . $data['old_app_name'] . "'"; $this->db->query($sql,__LINE__,__FILE__); diff --git a/admin/inc/class.uiaccess_history.inc.php b/admin/inc/class.uiaccess_history.inc.php index 43915293a6..e9ed137b01 100644 --- a/admin/inc/class.uiaccess_history.inc.php +++ b/admin/inc/class.uiaccess_history.inc.php @@ -20,6 +20,11 @@ function uiaccess_history() { + if ($GLOBALS['phpgw']->acl->check('access_log_access',1,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } + $this->bo = createobject('admin.boaccess_history'); $this->nextmatchs = createobject('phpgwapi.nextmatchs'); $this->template = $GLOBALS['phpgw']->template; @@ -35,13 +40,14 @@ function list_history() { - $account_id = ($GLOBALS['HTTP_GET_VARS']['account_id']?$GLOBALS['HTTP_GET_VARS']['account_id']:$GLOBALS['HTTP_POST_VARS']['account_id']); - $start = ($GLOBALS['HTTP_POST_VARS']['start']?$GLOBALS['HTTP_POST_VARS']['start']:0); - $sort = ($GLOBALS['HTTP_POST_VARS']['sort']?$GLOBALS['HTTP_POST_VARS']['sort']:0); - $order = ($GLOBALS['HTTP_POST_VARS']['order']?$GLOBALS['HTTP_POST_VARS']['order']:0); + $account_id = get_var('account_id',array('GET','POST')); + $start = get_var('start',array('POST'),0); + $sort = get_var('sort',array('POST'),0); + $order = get_var('order',array('POST'),0); $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin').' - '.lang('View access log'); $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); $total_records = $this->bo->total($account_id); diff --git a/admin/inc/class.uiaccounts.inc.php b/admin/inc/class.uiaccounts.inc.php index da20139433..93279f74b0 100755 --- a/admin/inc/class.uiaccounts.inc.php +++ b/admin/inc/class.uiaccounts.inc.php @@ -2,8 +2,7 @@ /**************************************************************************\ * phpGroupWare - account administration * * http://www.phpgroupware.org * - * Written by coreteam * - * ----------------------------------------------------- * + * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * @@ -15,14 +14,19 @@ { var $public_functions = array ( - 'list_groups' => True, - 'list_users' => True, - 'delete_group' => True, - 'delete_user' => True, - 'edit_user' => True, - 'edit_group' => True, - 'view_user' => True, - 'group_manager' => True + 'list_groups' => True, + 'list_users' => True, + 'add_group' => True, + 'add_user' => True, + 'delete_group' => True, + 'delete_user' => True, + 'edit_user' => True, + 'edit_user_hook' => True, + 'edit_group' => True, + 'view_user' => True, + 'view_user_hook' => True, + 'group_manager' => True, + 'accounts_popup' => True ); var $bo; @@ -30,11 +34,8 @@ function uiaccounts() { - $GLOBALS['phpgw_info']['flags']['xslt_app'] = True; - - $this->bo = createobject('admin.boaccounts'); - $this->nextmatchs = createobject('phpgwapi.nextmatchs'); - + $this->bo = createobject('admin.boaccounts'); + $this->nextmatchs = createobject('phpgwapi.nextmatchs'); @set_time_limit(300); } @@ -48,27 +49,28 @@ function list_groups() { - if ($_POST['done'] || $GLOBALS['phpgw']->acl->check('group_access',1,'admin')) + if ($GLOBALS['phpgw']->acl->check('group_access',1,'admin')) { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uimainscreen.mainscreen'); - } - - if($_POST['add']) - { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.edit_group'); + $GLOBALS['phpgw']->redirect($GLOBALS['phpgw']->link('/admin/index.php')); } $query = (isset($_POST['query'])?$_POST['query']:''); $GLOBALS['cd'] = ($_GET['cd']?$_GET['cd']:0); + + unset($GLOBALS['phpgw_info']['flags']['noheader']); + unset($GLOBALS['phpgw_info']['flags']['nonavbar']); + $GLOBALS['phpgw']->common->phpgw_header(); - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('administration') . ': ' . lang('list groups'); - - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data','groups', - $GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'search_field', - $GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'nextmatchs')); - -/* what should this be for??? this is the same call for both cases! can this be removed? [ceb] */ + $p = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $p->set_file( + array( + 'groups' => 'groups.tpl' + ) + ); + $p->set_block('groups','list','list'); + $p->set_block('groups','row','row'); + $p->set_block('groups','row_empty','row_empty'); if ($GLOBALS['phpgw']->acl->check('group_access',2,'admin')) { @@ -81,85 +83,117 @@ $total = $GLOBALS['phpgw']->accounts->total; } - $group_header = array - ( - 'sort_name' => $this->nextmatchs->show_sort_order(array - ( - 'sort' => $sort, - 'var' => 'account_lid', - 'order' => $order, - 'extra' => 'menuaction=admin.uiaccounts.list_groups' - )), - 'lang_name' => lang('name'), - 'lang_edit' => lang('edit'), - 'lang_delete' => lang('delete'), - 'lang_sort_statustext' => lang('sort the entries') - ); + $url = $GLOBALS['phpgw']->link('/index.php'); - while (list($null,$account) = each($account_info)) + $var = Array( + 'th_bg' => $GLOBALS['phpgw_info']['theme']['th_bg'], + 'left_next_matchs' => $this->nextmatchs->left('/index.php',$start,$total,'menuaction=admin.uiaccounts.list_groups'), + 'right_next_matchs' => $this->nextmatchs->right('/admin/groups.php',$start,$total,'menuaction=admin.uiaccounts.list_groups'), + 'lang_groups' => lang('user groups'), + 'sort_name' => $this->nextmatchs->show_sort_order($sort,'account_lid',$order,'/index.php',lang('name'),'menuaction=admin.uiaccounts.list_groups'), + 'header_edit' => lang('Edit'), + 'header_delete' => lang('Delete') + ); + $p->set_var($var); + + if (!count($account_info) || !$total) { - $group_data[] = Array - ( - 'edit_url' => ($this->bo->check_rights('edit')?$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.edit_group&account_id=' . $account['account_id']):''), - 'lang_edit' => ($this->bo->check_rights('edit')?lang('edit'):''), - 'lang_edit_statustext' => ($this->bo->check_rights('edit')?lang('edit this group'):''), - 'group_name' => (!$account['account_lid']?'':$account['account_lid']), - 'delete_url' => ($this->bo->check_rights('delete')?$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.delete_group&account_id=' . $account['account_id']):''), - 'lang_delete_statustext' => ($this->bo->check_rights('delete')?lang('delete this group'):''), - 'lang_delete' => ($this->bo->check_rights('delete')?lang('delete'):'') - ); + $p->set_var('message',lang('No matches found')); + $p->parse('rows','row_empty',True); + } + else + { + if (! $GLOBALS['phpgw']->acl->check('group_access',8,'admin')) + { + $can_view = True; + } + + if (! $GLOBALS['phpgw']->acl->check('group_access',16,'admin')) + { + $can_edit = True; + } + + if (! $GLOBALS['phpgw']->acl->check('group_access',32,'admin')) + { + $can_delete = True; + } + + while (list($null,$account) = each($account_info)) + { + $tr_color = $this->nextmatchs->alternate_row_color($tr_color); + $var = Array( + 'tr_color' => $tr_color, + 'group_name' => (!$account['account_lid']?' ':$account['account_lid']), + 'delete_link' => $this->row_action('delete','group',$account['account_id']) + ); + $p->set_var($var); + + if ($can_edit) + { + $p->set_var('edit_link',$this->row_action('edit','group',$account['account_id'])); + } + else + { + $p->set_var('edit_link',' '); + } + + if ($can_delete) + { + $p->set_var('delete_link',$this->row_action('delete','group',$account['account_id'])); + } + else + { + $p->set_var('delete_link',' '); + } + + $p->fp('rows','row',True); + + } + } + $var = Array( + 'new_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.add_group'), + 'search_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups') + ); + $p->set_var($var); + + if (! $GLOBALS['phpgw']->acl->check('group_access',4,'admin')) + { + $p->set_var('input_add',''); } - $group_add = array - ( - 'lang_add' => lang('add'), - 'lang_add_statustext' => lang('add a group'), - 'action_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'), - 'lang_done' => lang('done'), - 'lang_done_statustext' => lang('return to admin mainscreen'), - 'add_access' => ($this->bo->check_rights('add')?'yes':''), - ); + if (! $GLOBALS['phpgw']->acl->check('group_access',2,'admin')) + { + $p->set_var('input_search',lang('Search') . ' '); + } - $data = array - ( - 'start_record' => $start, - 'record_limit' => $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs'], - 'num_records' => count($account_info), - 'all_records' => $total, - 'nextmatchs_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'), - 'nextmatchs_img_path' => $GLOBALS['phpgw']->common->get_image_path('phpgwapi','default'), - 'select_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'), - 'lang_searchfield_statustext' => lang('Enter the search string. To show all entries, empty this field and press the SUBMIT button again'), - 'lang_searchbutton_statustext' => lang('Submit the search string'), - 'query' => $query, - 'lang_search' => lang('search'), - 'group_header' => $group_header, - 'group_data' => $group_data, - 'group_add' => $group_add, - 'search_access' => ($this->bo->check_rights('search')?'yes':'') - ); - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('group_list' => $data)); + $p->pfp('out','list'); } function list_users($param_cd='') { - if ($_POST['done'] || $GLOBALS['phpgw']->acl->check('account_access',1,'admin')) + if ($GLOBALS['phpgw']->acl->check('account_access',1,'admin')) { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uimainscreen.mainscreen'); - } - - if ($_POST['add']) - { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.edit_user'); + $GLOBALS['phpgw']->redirect($GLOBALS['phpgw']->link('/admin/index.php')); } if($param_cd) { $cd = $param_cd; } - - $GLOBALS['query'] = (isset($GLOBALS['HTTP_POST_VARS']['query'])?$GLOBALS['HTTP_POST_VARS']['query']:''); - $start = (isset($GLOBALS['HTTP_POST_VARS']['start'])?intval($GLOBALS['HTTP_POST_VARS']['start']):''); + + if(isset($_POST['query'])) + { + $GLOBALS['query'] = $_POST['query']; + } + + if(isset($_POST['start'])) + { + $start = intval($_POST['start']); + } + else + { + $start = 0; + } if(isset($_GET['order'])) { @@ -178,537 +212,362 @@ { $sort = 'ASC'; } + + unset($GLOBALS['phpgw_info']['flags']['noheader']); + unset($GLOBALS['phpgw_info']['flags']['nonavbar']); + $GLOBALS['phpgw']->common->phpgw_header(); - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('administration') . ': ' . lang('list users'); + $p = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data','users', - $GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'search_field', - $GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'nextmatchs')); - -/* the same like in groups... we really should remove this... :) [ceb] */ + $p->set_file( + Array( + 'accounts' => 'accounts.tpl' + ) + ); + $p->set_block('accounts','list','list'); + $p->set_block('accounts','row','row'); + $p->set_block('accounts','row_empty','row_empty'); if ($GLOBALS['phpgw']->acl->check('account_access',2,'admin')) { - $account_info = $GLOBALS['phpgw']->accounts->get_list('accounts',$start,$sort,$order,$GLOBALS['query'],$total); + $account_info = $GLOBALS['phpgw']->accounts->get_list('accounts',$start,$sort,$order,$GLOBALS['query']); $total = $GLOBALS['phpgw']->accounts->total; } else { - $account_info = $GLOBALS['phpgw']->accounts->get_list('accounts',$start,$sort,$order,$GLOBALS['query'],$total); + $account_info = $GLOBALS['phpgw']->accounts->get_list('accounts',$start,$sort,$order,$GLOBALS['query']); $total = $GLOBALS['phpgw']->accounts->total; } + + $url = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'); - $user_header = array - ( - 'sort_lid' => $this->nextmatchs->show_sort_order(array - ( - 'sort' => $sort, - 'var' => 'account_lid', - 'order' => $order, - 'extra' => 'menuaction=admin.uiaccounts.list_users' - )), - 'lang_lid' => lang('loginid'), - 'sort_lastname' => $this->nextmatchs->show_sort_order(array - ( - 'sort' => $sort, - 'var' => 'account_lastname', - 'order' => $order, - 'extra' => 'menuaction=admin.uiaccounts.list_users' - )), - 'lang_lastname' => lang('Lastname'), - 'sort_firstname' => $this->nextmatchs->show_sort_order(array - ( - 'sort' => $sort, - 'var' => 'account_firstname', - 'order' => $order, - 'extra' => 'menuaction=admin.uiaccounts.list_users' - )), - 'lang_firstname' => lang('firstname'), - 'lang_view' => lang('view'), - 'lang_edit' => lang('edit'), - 'lang_delete' => lang('delete'), - 'lang_sort_statustext' => lang('sort the entries') + $var = Array( + 'bg_color' => $GLOBALS['phpgw_info']['theme']['bg_color'], + 'th_bg' => $GLOBALS['phpgw_info']['theme']['th_bg'], + 'left_next_matchs' => $this->nextmatchs->left($url,$start,$total,'menuaction=admin.uiaccounts.list_users'), + 'lang_user_accounts' => lang('%1 - %2 of %3 user accounts',$start+1,$start+count($account_info),$total), + 'right_next_matchs' => $this->nextmatchs->right($url,$start,$total,'menuaction=admin.uiaccounts.list_users'), + 'lang_loginid' => $this->nextmatchs->show_sort_order($sort,'account_lid',$order,$url,lang('LoginID')), + 'lang_lastname' => $this->nextmatchs->show_sort_order($sort,'account_lastname',$order,$url,lang('last name')), + 'lang_firstname' => $this->nextmatchs->show_sort_order($sort,'account_firstname',$order,$url,lang('first name')), + 'lang_edit' => lang('edit'), + 'lang_delete' => lang('delete'), + 'lang_view' => lang('view'), + 'actionurl' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.add_user'), + 'accounts_url' => $url, + 'lang_search' => lang('search') ); - - while (list($null,$account) = each($account_info)) + $p->set_var($var); + + if (! $GLOBALS['phpgw']->acl->check('account_access',4,'admin')) { - $user_data[] = Array - ( - 'view_url' => ($this->bo->check_rights('view','account_access')?$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.view_user&account_id=' . $account['account_id']):''), - 'lang_view' => ($this->bo->check_rights('view','account_access')?lang('view'):''), - 'lang_view_statustext' => ($this->bo->check_rights('view','account_access')?lang('view this user'):''), - 'edit_url' => ($this->bo->check_rights('edit','account_access')?$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.edit_user&account_id=' . $account['account_id']):''), - 'lang_edit' => ($this->bo->check_rights('edit','account_access')?lang('edit'):''), - 'lang_edit_statustext' => ($this->bo->check_rights('edit','account_access')?lang('edit this user'):''), - 'lid' => (!$account['account_lid']?'':$account['account_lid']), - 'firstname' => (!$account['account_firstname']?'':$account['account_firstname']), - 'lastname' => (!$account['account_lastname']?'':$account['account_lastname']), - 'delete_url' => ($this->bo->check_rights('delete','account_access')?$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.delete_user&account_id=' . $account['account_id']):''), - 'lang_delete_statustext' => ($this->bo->check_rights('delete','account_access')?lang('delete this user'):''), - 'lang_delete' => ($this->bo->check_rights('delete','account_access')?lang('delete'):'') - ); + $p->set_var('input_add',''); } - $user_add = array - ( - 'lang_add' => lang('add'), - 'lang_add_statustext' => lang('add a user'), - 'action_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'), - 'lang_done' => lang('done'), - 'lang_done_statustext' => lang('return to admin mainscreen'), - 'add_access' => ($this->bo->check_rights('add','account_access')?'yes':''), - ); - - $data = array - ( - 'start_record' => $start, - 'record_limit' => $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs'], - 'num_records' => count($account_info), - 'all_records' => $total, - 'nextmatchs_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'), - 'nextmatchs_img_path' => $GLOBALS['phpgw']->common->get_image_path('phpgwapi','default'), - 'select_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'), - 'lang_searchfield_statustext' => lang('Enter the search string. To show all entries, empty this field and press the SUBMIT button again'), - 'lang_searchbutton_statustext' => lang('Submit the search string'), - 'query' => $query, - 'lang_search' => lang('search'), - 'user_header' => $user_header, - 'user_data' => $user_data, - 'user_add' => $user_add, - 'search_access' => ($this->bo->check_rights('search','account_access')?'yes':'') - ); - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('account_list' => $data)); - } - - function edit_group() - { - $account_id = get_var('account_id',array('POST','GET')); - $values = get_var('values',array('POST')); - $account_user = get_var('account_user',array('POST')); - $account_apps = get_var('account_apps',array('POST')); - - if ($values['save']) + if (! $GLOBALS['phpgw']->acl->check('account_access',2,'admin')) { - $error = $this->bo->validate_group($values); + $p->set_var('input_search',lang('Search') . ' '); + } - if (is_array($error)) + if (!count($account_info) || !$total) + { + $p->set_var('message',lang('No matches found')); + $p->parse('rows','row_empty',True); + } + else + { + if (! $GLOBALS['phpgw']->acl->check('account_access',8,'admin')) { - $error_list = $GLOBALS['phpgw']->common->error_list($error); + $can_view = True; } - else + + if (! $GLOBALS['phpgw']->acl->check('account_access',16,'admin')) { - if (is_array($account_user)) - { - $values['account_user'] = $account_user; - } + $can_edit = True; + } - if (is_array($account_apps)) - { - $values['account_apps'] = $account_apps; - } + if (! $GLOBALS['phpgw']->acl->check('account_access',32,'admin')) + { + $can_delete = True; + } - if ($values['account_id']) + while (list($null,$account) = each($account_info)) + { + $this->nextmatchs->template_alternate_row_color($p); + + $var = array( + 'row_loginid' => $account['account_lid'], + 'row_firstname' => (!$account['account_firstname']?' ':$account['account_firstname']), + 'row_lastname' => (!$account['account_lastname']?' ':$account['account_lastname']) + ); + $p->set_var($var); + + if ($can_edit) { - $this->bo->edit_group($values); - $account_id = $values['account_id']; + $p->set_var('row_edit',$this->row_action('edit','user',$account['account_id'])); } else { - $this->bo->add_group($values); - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.list_groups'); + $p->set_var('row_edit',' '); } + + if ($can_delete) + { + $p->set_var('row_delete',($GLOBALS['phpgw_info']['user']['userid'] != $account['account_lid']?$this->row_action('delete','user',$account['account_id']):' ')); + } + else + { + $p->set_var('row_delete',' '); + } + + if ($can_view) + { + $p->set_var('row_view',$this->row_action('view','user',$account['account_id'])); + } + else + { + $p->set_var('row_view',' '); + } + $p->parse('rows','row',True); } + } // End else + $p->pfp('out','list'); + } + + function add_group() + { + if ($GLOBALS['phpgw']->acl->check('group_access',4,'admin')) + { + $this->list_groups(); + return False; } - if ($values['cancel'] || (!$account_id && $GLOBALS['phpgw']->acl->check('group_access',4,'admin')) || ($account_id && $GLOBALS['phpgw']->acl->check('group_access',16,'admin'))) + $group_info = Array( + 'account_id' => $_GET['account_id'], + 'account_name' => '', + 'account_user' => Array(), + 'account_apps' => Array() + ); + $this->create_edit_group($group_info); + } + + function add_user() + { + if ($GLOBALS['phpgw']->acl->check('account_access',4,'admin')) { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.list_groups'); + $this->list_users(); + } + else + { + $this->create_edit_user(0); + } + } + + function delete_group() + { + if ($_POST['no'] || $_POST['yes'] || !@isset($_GET['account_id']) || !@$_GET['account_id'] || $GLOBALS['phpgw']->acl->check('group_access',32,'admin')) + { + if ($_POST['yes']) + { + $this->bo->delete_group(); + } + $this->list_groups(); + return False; + } + + unset($GLOBALS['phpgw_info']['flags']['noheader']); + unset($GLOBALS['phpgw_info']['flags']['nonavbar']); + $GLOBALS['phpgw']->common->phpgw_header(); + + $p = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $p->set_file( + Array( + 'body' => 'delete_common.tpl', + 'message_row' => 'message_row.tpl', + 'form_button' => 'form_button_script.tpl' + ) + ); + + $p->set_var('message_display',lang('Are you sure you want to delete this group ?')); + $p->parse('messages','message_row'); + + $old_group_list = $GLOBALS['phpgw']->acl->get_ids_for_location(intval($_GET['account_id']),1,'phpgw_group'); + + if($old_group_list) + { + $group_name = $GLOBALS['phpgw']->accounts->id2name($_GET['account_id']); + + $p->set_var('message_display','
    '); + $p->parse('messages','message_row',True); + + $user_list = ''; + while (list(,$id) = each($old_group_list)) + { + $user_list .= '' . $GLOBALS['phpgw']->common->grab_owner_name($id) . '
    '; + } + $p->set_var('message_display',$user_list); + $p->parse('messages','message_row',True); + + $p->set_var('message_display',lang("Sorry, the above users are still a member of the group %1",$group_name) + . '.
    ' . lang('They must be removed before you can continue'). '.
    ' . lang('Remove all users from this group').'?'); + $p->parse('messages','message_row',True); + } + + $var = Array( + 'form_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.delete_group'), + 'hidden_vars' => '', + 'yes' => lang('Yes'), + 'no' => lang('No') + ); + $p->set_var($var); +/* + $p->parse('yes','form_button'); + + + $var = Array( + 'submit_button' => lang('Submit'), + 'action_url_button' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'), + 'action_text_button' => ' '.lang('No'), + 'action_confirm_button' => '', + 'action_extra_field' => '' + ); + $p->set_var($var); + $p->parse('no','form_button'); +*/ + $p->pparse('phpgw_body','body'); + } + + function delete_user() + { + if ($GLOBALS['phpgw']->acl->check('account_access',32,'admin') || $GLOBALS['phpgw_info']['user']['account_id'] == $_GET['account_id']) + { + $this->list_users(); + return False; + } + + unset($GLOBALS['phpgw_info']['flags']['noheader']); + unset($GLOBALS['phpgw_info']['flags']['nonavbar']); + $GLOBALS['phpgw']->common->phpgw_header(); + + $t = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $t->set_file( + Array( + 'form' => 'delete_account.tpl' + ) + ); + $var = Array( + 'form_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.boaccounts.delete_user'), + 'account_id' => $_GET['account_id'] + ); + + // the account can have special chars/white spaces, if it is a ldap dn + $account_id = rawurlencode($_GET['account_id']); + + // Find out who the new owner is of the deleted users records... + $users = $GLOBALS['phpgw']->accounts->get_list('accounts'); + $c_users = count($users); + $str = ''; + for($i=0;$i<$c_users;$i++) + { + $str .= ''."\n"; + } + $var['lang_new_owner'] = lang('Who would you like to transfer ALL records owned by the deleted user to?'); + $var['new_owner_select'] = ''."\n"; + $var['cancel'] = lang('cancel'); + $var['delete'] = lang('delete'); + $t->set_var($var); + $t->pparse('out','form'); + } + + function edit_group($cd='',$account_id='') + { + if ($GLOBALS['phpgw']->acl->check('group_access',16,'admin')) + { + $this->list_groups(); + return False; } $cdid = $cd; settype($cd,'integer'); $cd = ($_GET['cd']?$_GET['cd']:intval($cdid)); - if ($account_id) + $accountid = $account_id; + settype($account_id,'integer'); + $account_id = ($_GET['account_id']?$_GET['account_id']:intval($accountid)); + + // todo + // not needed if i use the same file for new groups too + if (! $account_id) { - $group_info = Array - ( - 'account_name' => $GLOBALS['phpgw']->accounts->id2name($account_id), - 'account_user' => $this->bo->load_group_users($account_id), - 'account_apps' => $this->bo->load_group_apps($account_id) + $this->list_groups(); + } + else + { + $group_info = Array( + 'account_id' => intval($_GET['account_id']), + 'account_name' => $GLOBALS['phpgw']->accounts->id2name($_GET['account_id']), + 'account_user' => $this->bo->load_group_users($_GET['account_id']), + 'account_apps' => $this->bo->load_group_apps($_GET['account_id']) ); + + $this->create_edit_group($group_info); } - - $apps_with_acl = Array - ( - 'addressbook' => True, - 'bookmarks' => True, - 'calendar' => True, - 'filemanager' => True, - 'img' => True, - 'infolog' => True, - 'inv' => True, - 'netsaint' => True, - 'notes' => True, - 'phonelog' => True, - 'phpwebhosting' => True, - 'projects' => True, - 'todo' => True, - 'tts' => True - ); - - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data','groups')); - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('administration') . ': ' . ((intval($account_id) > 0)?lang('edit group'):lang('add group')); - - $accounts = CreateObject('phpgwapi.accounts',$account_id,'u'); - $account_list = $accounts->get_list('accounts'); - $account_num = count($account_list); - - while (list($key,$entry) = each($account_list)) - { - $user_list[] = array - ( - 'account_id' => $entry['account_id'], - 'account_name' => $GLOBALS['phpgw']->common->display_fullname($entry['account_lid'],$entry['account_firstname'], - $entry['account_lastname']), - 'selected' => $group_info['account_user'][intval($entry['account_id'])] - ); - } - - $group_repository = $accounts->read_repository(); - if (!$group_repository['file_space']) - { - $group_repository['file_space'] = $GLOBALS['phpgw_info']['server']['vfs_default_account_size_number'] . "-" . $GLOBALS['phpgw_info']['server']['vfs_default_account_size_type']; - } - /* - $file_space_array = explode ('-', $group_repository['file_space']); - $account_file_space_types = array ('gb', 'mb', 'kb', 'b'); - while (list ($num, $type) = each ($account_file_space_types)) - { - $account_file_space_select .= ''."\n"; - } - $p->set_var ('lang_file_space', lang('File space')); - $p->set_var ('account_file_space', ''); - $p->set_var ('account_file_space_select',''."\n"); - */ - - reset($GLOBALS['phpgw_info']['apps']); - $sorted_apps = $GLOBALS['phpgw_info']['apps']; - @asort($sorted_apps); - @reset($sorted_apps); - while ($permission = each($sorted_apps)) - { - if ($permission[1]['enabled'] && $permission[1]['status'] != 3) - { - $perm_display[] = array - ( - $permission[0], - $permission[1]['title'] - ); - } - } - - /*$perm_html = '

    '; - $perm_html = ''.$perm_html.$perm_html."\n";*/ - - for ($i=0;$i < count($perm_display);$i++) - { - $app = $perm_display[$i][0]; - /*$perm_html .= '' - . ''.($i & 1?'':'')."\n";*/ - - $app_list[] = array - ( - 'app_name' => $perm_display[$i][1], - 'checkbox_name' => 'account_apps[' . $perm_display[$i][0] . ']', - 'checked' => ($group_info['account_apps'][$app]?'checked':''), - 'acl_url' => ($apps_with_acl[$app] && $account_id?$GLOBALS['phpgw']->link('/index.php','menuaction=preferences.uiaclprefs.index&acl_app='.$app.'&owner='.$account_id):''), - 'acl_img' => $GLOBALS['phpgw']->common->image('admin','dot'), - 'img_name' => lang('Grant Access') - ); - } - - /*if($i & 1) - { - $perm_html .= ''; - }*/ - - $link_data = array - ( - 'menuaction' => 'admin.uiaccounts.edit_group', - 'account_id' => $account_id - ); - - $data = array - ( - 'msgbox_data' => $error_list, - 'edit_url' => $GLOBALS['phpgw']->link('/index.php',$link_data), - 'account_id' => $group_info['account_id'], - 'lang_account_name' => lang('group name'), - 'value_account_name' => $group_info['account_name'], - 'lang_include_user' => lang('select users for inclusion'), - 'select_size' => ($account_num < 5?$account_num:5), - 'user_list' => $user_list, - 'lang_permissions' => lang('permissions this group has'), - 'lang_application' => lang('application'), - 'lang_acl' => lang('acl'), - 'lang_cancel' => lang('cancel'), - 'lang_save' => lang('save'), - 'app_list' => $app_list, - 'account_id' => $account_id - ); - - /* create the menu on the left, if needed - $p->set_var('rows',ExecMethod('admin.uimenuclass.createHTMLCode','group_manager')); */ - - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('group_edit' => $data)); } - function edit_user() + function edit_view_user_hook() { - $cd = get_var('cd',array('GET')); - $account_id = get_var('account_id',array('GET','POST')); - $values = get_var('values',array('POST')); - $account_groups = get_var('account_groups',array('POST')); - $account_permissions = get_var('account_permissions',array('POST')); - - if ($values['cancel'] || (!$account_id && $GLOBALS['phpgw']->acl->check('account_access',4,'admin')) || ($account_id && $GLOBALS['phpgw']->acl->check('account_access',16,'admin'))) + if (!$GLOBALS['phpgw']->acl->check('current_sessions_access',1,'admin')) // no rights to view { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.list_users'); + $GLOBALS['menuData'][] = array( + 'description' => 'Login History', + 'url' => '/index.php', + 'extradata' => 'menuaction=admin.uiaccess_history.list_history' + ); + } + // not sure if this realy belongs here, or only in edit_user + if ($_GET['account_id'] && // can't set it on add + !$GLOBALS['phpgw']->acl->check('account_access',64,'admin')) // no rights to set ACL-rights + { + $GLOBALS['menuData'][] = array( + 'description' => 'ACL Rights', + 'url' => '/index.php', + 'extradata' => 'menuaction=admin.uiaclmanager.list_apps' + ); + } + } + + function edit_user($cd='',$account_id='') + { + if ($GLOBALS['phpgw']->acl->check('account_access',16,'admin')) + { + $this->list_users(); + return False; } - /*$cdid = $cd; + $cdid = $cd; settype($cd,'integer'); $cd = ($_GET['cd']?$_GET['cd']:intval($cdid)); $accountid = $account_id; settype($account_id,'integer'); - $account_id = ($_GET['account_id']?$_GET['account_id']:intval($accountid));*/ + $account_id = intval($_GET['account_id'] ? $_GET['account_id'] : $accountid); - if ($values['save']) + // todo + // not needed if i use the same file for new users too + if (! $account_id) { - if (is_array($account_groups)) - { - $values['account_groups'] = $account_groups; - } - - if (is_array($account_permissions)) - { - $values['account_permissions'] = $account_permissions; - } - - $error = $this->bo->validate_user($values); - - if (is_array($error)) - { - $error_list = $GLOBALS['phpgw']->common->error_list($error); - } - else - { - if ($account_id) - { - $values['account_id'] = $account_id; - } - $this->bo->save_user($values); - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.list_users'); - } - } - - $sbox = createobject('phpgwapi.sbox'); - - if ($GLOBALS['phpgw_info']['server']['ldap_extra_attributes'] && ($GLOBALS['phpgw_info']['server']['account_repository'] == 'ldap')) - { - } - - print_debug('Type : '.gettype($_userData).'
    _userData(size) = "'.$_userData.'"('.strlen($_userData).')'); - - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data','users')); - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('administration') . ': ' . ($account_id?lang('edit user account'):lang('add user account')); - - if ($account_id) - { - $user_info = Array - ( - 'account_name' => $GLOBALS['phpgw']->accounts->id2name($account_id), - 'account_user' => $this->bo->load_group_users($account_id), - 'account_apps' => $this->bo->load_group_apps($account_id) - ); - } - - if($account_id) - { - $account = CreateObject('phpgwapi.accounts',intval($account_id),'u'); - $userData = $account->read_repository(); - $userGroups = $account->membership($account_id); + $this->list_users(); + return False; } else { - $account = CreateObject('phpgwapi.accounts'); - $userData = Array(); - $userData['status'] = 'A'; - $userGroups = Array(); + $this->create_edit_user($account_id); } - $allGroups = $account->get_list('groups'); - - if ($userData['expires'] == -1) - { - $userData['account_expires_month'] = 0; - $userData['account_expires_day'] = 0; - $userData['account_expires_year'] = 0; - } - else - { - /* Change this to be an admin/setup setting. For now, default to expire one week from today. */ - $time_var = time() + (60*60*24*7); - $userData['account_expires_month'] = date('m',$userData['expires'] > 0 ? $userData['expires'] : $time_var); - $userData['account_expires_day'] = date('d',$userData['expires'] > 0 ? $userData['expires'] : $time_var); - $userData['account_expires_year'] = date('Y',$userData['expires'] > 0 ? $userData['expires'] : $time_var); - } - - if ($GLOBALS['phpgw_info']['server']['ldap_extra_attributes']) - { - $lang_homedir = lang('home directory'); - $lang_shell = lang('login shell'); - $homedirectory = ''; - $loginshell = ''; - } - - $_y = $sbox->getyears('account_expires_year',$userData['account_expires_year'],date('Y'),date('Y')+10); - $_m = $sbox->getmonthtext('account_expires_month',$userData['account_expires_month']); - $_d = $sbox->getdays('account_expires_day',$userData['account_expires_day']); - - /* $account_file_space = ''; - if (!$userData['file_space']) - { - $userData['file_space'] = $GLOBALS['phpgw_info']['server']['vfs_default_account_size_number'] . "-" . $GLOBALS['phpgw_info']['server']['vfs_default_account_size_type']; - } - $file_space_array = explode ('-', $userData['file_space']); - $account_file_space_number = $file_space_array[0]; - $account_file_space_type = $file_space_array[1]; - $account_file_space_type_selected[$account_file_space_type] = ' selected'; - - $account_file_space = ''; - $account_file_space_select =''; - - $var = Array( - 'lang_file_space' => 'File space', - 'account_file_space' => $account_file_space, - 'account_file_space_select' => $account_file_space_select - ); - $t->set_var($var); - */ - - reset($allGroups); - while (list($key,$value) = each($allGroups)) - { - $group_list[] = array - ( - 'account_id' => $value['account_id'], - 'account_lid' => $value['account_lid'] - ); - } - - for ($i=0;$iread_account_specific(); - - @reset($GLOBALS['phpgw_info']['apps']); - $availableApps = $GLOBALS['phpgw_info']['apps']; - @asort($availableApps); - @reset($availableApps); - while (list($key,$application) = each($availableApps)) - { - if ($application['enabled'] && $application['status'] != 3) - { - $perm_display[$i]['appName'] = $key; - $perm_display[$i]['translatedName'] = $application['title']; - $i++; - } - } - - /* create apps output */ - $appRightsOutput = ''; -// @reset($perm_display); - for ($i=0;$i $perm_display[$i]['translatedName'], - 'checkbox_name' => 'account_permissions[' . $perm_display[$i]['appName'] . ']', - 'checked' => ($userData['account_permissions'][$perm_display[$i]['appName']] || $db_perms[$perm_display[$i]['appName']]?'yes':'') - ); - } - - $page_params['menuaction'] = 'admin.uiaccounts.edit_user'; - if($account_id) - { - $page_params['account_id'] = $account_id; - $page_params['old_loginid'] = rawurlencode($userData['account_lid']); - } - - $data = array - ( - 'msgbox_data' => $error_list, - 'edit_url' => $GLOBALS['phpgw']->link('/index.php',$page_params), - 'lang_lid' => lang('loginid'), - 'lang_account_active' => lang('account active'), - 'lang_password' => lang('password'), - 'lang_reenter_password' => lang('Re-Enter Password'), - 'lang_lastname' => lang('lastname'), - 'lang_groups' => lang('groups'), - 'lang_expires' => lang('expires'), - 'lang_firstname' => lang('firstname'), - 'lang_applications' => lang('applications'), - 'lang_save' => lang('save'), - 'lang_cancel' => lang('cancel'), - 'select_expires' => $GLOBALS['phpgw']->common->dateformatorder($_y,$_m,$_d,True), - 'lang_never' => lang('Never'), - 'account_lid' => $userData['account_lid'], - 'lang_homedir' => $lang_homedir, - 'lang_shell' => $lang_shell, - 'homedirectory' => $homedirectory, - 'loginshell' => $loginshell, - 'account_status' => ($userData['status']?'yes':''), - 'account_firstname' => $userData['firstname'], - 'account_lastname' => $userData['lastname'], - 'account_passwd' => $account_passwd, - 'account_passwd_2' => $account_passwd_2, - 'expires_never' => (($userData['expires'] == -1)?'yes':''), - 'group_list' => $group_list, - 'app_list' => $app_list - ); - - /* create the menu on the left, if needed - $menuClass = CreateObject('admin.uimenuclass'); - This is now using ExecMethod() - $t->set_var('rows',ExecMethod('admin.uimenuclass.createHTMLCode','edit_user')); */ - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('account_edit' => $data)); } function view_user() @@ -734,13 +593,16 @@ $t->set_block('account','link_row'); $var = Array( + 'th_bg' => $GLOBALS['phpgw_info']['theme']['th_bg'], + 'tr_color1' => $GLOBALS['phpgw_info']['theme']['row_on'], + 'tr_color2' => $GLOBALS['phpgw_info']['theme']['row_off'], 'lang_action' => lang('View user account'), 'lang_loginid' => lang('LoginID'), 'lang_account_active' => lang('Account active'), - 'lang_password' => lang('Password'), - 'lang_reenter_password' => lang('Re-Enter Password'), 'lang_lastname' => lang('Last Name'), 'lang_groups' => lang('Groups'), + 'lang_anonymous' => lang('Anonymous user (not shown in list sessions)'), + 'lang_changepassword'=> lang('Can change password'), 'lang_firstname' => lang('First Name'), 'lang_lastlogin' => lang('Last login'), 'lang_lastloginfrom' => lang('Last login from'), @@ -756,6 +618,11 @@ $var['account_firstname'] = $userData['firstname']; $var['account_lastname'] = $userData['lastname']; + $acl = CreateObject('phpgwapi.acl',intval($_GET['account_id'])); + $var['anonymous'] = $acl->check('anonymous',1,'phpgwapi') ? '  X' : ' '; + $var['changepassword'] = $acl->check('changepassword',0xFFFF,'preferences') ? '  X' : ' '; + unset($acl); + if ($userData['status']) { $var['account_status'] = lang('Enabled'); @@ -807,7 +674,7 @@ { $group_names[] = $group['account_name']; } - $var['groups_select'] = implode(',',$group_names); + $var['groups_select'] = implode(', ',$group_names); } $account_lastlogin = $userData['account_lastlogin']; @@ -820,12 +687,12 @@ $availableApps = $GLOBALS['phpgw_info']['apps']; @asort($availableApps); @reset($availableApps); - while ($application = each($availableApps)) + foreach($availableApps as $app => $data) { - if ($application[1]['enabled'] && $application[1]['status'] != 2) + if ($data['enabled'] && $data['status'] != 2) { - $perm_display[$i]['appName'] = $application[0]; - $perm_display[$i]['translatedName'] = $application[1]['title']; + $perm_display[$i]['appName'] = $app; + $perm_display[$i]['title'] = $data['title']; $i++; } } @@ -836,25 +703,25 @@ @reset($db_perms); - for ($i=0;$i<=count($perm_display);$i++) + for ($i=0;$i%s
    ",lang($perm_display[$i]['translatedName']),($_userData['account_permissions'][$perm_display[$i]['appName']] || $db_perms[$perm_display[$i]['appName']]?'  X':' ')); + $part1 = sprintf("",$perm_display[$i]['title'],($_userData['account_permissions'][$perm_display[$i]['appName']] || $db_perms[$perm_display[$i]['appName']]?'  X':' ')); } $i++; - if ($perm_display[$i]['translatedName']) + if ($perm_display[$i]['title']) { - $part2 = sprintf("",lang($perm_display[$i]['translatedName']),($_userData['account_permissions'][$perm_display[$i]['appName']] || $db_perms[$perm_display[$i]['appName']]?'  X':' ')); + $part2 = sprintf("",$perm_display[$i]['title'],($_userData['account_permissions'][$perm_display[$i]['appName']] || $db_perms[$perm_display[$i]['appName']]?'  X':' ')); } else { $part2 = ''; } - $appRightsOutput .= "$part1$part2\n"; + $appRightsOutput .= sprintf("$part1$part2\n",$GLOBALS['phpgw_info']['theme']['row_on']); } $var['permissions_list'] = $appRightsOutput; @@ -867,101 +734,6 @@ $t->pfp('out','form'); } - function delete_group() - { - $account_id = get_var('account_id',array('POST','GET')); - - if ($_POST['cancel'] || $GLOBALS['phpgw']->acl->check('group_access',32,'admin')) - { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.list_groups'); - } - - if ($account_id && $_POST['delete']) - { - $this->bo->delete_group($account_id); - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiaccounts.list_groups'); - } - - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data',$GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'app_delete')); - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('administration') . ': ' . lang('delete group'); - - $data = array - ( - 'delete_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.delete_group&account_id=' . $account_id), - 'lang_delete' => lang('delete'), - 'lang_cancel' => lang('cancel'), - 'lang_delete_statustext' => lang('delete the group'), - 'lang_cancel_statustext' => lang('Leave the group untouched and return back to the list'), - 'lang_delete_msg' => lang('are you sure you want to delete this group ?') - ); - - $old_group_list = $GLOBALS['phpgw']->acl->get_ids_for_location(intval($account_id),1,'phpgw_group'); - - if($old_group_list) - { - $group_name = $GLOBALS['phpgw']->accounts->id2name($account_id); - - $user_list = ''; - while (list(,$id) = each($old_group_list)) - { - $data['user_list'][] = array - ( - 'user_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.edit_user&account_id=' . $id), - 'user_name' => $GLOBALS['phpgw']->common->grab_owner_name($id), - 'lang_user_url_statustext' => lang('edit user') - ); - } - - $data['lang_confirm_msg'] = lang('the users bellow are still members of group %1',$group_name) . '. ' - . lang('they must be removed before you can continue'); - $data['lang_remove_user'] = lang('Remove all users from this group ?'); - } - - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('delete' => $data)); - } - - function delete_user() - { - if ($GLOBALS['phpgw']->acl->check('account_access',32,'admin') || $GLOBALS['phpgw_info']['user']['account_id'] == $_GET['account_id']) - { - $this->list_users(); - return False; - } - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw']->common->phpgw_header(); - - $t = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); - $t->set_file( - Array( - 'form' => 'delete_account.tpl' - ) - ); - $var = Array( - 'form_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.boaccounts.delete_user'), - 'account_id' => $_GET['account_id'] - ); - - // the account can have special chars/white spaces, if it is a ldap dn - $account_id = rawurlencode($_GET['account_id']); - - // Find out who the new owner is of the deleted users records... - $users = $GLOBALS['phpgw']->accounts->get_list('accounts'); - $c_users = count($users); - $str = ''; - for($i=0;$i<$c_users;$i++) - { - $str .= ''."\n"; - } - $var['lang_new_owner'] = lang('Who would you like to transfer ALL records owned by the deleted user to?'); - $var['new_owner_select'] = ''."\n"; - $var['cancel'] = lang('cancel'); - $var['delete'] = lang('delete'); - $t->set_var($var); - $t->pparse('out','form'); - } - function group_manager($cd='',$account_id='') { if ($GLOBALS['phpgw']->acl->check('group_access',16,'admin')) @@ -997,6 +769,412 @@ } } + function accounts_popup() + { + $GLOBALS['phpgw']->accounts->accounts_popup('admin'); + } + + function create_edit_group($group_info,$_errors='') + { + // Maybe we should list this in setup/setup.inc.php and put it into the + // phpgw_applications table ? (jengo) + $apps_with_acl = array( + 'addressbook' => True, + 'todo' => True, + 'calendar' => True, + 'notes' => True, + 'projects' => True, + 'phonelog' => True, + 'infolog' => True, + 'filemanager' => True, + 'tts' => True, + 'bookmarks' => True, + 'img' => True, + 'netsaint' => True, + 'inv' => True + ); + + $sbox = createobject('phpgwapi.sbox'); + + unset($GLOBALS['phpgw_info']['flags']['noheader']); + unset($GLOBALS['phpgw_info']['flags']['nonavbar']); + $GLOBALS['phpgw']->common->phpgw_header(); + + $p = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $p->set_file(Array('edit' => 'group_form.tpl')); + $p->set_block('edit','select'); + $p->set_block('edit','popwin'); + + $accounts = CreateObject('phpgwapi.accounts',$group_info['account_id'],'u'); + + if ($GLOBALS['phpgw_info']['user']['preferences']['common']['account_selection'] == 'popup') + { + $p->set_var('accounts_link',$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.accounts_popup')); + $p->set_var('lang_open_popup',lang('open popup window')); + + while(is_array($group_info['account_user']) && list($ac_id,) = each($group_info['account_user'])) + { + $ac_name = $GLOBALS['phpgw']->accounts->get_account_data($ac_id); + + $user_list .= ''."\n"; + } + $account_num = count($group_info['account_user']); + $p->set_var('select_size',($account_num < 25?$account_num:25)); + $p->set_var('user_list',$user_list); + $p->fp('accounts','popwin',True); + } + else + { + $account_list = $accounts->get_list('accounts'); + $account_num = count($account_list); + + $user_list = ''; + while (list($key,$entry) = each($account_list)) + { + $user_list .= ''."\n"; + } + $p->set_var('select_size',($account_num < 7?$account_num:7)); + $p->set_var('user_list',$user_list); + $p->fp('accounts','select',True); + } + + $var = Array( + 'form_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.boaccounts.'.($group_info['account_id']?'edit':'add').'_group'), + 'hidden_vars' => '', + 'lang_group_name' => lang('group name'), + 'group_name_value' => $group_info['account_name'], + 'lang_include_user' => lang('Select users for inclusion'), + 'error' => (!$_errors?'':'
    '.$GLOBALS['phpgw']->common->error_list($_errors).'
    '), + 'lang_permissions' => lang('Permissions this group has') + ); + $p->set_var($var); + + $group_repository = $accounts->read_repository(); + if (!$group_repository['file_space']) + { + $group_repository['file_space'] = $GLOBALS['phpgw_info']['server']['vfs_default_account_size_number'] . "-" . $GLOBALS['phpgw_info']['server']['vfs_default_account_size_type']; + } + /* + $file_space_array = explode ('-', $group_repository['file_space']); + $account_file_space_types = array ('gb', 'mb', 'kb', 'b'); + while (list ($num, $type) = each ($account_file_space_types)) + { + $account_file_space_select .= ''."\n"; + } + $p->set_var ('lang_file_space', lang('File space')); + $p->set_var ('account_file_space', ''); + $p->set_var ('account_file_space_select',''."\n"); + */ + + reset($GLOBALS['phpgw_info']['apps']); + $sorted_apps = $GLOBALS['phpgw_info']['apps']; + @asort($sorted_apps); + @reset($sorted_apps); + while ($permission = each($sorted_apps)) + { + if ($permission[1]['enabled'] && $permission[1]['status'] != 3) + { + $perm_display[] = Array( + $permission[0], + $permission[1]['title'] + ); + } + } + + $perm_html = '
    '; + $perm_html = ''. + $perm_html.$perm_html."\n"; + + $tr_color = $GLOBALS['phpgw_info']['theme']['row_off']; + for ($i=0;$i < count($perm_display);$i++) + { + $app = $perm_display[$i][0]; + if(!($i & 1)) + { + $tr_color = $this->nextmatchs->alternate_row_color(); + $perm_html .= ''; + } + $perm_html .= '' + . ''.($i & 1?'':'')."\n"; + } + if($i & 1) + { + $perm_html .= ''; + } + + $var = Array( + 'permissions_list' => $perm_html, + 'lang_submit_button' => lang('submit changes') + ); + $p->set_var($var); + + // create the menu on the left, if needed + $p->set_var('rows',ExecMethod('admin.uimenuclass.createHTMLCode','group_manager')); + + $p->set_var('select',''); + $p->set_var('popwin',''); + $p->pfp('out','edit'); + + } + + function create_edit_user($_account_id,$_userData='',$_errors='') + { + $sbox = createobject('phpgwapi.sbox'); + $jscal = CreateObject('phpgwapi.jscalendar'); + + unset($GLOBALS['phpgw_info']['flags']['noheader']); + unset($GLOBALS['phpgw_info']['flags']['nonavbar']); + $GLOBALS['phpgw']->common->phpgw_header(); + + $t = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $t->set_unknowns('remove'); + + if ($GLOBALS['phpgw_info']['server']['ldap_extra_attributes'] && ($GLOBALS['phpgw_info']['server']['account_repository'] == 'ldap')) + { + $t->set_file(array('account' => 'account_form_ldap.tpl')); + } + else + { + $t->set_file(array('account' => 'account_form.tpl')); + } + $t->set_block('account','form','form'); + $t->set_block('account','form_passwordinfo','form_passwordinfo'); + $t->set_block('account','form_buttons_','form_buttons_'); + $t->set_block('account','link_row','link_row'); + + print_debug('Type : '.gettype($_userData).'
    _userData(size) = "'.$_userData.'"('.strlen($_userData).')'); + if (is_array($_userData)) + { + $userData = Array(); + $userData=$_userData; + @reset($userData['account_groups']); + while (list($key, $value) = @each($userData['account_groups'])) + { + $userGroups[$key]['account_id'] = $value; + } + + $account = CreateObject('phpgwapi.accounts'); + $allGroups = $account->get_list('groups'); + } + elseif(is_string($_userData) && $_userData=='') + { + if($_account_id) + { + $account = CreateObject('phpgwapi.accounts',intval($_account_id),'u'); + $userData = $account->read_repository(); + $userGroups = $account->membership($_account_id); + $acl = CreateObject('phpgwapi.acl',$_account_id); + $acl->read_repository(); + $userData['anonymous'] = $acl->check('anonymous',1,'phpgwapi'); + $userData['changepassword'] = $acl->check('changepassword',0xFFFF,'preferences'); + unset($acl); + } + else + { + $account = CreateObject('phpgwapi.accounts'); + $userData = Array(); + $userData['status'] = 'A'; + $userGroups = Array(); + $userData['anonymous'] = False; + $userData['changepassword'] = True; + } + $allGroups = $account->get_list('groups'); + } + $page_params['menuaction'] = 'admin.boaccounts.'.($_account_id?'edit':'add').'_user'; + if($_account_id) + { + $page_params['account_id'] = $_account_id; + $page_params['old_loginid'] = rawurlencode($userData['account_lid']); + } + + $var = Array( + 'form_action' => $GLOBALS['phpgw']->link('/index.php',$page_params), + 'error_messages' => (!$_errors?'':'
    '.$GLOBALS['phpgw']->common->error_list($_errors).'
    '), + 'th_bg' => $GLOBALS['phpgw_info']['theme']['th_bg'], + 'tr_color1' => $GLOBALS['phpgw_info']['theme']['row_on'], + 'tr_color2' => $GLOBALS['phpgw_info']['theme']['row_off'], + 'lang_action' => ($_account_id?lang('Edit user account'):lang('Add new account')), + 'lang_loginid' => lang('LoginID'), + 'lang_account_active' => lang('Account active'), + 'lang_password' => lang('Password'), + 'lang_reenter_password' => lang('Re-Enter Password'), + 'lang_lastname' => lang('Last Name'), + 'lang_groups' => lang('Groups'), + 'lang_expires' => lang('Expires'), + 'lang_firstname' => lang('First Name'), + 'lang_anonymous' => lang('Anonymous User (not shown in list sessions)'), + 'lang_changepassword' => lang('Can change password'), + 'lang_button' => ($_account_id?lang('Save'):lang('Add')) + /* 'lang_file_space' => lang('File Space') */ + ); + $t->set_var($var); + $t->parse('form_buttons','form_buttons_',True); + + if ($GLOBALS['phpgw_info']['server']['ldap_extra_attributes']) { + $lang_homedir = lang('home directory'); + $lang_shell = lang('login shell'); + $homedirectory = ''; + $loginshell = ''; + } + else + { + $lang_homedir = ''; + $lang_shell = ''; + $homedirectory = ''; + $loginshell = ''; + } + $account_file_space = ''; + /* + if (!$userData['file_space']) + { + $userData['file_space'] = $GLOBALS['phpgw_info']['server']['vfs_default_account_size_number'] . "-" . $GLOBALS['phpgw_info']['server']['vfs_default_account_size_type']; + } + $file_space_array = explode ('-', $userData['file_space']); + $account_file_space_number = $file_space_array[0]; + $account_file_space_type = $file_space_array[1]; + $account_file_space_type_selected[$account_file_space_type] = ' selected'; + + $account_file_space = ''; + $account_file_space_select =''; + + $var = Array( + 'lang_file_space' => 'File space', + 'account_file_space' => $account_file_space, + 'account_file_space_select' => $account_file_space_select + ); + $t->set_var($var); + */ + $var = Array( + 'input_expires' => $jscal->input('expires',$userData['expires']<0?'':($userData['expires']?$userData['expires']:time()+(60*60*24*7))), + 'lang_never' => lang('Never'), + 'account_lid' => '', + 'lang_homedir' => $lang_homedir, + 'lang_shell' => $lang_shell, + 'homedirectory' => $homedirectory, + 'loginshell' => $loginshell, + 'anonymous' => '', + 'changepassword'=> '', + 'account_status' => '', + 'account_firstname' => '', + 'account_lastname' => '', + 'account_passwd' => $account_passwd, + 'account_passwd_2' => $account_passwd_2, + 'account_file_space' => $account_file_space + ); + + if($userData['expires'] == -1) + { + $var['never_expires'] = ''; + } + else + { + $var['never_expires'] = ''; + } + + $t->set_var($var); + $t->parse('password_fields','form_passwordinfo',True); + +// $allAccounts; +// $userGroups; + + $groups_select = ''; + reset($allGroups); + while (list($key,$value) = each($allGroups)) + { + $groups_select .= ''."\n"; + } + + /* create list of available apps */ + $i = 0; + + $apps = CreateObject('phpgwapi.applications',$_account_id); + $db_perms = $apps->read_account_specific(); + + @reset($GLOBALS['phpgw_info']['apps']); + $availableApps = $GLOBALS['phpgw_info']['apps']; + @asort($availableApps); + @reset($availableApps); + while (list($key,$application) = each($availableApps)) + { + if ($application['enabled'] && $application['status'] != 3) + { + $perm_display[$i]['appName'] = $key; + $perm_display[$i]['title'] = $application['title']; + $i++; + } + } + + /* create apps output */ + $appRightsOutput = ''; +// @reset($perm_display); + for ($i=0;$i<=count($perm_display);$i++) + { + $checked = ((($userData['account_permissions'][$perm_display[$i]['appName']] || $db_perms[$perm_display[$i]['appName']]) && $_account_id)?' checked':''); + + if ($perm_display[$i]['title']) + { + $part[$i&1] = sprintf('
    ', + $perm_display[$i]['title'], + $perm_display[$i]['appName'], + $checked); + } + else + { + $part[1] = ''; + } + + if ($i & 1) + { + $appRightsOutput .= sprintf('%s%s',$this->nextmatchs->alternate_row_color()/*$GLOBALS['phpgw_info']['theme']['row_on']*/, $part[0], $part[1]); + } + } + + $var = Array( + 'groups_select' => ''."\n", + 'permissions_list' => $appRightsOutput + ); + $t->set_var($var); + + // create the menu on the left, if needed +// $menuClass = CreateObject('admin.uimenuclass'); + // This is now using ExecMethod() + $GLOBALS['account_id'] = $_account_id; + $t->set_var('rows',ExecMethod('admin.uimenuclass.createHTMLCode','edit_user')); + + echo $t->fp('out','form'); + } + function edit_group_managers($group_info,$_errors='') { if ($GLOBALS['phpgw']->acl->check('group_access',16,'admin')) diff --git a/admin/inc/class.uiaclmanager.inc.php b/admin/inc/class.uiaclmanager.inc.php index 4e6dfd2c2c..956dcd3628 100644 --- a/admin/inc/class.uiaclmanager.inc.php +++ b/admin/inc/class.uiaclmanager.inc.php @@ -23,12 +23,20 @@ function uiaclmanager() { + $this->account_id = intval($_GET['account_id']); + if (!$this->account_id || $GLOBALS['phpgw']->acl->check('account_access',64,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } $this->template = createobject('phpgwapi.Template',PHPGW_APP_TPL); } function common_header() { + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin') . ' - ' . lang('ACL Manager') . + ': ' . $GLOBALS['phpgw']->common->grab_owner_name($this->account_id); $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); } function list_apps() @@ -46,14 +54,12 @@ $this->template->set_block('app_list','link_row'); $this->template->set_block('app_list','spacer_row'); - $this->template->set_var('lang_header',lang('ACL Manager')); - while (is_array($GLOBALS['acl_manager']) && list($app,$locations) = each($GLOBALS['acl_manager'])) { $icon = $GLOBALS['phpgw']->common->image($app,array('navbar.gif',$app.'.gif')); $this->template->set_var('icon_backcolor',$GLOBALS['phpgw_info']['theme']['row_off']); $this->template->set_var('link_backcolor',$GLOBALS['phpgw_info']['theme']['row_off']); - $this->template->set_var('app_name',lang($GLOBALS['phpgw_info']['navbar'][$app]['title'])); + $this->template->set_var('app_name',$GLOBALS['phpgw_info']['apps'][$app]['title']); $this->template->set_var('a_name',$appname); $this->template->set_var('app_icon',$icon); @@ -68,83 +74,83 @@ while (is_array($locations) && list($loc,$value) = each($locations)) { - $total_rights = 0; - while (list($k,$v) = each($value['rights'])) - { - $total_rights += $v; - } - reset($value['rights']); + $link_values = array( + 'menuaction' => 'admin.uiaclmanager.access_form', + 'location' => urlencode($loc), + 'acl_app' => $app, + 'account_id' => $this->account_id + ); - // If all of there rights are denied, then they shouldn't even see the option - if ($total_rights != $GLOBALS['phpgw']->acl->get_rights($loc,$app)) - { - $link_values = array( - 'menuaction' => 'admin.uiaclmanager.access_form', - 'location' => urlencode(base64_encode($loc)), - 'acl_app' => $app, - 'account_id' => $GLOBALS['account_id'] - ); - - $this->template->set_var('link_location',$GLOBALS['phpgw']->link('/index.php',$link_values)); - $this->template->set_var('lang_location',lang($value['name'])); - $this->template->fp('rows','link_row',True); - } + $this->template->set_var('link_location',$GLOBALS['phpgw']->link('/index.php',$link_values)); + $this->template->set_var('lang_location',lang($value['name'])); + $this->template->fp('rows','link_row',True); } $this->template->parse('rows','spacer_row',True); } + $this->template->set_var(array( + 'cancel_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'), + 'lang_cancel' => lang('Cancel') + )); $this->template->pfp('out','list'); } function access_form() { - $GLOBALS['phpgw']->hooks->single('acl_manager',$GLOBALS['acl_app']); - $location = base64_decode($GLOBALS['location']); + $location = $_GET['location']; - $acl_manager = $GLOBALS['acl_manager'][$GLOBALS['acl_app']][$location]; + if ($_POST['submit'] || $_POST['cancel']) + { + if ($_POST['submit']) + { + $total_rights = 0; + while (is_array($_POST['acl_rights']) && list(,$rights) = each($_POST['acl_rights'])) + { + $total_rights += $rights; + } + if ($total_rights) + { + $GLOBALS['phpgw']->acl->add_repository($_GET['acl_app'], $location, $this->account_id, $total_rights); + } + else // we dont need to save 0 rights (= no restrictions) + { + $GLOBALS['phpgw']->acl->delete_repository($_GET['acl_app'], $location, $this->account_id); + } + } + $this->list_apps(); + return; + } + $GLOBALS['phpgw']->hooks->single('acl_manager',$_GET['acl_app']); + $acl_manager = $GLOBALS['acl_manager'][$_GET['acl_app']][$location]; $this->common_header(); $this->template->set_file('form','acl_manager_form.tpl'); - $acc = createobject('phpgwapi.accounts',$GLOBALS['account_id']); + $acc = createobject('phpgwapi.accounts',$this->account_id); $acc->read_repository(); $afn = $GLOBALS['phpgw']->common->display_fullname($acc->data['account_lid'],$acc->data['firstname'],$acc->data['lastname']); - $this->template->set_var('lang_message',lang('Check items to %1 to %2 for %3',$acl_manager['name'],$GLOBALS['acl_app'],$afn)); + $this->template->set_var('lang_message',lang('Check items to %1 to %2 for %3',lang($acl_manager['name']),$GLOBALS['phpgw_info']['apps'][$_GET['acl_app']]['title'],$afn)); $link_values = array( - 'menuaction' => 'admin.boaclmanager.submit', - 'acl_app' => $GLOBALS['acl_app'], - 'location' => urlencode($GLOBALS['location']), - 'account_id' => $GLOBALS['account_id'] + 'menuaction' => 'admin.uiaclmanager.access_form', + 'acl_app' => $_GET['acl_app'], + 'location' => urlencode($_GET['location']), + 'account_id' => $this->account_id ); - $acl = createobject('phpgwapi.acl',$GLOBALS['account_id']); + $acl = createobject('phpgwapi.acl',$this->account_id); $acl->read_repository(); + $grants = $acl->get_rights($location,$_GET['acl_app']); $this->template->set_var('form_action',$GLOBALS['phpgw']->link('/index.php',$link_values)); - $this->template->set_var('lang_title',lang('ACL Manager')); $total = 0; while (list($name,$value) = each($acl_manager['rights'])) { - $grants = $acl->get_rights($location,$GLOBALS['acl_app']); - - if (! $GLOBALS['phpgw']->acl->check($location,$value,$GLOBALS['acl_app'])) - { - $s .= '' @@ -310,38 +346,47 @@ $this->display_row(lang("Select which location this app should appear on the navbar, lowest (left) to highest (right)"),''); $GLOBALS['phpgw']->template->set_var('select_status',$status_html); - $GLOBALS['phpgw']->template->pparse('out','form'); + $GLOBALS['phpgw']->template->pparse('phpgw_body','form'); } function delete() { - $app_name = $GLOBALS['HTTP_GET_VARS']['app_name']; - - if (!$app_name) + if ($GLOBALS['phpgw']->acl->check('applications_access',8,'admin')) { - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.get_list')); + $GLOBALS['phpgw']->redirect_link('/index.php'); + } + $app_name = get_var('app_name',array('POST','GET')); + $start = get_var('start',array('POST','GET')); + + if (!$app_name || $_POST['no'] || $_POST['yes']) + { + if ($_POST['yes']) + { + $this->bo->delete($app_name); + } + $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uiapplications.get_list&start='.$start); } $GLOBALS['phpgw']->template->set_file(array('body' => 'delete_common.tpl')); - if ($GLOBALS['HTTP_GET_VARS']['confirm']) - { - $this->bo->delete($app_name); - Header('Location: ' . $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.get_list')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; - } - $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); - $GLOBALS['phpgw']->template->set_var('messages',lang('Are you sure you want to delete this application ?')); - $GLOBALS['phpgw']->template->set_var('no','' . lang('No') . ''); - $GLOBALS['phpgw']->template->set_var('yes','' . lang('Yes') . ''); - $GLOBALS['phpgw']->template->pparse('out','body'); + $GLOBALS['phpgw']->template->set_var('messages',lang('Are you sure you want to delete the application %1 ?',$GLOBALS['phpgw_info']['apps'][$app_name]['title'])); + $GLOBALS['phpgw']->template->set_var('no',lang('No')); + $GLOBALS['phpgw']->template->set_var('yes',lang('Yes')); + $GLOBALS['phpgw']->template->set_var('form_action',$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.delete')); + $GLOBALS['phpgw']->template->set_var('hidden_vars',''. + ''); + $GLOBALS['phpgw']->template->pparse('phpgw_body','body'); } function register_all_hooks() { + if ($GLOBALS['phpgw']->acl->check('applications_access',16,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } if (!is_object($GLOBALS['phpgw']->hooks)) { $GLOBALS['phpgw']->hooks = CreateObject('phpgwapi.hooks'); diff --git a/admin/inc/class.uicategories.inc.php b/admin/inc/class.uicategories.inc.php index 9223bb2f9d..14e35c725a 100644 --- a/admin/inc/class.uicategories.inc.php +++ b/admin/inc/class.uicategories.inc.php @@ -4,10 +4,12 @@ * http://www.phpgroupware.org * * Written by Bettina Gille [ceb@phpgroupware.org] * * ----------------------------------------------- * - * This program is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the * - * Free Software Foundation; either version 2 of the License, or (at your * - * option) any later version. * + * Copyright 2000 - 2003 Free Software Foundation, Inc * + * * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * \**************************************************************************/ /* $Id$ */ /* $Source$ */ @@ -15,8 +17,7 @@ class uicategories { var $bo; - var $nextmatchs; - var $xslttpl; + var $template; var $start; var $query; @@ -28,20 +29,35 @@ var $public_functions = array ( 'index' => True, + 'add' => True, 'edit' => True, 'delete' => True ); function uicategories() { - $GLOBALS['phpgw_info']['flags']['xslt_app'] = True; + if ($GLOBALS['phpgw']->acl->check('global_categories_access',1,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } $this->bo = CreateObject('admin.bocategories'); + $this->template = $GLOBALS['phpgw']->template; $this->nextmatchs = CreateObject('phpgwapi.nextmatchs'); + $this->acl_search = !$GLOBALS['phpgw']->acl->check('global_categories_access',2,'admin'); + $this->acl_add = !$GLOBALS['phpgw']->acl->check('global_categories_access',4,'admin'); + $this->acl_view = !$GLOBALS['phpgw']->acl->check('global_categories_access',8,'admin'); + $this->acl_edit = !$GLOBALS['phpgw']->acl->check('global_categories_access',16,'admin'); + $this->acl_delete = !$GLOBALS['phpgw']->acl->check('global_categories_access',32,'admin'); + $this->acl_add_sub= !$GLOBALS['phpgw']->acl->check('global_categories_access',64,'admin'); + + $this->appname = get_var('appname',array('GET','POST')); + $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps'][$this->appname ? $this->appname : 'admin']['title']; + $this->start = $this->bo->start; $this->query = $this->bo->query; - $this->sort = $this->bo->sort; + $this->sort = $this->bo->sort; $this->order = $this->bo->order; $this->cat_id = $this->bo->cat_id; if($this->debug) { $this->_debug_sqsof(); } @@ -50,11 +66,11 @@ function _debug_sqsof() { $data = array( - 'start' => $this->start, - 'query' => $this->query, - 'sort' => $this->sort, - 'order' => $this->order, - 'cat_id' => $this->cat_id + 'start' => $this->start, + 'query' => $this->query, + 'sort' => $this->sort, + 'order' => $this->order, + 'cat_id' => $this->cat_id ); echo '
    UI:
    '; _debug_array($data); @@ -64,10 +80,10 @@ { $data = array ( - 'start' => $this->start, - 'query' => $this->query, - 'sort' => $this->sort, - 'order' => $this->order + 'start' => $this->start, + 'query' => $this->query, + 'sort' => $this->sort, + 'order' => $this->order ); if(isset($this->cat_id)) @@ -77,106 +93,133 @@ $this->bo->save_sessiondata($data); } + function set_langs() + { + $this->template->set_var('th_bg',$GLOBALS['phpgw_info']['theme']['th_bg']); + $this->template->set_var('row_on',$GLOBALS['phpgw_info']['theme']['row_on']); + $this->template->set_var('row_off',$GLOBALS['phpgw_info']['theme']['row_off']); + $this->template->set_var('lang_save',lang('Save')); + $this->template->set_var('lang_search',lang('Search')); + $this->template->set_var('lang_sub',lang('Add sub')); + $this->template->set_var('lang_edit',lang('Edit')); + $this->template->set_var('lang_delete',lang('Delete')); + $this->template->set_var('lang_parent',lang('Parent category')); + $this->template->set_var('lang_none',lang('None')); + $this->template->set_var('lang_name',lang('Name')); + $this->template->set_var('lang_descr',lang('Description')); + $this->template->set_var('lang_add',lang('Add')); + $this->template->set_var('lang_reset',lang('Clear Form')); + $this->template->set_var('lang_cancel',lang('Cancel')); + $this->template->set_var('lang_done',lang('Done')); + } + function index() { - $global_cats = get_var('global_cats',array('POST','GET')); - - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data','cats', - $GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'search_field', - $GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'nextmatchs')); - $link_data = array ( - 'menuaction' => 'admin.uicategories.index', - 'appname' => $GLOBALS['appname'], - 'global_cats' => $global_cats + 'menuaction' => 'admin.uicategories.add', + 'appname' => $this->appname ); if ($_POST['add']) { - $link_data['menuaction'] = 'admin.uicategories.edit'; $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); } if ($_POST['done']) { - $GLOBALS['phpgw']->redirect_link('/index.php','menuaction=admin.uimainscreen.mainscreen'); + $GLOBALS['phpgw']->redirect_link('/admin/index.php'); } - if ($GLOBALS['appname']) + $this->template->set_file(array('cat_list_t' => 'listcats.tpl')); + $this->template->set_block('cat_list_t','cat_list','list'); + if (!$this->acl_add) { - $GLOBALS['phpgw_info']['flags']['app_header'] = lang($GLOBALS['appname']) . ' ' . lang('global categories') . ': ' . lang('category list'); + $this->template->set_block('cat_list_t','add','addhandle'); } - else + if (!$this->acl_search) { - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('global categories') . ': ' . lang('category list'); + $this->template->set_block('cat_list_t','search','searchhandle'); } - if (!$global_cats) + $GLOBALS['phpgw_info']['flags']['app_header'] .= ' - '.lang('Global categories'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + $this->set_langs(); + $this->template->set_var('query',$this->query); + + $link_data['menuaction'] = 'admin.uicategories.index'; + $this->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php',$link_data)); + + if(!$start) { - $global_cats = False; + $start = 0; } - $categories = $this->bo->get_list($global_cats); + $categories = $this->bo->get_list(); - $cat_header[] = array - ( - 'sort_name' => $this->nextmatchs->show_sort_order(array - ( - 'sort' => $this->sort, - 'var' => 'cat_name', - 'order' => $this->order, - 'extra' => $link_data - )), - 'lang_add_sub' => lang('add sub'), - 'lang_name' => lang('name'), - 'lang_descr' => lang('description'), - 'lang_edit' => lang('edit'), - 'lang_delete' => lang('delete'), - 'lang_sort_statustext' => lang('sort the entries'), - 'sort_descr' => $this->nextmatchs->show_sort_order(array - ( - 'sort' => $this->sort, - 'var' => 'cat_description', - 'order' => $this->order, - 'extra' => $link_data - )) - ); + $left = $this->nextmatchs->left('/index.php',$this->start,$this->bo->cats->total_records,$link_data); + $right = $this->nextmatchs->right('/index.php',$this->start,$this->bo->cats->total_records,$link_data); + $this->template->set_var('left',$left); + $this->template->set_var('right',$right); - while (is_array($categories) && list(,$cat) = each($categories)) + $this->template->set_var('lang_showing',$this->nextmatchs->show_hits($this->bo->cats->total_records,$this->start)); + + $this->template->set_var('sort_name',$this->nextmatchs->show_sort_order($this->sort,'cat_name',$this->order,'/index.php',lang('Name'),$link_data)); + $this->template->set_var('sort_description',$this->nextmatchs->show_sort_order($this->sort,'cat_description',$this->order,'/index.php',lang('Description'),$link_data)); + + for ($i=0;$istrip_html($cat['name']); + $tr_color = $this->nextmatchs->alternate_row_color($tr_color); + $this->template->set_var(tr_color,$tr_color); + + $id = $categories[$i]['id']; + $level = $categories[$i]['level']; + $cat_name = $GLOBALS['phpgw']->strip_html($categories[$i]['name']); - $main = 'yes'; if ($level > 0) { - $space = ' . '; + $space = '  '; $spaceset = str_repeat($space,$level); $cat_name = $spaceset . $cat_name; - $main = 'no'; } - $descr = $GLOBALS['phpgw']->strip_html($cat['descr']); + $descr = $GLOBALS['phpgw']->strip_html($categories[$i]['description']); + if (!$descr) { $descr = ' '; } - if ($GLOBALS['appname'] && $cat['app_name'] == 'phpgw') + if ($level == 0) { - $appendix = ' <' . lang('Global') . '>'; + $cat_name = '' . $cat_name . ''; + $descr = '' . $descr . ''; + } + + if ($this->appname && $categories[$i]['app_name'] == 'phpgw') + { + $appendix = '<' . lang('Global') . '>'; } else { $appendix = ''; } - $link_data['menuaction'] = 'admin.uicategories.edit'; - $link_data['parent'] = $cat['cat_id']; - $add_sub_url = $GLOBALS['phpgw']->link('/index.php',$link_data); + $this->template->set_var(array + ( + 'name' => $cat_name . $appendix, + 'descr' => $descr + )); - if ($GLOBALS['appname'] && $cat['app_name'] == $GLOBALS['appname']) + if ($this->acl_add_sub) + { + $link_data['menuaction'] = 'admin.uicategories.add'; + $link_data['cat_parent'] = $id; + $this->template->set_var('add_sub',''. + lang('Add sub').''); + } + if ($this->appname && $categories[$i]['app_name'] == $this->appname) { $show_edit_del = True; } - elseif(!$GLOBALS['appname'] && $cat['app_name'] == 'phpgw') + elseif(!$this->appname && $categories[$i]['app_name'] == 'phpgw') { $show_edit_del = True; } @@ -185,242 +228,251 @@ $show_edit_del = False; } - if ($show_edit_del) + $link_data['cat_id'] = $id; + if ($show_edit_del && $this->acl_edit) { - $link_data['cat_id'] = $cat['cat_id']; - $link_data['menuaction'] = 'admin.uicategories.edit'; - $edit_url = $GLOBALS['phpgw']->link('/index.php',$link_data); - $lang_edit = lang('edit'); - - $link_data['menuaction'] = 'admin.uicategories.delete'; - $delete_url = $GLOBALS['phpgw']->link('/index.php',$link_data); - $lang_delete = lang('delete'); + $link_data['menuaction'] = 'admin.uicategories.edit'; + $this->template->set_var('edit',''. + lang('Edit').''); } else { - $edit_url = ''; - $lang_edit = ''; - $delete_url = ''; - $lang_delete = ''; + $this->template->set_var('edit',''); } - - $content[] = array - ( - 'name' => $cat_name . $appendix, - 'descr' => $descr, - 'date' => $note['date'], - 'main' => $main, - 'add_sub_url' => $add_sub_url, - 'edit_url' => $edit_url, - 'delete_url' => $delete_url, - 'lang_add_sub_statustext' => lang('add a subcategory'), - 'lang_edit_statustext' => lang('edit this category'), - 'lang_delete_statustext' => lang('delete this category'), - 'lang_add_sub' => lang('add sub'), - 'lang_edit' => $lang_edit, - 'lang_delete' => $lang_delete - ); + if ($show_edit_del && $this->acl_delete) + { + $link_data['menuaction'] = 'admin.uicategories.delete'; + $this->template->set_var('delete',''. + lang('Delete').''); + } + else + { + $this->template->set_var('delete',''); + } + $this->template->fp('list','cat_list',True); } - - $link_data['menuaction'] = 'admin.uicategories.index'; - $link_data['parent'] = ''; - - $cat_add[] = array - ( - 'lang_add' => lang('add'), - 'lang_add_statustext' => lang('add a category'), - 'action_url' => $GLOBALS['phpgw']->link('/index.php',$link_data), - 'lang_done' => lang('done'), - 'lang_done_statustext' => lang('return to admin mainscreen') - ); - - $link_data['menuaction'] = 'admin.uicategories.index'; - - $data = array - ( - 'start_record' => $this->start, - 'record_limit' => $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs'], - 'num_records' => count($categoris), - 'all_records' => $this->bo->cats->total_records, - 'nextmatchs_url' => $GLOBALS['phpgw']->link('/index.php',$link_data), - 'nextmatchs_img_path' => $GLOBALS['phpgw']->common->get_image_path('phpgwapi','default'), - 'select_url' => $GLOBALS['phpgw']->link('/index.php',$link_data), - 'lang_searchfield_statustext' => lang('Enter the search string. To show all entries, empty this field and press the SUBMIT button again'), - 'lang_searchbutton_statustext' => lang('Submit the search string'), - 'query' => $this->query, - 'lang_search' => lang('search'), - 'cat_header' => $cat_header, - 'cat_data' => $content, - 'cat_add' => $cat_add - ); + $link_data['menuaction'] = 'admin.uicategories.add'; + $link_data['cat_parent'] = ''; + $this->template->set_var('add_action',$GLOBALS['phpgw']->link('/index.php',$link_data)); $this->save_sessiondata(); - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('cat_list' => $data)); + $this->template->pfp('out','cat_list_t',True); } - function edit() + function add() { - $global_cats = get_var('global_cats',array('POST','GET')); - $parent = get_var('parent',array('GET')); - $values = get_var('values',array('POST')); + $new_parent = $_POST['new_parent']; + $cat_parent = intval(get_var('cat_parent',array('POST','GET'))); + $cat_name = $_POST['cat_name']; + $cat_description = $_POST['cat_description']; + if ($new_parent) + { + $cat_parent = intval($new_parent); + } + if (!$this->acl_add && $cat_parent == 0 || !$this->acl_add_sub && $cat_parent != 0) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } $link_data = array ( - 'menuaction' => 'admin.uicategories.index', - 'appname' => $GLOBALS['appname'], - 'global_cats' => $global_cats + 'menuaction' => 'admin.uicategories.index', + 'appname' => $this->appname ); - if ($values['cancel']) + if ($_POST['cancel']) { $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); } - if ($values['save'] || $values['apply']) + $GLOBALS['phpgw_info']['flags']['app_header'] .= ' - '.lang('Add global category'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + + $this->set_langs(); + + $this->template->set_file(array('form' => 'category_form.tpl')); + $this->template->set_block('form','delete','deletehandle'); + + if ($_POST['save']) { - $values['cat_id'] = $this->cat_id; - $values['access'] = 'public'; + $values = array + ( + 'parent' => $cat_parent, + 'descr' => $cat_description, + 'name' => $cat_name, + 'access' => 'public' + ); $error = $this->bo->check_values($values); if (is_array($error)) { - $message = $GLOBALS['phpgw']->common->error_list($error); + $this->template->set_var('message',$GLOBALS['phpgw']->common->error_list($error)); } else { - $this->cat_id = $this->bo->save_cat($values); - if ($values['apply']) - { - $message = lang('Category %1 has been saved !',$values['name']); - } - else - { - $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); - } + $this->bo->save_cat($values); + $this->template->set_var('message',lang('Category %1 has been added !', $cat_name)); } } - if ($this->cat_id) - { - $cats = $this->bo->cats->return_single($this->cat_id); - $parent = $cats['parent']; - } + $link_data['menuaction'] = 'admin.uicategories.add'; + $this->template->set_var('actionurl',$GLOBALS['phpgw']->link('/index.php',$link_data)); - if ($GLOBALS['appname']) - { - $GLOBALS['phpgw_info']['flags']['app_header'] = lang($GLOBALS['appname']) . ' ' . lang('global categories') . ': ' . ($this->cat_id?lang('edit category'):lang('add category')); - } - else - { - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('global categories') . ': ' . $function; - } + $this->template->set_var('category_list',$this->bo->cats->formatted_list(array('selected' => $cat_parent))); + $this->template->set_var('cat_name',$cat_name); + $this->template->set_var('cat_description',$cat_description); - $GLOBALS['phpgw']->xslttpl->add_file(array('app_data','cats')); - - if ($GLOBALS['appname']) - { - $GLOBALS['phpgw']->template->set_var('title_categories',lang('Edit global category for %1',lang($GLOBALS['appname']))); - } - else - { - $GLOBALS['phpgw']->template->set_var('title_categories',lang('Edit global category')); - } - - $data = array - ( - 'lang_name' => lang('name'), - 'lang_descr' => lang('description'), - 'lang_parent' => lang('parent category'), - 'old_parent' => $cats['parent'], - 'lang_save' => lang('save'), - 'lang_apply' => lang('apply'), - 'lang_cancel' => lang('cancel'), - 'value_name' => $GLOBALS['phpgw']->strip_html($cats['name']), - 'value_descr' => $GLOBALS['phpgw']->strip_html($cats['descr']), - 'message' => $message, - 'lang_content_statustext' => lang('enter a description for the category'), - 'lang_cancel_statustext' => lang('leave the category untouched and return back to the list'), - 'lang_save_statustext' => lang('save the category and return back to the list'), - 'lang_apply_statustext' => lang('save the category'), - 'lang_no_cat' => lang('no category'), - 'lang_cat_statustext' => lang('Select the parent category. If this is a main category select NO CATEGORY'), - 'select_name' => 'values[parent]', - 'cat_list' => $this->bo->cats->formatted_xslt_list(array('format' => 'select', 'selected' => $parent,'self' => $this->cat_id,'globals' => $global_cats)) - ); - - $link_data['menuaction'] = 'admin.uicategories.edit'; - if ($this->cat_id) - { - $link_data['cat_id'] = $this->cat_id; - } - $data['edit_url'] = $GLOBALS['phpgw']->link('/index.php',$link_data); - - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('cat_edit' => $data)); + $this->template->pfp('out','form'); } - function delete() + function edit() { - $global_cats = get_var('global_cats',array('POST','GET')); + $new_parent = intval($_POST['new_parent']); + $cat_parent = intval($_POST['cat_parent']); + $cat_name = $_POST['cat_name']; + $cat_description = $_POST['cat_description']; + $old_parent = intval($_POST['old_parent']); + + if ($new_parent) + { + $cat_parent = $new_parent; + } $link_data = array ( - 'menuaction' => 'admin.uicategories.index', - 'appname' => $GLOBALS['appname'], - 'global_cats' => $global_cats + 'menuaction' => 'admin.uicategories.index', + 'appname' => $this->appname ); - if ($_POST['done'] || $_POST['cancel'] || !$this->cat_id) + if ($_POST['cancel'] || !$this->cat_id || !$this->acl_edit) { $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); } - if ($_POST['delete']) + $GLOBALS['phpgw_info']['flags']['app_header'] .= ' - '.lang('Edit global category'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + + $this->set_langs(); + + $this->template->set_file(array('form' => 'category_form.tpl')); + + if ($_POST['save']) { - if ($_POST['subs']) + $values = array + ( + 'id' => $this->cat_id, + 'old_parent' => $old_parent, + 'parent' => $cat_parent, + 'descr' => $cat_description, + 'name' => $cat_name, + 'access' => 'public' + ); + + $error = $this->bo->check_values($values); + if (is_array($error)) { - switch ($_POST['subs']) - { - case 'move': - $this->bo->delete(array('cat_id' => $this->cat_id, 'modify_subs' => True)); - $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); - break; - case 'drop': - $this->bo->delete(array('cat_id' => $this->cat_id, 'drop_subs' => True)); - $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); - break; - default: - $error = array('Please choose one of the methods to handle the subcategories'); - $msgbox_error = $GLOBALS['phpgw']->common->error_list($error); - break; - } + $this->template->set_var('message',$GLOBALS['phpgw']->common->error_list($error)); } else { - $this->bo->delete(array('cat_id' => $this->cat_id)); - $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); + $this->cat_id = $this->bo->save_cat($values); + $this->template->set_var('message',lang('Category %1 has been updated !',$cat_name)); } } - $GLOBALS['phpgw']->xslttpl->add_file(array($GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi','default') . SEP . 'app_delete')); + $cats = $this->bo->cats->return_single($this->cat_id); - $GLOBALS['phpgw_info']['flags']['app_header'] = ($GLOBALS['appname']?lang($GLOBALS['appname']) . ' ':'') . lang('global categories') . ': ' . lang('delete category'); + $hidden_vars = '' . "\n" + . '' . "\n"; + $this->template->set_var('hidden_vars',$hidden_vars); - $type = ($GLOBALS['appname']?'noglobalapp':'noglobal'); + $link_data['menuaction'] = 'admin.uicategories.edit'; + $link_data['cat_id'] = $this->cat_id; + $this->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php',$link_data)); - $apps_cats = $this->bo->exists(array('type' => $type, - 'cat_name' => '', - 'cat_id' => $this->cat_id)); - if ($apps_cats) + $this->template->set_var('cat_name',$GLOBALS['phpgw']->strip_html($cats[0]['name'])); + $this->template->set_var('cat_description',$GLOBALS['phpgw']->strip_html($cats[0]['description'])); + $this->template->set_var('category_list',$this->bo->cats->formatted_list(array('selected' => $cats[0]['parent'],'self' => $this->cat_id))); + $this->template->pfp('out','form'); + } + + function delete() + { + if (!$this->acl_delete) { - $error = array('This category is currently being used by applications as a parent category', - 'You will need to reassign these subcategories before you can delete this category'); + $GLOBALS['phpgw']->redirect_link('/index.php'); + } + $link_data = array + ( + 'menuaction' => 'admin.uicategories.index', + 'appname' => $this->appname + ); - $msgbox_error = $GLOBALS['phpgw']->common->error_list($error); - $show_done = 'yes'; + if (!$this->cat_id || $_POST['cancel']) + { + $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); + } + + if ($_POST['confirm']) + { + if ($_POST['subs']) + { + $this->bo->delete($this->cat_id,True); + } + else + { + $this->bo->delete($this->cat_id); + } + $GLOBALS['phpgw']->redirect_link('/index.php',$link_data); + } + $this->template->set_file(array('category_delete' => 'delete_cat.tpl')); + + if ($this->appname) + { + $type = 'noglobalapp'; } else { - $confirm_msg = lang('Are you sure you want to delete this global category ?'); + $type = 'noglobal'; + } + + $apps_cats = $this->bo->exists(array + ( + 'type' => $type, + 'cat_name' => '', + 'cat_id' => $this->cat_id + )); + + $GLOBALS['phpgw_info']['flags']['app_header'] .= ' - '.lang('Delete category'); + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + + $hidden_vars = '' . "\n"; + $this->template->set_var('hidden_vars',$hidden_vars); + + $cats = $this->bo->cats->return_single($this->cat_id); + $this->template->set_var('cat_name',$cats[0]['name']); + + if ($apps_cats) + { + $this->template->set_block('category_delete','delete','deletehandle'); + $this->template->set_var('messages',lang('This category is currently being used by applications as a parent category') . '
    ' + . lang('You will need to remove the subcategories before you can delete this category')); + + $this->template->set_var('lang_subs',''); + $this->template->set_var('subs',''); + $this->template->set_var('nolink',$nolink); + $this->template->set_var('deletehandle',''); + $this->template->set_var('donehandle',''); + $this->template->set_var('lang_ok',lang('Ok')); + $this->template->pfp('out','category_delete'); + } + else + { + $this->template->set_block('category_delete','done','donehandle'); + $this->template->set_var('messages',lang('Are you sure you want to delete this category ?')); $exists = $this->bo->exists(array ( @@ -431,33 +483,22 @@ if ($exists) { - $subs = 'yes'; - $lang_sub_select_move = lang('Do you want to move all global subcategories one level down ?'); - $lang_sub_select_drop = lang('Do you want to delete all global subcategories ?'); + $this->template->set_var('lang_subs',lang('Do you also want to delete all global subcategories ?')); + $this->template->set_var('subs',''); } + else + { + $this->template->set_var('lang_subs',''); + $this->template->set_var('subs', ''); + } + + $link_data['menuaction'] = 'admin.uicategories.delete'; + $link_data['cat_id'] = $this->cat_id; + $this->template->set_var('action_url',$GLOBALS['phpgw']->link('/index.php',$link_data)); + $this->template->set_var('lang_yes',lang('Yes')); + $this->template->set_var('lang_no',lang('No')); + $this->template->pfp('out','category_delete'); } - - $data = array - ( - 'show_done' => $show_done, - 'msgbox_data' => $msgbox_error, - 'lang_delete' => lang('delete'), - 'subs' => $subs, - 'lang_sub_select_move' => $lang_sub_select_move, - 'lang_sub_select_drop' => $lang_sub_select_drop, - 'lang_delete_statustext' => lang('delete the category'), - 'lang_cancel_statustext' => lang('do NOT delete the category and return back to the list'), - 'lang_done_statustext' => lang('back to the list'), - 'lang_cancel' => lang('cancel'), - 'lang_done' => lang('done'), - 'lang_confirm_msg' => $confirm_msg - ); - - $link_data['menuaction'] = 'admin.uicategories.delete'; - $link_data['cat_id'] = $this->cat_id; - $data['delete_url'] = $GLOBALS['phpgw']->link('/index.php',$link_data); - - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('delete' => $data)); } } ?> diff --git a/admin/inc/class.uiconfig.inc.php b/admin/inc/class.uiconfig.inc.php index 2fa6ba6ceb..a422f605ea 100644 --- a/admin/inc/class.uiconfig.inc.php +++ b/admin/inc/class.uiconfig.inc.php @@ -18,29 +18,14 @@ function index() { - $referer = urldecode($GLOBALS['HTTP_GET_VARS']['referer']); - - if($referer) + if ($GLOBALS['phpgw']->acl->check('site_config_access',1,'admin')) { - $_redir = $referer; - $GLOBALS['phpgw']->session->appsession('session_data','admin_config',$referer); + $GLOBALS['phpgw']->redirect_link('/index.php'); } - else - { - $referer = $GLOBALS['phpgw']->session->appsession('session_data','admin_config'); - if($referer == '-1') - { - $referer = ''; - } - $_redir = $referer ? $referer : $GLOBALS['phpgw']->link('/admin/index.php'); - } - - $appname = $GLOBALS['HTTP_GET_VARS']['appname']; - switch($appname) + + switch($_GET['appname']) { case 'admin': - //case 'preferences': - //$appname = 'preferences'; case 'addressbook': case 'calendar': case 'email': @@ -49,14 +34,16 @@ Other special apps can go here for now, e.g.: case 'bogusappname': */ + $appname = $_GET['appname']; $config_appname = 'phpgwapi'; break; case 'phpgwapi': case '': /* This keeps the admin from getting into what is a setup-only config */ - Header('Location: ' . $_redir); + $GLOBALS['phpgw']->redirect_link('/admin/index.php'); break; default: + $appname = $_GET['appname']; $config_appname = $appname; break; } @@ -76,17 +63,17 @@ $current_config = $c->config_data; } - if ($GLOBALS['HTTP_POST_VARS']['cancel']) + if ($_POST['cancel'] || $_POST['submit'] && $GLOBALS['phpgw']->acl->check('site_config_access',2,'admin')) { - Header('Location: ' . $_redir); + $GLOBALS['phpgw']->redirect_link('/admin/index.php'); } - if ($GLOBALS['HTTP_POST_VARS']['submit']) + if ($_POST['submit']) { /* Load hook file with functions to validate each config (one/none/all) */ $GLOBALS['phpgw']->hooks->single('config_validate',$appname); - while (list($key,$config) = each($GLOBALS['HTTP_POST_VARS']['newsettings'])) + while (list($key,$config) = each($_POST['newsettings'])) { if ($config) { @@ -128,14 +115,11 @@ unset($GLOBALS['phpgw_info']['server']['found_validation_hook']); } - $c->save_repository(True); + $c->save_repository(); if(!$errors) { - $GLOBALS['phpgw']->session->appsession('session_data','admin_config',-1); - Header('Location: ' . $_redir); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; + $GLOBALS['phpgw']->redirect_link('/admin/index.php'); } } @@ -149,12 +133,18 @@ else { $t->set_var('error',''); + $t->set_var('th_err',$GLOBALS['phpgw_info']['theme']['th_bg']); } $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); $t->set_var('title',lang('Site Configuration')); $t->set_var('action_url',$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname)); + $t->set_var('th_bg', $GLOBALS['phpgw_info']['theme']['th_bg']); + $t->set_var('th_text', $GLOBALS['phpgw_info']['theme']['th_text']); + $t->set_var('row_on', $GLOBALS['phpgw_info']['theme']['row_on']); + $t->set_var('row_off', $GLOBALS['phpgw_info']['theme']['row_off']); $t->pparse('out','header'); $vars = $t->get_undefined('body'); @@ -173,7 +163,7 @@ } $newval = implode(' ',$new); - switch($type) + switch ($type) { case 'lang': $t->set_var($value,lang($newval)); @@ -190,19 +180,19 @@ $t->set_var($value,$current_config[$newval]); } break; + /* case 'checked': - /* '+' is used as a delimiter for the check value */ - list($newvalue,$check) = split('\+',$newval); - $newval = ereg_replace(' ','_',$newvalue); - if($current_config[$newval] == $check) + $newval = ereg_replace(' ','_',$newval); + if ($current_config[$newval]) { - $t->set_var($value, ' checked'); + $t->set_var($value,' checked'); } else { - $t->set_var($value, ''); + $t->set_var($value,''); } break; + */ case 'selected': $configs = array(); $config = ''; @@ -235,15 +225,15 @@ } break; default: - $t->set_var($value,''); - break; + $t->set_var($value,''); + break; } } $t->pfp('out','body'); - $t->set_var('lang_submit', lang('submit')); - $t->set_var('lang_cancel', lang('cancel')); + $t->set_var('lang_submit', $GLOBALS['phpgw']->acl->check('site_config_access',2,'admin') ? lang('Cancel') : lang('Save')); + $t->set_var('lang_cancel', lang('Cancel')); $t->pfp('out','footer'); } } diff --git a/admin/inc/class.uicurrentsessions.inc.php b/admin/inc/class.uicurrentsessions.inc.php index 0d03db25b9..6d680c20e7 100644 --- a/admin/inc/class.uicurrentsessions.inc.php +++ b/admin/inc/class.uicurrentsessions.inc.php @@ -23,6 +23,10 @@ function uicurrentsessions() { + if ($GLOBALS['phpgw']->acl->check('current_sessions_access',1,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } $this->template = createobject('phpgwapi.Template',PHPGW_APP_TPL); $this->bo = createobject('admin.bocurrentsessions'); $this->nextmatchs = createobject('phpgwapi.nextmatchs'); @@ -31,6 +35,7 @@ function header() { $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); } function store_location($info) @@ -78,15 +83,9 @@ $this->template->set_block('current','list','list'); $this->template->set_block('current','row','row'); - if (! $GLOBALS['phpgw']->acl->check('current_sessions_access',4,'admin')) - { - $can_view_ip = True; - } - - if (! $GLOBALS['phpgw']->acl->check('current_sessions_access',2,'admin')) - { - $can_view_action = True; - } + $can_view_action = !$GLOBALS['phpgw']->acl->check('current_sessions_access',2,'admin'); + $can_view_ip = !$GLOBALS['phpgw']->acl->check('current_sessions_access',4,'admin'); + $can_kill = !$GLOBALS['phpgw']->acl->check('current_sessions_access',8,'admin'); $total = $this->bo->total(); @@ -115,14 +114,7 @@ $this->template->set_var('row_loginid',$value['session_lid']); - if ($can_view_ip) - { - $this->template->set_var('row_ip',$value['session_ip']); - } - else - { - $this->template->set_var('row_ip','  --  '); - } + $this->template->set_var('row_ip',$can_view_ip?$value['session_ip']:' '); $this->template->set_var('row_logintime',$value['session_logintime']); $this->template->set_var('row_idle',$value['session_idle']); @@ -131,16 +123,12 @@ { $this->template->set_var('row_action',$GLOBALS['phpgw']->strip_html($value['session_action'])); } - elseif(! $can_view_action) - { - $this->template->set_var('row_action','  --  '); - } else { $this->template->set_var('row_action',' '); } - if ($value['session_id'] != $GLOBALS['phpgw_info']['user']['sessionid'] && ! $GLOBALS['phpgw']->acl->check('current_sessions_access',8,'admin')) + if ($value['session_id'] != $GLOBALS['phpgw_info']['user']['sessionid'] && $can_kill) { $this->template->set_var('row_kill','' . lang('Kill').''); @@ -160,10 +148,8 @@ { if ($GLOBALS['phpgw']->acl->check('current_sessions_access',8,'admin')) { - $this->list_sessions(); - return False; + $GLOBALS['phpgw']->redirect_link('/index.php'); } - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin').' - '.lang('Kill session'); $this->header(); $this->template->set_file('form','kill_session.tpl'); diff --git a/admin/inc/class.uilog.inc.php b/admin/inc/class.uilog.inc.php index aa6d7f36f0..ab718ffba3 100644 --- a/admin/inc/class.uilog.inc.php +++ b/admin/inc/class.uilog.inc.php @@ -26,6 +26,11 @@ function uilog() { + if ($GLOBALS['phpgw']->acl->check('error_log_access',1,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } + $_cols = $GLOBALS['HTTP_POST_VARS']['_cols']; $nocols = $GLOBALS['HTTP_POST_VARS']['nocols']; $_delcol = $GLOBALS['HTTP_POST_VARS']['_delcol']; @@ -257,6 +262,7 @@ $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin').' - '.($this->editmode?lang('Edit Table format') : lang('View error log')); $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); $this->t->pfp('out','log_list_t'); // $this->set_app_langs(); } diff --git a/admin/inc/class.uimainscreen.inc.php b/admin/inc/class.uimainscreen.inc.php index 3a5335861f..52b2570a71 100644 --- a/admin/inc/class.uimainscreen.inc.php +++ b/admin/inc/class.uimainscreen.inc.php @@ -1,49 +1,44 @@ * - * -------------------------------------------- * - * This program is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the * - * Free Software Foundation; either version 2 of the License, or (at your * - * option) any later version. * - \**************************************************************************/ - /* $Id$ */ + /**************************************************************************\ + * phpGroupWare - administration * + * http://www.phpgroupware.org * + * -------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * + \**************************************************************************/ + + /* $Id$ */ class uimainscreen { - var $public_functions = array - ( - 'index' => True, - 'mainscreen' => True - ); + var $public_functions = array('index' => True); function uimainscreen() { - $GLOBALS['phpgw_info']['flags']['xslt_app'] = True; $GLOBALS['phpgw']->nextmatchs = CreateObject('phpgwapi.nextmatchs'); } - function mainscreen() - { - $GLOBALS['phpgw']->xslttpl->add_file('app_data'); - - function display_section($appname,$file,$file2='') - { - $GLOBALS['phpgw']->common->display_mainscreen($appname,$file2 ? $file2 : $file); - } - - $GLOBALS['phpgw']->hooks->process('admin'); - - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('list' => $GLOBALS['phpgw']->common->output)); - } - function index() { - if ($GLOBALS['HTTP_POST_VARS']['cancel']) + $section = addslashes($_POST['section']); + $select_lang = addslashes($_POST['select_lang']); + $message = addslashes($_POST['message']); + + $acl_ok = array(); + if (!$GLOBALS['phpgw']->acl->check('mainscreen_message_access',1,'admin')) { - header('Location: ' . $GLOBALS['phpgw']->link('/admin/index.php')); + $acl_ok['mainscreen'] = True; + } + if (!$GLOBALS['phpgw']->acl->check('mainscreen_message_access',2,'admin')) + { + $acl_ok['loginscreen'] = True; + } + if ($_POST['cancel'] && !isset($_POST['message']) || + !count($acl_ok) || $_POST['submit'] && !isset($acl_ok[$section])) + { + $GLOBALS['phpgw']->redirect_link('/admin/index.php'); } $GLOBALS['phpgw']->template->set_file(array('message' => 'mainscreen_message.tpl')); @@ -51,24 +46,37 @@ $GLOBALS['phpgw']->template->set_block('message','row','row'); $GLOBALS['phpgw']->template->set_block('message','row_2','row_2'); - $section = $GLOBALS['HTTP_POST_VARS']['section']; - $select_lang = $GLOBALS['HTTP_POST_VARS']['select_lang']; - $message = $GLOBALS['HTTP_POST_VARS']['message']; - - $GLOBALS['phpgw']->common->phpgw_header(); - - if ($GLOBALS['HTTP_POST_VARS']['submit']) + if ($_POST['submit']) { $GLOBALS['phpgw']->db->query("DELETE FROM phpgw_lang WHERE message_id='$section" . "_message' AND app_name='" . "$section' AND lang='$select_lang'",__LINE__,__FILE__); $GLOBALS['phpgw']->db->query("INSERT INTO phpgw_lang VALUES ('$section" . "_message','$section','$select_lang','" - . addslashes($message) . "')",__LINE__,__FILE__); + . $message . "')",__LINE__,__FILE__); $message = '
    '.lang('message has been updated').'
    '; + + $section = ''; } - - if (empty($select_lang)) + if ($_POST['cancel']) // back to section/lang-selection + { + $message = $section = ''; + } + switch ($section) + { + case 'mainscreen': + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin').' - '.lang('Edit main screen message') . ': '.strtoupper($select_lang); + break; + case 'loginscreen': + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin').' - '.lang('Edit login screen message') . ': '.strtoupper($select_lang); + break; + default: + $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Admin').' - '.lang('Main screen message'); + break; + } + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + + if (empty($section)) { - $GLOBALS['phpgw']->template->set_var('header_lang',lang('Main screen message')); $GLOBALS['phpgw']->template->set_var('form_action',$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uimainscreen.index')); $GLOBALS['phpgw']->template->set_var('tr_color',$GLOBALS['phpgw_info']['theme']['th_bg']); $GLOBALS['phpgw']->template->set_var('value',' '); @@ -77,51 +85,48 @@ $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); $GLOBALS['phpgw']->template->set_var('tr_color',$tr_color); - $select_lang = ''; $GLOBALS['phpgw']->db->query("SELECT lang,phpgw_languages.lang_name,phpgw_languages.lang_id FROM phpgw_lang,phpgw_languages WHERE " . "phpgw_lang.lang=phpgw_languages.lang_id GROUP BY lang,phpgw_languages.lang_name," - . "phpgw_languages.lang_id ORDER BY lang"); + . "phpgw_languages.lang_id ORDER BY lang",__LINE__,__FILE__); while ($GLOBALS['phpgw']->db->next_record()) { - $select_lang .= ''; + $lang = $GLOBALS['phpgw']->db->f('lang'); + $lang_select .= '\n"; } - $select_lang .= ''; + $lang_select .= ''; $GLOBALS['phpgw']->template->set_var('label',lang('Language')); - $GLOBALS['phpgw']->template->set_var('value',$select_lang); + $GLOBALS['phpgw']->template->set_var('value',$lang_select); $GLOBALS['phpgw']->template->fp('rows','row',True); $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); $GLOBALS['phpgw']->template->set_var('tr_color',$tr_color); - $select_section = ''; + $select_section = ''; $GLOBALS['phpgw']->template->set_var('label',lang('Section')); $GLOBALS['phpgw']->template->set_var('value',$select_section); $GLOBALS['phpgw']->template->fp('rows','row',True); $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); $GLOBALS['phpgw']->template->set_var('tr_color',$tr_color); - $GLOBALS['phpgw']->template->set_var('value',''); $GLOBALS['phpgw']->template->fp('rows','row_2',True); } else { $GLOBALS['phpgw']->db->query("SELECT content FROM phpgw_lang WHERE lang='$select_lang' AND message_id='$section" - . "_message'"); + . "_message'",__LINE__,__FILE__); $GLOBALS['phpgw']->db->next_record(); $current_message = $GLOBALS['phpgw']->db->f('content'); - if ($section == 'mainscreen') - { - $GLOBALS['phpgw']->template->set_var('header_lang',lang('Edit main screen message')); - } - else - { - $GLOBALS['phpgw']->template->set_var('header_lang',lang('Edit login screen message')); - } - $GLOBALS['phpgw']->template->set_var('form_action',$GLOBALS['phpgw']->link('/index.php','menuaction=admin.uimainscreen.index')); $GLOBALS['phpgw']->template->set_var('select_lang',$select_lang); $GLOBALS['phpgw']->template->set_var('section',$section); @@ -136,7 +141,7 @@ $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); $GLOBALS['phpgw']->template->set_var('tr_color',$tr_color); - $GLOBALS['phpgw']->template->set_var('value','' ); $GLOBALS['phpgw']->template->fp('rows','row_2',True); diff --git a/admin/inc/class.uimenuclass.inc.php b/admin/inc/class.uimenuclass.inc.php index e52167716d..87bf0be114 100644 --- a/admin/inc/class.uimenuclass.inc.php +++ b/admin/inc/class.uimenuclass.inc.php @@ -45,15 +45,18 @@ { $i=0; + // reset the value of all_rows + $this->t->set_var('all_rows',''); + while(list($key,$value) = each($_menuData)) { if (!empty($value['extradata'])) { - $link = $GLOBALS['phpgw']->link($value['url'],'account_id=' . $GLOBALS['account_id'] . '&' . $value['extradata']); + $link = $GLOBALS['phpgw']->link($value['url'],'account_id=' . get_var('account_id',array('GET','POST')) . '&' . $value['extradata']); } else { - $link = $GLOBALS['phpgw']->link($value['url'],'account_id=' . $GLOBALS['account_id']); + $link = $GLOBALS['phpgw']->link($value['url'],'account_id=' . get_var('account_id',array('GET','POST'))); } $this->section_item($link,lang($value['description']),$this->rowColor[($i % 2)]); $i++; @@ -115,7 +118,6 @@ } $GLOBALS['phpgw']->hooks->process($_hookname); - if (count($GLOBALS['menuData']) >= 1) { $result = $this->display_section($GLOBALS['menuData']); diff --git a/admin/inc/class.uiserver.inc.php b/admin/inc/class.uiserver.inc.php index d38d9851fe..0750abc9d7 100644 --- a/admin/inc/class.uiserver.inc.php +++ b/admin/inc/class.uiserver.inc.php @@ -33,6 +33,16 @@ function uiserver() { + if ($GLOBALS['phpgw']->acl->check('peer_server_access',1,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } + $this->acl_search = !$GLOBALS['phpgw']->acl->check('peer_server_access',2,'admin'); + $this->acl_add = !$GLOBALS['phpgw']->acl->check('peer_server_access',4,'admin'); + $this->acl_view = !$GLOBALS['phpgw']->acl->check('peer_server_access',8,'admin'); + $this->acl_edit = !$GLOBALS['phpgw']->acl->check('peer_server_access',16,'admin'); + $this->acl_delete = !$GLOBALS['phpgw']->acl->check('peer_server_access',32,'admin'); + $this->bo = createobject('admin.boserver',True); $this->nextmatchs = createobject('phpgwapi.nextmatchs'); @@ -70,7 +80,7 @@ $this->bo->save_sessiondata($data); } - function formatted_list($name,$list,$id='',$default=False,$java=False) + function formatted_list($name,$list,$id='',$default=False) { $select = "\n" .'' - . '' - . '' - . ''; - - $GLOBALS['phpgw']->template->set_var('messages',lang('Are you sure you want to delete this server?')); - $GLOBALS['phpgw']->template->set_var('no','' . lang('No') . ''); - $GLOBALS['phpgw']->template->set_var('yes',$yeslink); - $GLOBALS['phpgw']->template->pparse('out','server_delete'); + $GLOBALS['phpgw']->template->set_var(array( + 'form_action' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiserver.delete'), + 'hidden_vars' => '', + 'messages' => lang('Are you sure you want to delete this server?'), + 'no' => lang('No'), + 'yes' => lang('Yes'), + )); + $GLOBALS['phpgw']->template->pparse('phpgw_body','server_delete'); } } } diff --git a/admin/inc/hook_acl_manager.inc.php b/admin/inc/hook_acl_manager.inc.php index 171fa2ef67..e8a015250f 100644 --- a/admin/inc/hook_acl_manager.inc.php +++ b/admin/inc/hook_acl_manager.inc.php @@ -17,7 +17,7 @@ 'List config settings' => 1, 'Change config settings' => 2 ) - ); + ); // added and working ralfbecker $GLOBALS['acl_manager']['admin']['account_access'] = array( 'name' => 'Deny access to user accounts', @@ -27,9 +27,10 @@ 'Add account' => 4, 'View account' => 8, 'Edit account' => 16, - 'Delete account' => 32 + 'Delete account' => 32, + 'change ACL Rights' => 64 ) - ); + ); // was already there and seems to work ralfbecker $GLOBALS['acl_manager']['admin']['group_access'] = array( 'name' => 'Deny access to groups', @@ -41,7 +42,7 @@ 'Edit group' => 16, 'Delete group' => 32 ) - ); + ); // was already there and seems to work ralfbecker $GLOBALS['acl_manager']['admin']['peer_server_access'] = array( 'name' => 'Deny access to peer servers', @@ -49,7 +50,7 @@ 'Peer server list' => 1, 'Search peer servers' => 2, 'Add peer server' => 4, - 'View peer server' => 8, +// 'View peer server' => 8, // there's no view-routine atm. 'Edit peer server' => 16, 'Delete peer server' => 32 ) @@ -61,9 +62,10 @@ 'Applications list' => 1, 'Add application' => 2, 'Edit application' => 4, - 'Delete application' => 8 + 'Delete application' => 8, + 'Register application hooks' => 16 ) - ); + ); // added and working ralfbecker $GLOBALS['acl_manager']['admin']['global_categories_access'] = array( 'name' => 'Deny access to global categories', @@ -73,9 +75,10 @@ 'Add category' => 4, 'View category' => 8, 'Edit category' => 16, - 'Delete category' => 32 + 'Delete category' => 32, + 'Add sub-category' => 64 ) - ); + ); // added and working ralfbecker $GLOBALS['acl_manager']['admin']['mainscreen_message_access'] = array( 'name' => 'Deny access to mainscreen message', @@ -83,7 +86,7 @@ 'Main screen message' => 1, 'Login message' => 2 ) - ); + ); // added and working ralfbecker $GLOBALS['acl_manager']['admin']['current_sessions_access'] = array( 'name' => 'Deny access to current sessions', @@ -93,33 +96,33 @@ 'Show session IP address' => 4, 'Kill session' => 8 ) - ); + ); // checked and working ralfbecker $GLOBALS['acl_manager']['admin']['access_log_access'] = array( - 'name' => 'Deny access to session log', + 'name' => 'Deny access to access log', 'rights' => array( - 'Show session log' => 1 + 'Show access log' => 1 ) - ); + ); // added and working ralfbecker $GLOBALS['acl_manager']['admin']['error_log_access'] = array( 'name' => 'Deny access to error log', 'rights' => array( 'Show error log' => 1 ) - ); + ); // added and working ralfbecker - $GLOBALS['acl_manager']['admin']['appreg_access'] = array( - 'name' => 'Deny access to application registery', + $GLOBALS['acl_manager']['admin']['asyncservice_access'] = array( + 'name' => 'Deny access to asynchronous timed services', 'rights' => array( - 'Register applications' => 1 + 'Asynchronous timed services' => 1 ) - ); + ); // added and working ralfbecker $GLOBALS['acl_manager']['admin']['info_access'] = array( 'name' => 'Deny access to phpinfo', 'rights' => array( 'Show phpinfo()' => 1 ) - ); + ); // added and working ralfbecker diff --git a/admin/inc/hook_admin.inc.php b/admin/inc/hook_admin.inc.php index 0c693d5685..4f433a371e 100644 --- a/admin/inc/hook_admin.inc.php +++ b/admin/inc/hook_admin.inc.php @@ -8,36 +8,37 @@ * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ + /* $Id$ */ if (! $GLOBALS['phpgw']->acl->check('site_config_access',1,'admin')) { - $file['Site Configuration'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=admin'); + $file['Site Configuration'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=admin'); } if (! $GLOBALS['phpgw']->acl->check('peer_server_access',1,'admin')) { - $file['Peer Servers'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiserver.list_servers'); + $file['Peer Servers'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiserver.list_servers'); } if (! $GLOBALS['phpgw']->acl->check('account_access',1,'admin')) { - $file['User Accounts'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'); + $file['User Accounts'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'); } if (! $GLOBALS['phpgw']->acl->check('group_access',1,'admin')) { - $file['User Groups'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'); + $file['User Groups'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'); } if (! $GLOBALS['phpgw']->acl->check('applications_access',1,'admin')) { - $file['Applications'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.get_list'); + $file['Applications'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.get_list'); } if (! $GLOBALS['phpgw']->acl->check('global_categories_access',1,'admin')) { - $file['Global Categories'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicategories.index'); + $file['Global Categories'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicategories.index'); } if (!$GLOBALS['phpgw']->acl->check('mainscreen_message_access',1,'admin') || !$GLOBALS['phpgw']->acl->check('mainscreen_message_access',2,'admin')) @@ -49,7 +50,7 @@ { $file['View Sessions'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicurrentsessions.list_sessions'); } - + if (! $GLOBALS['phpgw']->acl->check('access_log_access',1,'admin')) { $file['View Access Log'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccess_history.list_history'); @@ -57,7 +58,7 @@ if (! $GLOBALS['phpgw']->acl->check('error_log_access',1,'admin')) { - $file['View Error Log'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uilog.list_log'); + $file['View Error Log'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uilog.list_log'); } if (! $GLOBALS['phpgw']->acl->check('applications_access',16,'admin')) @@ -72,10 +73,9 @@ if (! $GLOBALS['phpgw']->acl->check('info_access',1,'admin')) { - $file['phpInfo'] = "javascript:openwindow('" . $GLOBALS['phpgw']->link('/admin/phpinfo.php') . "','700','600')"; + $file['phpInfo'] = "javascript:openwindow('" . $GLOBALS['phpgw']->link('/admin/phpinfo.php') . "')"; //$GLOBALS['phpgw']->link('/admin/phpinfo.php'); } /* Do not modify below this line */ - - $GLOBALS['phpgw']->common->display_mainscreen('admin',$file); + display_section('admin',$file); ?> diff --git a/admin/inc/hook_after_navbar.inc.php b/admin/inc/hook_after_navbar.inc.php index 4dced0cae9..dbd907a18b 100644 --- a/admin/inc/hook_after_navbar.inc.php +++ b/admin/inc/hook_after_navbar.inc.php @@ -23,7 +23,7 @@ $GLOBALS['phpgw_info']['user']['apps']['admin']) || $GLOBALS['phpgw_info']['server']['checkappversions'] == 'All') { - $_current = array(); + $_current = False; $app_name = $GLOBALS['phpgw_info']['flags']['currentapp']; $GLOBALS['phpgw']->db->query("SELECT app_name,app_version FROM phpgw_applications WHERE app_name='$app_name' OR app_name='phpgwapi'",__LINE__,__FILE__); while($GLOBALS['phpgw']->db->next_record()) @@ -36,34 +36,29 @@ include($_versionfile); /* echo '
    ' . $_versionfile . ','; */ $_file_version = $setup_info[$app_name]['version']; - $_app_title = str_replace('- ','-',ucwords(str_replace('_','- ',$setup_info[$app_name]['name']))), + $_app_title = $setup_info[$app_name]['title']; unset($setup_info); - /* echo '
    ' . $app_name . ',' . $_db_version . ',' . $_file_version; */ - $test = $GLOBALS['phpgw']->common->cmp_version_long($_db_version,$_file_version); - if($test == '') + if($app_name == 'phpgwapi') { - $_current[$app_name] = True; + $api_str = '
    ' . lang('The API requires an upgrade'); + } + /* echo $app_name . ',' . $_db_version . ',' . $_file_version; */ + if(!$GLOBALS['phpgw']->common->cmp_version_long($_db_version,$_file_version)) + { + $_current = True; if($app_name == 'phpgwapi') { $api_str = '
    ' . lang('The API is current'); } } - else - { - if($app_name == 'phpgwapi') - { - $api_str = '
    ' . lang('The API requires an upgrade'); - } - } - unset($test); unset($_file_version); unset($_app_title); } unset($_db_version); unset($_versionfile); } - if(!@isset($_current[$GLOBALS['phpgw_info']['flags']['currentapp']])) + if(!$_current) { echo '
    '; echo $api_str; diff --git a/admin/inc/hook_config.inc.php b/admin/inc/hook_config.inc.php new file mode 100644 index 0000000000..2a412a9dfd --- /dev/null +++ b/admin/inc/hook_config.inc.php @@ -0,0 +1,104 @@ + * + * -------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * + \**************************************************************************/ + + /* $Id$ */ + + function encryptalgo($config) + { + if(@function_exists('mcrypt_list_algorithms')) + { + $listed = array(); + if(!isset($config['mcrypt_algo'])) + { + $config['mcrypt_algo'] = 'tripledes'; /* MCRYPT_TRIPLEDES */ + } + $algos = @mcrypt_list_algorithms(); + $found = False; + + while (list ($key, $value) = each ($algos)) + { + $found = True; + /* Only show each once - seems this is a problem in some installs */ + if(!in_array($value,$listed)) + { + if ($config['mcrypt_algo'] == $value) + { + $selected = ' selected'; + } + else + { + $selected = ''; + } + $descr = strtoupper($value); + + $out .= '' . "\n"; + $listed[] = $value; + } + } + if(!$found) + { + /* Something is wrong with their mcrypt install or php.ini */ + $out = '' . "\n";; + } + } + else + { + $out = '' . "\n";; + } + return $out; + } + + function encryptmode($config) + { + if(@function_exists('mcrypt_list_modes')) + { + $listed = array(); + if(!isset($config['mcrypt_mode'])) + { + $config['mcrypt_mode'] = 'cbc'; /* MCRYPT_MODE_CBC */ + } + $modes = @mcrypt_list_modes(); + $found = False; + + while (list ($key, $value) = each ($modes)) + { + $found = True; + /* Only show each once - seems this is a problem in some installs */ + if(!in_array($value,$listed)) + { + if ($config['mcrypt_mode'] == $value) + { + $selected = ' selected'; + } + else + { + $selected = ''; + } + $descr = strtoupper($value); + + $out .= '' . "\n"; + $listed[] = $value; + } + } + if(!$found) + { + /* Something is wrong with their mcrypt install or php.ini */ + $out = '' . "\n"; + } + } + else + { + $out = '' . "\n"; + } + return $out; + } +?> diff --git a/admin/inc/hook_sidebox_menu.inc.php b/admin/inc/hook_sidebox_menu.inc.php new file mode 100644 index 0000000000..dfac14c6fa --- /dev/null +++ b/admin/inc/hook_sidebox_menu.inc.php @@ -0,0 +1,95 @@ + * + * -------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * + \**************************************************************************/ + + /* $Id$ */ + { + + /* + This hookfile is for generating an app-specific side menu used in the idots + template set. + + $menu_title speaks for itself + $file is the array with link to app functions + + display_sidebox can be called as much as you like + */ + + $menu_title = $GLOBALS['phpgw_info']['apps'][$appname]['title'] . ' '. lang('Menu'); + $file = array(); + + if (! $GLOBALS['phpgw']->acl->check('site_config_access',1,'admin')) + { + $file['Site Configuration'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=admin'); + } +/* + if (! $GLOBALS['phpgw']->acl->check('peer_server_access',1,'admin')) + { + $file['Peer Servers'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiserver.list_servers'); + } +*/ + if (! $GLOBALS['phpgw']->acl->check('account_access',1,'admin')) + { + $file['User Accounts'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_users'); + } + + if (! $GLOBALS['phpgw']->acl->check('group_access',1,'admin')) + { + $file['User Groups'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccounts.list_groups'); + } + + if (! $GLOBALS['phpgw']->acl->check('applications_access',1,'admin')) + { + $file['Applications'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.get_list'); + } + + if (! $GLOBALS['phpgw']->acl->check('global_categories_access',1,'admin')) + { + $file['Global Categories'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicategories.index'); + } + + if (!$GLOBALS['phpgw']->acl->check('mainscreen_message_access',1,'admin') || !$GLOBALS['phpgw']->acl->check('mainscreen_message_access',2,'admin')) + { + $file['Change Main Screen Message'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uimainscreen.index'); + } + + if (! $GLOBALS['phpgw']->acl->check('current_sessions_access',1,'admin')) + { + $file['View Sessions'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicurrentsessions.list_sessions'); + } + + if (! $GLOBALS['phpgw']->acl->check('access_log_access',1,'admin')) + { + $file['View Access Log'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiaccess_history.list_history'); + } + + if (! $GLOBALS['phpgw']->acl->check('error_log_access',1,'admin')) + { + $file['View Error Log'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uilog.list_log'); + } + + if (! $GLOBALS['phpgw']->acl->check('applications_access',16,'admin')) + { + $file['Find and Register all Application Hooks'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.register_all_hooks'); + } + + if (! $GLOBALS['phpgw']->acl->check('asyncservice_access',1,'admin')) + { + $file['Asynchronous timed services'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiasyncservice.index'); + } + + if (! $GLOBALS['phpgw']->acl->check('info_access',1,'admin')) + { + $file['phpInfo'] = "javascript:openwindow('" . $GLOBALS['phpgw']->link('/admin/phpinfo.php') . "')"; + } + + display_sidebox($appname,$menu_title,$file); + } diff --git a/admin/inc/hook_view_account.inc.php b/admin/inc/hook_view_account.inc.php deleted file mode 100644 index 40e7004ebc..0000000000 --- a/admin/inc/hook_view_account.inc.php +++ /dev/null @@ -1,30 +0,0 @@ - 'Login History', - 'url' => '/index.php', - 'extradata' => 'menuaction=admin.uiaccess_history.list_history' - ); - - $GLOBALS['menuData'][] = array( - 'description' => 'ACL Rights', - 'url' => '/index.php', - 'extradata' => 'menuaction=admin.uiaclmanager.list_apps' - ); - - //Do not modify below this line -// global $menuData; - -// $GLOBALS['menuData'][] = $data; -?> \ No newline at end of file diff --git a/admin/inc/hook_view_user.inc.php b/admin/inc/hook_view_user.inc.php deleted file mode 100755 index a451d73603..0000000000 --- a/admin/inc/hook_view_user.inc.php +++ /dev/null @@ -1,25 +0,0 @@ - 'Login History', - 'url' => '/index.php', - 'extradata' => 'menuaction=admin.uiaccess_history.list_history' - ); - - $GLOBALS['menuData'][] = array( - 'description' => 'ACL Rights', - 'url' => '/index.php', - 'extradata' => 'menuaction=admin.uiaclmanager.list_apps' - ); -?> \ No newline at end of file diff --git a/admin/index.php b/admin/index.php index 4718dab574..d94e572457 100755 --- a/admin/index.php +++ b/admin/index.php @@ -2,23 +2,96 @@ /**************************************************************************\ * phpGroupWare - administration * * http://www.phpgroupware.org * - * Written by coreteam * - * & Stephen Brown * - * to distribute admin across the application directories * - * ------------------------------------------------------ * - * This program is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the * - * Free Software Foundation; either version 2 of the License, or (at your * - * option) any later version. * + * Written by Joseph Engo * + * Modified by Stephen Brown * + * to distribute admin across the application directories * + * -------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 2 of the License, or (at your * + * option) any later version. * \**************************************************************************/ + /* $Id$ */ - $GLOBALS['phpgw_info']['flags'] = array - ( - 'currentapp' => 'admin' - ); + $GLOBALS['phpgw_info'] = array(); + $GLOBALS['phpgw_info']['flags']['currentapp'] = 'admin'; include('../header.inc.php'); - header('Location: '. $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uimainscreen.mainscreen')); - exit; + $GLOBALS['admin_tpl'] = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); + $GLOBALS['admin_tpl']->set_file( + Array( + 'admin' => 'index.tpl' + ) + ); + + $GLOBALS['admin_tpl']->set_block('admin','list'); + $GLOBALS['admin_tpl']->set_block('admin','app_row'); + $GLOBALS['admin_tpl']->set_block('admin','app_row_noicon'); + $GLOBALS['admin_tpl']->set_block('admin','link_row'); + $GLOBALS['admin_tpl']->set_block('admin','spacer_row'); + + $GLOBALS['admin_tpl']->set_var('title',lang('Administration')); + + // This func called by the includes to dump a row header + function section_start($appname='',$icon='') + { + $GLOBALS['admin_tpl']->set_var('icon_backcolor',$GLOBALS['phpgw_info']['theme']['row_off']); + $GLOBALS['admin_tpl']->set_var('link_backcolor',$GLOBALS['phpgw_info']['theme']['row_off']); + $GLOBALS['admin_tpl']->set_var('app_name',$GLOBALS['phpgw_info']['apps'][$appname]['title']); + $GLOBALS['admin_tpl']->set_var('a_name',$appname); + $GLOBALS['admin_tpl']->set_var('app_icon',$icon); + if ($icon) + { + $GLOBALS['admin_tpl']->parse('rows','app_row',True); + } + else + { + $GLOBALS['admin_tpl']->parse('rows','app_row_noicon',True); + } + } + + function section_item($pref_link='',$pref_text='') + { + $GLOBALS['admin_tpl']->set_var('pref_link',$pref_link); + $GLOBALS['admin_tpl']->set_var('pref_text',$pref_text); + $GLOBALS['admin_tpl']->parse('rows','link_row',True); + } + + function section_end() + { + $GLOBALS['admin_tpl']->parse('rows','spacer_row',True); + } + + function display_section($appname,$file,$file2=False) + { + if ($file2) + { + $file = $file2; + } + if(is_array($file)) + { + section_start($appname, + $GLOBALS['phpgw']->common->image( + $appname, + Array( + 'navbar', + $appname, + 'nonav' + ) + ) + ); + + while(list($text,$url) = each($file)) + { + section_item($url,lang($text)); + } + section_end(); + } + } + + $GLOBALS['phpgw']->hooks->process('admin'); + $GLOBALS['admin_tpl']->pparse('out','list'); + + $GLOBALS['phpgw']->common->phpgw_footer(); ?> diff --git a/admin/navbar-create.php b/admin/navbar-create.php index 5d3e116475..13fc39cefb 100644 --- a/admin/navbar-create.php +++ b/admin/navbar-create.php @@ -27,4 +27,6 @@ The instructions are as follows: echo "\nlink("/admin/navbar-sel.php","filename=".$phpgw_info["server"]["server_root"]."/".$key."/images/navbar.gif")."\">"; echo $phpgw_info["apps"][$key]["title"]."
    "; } + + $phpgw->common->phpgw_footer(); ?> diff --git a/admin/phpinfo.php b/admin/phpinfo.php index fca0a7fd00..3c5b718137 100755 --- a/admin/phpinfo.php +++ b/admin/phpinfo.php @@ -8,14 +8,20 @@ * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ + /* $Id$ */ - $GLOBALS['phpgw_info']['flags'] = array - ( - 'noframework' => True, - 'currentapp' => 'admin' + $phpgw_info['flags'] = array( + 'noheader' => True, + 'nonavbar' => True, + 'currentapp' => 'admin' ); include('../header.inc.php'); + + if ($GLOBALS['phpgw']->acl->check('info_access',1,'admin')) + { + $GLOBALS['phpgw']->redirect_link('/index.php'); + } // Throw a little notice out if PHPaccelerator is enabled. if($GLOBALS['_PHPA']['ENABLED']) @@ -23,6 +29,8 @@ echo 'PHPaccelerator enabled:
    '."\n"; echo 'PHPaccelerator Version: '.$GLOBALS['_PHPA']['VERSION'].'

    '."\n"; } - + phpinfo(); + +// $phpgw->common->phpgw_footer(); ?> diff --git a/admin/templates/default/accesslog.tpl b/admin/templates/default/accesslog.tpl index 95febfc2c9..16fa29cb3f 100644 --- a/admin/templates/default/accesslog.tpl +++ b/admin/templates/default/accesslog.tpl @@ -23,7 +23,7 @@
     {title}
     {error}
     
     {lang_Addressbook}/{lang_Contact_Settings} -
    {lang_Contact_application}:
    {lang_Country_Selection} ({lang_Text_Entry}/{lang_SelectBox}): - -
    '.lang('Application').' '.lang('ACL').'
    ' . $perm_display[$i][1] . '' - . ($apps_with_acl[$app] && $group_info['account_id']?''
-					. lang('Grant Access').'':' ').'
     
    %s%s%s%s%s%s%s 
    '.lang('Application').' '.lang('ACL').'
    ' . $perm_display[$i][1] . '' + . ($apps_with_acl[$app] && $group_info['account_id']?''
+					. lang('Grant Access').'':' ').'
     
    %s 

    {lang_loginid} {lang_ip} {lang_login}{lang_total}
    {footer_total}
    {lang_percent}
    @@ -46,7 +46,7 @@ - + {row_loginid} {row_ip} {row_li} @@ -56,7 +56,7 @@ - + {row_message} diff --git a/admin/templates/default/account_form.tpl b/admin/templates/default/account_form.tpl new file mode 100644 index 0000000000..4a688c7e78 --- /dev/null +++ b/admin/templates/default/account_form.tpl @@ -0,0 +1,93 @@ + +{error_messages} + +
    +
    + + + + + +
    + {rows} + + + + + + + + + + + + + + + + + + + + + + + {password_fields} + + + + + + + + + + + + + + + + + + + {permissions_list} + + {form_buttons} + +
    {lang_action}
    {lang_loginid}{account_lid} {lang_account_active}:{account_status}
    {lang_firstname}{account_firstname} {lang_lastname}{account_lastname} 
    {lang_changepassword}{changepassword}{lang_anonymous}{anonymous}
    {lang_expires}{input_expires}  {lang_never} {never_expires}
    {lang_groups}{groups_select} 
    +
    +
    +
    + + + + + {lang_password} + + {lang_reenter_password} + + + + + + + + + + + + + {lang_lastlogin} + {account_lastlogin} + + {lang_lastloginfrom} + {account_lastloginfrom} + + + + + +  {row_text} + + diff --git a/admin/templates/default/account_form_ldap.tpl b/admin/templates/default/account_form_ldap.tpl index 309811d983..9c163607dd 100644 --- a/admin/templates/default/account_form_ldap.tpl +++ b/admin/templates/default/account_form_ldap.tpl @@ -2,56 +2,74 @@ {error_messages}
    -
    - - - - - -
    - {rows} - - - - - - - - - - - - - - - - - - {password_fields} - - - - - - - - - - - - - - - {permissions_list} - {form_buttons} -
    {lang_action}
    {lang_loginid}{account_lid} {lang_account_active}:{account_status}
    {lang_firstname}{account_firstname} {lang_lastname}{account_lastname} 
    {lang_homedir}{homedirectory} {lang_shell}{loginshell} 
    {lang_groups}{groups_select} 
    {lang_expires}{input_expires}  {lang_never} {never_expires}
    -
    -
    +
    + + + + + +
    + {rows} + + + + + + + + + + + + + + + + + + + + + + + {password_fields} + + + + + + + + + + + + + + + + + + + + + + + + + + {permissions_list} + + {form_buttons} + +
    {lang_action}
    {lang_loginid}{account_lid} {lang_account_active}:{account_status}
    {lang_firstname}{account_firstname} {lang_lastname}{account_lastname} 
    {lang_homedir}{homedirectory} {lang_shell}{loginshell} 
    {lang_expires}{input_expires}  {lang_never} {never_expires}
    {lang_changepassword}{changepassword}{lang_anonymous}{anonymous}
    {lang_groups}{groups_select} 
    +
    +
    - + {lang_password} {lang_reenter_password} @@ -60,16 +78,13 @@ - - - -
    - + + - + {lang_lastlogin} {account_lastlogin} @@ -79,7 +94,7 @@ - -  {row_text} - + +  {row_text} + diff --git a/admin/templates/default/accounts.tpl b/admin/templates/default/accounts.tpl new file mode 100644 index 0000000000..de2834693b --- /dev/null +++ b/admin/templates/default/accounts.tpl @@ -0,0 +1,62 @@ + +

    +

    + + + + + + +
    {left_next_matchs}{lang_user_accounts}{right_next_matchs}
    +
    + +
    + + + + + + + + + + + {rows} + +
    {lang_loginid}{lang_lastname}{lang_firstname}{lang_edit}{lang_delete}{lang_view}
    +
    + + +
    + + + + + +
    + {input_add} + + +
    + {input_search} +
    +
    +
    + + + + + {row_loginid} + {row_lastname} + {row_firstname} + {row_edit} + {row_delete} + {row_view} + + + + + + {message} + + diff --git a/admin/templates/default/acl_accounts.tpl b/admin/templates/default/acl_accounts.tpl index e2c30522fb..0938c91de7 100644 --- a/admin/templates/default/acl_accounts.tpl +++ b/admin/templates/default/acl_accounts.tpl @@ -14,7 +14,7 @@
    - + @@ -42,7 +42,7 @@ - + diff --git a/admin/templates/default/acl_applist.tpl b/admin/templates/default/acl_applist.tpl index 3bfa6d08f3..ed5312c15c 100644 --- a/admin/templates/default/acl_applist.tpl +++ b/admin/templates/default/acl_applist.tpl @@ -1,21 +1,21 @@ -{lang_header} -

    -

    {lang_loginid} {lang_lastname} {lang_firstname}
    {row_loginid} {row_lastname} {row_firstname}
    {rows}
    +
    + +
    - + [ {app_name} ]   {app_name} - +   {app_name} diff --git a/admin/templates/default/acl_manager_form.tpl b/admin/templates/default/acl_manager_form.tpl index c10c9a75bd..0def47790c 100644 --- a/admin/templates/default/acl_manager_form.tpl +++ b/admin/templates/default/acl_manager_form.tpl @@ -1,20 +1,11 @@ -{lang_title} -

    -

    - - - - - - - - - - - -
    {lang_message}
    {select_values}
    +
    +

    {lang_message}

    +

    {select_values}

    +

      +

    +
    diff --git a/admin/templates/default/app_data.xsl b/admin/templates/default/app_data.xsl deleted file mode 100644 index e70fafebdc..0000000000 --- a/admin/templates/default/app_data.xsl +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - {$app_title} - - - - -   - - - - - -   - - - -   - - - - - - - - - - - - - row_off - - - row_on - - - -  •  - - diff --git a/admin/templates/default/application_form.tpl b/admin/templates/default/application_form.tpl index acbd227345..a584dffdd8 100644 --- a/admin/templates/default/application_form.tpl +++ b/admin/templates/default/application_form.tpl @@ -1,21 +1,25 @@ -

    {lang_header} -


    {error} - +

    {hidden_vars}
    - + {rows} - + @@ -25,7 +29,7 @@ - + diff --git a/admin/templates/default/applications.tpl b/admin/templates/default/applications.tpl index c92fa434e4..2b44c8f692 100644 --- a/admin/templates/default/applications.tpl +++ b/admin/templates/default/applications.tpl @@ -1,10 +1,8 @@ -

    {lang_installed}


    - -

    +

     
    - + +   + +   + + +
    {label} {value}
    - + {left} {right} @@ -12,7 +10,7 @@
    {lang_showing}
    - + @@ -22,10 +20,14 @@ {rows}
    {sort_title} {lang_edit} {lang_delete}
    + + {addbutton} + + -
    + @@ -36,13 +38,13 @@
    - + - + {name} {edit} {delete} - {status} + {status} diff --git a/admin/templates/default/category_form.tpl b/admin/templates/default/category_form.tpl new file mode 100644 index 0000000000..1bea5d9bd8 --- /dev/null +++ b/admin/templates/default/category_form.tpl @@ -0,0 +1,28 @@ + + + + +
    +{message}
    +
    + + + + + + + + + + + + + + + + + +
    {lang_parent}
    {lang_name}:
    {lang_descr}:
    +
    + + diff --git a/admin/templates/default/cats.xsl b/admin/templates/default/cats.xsl deleted file mode 100644 index f376730482..0000000000 --- a/admin/templates/default/cats.xsl +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - row_off - - - row_on - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - window.status=' - - '; return true; - - - - - - - - window.status=' - - '; return true; - - - -
    - -
    - - - - - - - - - - - -
    -
    - - - - - - - - - - - - - - - - - - -
    - -
    - - - -
    : - - window.status=' - - '; return true; - - - - - -
    : -
    - - - - - - window.status=' - - '; return true; - - - - - - - window.status=' - - '; return true; - - - - - - - window.status=' - - '; return true; - - -
    -
    diff --git a/admin/templates/default/config.tpl b/admin/templates/default/config.tpl index fc0c79f8d8..71bf009dd0 100644 --- a/admin/templates/default/config.tpl +++ b/admin/templates/default/config.tpl @@ -1,19 +1,13 @@ - - -
    - +
    - - - - + + + + + + - - - @@ -92,8 +70,7 @@ - - - + - + - - - - - - - - + @@ -232,17 +200,15 @@ - @@ -255,6 +221,7 @@
     {title}
    {lang_Would_you_like_phpGroupWare_to_check_for_new_application_versions_when_admins_login_?}:{lang_Would_you_like_phpGroupWare_to_check_for_a_new_version
    when_admins_login_?}:
    {lang_Maximum_entries_in_click_path_history}:
    {lang_Would_you_like_to_automaticaly_load_new_langfiles_(at_login-time)_?}:
     {lang_appearance}
     {lang_security}
    {lang_Use_cookies_to_pass_sessionid}:
    {lang_check_ip_address_of_all_sessions}:
    {lang_Minimum_password_length}:
    {lang_Require_non-alpha_characters}: - -
    {lang_How_many_days_should_entries_stay_in_the_access_log,_before_they_get_deleted_(default_90)_?}:
    +
    diff --git a/admin/templates/default/config_footer.tpl b/admin/templates/default/config_footer.tpl index c640044646..dd925ed01c 100644 --- a/admin/templates/default/config_footer.tpl +++ b/admin/templates/default/config_footer.tpl @@ -1,5 +1,5 @@ - +   diff --git a/admin/templates/default/config_head.tpl b/admin/templates/default/config_head.tpl index 7929450181..a30664540c 100644 --- a/admin/templates/default/config_head.tpl +++ b/admin/templates/default/config_head.tpl @@ -1,7 +1,7 @@ - + diff --git a/admin/templates/default/currentusers.tpl b/admin/templates/default/currentusers.tpl index 9c248d310a..0379944735 100644 --- a/admin/templates/default/currentusers.tpl +++ b/admin/templates/default/currentusers.tpl @@ -1,14 +1,14 @@
     {title}
    - + {left_next_matchs} {right_next_matchs} - + @@ -24,7 +24,7 @@ - + @@ -33,3 +33,5 @@ + + diff --git a/admin/templates/default/delete_cat.tpl b/admin/templates/default/delete_cat.tpl new file mode 100644 index 0000000000..af38b9c23a --- /dev/null +++ b/admin/templates/default/delete_cat.tpl @@ -0,0 +1,35 @@ + + + +
    + + {hidden_vars} +
       
    {sort_loginid} {sort_ip} {sort_login_time}
    {row_loginid} {row_ip} {row_logintime}{row_kill}
    + + + + + + + + + + + + + + + +
    +

    {cat_name}

    + {messages} +
    {lang_subs} {subs}
    + + + + + +
    +
    + + diff --git a/admin/templates/default/delete_common.tpl b/admin/templates/default/delete_common.tpl index c92490b32a..188635320c 100644 --- a/admin/templates/default/delete_common.tpl +++ b/admin/templates/default/delete_common.tpl @@ -1,16 +1,20 @@ -
    +

    +

    +
    + {hidden_vars} {messages}
    - {no} + - {yes} +
    -
    + +
    diff --git a/admin/templates/default/group_form.tpl b/admin/templates/default/group_form.tpl new file mode 100644 index 0000000000..012bd15057 --- /dev/null +++ b/admin/templates/default/group_form.tpl @@ -0,0 +1,79 @@ + + + {error} + + + + + +
    + {rows} + + + + {hidden_vars} + + + + + + + + + + + + + + + + + + + + + + + + + +
    {lang_group_name}
    {lang_include_user} + {accounts} +
    {lang_file_space} + {account_file_space}{account_file_space_select} +
    {lang_permissions} + {permissions_list} +
    + +
    +
    + + + + + + + + + + + + + + +
    + + + + +
    + + diff --git a/admin/templates/default/group_manager.tpl b/admin/templates/default/group_manager.tpl index 82f2aa5575..7554e2abc2 100755 --- a/admin/templates/default/group_manager.tpl +++ b/admin/templates/default/group_manager.tpl @@ -10,14 +10,14 @@ - + {hidden} - + @@ -31,7 +31,7 @@ - + diff --git a/admin/templates/default/groups.tpl b/admin/templates/default/groups.tpl new file mode 100644 index 0000000000..55a6d44ae9 --- /dev/null +++ b/admin/templates/default/groups.tpl @@ -0,0 +1,50 @@ + +

    +

    {lang_group}: {group_name}
    {lang_select_managers} {group_members}
     {row_text}
    + + + + + +
    {left_next_matchs}{lang_groups}{right_next_matchs}
    + + + + + + + + + {rows} + +
    {sort_name}{header_edit}{header_delete}
    + + + + + + +
    + + {input_add} + + +
    + {input_search} +
    +
    + + + + + {group_name} + {edit_link} + {delete_link} + + + + + + {message} + + diff --git a/admin/templates/default/groups.xsl b/admin/templates/default/groups.xsl deleted file mode 100644 index 1ccaebae6d..0000000000 --- a/admin/templates/default/groups.xsl +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    - -
    - - - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - row_off - - - row_on - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - window.status=' - - '; return true; - - - - - - - - - - window.status=' - - '; return true; - - - -
    - -
    - - - - - - - - - - - - - - - - - - -
    - - - - - - -
    - -
    - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    - -
    - -
    - - - - - - - -
     
    -
    - - - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - row_off - - - row_on - - - - - - - - - - - - - - - - - - - - - {$img_name} - - - - - diff --git a/admin/templates/default/images/navbar.png b/admin/templates/default/images/navbar.png index 677112d33c2b39987c8b86389e59d35bf6e97886..7bcb24ceec8bf888e799bb8e509bd9beea40a6f6 100644 GIT binary patch literal 1497 zcmXw24@?th94&`-dTI?P6s;SO)5*lG;7Mu%8$y8soi?N(B1Zmn(#}Q-5~#{QwcD!H zrE1kqi*%-&g%ww3k?J~ESu@M*q|7sPT1J6RP|kT`qZKNaea!47_kHj8zV}@&FYlUj zd09(f227z)mgHn-@WCEE_bdpdP(n)fxmqcdP)hFR{LDY@-A9v(bajwT!vqGWiA}na zY%17-d+AKRRtotEl~T?nOh~mDvuIf^j|V|h2ks(phT32;*&G-%$*7>N;VB6Ng0TfK9U}Gsm2FmMDxG}4Utd<2b-63+Qrqg5!= zYITMJp)lxE$duZo6dtfK0HRoKuNQ(=fDyp%yvyWB|}3t(pPr3gLF=5zz@aJg{LL+|)QnZ}I9aV&P6fpOJ( zbHE?)k|be7fXCyuYYdhsbna{QG7!vigQXX6!WZ=65Svqo@fAfvsljY#Fu8R~y-IH} zE9Lc44fasebqs2~I zkS6t9q;BtAdEP)Lg?M6RkyH&v^1nlJq=wJSqoj`C6M}(WlUZ1kS1GL7 zS5{q45$zUYRT5DQ#!O^l-xO!j{&%ETR#cQrYAET|+|`@cPu4IJ}C zIUEt#;fC!`@<7!#oX0 zHu-pD_Q8)jJ{(KaMubBDJYIM>ArKqR{(_u2f)%8$cqQMXmko_K6#6 zj$O0E-sqfL{WCM~jl5XaJG2>!%&o;5%6ecm)*zUQR*w9RRV7^io-;YNrO~^xGiGXV zkLbw<8TjmX;#1=xyF!=6-cG$d;(b5S+P5}5csjd+Dlar==1QJzY+=9bER)PGPQBha z7@y(3{d}<2R(FPR^dPo97U#%*-1Cc!rk_r=_KrUMdR3@k|2v&IC7Xt+`6Xd(9hVyT z&BrF{Mz&Ul*V8J>W01t|BMGY;Q+i6L8furarW@mfD~;VxL<@HB{F&a;z}wQ*|9p5| zTh_wlb7kEZZjL`~IisWRFepc>(yonqvX-v+^KYs5W<(bzn(19N+g2N&a^R=eUD)xK zQPmRU{EqfV)010ooPH|*VW%Xl!*sHIYhUc6D^Bsy6_MdYv-axxjaL;@-S-o2b++Y6 zb`IP*d2Ya6cR#JsXQ^F;(q|qoXziPgKxfg6Df`BC9bd49SSOPYsE5KMBTEJ@x3o@d zzCbCwx$P<5z4o>9{NPp5p2cS!+Y;-0mB=gWV-ay<@YfT-PmJnk3qY$zIWDV1tNsm$&=kH82Op5gFzaSRS18O8GJjWs+asfTr``opF!eB3oGAsiCjA)%kb8S(@evWc-LD-31j}ak;=R@Hz837uLhbIA| zG@ya7L{kfi#GVEq6sx3Cxyjl@B>9`s0T&je=%*w_n;P6L-cTZu1w)(jxJ?wrnrfg1~A!AOGU5tW(ufoPnz zJ3Ji6N#rWE!5$@IER#T+g;ZQ5R_Iv*G<*C(e83lsP|@rd$*~wh(u`c!D3+>Jh9}tzO_i0}<8gus!Ae651W8U>04&$Iu!y46 z1_?!hNK~P3GMlZi2u6cI z4^X@}fOE8`$moDXQY;iD;z=~nCj=l6#<{c_o0ktF?f^k^ywTFof`$_e$ML+{*sQ2% zaiKvWfSuj|%d$9epJgX09FPnLfRG{}7?#j96U5_Usiwl_p<*JX!RhgZ-DUvGw0uyM zKPP*2`X%0~)9XGFtR#obZx++Kl48NZ%=|TJJifO0qw@Or*2-U?%EKL1-Mi~EkN#di zuUXkzOd+<1Cxgj?-oev2dT!ZfV)}H?VfMx2{=BcIJi0PDKJ&oyn{7Ak)jxd74~+M}nwT@nPNFwuR&#G(Ov~*31?|5;@cj->mt|t$6Zg1Jv`9;-(6rFMLuN#XNm7QMEb0N@8 z8UJNAp62;O-`D^4bH8m~K}lQ9v4gRZ>Kw)5{=6LvUnd)DGh>t;N7``EUBhPG_p zc= + + + + {rows} +
    + + + + + [ {app_name} ] +   {app_name} + + + + + +   {app_name} + + + + + +  • {pref_text} + + + + + +   + + diff --git a/admin/templates/default/kill_session.tpl b/admin/templates/default/kill_session.tpl index fd47b4fef8..5f9d1eec8a 100644 --- a/admin/templates/default/kill_session.tpl +++ b/admin/templates/default/kill_session.tpl @@ -1,6 +1,4 @@ -{lang_title} -

    - +
    + diff --git a/admin/templates/default/nntp.tpl b/admin/templates/default/nntp.tpl index 2632a54fff..bcde39b313 100755 --- a/admin/templates/default/nntp.tpl +++ b/admin/templates/default/nntp.tpl @@ -34,7 +34,7 @@ function check_all() {common_hidden_vars}
    {lang_message} diff --git a/admin/templates/default/listcats.tpl b/admin/templates/default/listcats.tpl new file mode 100644 index 0000000000..95ff7edf60 --- /dev/null +++ b/admin/templates/default/listcats.tpl @@ -0,0 +1,53 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + {left} + + {right} + +
    {lang_showing}
    +
    +
    +  
    {sort_name}{sort_description}{lang_sub}{lang_edit}{lang_delete}
    {name}{descr}{add_sub}{edit}{delete}
    +
    diff --git a/admin/templates/default/listservers.tpl b/admin/templates/default/listservers.tpl index aab1bf94f4..a5832a645d 100644 --- a/admin/templates/default/listservers.tpl +++ b/admin/templates/default/listservers.tpl @@ -1,8 +1,5 @@
    - - - + + - - - - - - - - + + + + + + + + + - + - - + + - - - - - - - - + + + +
    {title_servers}
    @@ -14,42 +11,45 @@
     
     
    {sort_name}{sort_url}{sort_mode}{sort_security}{lang_edit}{lang_delete}
    {sort_name}{sort_url}{sort_mode}{sort_security}{lang_edit}{lang_delete}
    {server_name} {server_url} {server_mode} {server_security} {lang_edit_entry}{lang_delete_entry}{edit}{delete}
    +
    +
    +
    +
    diff --git a/admin/templates/default/mainscreen_message.tpl b/admin/templates/default/mainscreen_message.tpl index 43c6fbc8cc..7be96641cf 100644 --- a/admin/templates/default/mainscreen_message.tpl +++ b/admin/templates/default/mainscreen_message.tpl @@ -1,7 +1,5 @@ -

    {header_lang}


    - -{error_message}

    +

    {error_message}

    @@ -14,14 +12,14 @@ - + - + diff --git a/admin/templates/default/menurow.tpl b/admin/templates/default/menurow.tpl index cd69238a5a..8a4dd5d2fa 100644 --- a/admin/templates/default/menurow.tpl +++ b/admin/templates/default/menurow.tpl @@ -1,6 +1,6 @@
    {label} {value}
    {value}
    - + {all_rows} @@ -8,12 +8,12 @@ - +
     
     
      {lang_done}  {lang_done}
    -
      {row_text}
    - + @@ -45,7 +45,7 @@ function check_all() - + @@ -55,7 +55,7 @@ function check_all() - + - - - - - - - - - - - - - - - - - - - - - - - row_off - - - row_on - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {sort_con} {sort_group} {sort_active}
    {con} {group} {active}
      diff --git a/admin/templates/default/server_form.tpl b/admin/templates/default/server_form.tpl index fc6dafda78..e859e50e3f 100644 --- a/admin/templates/default/server_form.tpl +++ b/admin/templates/default/server_form.tpl @@ -1,84 +1,63 @@ -
    - - - - -
    {title_servers}
    - {message} +
    + {message} + + - - + - + - + - + - + - + - + - + - + - + -
    {lang_name}:
    {lang_url}:
    {lang_mode}: {server_mode}
    {lang_security}: {server_security} {ssl_note}
    {lang_trust}: {trust_level}
    {lang_relationship}: {trust_relationship}
    {lang_username}:
    {lang_password}:  {pass_note}
    {lang_admin_name}:
    {lang_admin_email}:
    - - - - - - + + + + + +
    - - -
    -
    +   + + + +
    -
    - - - - - - - - - -
    - -
    -
    -
    -
    -
    - - + + diff --git a/admin/templates/default/users.xsl b/admin/templates/default/users.xsl deleted file mode 100644 index 9f3c7a5dd6..0000000000 --- a/admin/templates/default/users.xsl +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    - -
    - - - - - -
    -
    -
    - - - - - - - - -
    - - - - - - - - -
    - - - - - - window.status=' - - '; return true; - - - - - - - - - window.status=' - - '; return true; - - -
    - - - - - - - - - - - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - -
    - -
    - - - - - - - - -
    - - - - - - -
    -
    - - - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - row_off - - - row_on - - - - - - - - - - - - - - - - diff --git a/admin/templates/idots/images/navbar.png b/admin/templates/idots/images/navbar.png new file mode 100755 index 0000000000000000000000000000000000000000..5de9eb1142811127bb97ead7c5072dbbd4433a27 GIT binary patch literal 2966 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 M07*qoM6N<$g1~jVuK)l5 literal 0 HcmV?d00001 diff --git a/admin/templates/idots/index.tpl b/admin/templates/idots/index.tpl new file mode 100644 index 0000000000..673af0e6b3 --- /dev/null +++ b/admin/templates/idots/index.tpl @@ -0,0 +1,51 @@ + + + + + {rows} +
    + + + + + [ {app_name} ] +   {app_name} + + + + + +   {app_name} + + + + + +  • {pref_text} + + + + + +   + + diff --git a/admin/templates/verdilak/images/navbar.gif b/admin/templates/verdilak/images/navbar.gif new file mode 100755 index 0000000000000000000000000000000000000000..d2b0bfccf1c45159332a6d7ff77cdb879b398876 GIT binary patch literal 1376 zcmWlYVNVkW06>oeD;!whU^l6(zztC=RIJz`1B5avRz+7CbA%BAX-IK|Ro84pi4?3* zw6dzzoJ)t*Rd*zv>9mq&>Ew{29qZ(Dm)V$3y9LO7xZ!2HvC|!6?Iof75YiJK_&?|fnB^8OlXt~)^ zt85tHXh)A7=NTvMhaDb*z}2V(4A{jsr#C{=LBh)Ne4e^fqqkxB0fG>Dt-)Y%`K(}&q-auN z$9*0msF0VqEuy?yD~-bnRSSeDXqw?D5jQ(f(qvO>TWULPkqF5!3ohS%L16uE6vw81tC?ZvuF&qTNj2C8ET8yA{XobV=*O?p+Ctk1939Q9rb(ECXI(tCLGE!wY8U?`& znbwMXyn)aoxw_Nr@Nn!OoEH{}b6H9rAe{9^Y?h%_EvMWj5G~jH?NCdni6)_Pm4@a1 zk}B$zS|g0eh)@_3BSDHHBXiN&ITPkZWolo5lqfWImzU@GD8tZh7|l~g!T}8TNl^ta z@GjG`nANy%iX|YL6<88fsShZ$mIj>>_XZ?#O}Eu$bNRfMIGRXN>8u=$QBjr-CAvI> z5QZ%duijviASmmGW|_YUGK{(Xv=5eRIs+tyNMsC&ia?0t7G)Y^OAn^d8jV&r!?Jp_ zD^Jx>I~*tmLUT=xCvBfx=eO=lxAdVgQC{pw}M_GWWjK~$yuT`sC8DJ#vn*yclkJ; z7X%?hg_TN`!%cu7Y<74t+)t1ZG8~~v@xx!9qO6@m8B1+&up8B z?nVYm3xSNTaqAoV3O8k=>#`@VcgG+9WZ=cwRPf-^jayaUPF+DQfw7KG=bxjl)(4fX zUzz^hn3Fue9RS?L1&hB=*d&Syv=bHPcZ@x80PG7!Q zoteJAkrK9Mzn(jA`@=PHjeQGA*p;8-PtJ_4_+HpvdFsZiv@OZ)r;m&lf?sZ$2U4mw zmX*SFIit70tTo4yhoe>L=`q-gwtTwQ!8P`&mkkdSz? zT|1EfT^$;;N}j)Y0!$q4>fL%dv+gIwq4xc&67#!8+HxKN9}~ImF%UvV7W-;myIguA zt#W?f<`^Y6KN9=i(86%FJn53{#}(&s(|!5M_`AE)Q2ks(phT32;*&G-%$*7>N;VB6Ng0TfK9U}Gsm2FmMDxG}4Utd<2b-63+Qrqg5!= zYITMJp)lxE$duZo6dtfK0HRoKuNQ(=fDyp%yvyWB|}3t(pPr3gLF=5zz@aJg{LL+|)QnZ}I9aV&P6fpOJ( zbHE?)k|be7fXCyuYYdhsbna{QG7!vigQXX6!WZ=65Svqo@fAfvsljY#Fu8R~y-IH} zE9Lc44fasebqs2~I zkS6t9q;BtAdEP)Lg?M6RkyH&v^1nlJq=wJSqoj`C6M}(WlUZ1kS1GL7 zS5{q45$zUYRT5DQ#!O^l-xO!j{&%ETR#cQrYAET|+|`@cPu4IJ}C zIUEt#;fC!`@<7!#oX0 zHu-pD_Q8)jJ{(KaMubBDJYIM>ArKqR{(_u2f)%8$cqQMXmko_K6#6 zj$O0E-sqfL{WCM~jl5XaJG2>!%&o;5%6ecm)*zUQR*w9RRV7^io-;YNrO~^xGiGXV zkLbw<8TjmX;#1=xyF!=6-cG$d;(b5S+P5}5csjd+Dlar==1QJzY+=9bER)PGPQBha z7@y(3{d}<2R(FPR^dPo97U#%*-1Cc!rk_r=_KrUMdR3@k|2v&IC7Xt+`6Xd(9hVyT z&BrF{Mz&Ul*V8J>W01t|BMGY;Q+i6L8furarW@mfD~;VxL<@HB{F&a;z}wQ*|9p5| zTh_wlb7kEZZjL`~IisWRFepc>(yonqvX-v+^KYs5W<(bzn(19N+g2N&a^R=eUD)xK zQPmRU{EqfV)010ooPH|*VW%Xl!*sHIYhUc6D^Bsy6_MdYv-axxjaL;@-S-o2b++Y6 zb`IP*d2Ya6cR#JsXQ^F;(q|qoXziPgKxfg6Df`BC9bd49SSOPYsE5KMBTEJ@x3o@d zzCbCwx$P<5z4o>9{NPp5p2cS!+Y;-0mB=gWV-aythe same as ascii
    "; print $button->createInputButton("Lars is the best ;)",'submit','ascii'); print ""; + + $phpgw->common->phpgw_footer(); ?> diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 8810f8a02ad9983d0dd0a9ad7f433f5d368085bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 zcmchZSx{3~7{}xEp%0x-JALT%p)*d$m%cjH>5QXe)!M4niX&)Ql&mB{LRb<)7EB1- zn>`_r9YXd6DQZy=R4Qvhp)9rvR4Y(-1w}j zArO|p-?Gm>B!sU|KOhi32KzbO%ivxQ_Y%Sv8gD>%rbOc2l4Vrn1)SD^!xD5_ zgDxACS>jw{5m^9|aOg4)5#^AinZyjrE*5E57Ck99jbv0yfxB2Nw?(He6xpRTpNvr| zCL^r4_${lpef34mhLuTMSE~ffpmT9pB}lH*TCC!c{W69Jp^F(i;y14%#%|UK=t4$p z4kbp(qk8S8Mez#)RG6FQMH%2!c|JAmhmBlDqR*zkedW)~gT3cFjyG33T~__uvm8d1 zULm!LsQ`jv;P2hDZB6TmpZZQWO+A?mg+jNlTm< z_+d}ekzY?%`gQ!sRGjaZO;;GTN3d?tWesm4r`4oW7=&S`AS~YMV^;cg77epuo`e>V#>hT&dEm; z0D|lOom=PI>kg>dK6xr0ENDdeXt>5TK^EF}jmSIGz=_4YJ&9Xa zGZVI2P)^WC?jGNYH#%g$vFxn+C}%l~8ru#JrRkY3fcz#%{BSh(p~fj#JJC zDGUvDnS`Pjvwmx5$`nxN&ne#!BtP&)gGf-svIoADTM%)HC zZM-H$v5+dyO49Jib}7T0M^$l?rR=2g0tUW}UirQvKG~;W)%Yz9We6IhUehup@F`pU->_kcBe z^-^D3-C-ji&j)a!AT!yVM*$xpV_|EQOH-T$DK2#3NMX+6@e1QyHjkDMI_|=hb7xMC z^mqL|Jq4^Q7y3Gmx&n%Q@DsLBIzA=50^vi0ZW1JGISD1Xdn_WNt1!iHRbk5W>wmG_ zrG9&fPnPN|pov+D(p+|>!_ZJ2?C)&sI$nV}1+@oZsD(@bxe8L$+41za^*c7KjQ!?I zQp{RSc7nG^G@pWvM6zH6R?@2%!*Qz2imwZp2D?tR9JB>gY}_MgSn`=xF-@66LbHkF z9c#C(TLFhmHfcLMX$zW>;F7Ukkp828H4{0i1UPutKy-_@bPlRk*!>`A5Ok@Nzx zA)f{5mrL78irZ9z3dXJt-54IY(B0fx?S!bkIt!xaH6S2<#42t+Xgyk10PBXaO7m0H zIYj8X5hj|omln5CCCTY*s(bw4E`;^Yjla%fDP%$x#6_*)f^+aevs{2d0SDiGI9sZ` zw%+!iVFLo|@?cMQW3^wIj?a&3ycP?d^~l4U9axZZ`Kht(^*>(d{U!A5+4R)Yvu(BQ zHJ&K_$nNX1+$-)=+nC(up$; z+BJ=b9o?8`j GnE3~ True, - 'currentapp' => $app - ); - include('header.inc.php'); - - $GLOBALS['phpgw']->help = CreateObject('phpgwapi.help_helper'); - - if ($app == 'help') - { - $GLOBALS['phpgw']->hooks->process('help',array('manual')); - } - else - { - $GLOBALS['phpgw']->hooks->single('help',$app); - } - - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',$GLOBALS['phpgw']->help->output); -?> diff --git a/home.php b/home.php index 161d2423e3..c3fc9db783 100755 --- a/home.php +++ b/home.php @@ -20,79 +20,124 @@ exit; } - $GLOBALS['sessionid'] = $GLOBALS['HTTP_GET_VARS']['sessionid'] ? $GLOBALS['HTTP_GET_VARS']['sessionid'] : $GLOBALS['HTTP_COOKIE_VARS']['sessionid']; + $GLOBALS['sessionid'] = @$GLOBALS['HTTP_GET_VARS']['sessionid'] ? $GLOBALS['HTTP_GET_VARS']['sessionid'] : $GLOBALS['HTTP_COOKIE_VARS']['sessionid']; if (!isset($GLOBALS['sessionid']) || !$GLOBALS['sessionid']) { Header('Location: login.php'); exit; } + $GLOBALS['phpgw_info']['flags'] = array( + 'noheader' => True, + 'nonavbar' => True, + 'currentapp' => 'home', + 'enable_network_class' => True, + 'enable_contacts_class' => True, + 'enable_nextmatchs_class' => True + ); + include('header.inc.php'); + + if ($_GET['phpgw_forward']) + { + foreach($_GET as $name => $value) + { + if (ereg('phpgw_',$name)) + { + $extra_vars .= '&' . $name . '=' . urlencode($value); + } + } + $GLOBALS['phpgw']->redirect_link($_GET['phpgw_forward'],$extra_vars); + exit; + } + if ($GLOBALS['phpgw_info']['server']['force_default_app'] && $GLOBALS['phpgw_info']['server']['force_default_app'] != 'user_choice') { $GLOBALS['phpgw_info']['user']['preferences']['common']['default_app'] = $GLOBALS['phpgw_info']['server']['force_default_app']; } - if ($GLOBALS['HTTP_GET_VARS']['cd']=='yes' && $GLOBALS['phpgw_info']['user']['preferences']['common']['default_app'] - && $GLOBALS['phpgw_info']['user']['apps'][$GLOBALS['phpgw_info']['user']['preferences']['common']['default_app']]) - { - //$GLOBALS['phpgw']->redirect($GLOBALS['phpgw']->link('/' . $GLOBALS['phpgw_info']['user']['preferences']['common']['default_app'] . '/' . 'index.php')); - Header('Location: ' . $GLOBALS['phpgw']->link('/' . $GLOBALS['phpgw_info']['user']['preferences']['common']['default_app'] . '/' . 'index.php')); - } - else - { - $GLOBALS['phpgw_info']['flags'] = array - ( - 'noheader' => True, - 'nonavbar' => True, - 'currentapp' => 'home', - 'enable_network_class' => True, - 'enable_contacts_class' => True, - 'enable_nextmatchs_class' => True - ); - include('header.inc.php'); - - if ($GLOBALS['phpgw_forward']) - { - while (list($name,$value) = each($GLOBALS['HTTP_GET_VARS'])) + if (($GLOBALS['phpgw_info']['user']['preferences']['common']['useframes'] && + $GLOBALS['phpgw_info']['server']['useframes'] == 'allowed') || + ($GLOBALS['phpgw_info']['server']['useframes'] == 'always')) { - if (ereg('phpgw_',$name)) + if ($GLOBALS['HTTP_GET_VARS']['cd'] == 'yes') { - $extra_vars .= '&' . $name . '=' . urlencode($value); + if (! $navbarframe && ! $framebody) + { + $tpl = new Template(PHPGW_TEMPLATE_DIR); + $tpl->set_file(array( + 'frames' => 'frames.tpl', + 'frame_body' => 'frames_body.tpl', + 'frame_navbar' => 'frames_navbar.tpl' + )); + $tpl->set_var('navbar_link',$GLOBALS['phpgw']->link('index.php','navbarframe=True&cd=yes')); + if ($GLOBALS['forward']) + { + $tpl->set_var('body_link',$GLOBALS['phpgw']->link($GLOBALS['forward'])); + } + else + { + $tpl->set_var('body_link',$GLOBALS['phpgw']->link('index.php','framebody=True&cd=yes')); + } + + if ($GLOBALS['phpgw_info']['user']['preferences']['common']['frame_navbar_location'] == 'bottom') + { + $tpl->set_var('frame_size','*,60'); + $tpl->parse('frames_','frame_body',True); + $tpl->parse('frames_','frame_navbar',True); + } + else + { + $tpl->set_var('frame_size','60,*'); + $tpl->parse('frames_','frame_navbar',True); + $tpl->parse('frames_','frame_body',True); + } + $tpl->pparse('out','frames'); + } + if ($navbarframe) + { + $GLOBALS['phpgw']->common->phpgw_header(); + echo parse_navbar(); + } } } - $GLOBALS['phpgw']->redirect_link($GLOBALS['phpgw_forward'],$extra_vars); - } - - $GLOBALS['phpgw']->translation->add_app('mainscreen'); - if (lang('mainscreen_message') != 'mainscreen_message'.lang_char()) - { - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array( - 'mainscreen_message' => stripslashes(lang('mainscreen_message')) - )); - } - - if ((isset($GLOBALS['phpgw_info']['user']['apps']['admin']) && - $GLOBALS['phpgw_info']['user']['apps']['admin']) && - (isset($GLOBALS['phpgw_info']['server']['checkfornewversion']) && - $GLOBALS['phpgw_info']['server']['checkfornewversion'])) - { - $GLOBALS['phpgw']->network->set_addcrlf(False); - $lines = $GLOBALS['phpgw']->network->gethttpsocketfile('http://www.phpgroupware.org/currentversion'); - for ($i=0; $iredirect($GLOBALS['phpgw']->link('/' . $GLOBALS['phpgw_info']['user']['preferences']['common']['default_app'] . '/' . 'index.php')); } - if($GLOBALS['phpgw']->common->cmp_version($GLOBALS['phpgw_info']['server']['versions']['phpgwapi'],$line_found[1])) + else { - $message = '

    There is a new version of phpGroupWare available. http://www.phpgroupware.org'; - $GLOBALS['phpgw_info']['flags']['msgbox_data'][$message]=True; - } + } - $_found = False; + $_found = False; $GLOBALS['phpgw']->db->query("select app_name,app_version from phpgw_applications",__LINE__,__FILE__); while($GLOBALS['phpgw']->db->next_record()) { @@ -103,26 +148,25 @@ { include($_versionfile); $_file_version = $setup_info[$_app_name]['version']; + $_app_title = $GLOBALS['phpgw_info']['apps'][$_app_name]['title']; unset($setup_info); if($GLOBALS['phpgw']->common->cmp_version_long($_db_version,$_file_version)) { $_found = True; - $_app_string .= '
    ' . $GLOBALS['phpgw_info']['apps'][$_app_name]['title']; + $_app_string .= '
    ' . $_app_title; } unset($_file_version); + unset($_app_title); } unset($_db_version); unset($_versionfile); } if($_found) { - $message = '
    ' . lang('The following applications require upgrades') . ':' . "\n"; - $message .= $_app_string . "\n"; - $message .= '
    ' . lang('Please run setup to become current') . '.' . "\n"; - - $GLOBALS['phpgw_info']['flags']['msgbox_data'][$message]=False; - unset($message); + echo '
    ' . lang('The following applications require upgrades') . ':' . "\n"; + echo $_app_string . "\n"; + echo '
    ' . lang('Please run setup to become current') . '.' . "\n"; unset($_app_string); } } @@ -130,7 +174,7 @@ if (isset($GLOBALS['phpgw_info']['user']['apps']['notifywindow']) && $GLOBALS['phpgw_info']['user']['apps']['notifywindow']) { -/* need to figure out how to implement this properly +?> +' . lang('Open notify window') . ''; -*/ } /* This initializes the users portal_order preference if it does not exist. */ @@ -187,19 +231,15 @@ } else { - $sorted_apps = Array - ( + $sorted_apps = Array( 'email', 'calendar', - 'news', + 'news_admin', 'addressbook', 'squirrelmail' ); } @reset($sorted_apps); - - $GLOBALS['phpgw']->portalbox = CreateObject('phpgwapi.listbox'); - $GLOBALS['phpgw']->hooks->process('home',$sorted_apps); if($GLOBALS['portal_order']) @@ -212,8 +252,8 @@ } $GLOBALS['phpgw']->preferences->save_repository(); } - $GLOBALS['phpgw_info']['flags']['currentapp'] = 'home'; // has been changed by hook_home's - $GLOBALS['phpgw']->xslttpl->set_var('phpgw',$GLOBALS['phpgw']->portalbox->output); - } + //$phpgw->common->debug_phpgw_info(); + //$phpgw->common->debug_list_core_functions(); + $GLOBALS['phpgw']->common->phpgw_footer(); ?> diff --git a/index.php b/index.php index 78f9b9d42e..66b80d0bd9 100755 --- a/index.php +++ b/index.php @@ -8,9 +8,10 @@ * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ + /* $Id$ */ - $GLOBALS['phpgw_info'] = array(); + $phpgw_info = array(); if (!file_exists('header.inc.php')) { Header('Location: setup/index.php'); @@ -44,20 +45,17 @@ $invalid_data = True; } - // FIX ME! Don't leave this, we need to create a common place where applications can access - // things like the spell check class that the API has. (jengo) if ($app == 'phpgwapi') { $app = 'home'; $api_requested = True; } - $GLOBALS['phpgw_info']['flags'] = array - ( - //'noheader' => True, + $GLOBALS['phpgw_info']['flags'] = array( + 'noheader' => True, + 'nonavbar' => True, 'currentapp' => $app ); - include('./header.inc.php'); if ($app == 'home' && ! $api_requested) @@ -76,12 +74,6 @@ { // eval("\$GLOBALS['obj']->$method();"); execmethod($_GET['menuaction']); - - if ($GLOBALS['phpgw_info']['server']['support_old_style_apps']) - { - $GLOBALS['phpgw']->common->stop_xslt_capture(); // send captured output to the xslttpl - } - unset($app); unset($obj); unset($class); @@ -118,4 +110,9 @@ $_obj->get_list(); */ } + + if (! $GLOBALS['phpgw_info']['nofooter']) + { + $GLOBALS['phpgw']->common->phpgw_footer(); + } ?> diff --git a/login.php b/login.php index 5be600e240..6f0494d23d 100755 --- a/login.php +++ b/login.php @@ -10,15 +10,16 @@ * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ - /* $Id$ */ - $GLOBALS['phpgw_info'] = array(); - $GLOBALS['phpgw_info']['flags'] = array - ( - 'login' => True, - 'currentapp' => 'login', - 'noheader' => True, - ); + /* $Id$ */ + + $phpgw_info = array(); + $GLOBALS['phpgw_info']['flags'] = array( + 'disable_template_class' => True, + 'login' => True, + 'currentapp' => 'login', + 'noheader' => True + ); if(file_exists('./header.inc.php')) { include('./header.inc.php'); @@ -29,62 +30,72 @@ Header('Location: setup/index.php'); exit; } - + $GLOBALS['phpgw_info']['server']['template_dir'] = PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $GLOBALS['phpgw_info']['login_template_set']; - - if (!$GLOBALS['phpgw_info']['login_theme']) - { - $GLOBALS['phpgw_info']['login_theme'] = 'submarine'; - } - - $GLOBALS['phpgw']->common = CreateObject('phpgwapi.common'); - - $GLOBALS['phpgw']->xslttpl = CreateObject('phpgwapi.xslttemplates',$GLOBALS['phpgw_info']['server']['template_dir']); - $GLOBALS['phpgw']->xslttpl->add_file('login'); - - $data = array - ( - 'phpgw_theme' => 'phpgwapi/templates/' . $GLOBALS['phpgw_info']['login_template_set'] . '/css/phpgw.css', - 'login_theme' => 'phpgwapi/templates/' . $GLOBALS['phpgw_info']['login_template_set'] . '/css/' . $GLOBALS['phpgw_info']['login_theme'] . '.css', - 'phpgw_head_charset' => lang('charset'), - 'phpgw_head_website_title' => $GLOBALS['phpgw_info']['server']['site_title'] - ); - - $data['login_standard'] = array - ( - 'login_layout' => $GLOBALS['phpgw_info']['login_template_set'], - 'lang_phpgw_statustext' => lang('phpGroupWare --> homepage') - ); + $tmpl = CreateObject('phpgwapi.Template', $GLOBALS['phpgw_info']['server']['template_dir']); // This is used for system downtime, to prevent new logins. if ($GLOBALS['phpgw_info']['server']['deny_all_logins']) { - $GLOBALS['phpgw']->xslttpl->set_var('login',$data); - $GLOBALS['phpgw']->xslttpl->pp(); + $tmpl->set_file(array( + 'login_form' => 'login_denylogin.tpl' + )); + $tmpl->set_var('template_set','default'); + $tmpl->pfp('loginout','login_form'); exit; } - $data['login_standard']['loginscreen'] = True; + // !! NOTE !! + // Do NOT and I repeat, do NOT touch ANYTHING to do with lang in this file. + // If there is a problem, tell me and I will fix it. (jengo) - function check_logoutcode() +/* + if ($_GET['cd'] != 10 && $GLOBALS['phpgw_info']['server']['usecookies'] == False) { - switch($_GET['code']) + $GLOBALS['phpgw']->sessions->setcookie('sessionid'); + $GLOBALS['phpgw']->sessions->setcookie('kp3'); + $GLOBALS['phpgw']->sessions->setcookie('domain'); + } +*/ + +/* This is not working yet because I need to figure out a way to clear the $cd =1 + if (isset($_SERVER['PHP_AUTH_USER']) && $_GET['cd'] == '1') + { + Header('HTTP/1.0 401 Unauthorized'); + Header('WWW-Authenticate: Basic realm="phpGroupWare"'); + echo 'You have to re-authentificate yourself'; + exit; + } +*/ + + if (! $deny_login && ! $GLOBALS['phpgw_info']['server']['show_domain_selectbox']) + { + $tmpl->set_file(array('login_form' => 'login.tpl')); + $tmpl->set_var('charset',lang('charset')); + } + elseif ($GLOBALS['phpgw_info']['server']['show_domain_selectbox']) + { + $tmpl->set_file(array('login_form' => 'login_selectdomain.tpl')); + $tmpl->set_var('charset',lang('charset')); + } + + function check_logoutcode($code) + { + switch($code) { case 1: - $GLOBALS['phpgw_info']['flags']['msgbox_data']['You have been successfully logged out'] = True; + return lang('You have been successfully logged out'); break; case 2: - $GLOBALS['phpgw_info']['flags']['msgbox_data']['Sorry, your login has expired'] = False; + return lang('Sorry, your login has expired'); break; case 5: - $GLOBALS['phpgw_info']['flags']['msgbox_data']['Bad login or password'] = False; + return '' . lang('Bad login or password') . ''; break; case 99: - $GLOBALS['phpgw_info']['flags']['msgbox_data']['Blocked, too many attempts'] = False; + return '' . lang('Blocked, too many attempts') . ''; break; case 10: - $GLOBALS['phpgw_info']['flags']['msgbox_data']['Your session could not be verified'] = False; - $GLOBALS['phpgw']->sessions->phpgw_setcookie('sessionid'); $GLOBALS['phpgw']->sessions->phpgw_setcookie('kp3'); $GLOBALS['phpgw']->sessions->phpgw_setcookie('domain'); @@ -94,17 +105,22 @@ { $GLOBALS['phpgw']->sessions->phpgw_setcookie(PHPGW_PHPSESSID); } + + return '' . lang('Your session could not be verified.') . ''; break; + default: + return ' '; } } function check_langs() { - //$f = fopen('/tmp/log','a'); fwrite($f,"\ncheck_langs()\n"); + //echo "

    check_langs()

    \n"; if ($GLOBALS['phpgw_info']['server']['lang_ctimes'] && !is_array($GLOBALS['phpgw_info']['server']['lang_ctimes'])) { $GLOBALS['phpgw_info']['server']['lang_ctimes'] = unserialize($GLOBALS['phpgw_info']['server']['lang_ctimes']); } + //_debug_array($GLOBALS['phpgw_info']['server']['lang_ctimes']); $lang = $GLOBALS['phpgw_info']['user']['preferences']['common']['lang']; $apps = $GLOBALS['phpgw_info']['user']['apps']; @@ -117,18 +133,15 @@ { $ctime = filectime($fname); $ltime = intval($GLOBALS['phpgw_info']['server']['lang_ctimes'][$lang][$app]); - //fwrite($f,"checking lang='$lang', app='$app', ctime='$ctime', ltime='$ltime'\n"); + //echo "checking lang='$lang', app='$app', ctime='$ctime', ltime='$ltime'
    \n"; if ($ctime != $ltime) { - //fwrite($f,"\nupdate_langs()\n"); - update_langs(); // update all langs break; } } } - //fclose ($f); } function update_langs() @@ -151,6 +164,7 @@ } /* Program starts here */ + if ($GLOBALS['phpgw_info']['server']['auth_type'] == 'http' && isset($_SERVER['PHP_AUTH_USER'])) { $submit = True; @@ -160,7 +174,7 @@ # Apache + mod_ssl style SSL certificate authentication # Certificate (chain) verification occurs inside mod_ssl - if ($GLOBALS['phpgw_info']['server']['auth_type'] == 'sqlssl' && isset($_SERVER['SSL_CLIENT_S_DN']) && !isset($_GET['code'])) + if ($GLOBALS['phpgw_info']['server']['auth_type'] == 'sqlssl' && isset($_SERVER['SSL_CLIENT_S_DN']) && !isset($_GET['cd'])) { # an X.509 subject looks like: # /CN=john.doe/OU=Department/O=Company/C=xx/Email=john@comapy.tld/L=City/ @@ -205,9 +219,9 @@ } $GLOBALS['sessionid'] = $GLOBALS['phpgw']->session->create($login,$_POST['passwd'],$_POST['passwd_type']); - if(!isset($GLOBALS['sessionid']) || !$GLOBALS['sessionid']) + if (! isset($GLOBALS['sessionid']) || ! $GLOBALS['sessionid']) { - $GLOBALS['phpgw']->redirect($GLOBALS['phpgw_info']['server']['webserver_url'] . '/login.php?code=' . $GLOBALS['phpgw']->session->cd_reason); + $GLOBALS['phpgw']->redirect($GLOBALS['phpgw_info']['server']['webserver_url'] . '/login.php?cd=' . $GLOBALS['phpgw']->session->cd_reason); } else { @@ -262,22 +276,25 @@ $GLOBALS['phpgw']->translation->add_app('loginscreen'); if (lang('loginscreen_message') != 'loginscreen_message*') { - $data['login_standard']['phpgw_loginscreen_message'] = stripslashes(lang('loginscreen_message')); + $tmpl->set_var('lang_message',stripslashes(lang('loginscreen_message'))); } } $last_loginid = $_COOKIE['last_loginid']; if ($GLOBALS['phpgw_info']['server']['show_domain_selectbox']) { - foreach ($phpgw_domain as $domain => $domain_data) - { - $ds = array('domain' => $domain); - if ($domain == $_COOKIE['last_domain']) + $domain_select = ''; // For security ... just in case + foreach($GLOBALS['phpgw_domain'] as $domain_name => $domain_vars) + { + $domain_select .= '