diff --git a/addressbook/inc/class.addressbook_tracking.inc.php b/addressbook/inc/class.addressbook_tracking.inc.php index 786d4c462d..9187aa233d 100644 --- a/addressbook/inc/class.addressbook_tracking.inc.php +++ b/addressbook/inc/class.addressbook_tracking.inc.php @@ -277,24 +277,9 @@ class addressbook_tracking extends bo_tracking break; } } - if ($this->contacts->customfields) - { - foreach($this->contacts->customfields as $name => $custom) - { - if (!$header_done) - { - $details['custom'] = array( - 'value' => lang('Custom fields').':', - 'type' => 'reply', - ); - $header_done = true; - } - $details['#'.$name] = array( - 'label' => $custom['label'], - 'value' => $custom['type'] == 'select' ? $custom['values'][$data['#'.$name]] : $data['#'.$name], - ); - } - } + // add custom fields for given type + $details += $this->get_customfields($data, $data['tid']); + return $details; } } diff --git a/etemplate/inc/class.bo_merge.inc.php b/etemplate/inc/class.bo_merge.inc.php index 03d82c81f0..84bcd98504 100644 --- a/etemplate/inc/class.bo_merge.inc.php +++ b/etemplate/inc/class.bo_merge.inc.php @@ -246,42 +246,11 @@ abstract class bo_merge } if ($name != 'photo') $replacements['$$'.($prefix ? $prefix.'/':'').$name.'$$'] = $value; } - // set custom fields + // set custom fields, should probably go to a general method all apps can use foreach($this->contacts->customfields as $name => $field) { $name = '#'.$name; - $value = (string)$contact[$name]; - switch($field['type']) - { - case 'select-account': - if ($value) $value = common::grab_owner_name($value); - break; - - case 'select': - if (count($field['values']) == 1 && isset($field['values']['@'])) - { - $field['values'] = customfields_widget::_get_options_from_file($field['values']['@']); - } - $values = array(); - foreach($field['rows'] > 1 ? explode(',',$value) : (array) $value as $value) - { - $values[] = $field['values'][$value]; - } - $value = implode(', ',$values); - break; - - case 'date': - case 'date-time': - if ($value) - { - $format = $field['len'] ? $field['len'] : ($field['type'] == 'date' ? 'Y-m-d' : 'Y-m-d H:i:s'); - $date = array_combine(preg_split('/[\\/. :-]/',$format),preg_split('/[\\/. :-]/',$value)); - $value = common::dateformatorder($date['Y'],$date['m'],$date['d'],true); - if (isset($date['H'])) $value .= ' '.common::formattime($date['H'],$date['i']); - } - break; - } - $replacements['$$'.($prefix ? $prefix.'/':'').$name.'$$'] = $value; + $replacements['$$'.($prefix ? $prefix.'/':'').$name.'$$'] = customfields_widget::format_customfield($field, (string)$contact[$name]); } // Add in extra cat field diff --git a/etemplate/inc/class.bo_tracking.inc.php b/etemplate/inc/class.bo_tracking.inc.php index 5705576b01..781ea51105 100644 --- a/etemplate/inc/class.bo_tracking.inc.php +++ b/etemplate/inc/class.bo_tracking.inc.php @@ -1,12 +1,12 @@ * @package etemplate * @subpackage api - * @copyright (c) 2007-10 by Ralf Becker + * @copyright (c) 2007-12 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -210,6 +210,8 @@ abstract class bo_tracking /** * Get the details of an entry * + * You can/should call $this->get_customfields() to add custom fields. + * * @param array|object $data * @param int|string $receiver nummeric account_id or email address * @return array of details as array with values for keys 'label','value','type' @@ -219,6 +221,43 @@ abstract class bo_tracking return array(); } + /** + * Get custom fields of an entry of an entry + * + * @param array|object $data + * @param string $only_type2=null if given only return fields of type2 == $only_type2 + * @return array of details as array with values for keys 'label','value','type' + */ + function get_customfields($data, $only_type2=null) + { + $details = array(); + + if (($cfs = config::get_customfields($this->app, $all_private_too=false, $only_type2))) + { + $header_done = false; + foreach($cfs as $name => $field) + { + if (in_array($field['type'], customfields_widget::$non_printable_fields)) continue; + + if (!$header_done) + { + $details['custom'] = array( + 'value' => lang('Custom fields').':', + 'type' => 'reply', + ); + $header_done = true; + } + //error_log(__METHOD__."() $name: data['#$name']=".array2string($data['#'.$name]).", field[values]=".array2string($field['values'])); + $details['#'.$name] = array( + 'label' => $field['label'], + 'value' => customfields_widget::format_customfield($field, $data['#'.$name]), + ); + //error_log("--> details['#$name']=".array2string($details['#'.$name])); + } + } + return $details; + } + /** * Get a config value, which can depend on $data and $old * diff --git a/etemplate/inc/class.customfields_widget.inc.php b/etemplate/inc/class.customfields_widget.inc.php index 18e51cf505..c6355ffedc 100644 --- a/etemplate/inc/class.customfields_widget.inc.php +++ b/etemplate/inc/class.customfields_widget.inc.php @@ -1,6 +1,6 @@ @@ -514,7 +514,7 @@ class customfields_widget * @param string $file file name inside the eGW server root, either relative to it or absolute * @return array in case of an error we return a single option with the message */ - function _get_options_from_file($file) + public static function _get_options_from_file($file) { if (!($path = realpath($file{0} == '/' ? $file : EGW_SERVER_ROOT.'/'.$file)) || // file does not exist substr($path,0,strlen(EGW_SERVER_ROOT)+1) != EGW_SERVER_ROOT.'/' || // we are NOT inside the eGW root @@ -593,4 +593,89 @@ class customfields_widget } } } + + /** + * Non printable custom fields eg. UI elements + * + * @var array + */ + public static $non_printable_fields = array('button'); + + /** + * Format a single custom field value as string + * + * @param array $field field defintion incl. type + * @param string $value field value + * @return string formatted value + */ + public static function format_customfield(array $field, $value) + { + switch($field['type']) + { + case 'select-account': + if ($value) + { + $values = array(); + foreach($field['rows'] > 1 ? explode(',', $value) : (array) $value as $value) + { + $values[] = common::grab_owner_name($value); + } + $value = implode(', ',$values); + } + break; + + case 'checkbox': + $value = $value ? 'X' : ''; + break; + + case 'select': + case 'radio': + if (count($field['values']) == 1 && isset($field['values']['@'])) + { + $field['values'] = customfields_widget::_get_options_from_file($field['values']['@']); + } + $values = array(); + foreach($field['rows'] > 1 ? explode(',', $value) : (array) $value as $value) + { + $values[] = isset($field['values'][$value]) ? $field['values'][$value] : '#'.$value; + } + $value = implode(', ', $values); + break; + + case 'date': + case 'date-time': + if ($value) + { + $format = $field['len'] ? $field['len'] : ($field['type'] == 'date' ? 'Y-m-d' : 'Y-m-d H:i:s'); + $date = array_combine(preg_split('/[\\/. :-]/',$format), preg_split('/[\\/. :-]/',$value)); + $value = common::dateformatorder($date['Y'], $date['m'], $date['d'],true); + if (isset($date['H'])) $value .= ' '.common::formattime($date['H'], $date['i']); + } + break; + + case 'htmlarea': // ToDo: EMail probably has a nicer html2text method + if ($value) $value = strip_tags(preg_replace('/<(br|p)[^>]*>/i', "\r\n", str_replace(array("\r", "\n"), '', $value))); + break; + + case 'ajax_select': // ToDo: returns unchanged value for now + break; + + default: + // handling for several link types + if ($value && in_array($field['type'], self::get_customfield_link_types())) + { + if ($field['type'] == 'link-entry' || strpos($value, ':') !== false) + { + list($app, $value) = explode(':', $value); + } + else + { + $app = $field['type']; + } + if ($value) $value = egw_link::title($app, $value); + } + break; + } + return $value; + } } diff --git a/infolog/inc/class.infolog_tracking.inc.php b/infolog/inc/class.infolog_tracking.inc.php index 9a60c4709c..c7716706e2 100644 --- a/infolog/inc/class.infolog_tracking.inc.php +++ b/infolog/inc/class.infolog_tracking.inc.php @@ -187,15 +187,13 @@ class infolog_tracking extends bo_tracking /** * Get the details of an entry * - * @param array $data - * @param string $datetime_format of user to notify, eg. 'Y-m-d H:i' - * @param int $tz_offset_s offset in sec to be add to server-time to get the user-time of the user to notify + * @param array|object $data + * @param int|string $receiver nummeric account_id or email address * @return array of details as array with values for keys 'label','value','type' */ - function get_details($data) + function get_details($data,$receiver=null) { //error_log(__METHOD__.__LINE__.' Data:'.array2string($data)); - $header_done = false; $responsible = array(); if ($data['info_responsible']) { @@ -245,30 +243,9 @@ class infolog_tracking extends bo_tracking 'value' => $data['info_des'], 'type' => 'multiline', ); - // should be moved to bo_tracking because auf the different custom field types - if ($this->infolog->customfields) - { - foreach($this->infolog->customfields as $name => $field) - { - if ($field['type2'] && !in_array($data['info_type'],explode(',',$field['type2']))) continue; // different type + // add custom fields for given type + $details += $this->get_customfields($data, $data['info_type']); - if (!$header_done) - { - $details['custom'] = array( - 'value' => lang('Custom fields').':', - 'type' => 'reply', - ); - $header_done = true; - } - //error_log(__METHOD__."() $name: data['#$name']=".array2string($data['#'.$name]).", field[values]=".array2string($field['values'])); - $details['#'.$name] = array( - 'label' => $field['label'], - 'value' => is_array($field['values']) && $field['values'] && isset($data['#'.$name]) && - array_key_exists((string)$data['#'.$name],$field['values']) ? $field['values'][$data['#'.$name]] : $data['#'.$name], - ); - //error_log("--> details['#$name']=".array2string($details['#'.$name])); - } - } return $details; }