* * Class for creating select boxes for addresse, projects, array items, ... * * Copyright (C) 2000, 2001 Dan Kuykendall * * -------------------------------------------------------------------------* * This library is part of the phpGroupWare API * * http://www.phpgroupware.org/api * * ------------------------------------------------------------------------ * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 2.1 of the License, * * or any later version. * * This library is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \**************************************************************************/ /* $Id$ */ if(!isset($GLOBALS['phpgw_info']['flags']['included_classes']['sbox'])) { include(PHPGW_API_INC . '/class.sbox.inc.php'); $GLOBALS['phpgw_info']['flags']['included_classes']['sbox'] = True; } class sbox2 extends sbox { /* * Function: search for an id of an db-entry, eg. an address * Parameter: $name base name for all template-vars and of the submitted vars (not to conflict with other template-var-names !!!) * $lang_name titel of the field * $prompt for the JavaScript prompt() * $id_name id of previosly selected entry * $content from id (eg. 'company: lastname, givenname' for address $id) if $id != 0, or * array with searchresult (id's as key), if array is empty if search was unsucsessful * $multipe present a multiple selectable box instead of one selector-button * Returns: array with vars to set in temaplate, the vars are: * {doSearchFkt} Javascript Funktion, place somewhere in Template (before rest of the vars) * {$name.'_title} button with titel $lang_name (if JS) or just $lang_name * {$name} content of $id if != 0, or lang('use Button to search for').$lang_name * {$name.'_nojs} searchfield + button if we have no JavaScript, else empty * * To use call $template->set_var(getIdSearch( ... )); * the template should look like {doSearchFkt} {XXX_title}{XXX}{XXX_nojs} (XXX is content of $name) * In the submitted page the vars $query_XXX and $id_XXX are set according to what is selected, see getAddress as Example */ function sbox2() { $this->sbox(); // call constructor extended class } function getId($name,$lang_name,$prompt,$id_name,$content='',$note='',$multiple=False) { // echo "

getId('$name','$lang_name','$prompt',$id_name,'$content') ="; $ret['doSearchFkt'] = ''; $ret[$name.'_title'] = is_array($content) && count($content) ? $lang_name : '\n". ""; if (is_array($content)) { // result from search if (!count($content)) { // search was unsuccsessful $ret[$name] = lang('no entries found, try again ...'); } else { $ret[$name.'_OK'] = ''; // flag we have something so select if ($multiple) { $ret[$name] = ''."\n"; } while (list( $id,$text ) = each( $content )) { $ret[$name] .= "

getEvent('$name',$id_name,'$query_name','$title')

"; // fallback if calendar is not installed or not enabled for user if (!file_exists(PHPGW_SERVER_ROOT.'/calendar') || !$GLOBALS['phpgw_info']['user']['apps']['calendar']['enabled']) { return array( $name => "\n", $name.'_no_js' => '', $name.'_title' => '' ); } if ($id_name || $query_name) { if (!is_object($this->bocal)) { $this->bocal = createobject('calendar.bocalendar'); } if ($query_name) { $event_ids = $this->bocal->search_keywords($query_name); $content = array( ); while ($event_ids && list( $key,$id ) = each( $event_ids )) { $content[$id] = $this->event2name( $id ); } } else { $event = $this->bocal->read_entry( $id_name ); if ($event && is_array($event)) { $content = $this->event2name( $event ); } } } if (!$title) { $title = lang('Calendar'); } return $this->getId($name,$title,lang('Pattern for Search in Calendar'),$id_name,$content,lang('use Button to search for Calendarevent'),$multiple); } function addr2name( $addr ) { $name = $addr['n_family']; if ($addr['n_given']) { $name .= ', '.$addr['n_given']; } else { if ($addr['n_prefix']) { $name .= ', '.$addr['n_prefix']; } } if ($addr['org_name']) { $name = $addr['org_name'].': '.$name; } return $GLOBALS['phpgw']->strip_html($name); } /* * Function Allows you to show and select an address from the addressbook (works with and without javascript !!!) * Parameters $name string with basename of all variables (not to conflict with the name other template or submitted vars !!!) * $id_name id of the address for edit or 0 if none selected so far * $query_name have to be called $query_XXX, the search pattern after the submit, has to be passed back to the function * $multipe present a multiple selectable box instead of one selector-button * On Submit $id_XXX contains the selected address (if != 0) * $query_XXX search pattern if the search button is pressed by the user, or '' if regular submit * Returns array with vars to set for the template, set with: $template->set_var( getAddress( ... )); (see getId( )) * * Note As query's for an address are submitted, you have to check $query_XXX if it is a search or a regular submit (!$query_string) */ function getAddress( $name,$id_name,$query_name,$title='',$multiple=False) { // echo "

getAddress('$name',$id_name,'$query_name','$title')

"; if ($id_name || $query_name) { $contacts = createobject('phpgwapi.contacts'); if ($query_name) { $addrs = $contacts->read( 0,0,'',$query_name,'','DESC','org_name,n_family,n_given' ); $content = array( ); while ($addrs && list( $key,$addr ) = each( $addrs )) { $content[$addr['id']] = $this->addr2name( $addr ); } } else { list( $addr ) = $contacts->read_single_entry( $id_name ); if (count($addr)) { $content = $this->addr2name( $addr ); } } } if (!$title) { $title = lang('Addressbook'); } return $this->getId($name,$title,lang('Pattern for Search in Addressbook'),$id_name,$content,lang('use Button to search for Address'),$multiple); } function addr2email($addr,$home='') { if (!is_array($addr)) { $home = substr($addr,-1) == 'h'; $contacts = createobject('phpgwapi.contacts'); list($addr) = $contacts->read_single_entry((int)$addr); } if ($home) { $home = '_home'; } if (!count($addr) || !$addr['email'.$home]) { return False; } if ($addr['n_given']) { $name = $addr['n_given']; } else { if ($addr['n_prefix']) { $name = $addr['n_prefix']; } } $name .= ($name ? ' ' : '') . $addr['n_family']; return $name.' <'.$addr['email'.$home].'>'; } function getEmail( $name,$id_name,$query_name,$title='') { // echo "

getAddress('$name',$id_name,'$query_name','$title')

"; if ($id_name || $query_name) { $contacts = createobject('phpgwapi.contacts'); if ($query_name) { $addrs = $contacts->read( 0,0,'',$query_name,'','DESC','org_name,n_family,n_given' ); $content = array( ); while ($addrs && list( $key,$addr ) = each( $addrs )) { if ($addr['email']) { $content[$addr['id']] = $this->addr2email( $addr ); } if ($addr['email_home']) { $content[$addr['id'].'h'] = $this->addr2email( $addr,'_home' ); } } } else { $content = $this->addr2email( $id_name ); } } if (!$title) { $title = lang('Addressbook'); } return $this->getId($name,$title,lang('Pattern for Search in Addressbook'),$id_name,$content); } /* * Function Allows you to show and select an project from the projects-app (works with and without javascript !!!) * Parameters $name string with basename of all variables (not to conflict with the name other template or submitted vars !!!) * $id_name id of the project for edit or 0 if none selected so far * $query_name have to be called $query_XXX, the search pattern after the submit, has to be passed back to the function * On Submit $id_XXX contains the selected address (if != 0) * $query_XXX search pattern if the search button is pressed by the user, or '' if regular submit * Returns array with vars to set for the template, set with: $template->set_var( getProject( ... )); (see getId( )) * * Note As query's for an address are submitted, you have to check $query_XXX if it is a search or a regular submit (!$query_string) */ function getProject( $name,$id_name,$query_name,$title='' ) { // echo "

getProject('$name',$id_name,'$query_name','$title')

"; // fallback if projects is not installed or not enabled for user if (!file_exists(PHPGW_SERVER_ROOT.'/projects') || !$GLOBALS['phpgw_info']['user']['apps']['projects']['enabled']) { return array( $name => "\n", $name.'_no_js' => '', $name.'_title' => '' ); } if ($id_name || $query_name) { $projects = createobject('projects.boprojects'); if (!is_object($projects)) { return ''; } if ($query_name) { $projs = $projects->list_projects( 0,0,$query_name,'','','','',0,'mains','' ); $content = array(); while ($projs && list( $key,$proj ) = each( $projs )) { $content[$proj['project_id']] = $proj['title']; } } else { if ($proj = $projects->read_single_project( $id_name )) { $content = $proj['title']; // $customer_id = $proj['customer']; } } } if (!$title) { $title = lang('Project'); } return $this->getId($name,$title,lang('Pattern for Search in Projects'),$id_name,$content,lang('use Button to search for Project')); } /* * Function: Allows to show and select one item from an array * Parameters: $name string with name of the submitted var which holds the key of the selected item form array * $key key(s) of already selected item(s) from $arr, eg. '1' or '1,2' or array with keys * $arr array with items to select, eg. $arr = array ( 'y' => 'yes','n' => 'no','m' => 'maybe'); * $no_lang if !$no_lang send items through lang() * $options additional options (e.g. 'multiple') * On submit $XXX is the key of the selected item (XXX is the content of $name) * Returns: string to set for a template or to echo into html page */ function getArrayItem($name, $key, $arr=0,$no_lang=0,$options='',$multiple=0) { // should be in class common.sbox if (!is_array($arr)) { $arr = array('no','yes'); } if (0+$multiple > 0) { $options .= ' MULTIPLE SIZE='.(0+$multiple); if (substr($name,-2) != '[]') { $name .= '[]'; } } $out = "\n"; return $out; } function getPercentage($name, $selected=0,$options='') { // reimplemented using getArrayItem for ($i=0; $i <= 100; $i+=10) { $arr[$i] = "$i%"; } return $this->getArrayItem($name,$selected,$arr,1,$options); } function getPriority($name, $selected=2,$options='') { // reimplemented using getArrayItem $arr = array('','low','normal','high'); return $this->getArrayItem($name,$selected,$arr,0,$options); } function getAccessList($name,$selected='private',$options='') { // reimplemented using getArrayItem $arr = array( 'private' => 'Private', 'public' => 'Global public', 'group' => 'Group public' ); if (strstr($selected,',')) { $selected = "group"; } return $this->getArrayItem($name,$selected,$arr,0,$options); } function getCountry($name='country',$selected=' ',$options='') { // reimplemented using getArrayItem return $this->getArrayItem($name,$selected,$this->country_array,0,$options); } function form_select($name='country',$selected=' ',$options='') { // reimplemented using getArrayItem (stupid name!!!) return getCountry($name,$selected,$options); } function accountInfo($id,$account_data=0,$longnames=0,$show_type=0) { if (!$id) { return ' '; } if (!is_array($account_data)) { $accounts = createobject('phpgwapi.accounts',$id); $accounts->db = $GLOBALS['phpgw']->db; $accounts->read_repository(); $account_data = $accounts->data; } $info = $show_type ? '('.$account_data['account_type'].') ' : ''; switch ($longnames) { case 2: $info .= '<'.$account_data['account_lid'].'> '; // fall-through case 1: $info .= $account_data['account_firstname'].' '.$account_data['account_lastname']; break; default: $info .= $account_data['account_lid']; break; } return $info; } /* * Function: Allows to select one accountname * Parameters: $name string with name of the submitted var, which holds the account_id or 0 after submit * $id account_id of already selected account * $longnames -1=as user prefs, 0=account_lid 1=firstname lastname */ function getAccount($name,$id,$longnames=-1,$type='accounts',$multiple=0,$options='') { $accs = $GLOBALS['phpgw']->accounts->get_list($type); if ($multiple < 0) { $aarr[] = lang('not assigned'); } while ($a = current($accs)) { $aarr[$a['account_id']] = $longnames == -1 ? $GLOBALS['phpgw']->common->display_fullname($a['account_lid'],$a['account_firstname'],$a['account_lastname']) : $this->accountInfo($a['account_id'],$a,$longnames,$type=='both'); next($accs); } return $this->getArrayItem($name,$id,$aarr,1,$options,$multiple); } function getDate($n_year,$n_month,$n_day,$date,$options='') { if (is_array($date)) { list($year,$month,$day) = $date; } elseif (!$date) { $day = $month = $year = 0; } else { $day = date('d',$date); $month = date('m',$date); $year = date('Y',$date); } return $GLOBALS['phpgw']->common->dateformatorder( $this->getYears($n_year,$year), $this->getMonthText($n_month,$month), $this->getDays($n_day,$day) ); } function getCategory($name,$cat_id='',$notall=False,$jscript=True,$multiple=0,$options='') { if (!is_object($this->cat)) { $this->cat = CreateObject('phpgwapi.categories'); } if ($jscript) { $options .= ' onChange="this.form.submit();"'; } if (0+$multiple > 0) { $options .= ' MULTIPLE SIZE='.(0+$multiple); if (substr($name,-2) != '[]') { $name .= '[]'; } } /* Setup all and none first */ $cats_link = "\n'."\n"; return $cats_link; } }