User configurable setting how to display contact names in list
| | |
| | | - Handle identity details box with an iframe (#1487020) |
| | | - Fix issue where some text from original message was missing on reply (#1488340) |
| | | - Fix parse errors in DDL files for MS SQL Server |
| | | - User configurable setting how to display contact names in list |
| | | - Make contacts list sorting configurable for the admin/user |
| | | - Revert SORT=DISPLAY support, removed by mistake (#1488327) |
| | | - Fix autoselect_host() for login (#1488297) |
| | |
| | | // sort contacts by this col (preferably either one of name, firstname, surname) |
| | | $rcmail_config['addressbook_sort_col'] = 'surname'; |
| | | |
| | | // the way how contact names are displayed in the list |
| | | // 0: display name |
| | | // 1: (prefix) firstname middlename surname (suffix) |
| | | // 2: (prefix) surname firstname middlename (suffix) |
| | | // 3: (prefix) surname, firstname middlename (suffix) |
| | | $rcmail_config['addressbook_name_listing'] = 0; |
| | | |
| | | // use this timezone to display date/time |
| | | // valid timezone identifers are listed here: php.net/manual/en/timezones.php |
| | | // 'auto' will use the browser's timezone settings |
| | |
| | | * Compose a valid display name from the given structured contact data |
| | | * |
| | | * @param array Hash array with contact data as key-value pairs |
| | | * @param bool The name will be used on the list |
| | | * @param bool Don't attempt to extract components from the email address |
| | | * |
| | | * @return string Display name |
| | | */ |
| | | public static function compose_display_name($contact, $list_mode = false) |
| | | public static function compose_display_name($contact, $full_email = false) |
| | | { |
| | | $contact = rcmail::get_instance()->plugins->exec_hook('contact_displayname', $contact); |
| | | $fn = $contact['name']; |
| | | |
| | | if (!$fn) |
| | | if (!$fn) // default display name composition according to vcard standard |
| | | $fn = join(' ', array_filter(array($contact['prefix'], $contact['firstname'], $contact['middlename'], $contact['surname'], $contact['suffix']))); |
| | | |
| | | // use email address part for name |
| | | $email = is_array($contact['email']) ? $contact['email'][0] : $contact['email']; |
| | | |
| | | if ($email && (empty($fn) || $fn == $email)) { |
| | | // Use full email address on contacts list |
| | | if ($list_mode) |
| | | // return full email |
| | | if ($full_email) |
| | | return $email; |
| | | |
| | | list($emailname) = explode('@', $email); |
| | |
| | | return $fn; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Compose the name to display in the contacts list for the given contact record. |
| | | * This respects the settings parameter how to list conacts. |
| | | * |
| | | * @param array Hash array with contact data as key-value pairs |
| | | * @return string List name |
| | | */ |
| | | public static function compose_list_name($contact) |
| | | { |
| | | static $compose_mode; |
| | | |
| | | if (!isset($compose_mode)) // cache this |
| | | $compose_mode = rcmail::get_instance()->config->get('addressbook_name_listing', 0); |
| | | |
| | | if ($compose_mode == 3) |
| | | $fn = join(' ', array($contact['surname'] . ',', $contact['firstname'], $contact['middlename'])); |
| | | else if ($compose_mode == 2) |
| | | $fn = join(' ', array($contact['surname'], $contact['firstname'], $contact['middlename'])); |
| | | else if ($compose_mode == 1) |
| | | $fn = join(' ', array($contact['firstname'], $contact['middlename'], $contact['surname'])); |
| | | else |
| | | $fn = !empty($contact['name']) ? $contact['name'] : join(' ', array($contact['prefix'], $contact['firstname'], $contact['middlename'], $contact['surname'], $contact['suffix'])); |
| | | |
| | | $fn = trim($fn, ', '); |
| | | |
| | | // fallback to display name |
| | | if (empty($fn) && $contact['name']) |
| | | $fn = $contact['name']; |
| | | |
| | | // fallback to email address |
| | | $email = is_array($contact['email']) ? $contact['email'][0] : $contact['email']; |
| | | if (empty($fn) && $email) |
| | | return $email; |
| | | |
| | | return $fn; |
| | | } |
| | | |
| | | } |
| | | |
| | |
| | | $sql_arr['email'] = array_map('trim', $sql_arr['email']); |
| | | } |
| | | |
| | | // make sure we have a name to display |
| | | if (empty($sql_arr['name'])) { |
| | | if (empty($sql_arr['email'])) |
| | | $sql_arr['email'] = $this->get_col_values('email', $sql_arr, true); |
| | | $sql_arr['name'] = $sql_arr['email'][0]; |
| | | } |
| | | |
| | | $this->result->add($sql_arr); |
| | | } |
| | | |
| | |
| | | $labels['replysamefolder'] = 'Antworten im selben Ordner wie Original speichern'; |
| | | $labels['defaultaddressbook'] = 'Neue Kontakte speichern in'; |
| | | $labels['autocompletesingle'] = 'Keine alternativen E-Mail-Adressen in Autovervollständigung'; |
| | | $labels['listnamedisplay'] = 'Kontakte auflisten als'; |
| | | $labels['spellcheckbeforesend'] = 'Rechtscheibung vor dem Senden prüfen'; |
| | | $labels['spellcheckoptions'] = 'Rechtschreibprüfungsoptionen'; |
| | | $labels['spellcheckignoresyms'] = 'Wörter mit Symbolen überspringen'; |
| | |
| | | $labels['replysamefolder'] = 'Antworten im selben Ordner wie Original speichern'; |
| | | $labels['defaultaddressbook'] = 'Neue Kontakte zum ausgewählten Adressbuch hinzufügen'; |
| | | $labels['autocompletesingle'] = 'Alternative E-Mailadressen bei der Auto-Vervollständigung nicht berücksichtigen'; |
| | | $labels['listnamedisplay'] = 'Kontakte auflisten als'; |
| | | $labels['spellcheckbeforesend'] = 'Rechtschreibprüfung vor dem Absenden der Nachricht'; |
| | | $labels['spellcheckoptions'] = 'Rechtschreibprüfungsoptionen'; |
| | | $labels['spellcheckignoresyms'] = 'Wörter mit Symbolen überspringen'; |
| | |
| | | $labels['replysamefolder'] = 'Place replies in the folder of the message being replied to'; |
| | | $labels['defaultaddressbook'] = 'Add new contacts to the selected addressbook'; |
| | | $labels['autocompletesingle'] = 'Skip alternative email addresses in autocompletion'; |
| | | $labels['listnamedisplay'] = 'List contacts as'; |
| | | $labels['spellcheckbeforesend'] = 'Check spelling before sending a message'; |
| | | $labels['spellcheckoptions'] = 'Spellcheck Options'; |
| | | $labels['spellcheckignoresyms'] = 'Ignore words with symbols'; |
| | |
| | | |
| | | // format each col |
| | | foreach ($a_show_cols as $col) { |
| | | $val = $row[$col]; |
| | | if ($val == '' && $col == 'name') { |
| | | $val = rcube_addressbook::compose_display_name($row, true); |
| | | } |
| | | |
| | | $val = $col == 'name' ? rcube_addressbook::compose_list_name($row) : $row[$col]; |
| | | $a_row_cols[$col] = Q($val); |
| | | } |
| | | |
| | |
| | | $a_js_cols = array(); |
| | | $record = $CONTACTS->get_record($newcid ? $newcid : $cid, true); |
| | | $record['email'] = reset($CONTACTS->get_col_values('email', $record, true)); |
| | | if (empty($record['name'])) |
| | | $record['name'] = rcube_addressbook::compose_display_name($record, true); |
| | | $record['name'] = rcube_addressbook::compose_list_name($record); |
| | | |
| | | foreach (array('name', 'email') as $col) |
| | | $a_js_cols[] = Q((string)$record[$col]); |
| | |
| | | } |
| | | |
| | | $contact['email'] = rcube_idn_to_utf8($contact['email']); |
| | | $contact = $RCMAIL->plugins->exec_hook('contact_displayname', $contact); |
| | | |
| | | if (empty($contact['firstname']) || empty($contact['surname'])) |
| | | $contact['name'] = rcube_addressbook::compose_display_name($contact); |
| | | |
| | | // validate contact record |
| | |
| | | else if (!empty($result) && $result->count > 0) { |
| | | // create javascript list |
| | | while ($row = $result->next()) { |
| | | $name = rcube_addressbook::compose_display_name($row, true); |
| | | $name = rcube_addressbook::compose_list_name($row); |
| | | |
| | | // add record for every email address of the contact |
| | | foreach ($CONTACTS->get_col_values('email', $row, true) as $i => $email) { |
| | |
| | | ); |
| | | } |
| | | |
| | | // show addressbook listing mode selection |
| | | if (!isset($no_override['addressbook_name_listing'])) { |
| | | $field_id = 'rcmfd_addressbook_name_listing'; |
| | | $select_listing = new html_select(array('name' => '_addressbook_name_listing', 'id' => $field_id)); |
| | | $select_listing->add(rcube_label('name'), 0); |
| | | $select_listing->add(rcube_label('firstname') . ' ' . rcube_label('surname'), 1); |
| | | $select_listing->add(rcube_label('surname') . ' ' . rcube_label('firstname'), 2); |
| | | $select_listing->add(rcube_label('surname') . ', ' . rcube_label('firstname'), 3); |
| | | |
| | | $blocks['main']['options']['list_name_listing'] = array( |
| | | 'title' => html::label($field_id, Q(rcube_label('listnamedisplay'))), |
| | | 'content' => $select_listing->show($config['addressbook_name_listing']), |
| | | ); |
| | | } |
| | | |
| | | // show addressbook sort column |
| | | if (!isset($no_override['addressbook_sort_col'])) { |
| | | $field_id = 'rcmfd_addressbook_sort_col'; |
| | |
| | | 'default_addressbook' => get_input_value('_default_addressbook', RCUBE_INPUT_POST, true), |
| | | 'autocomplete_single' => isset($_POST['_autocomplete_single']) ? TRUE : FALSE, |
| | | 'addressbook_sort_col' => get_input_value('_addressbook_sort_col', RCUBE_INPUT_POST), |
| | | 'addressbook_name_listing' => intval(get_input_value('_addressbook_name_listing', RCUBE_INPUT_POST)), |
| | | 'addressbook_pagesize' => is_numeric($_POST['_addressbook_pagesize']) ? max(2, intval($_POST['_addressbook_pagesize'])) : $CONFIG['addressbook_pagesize'], |
| | | ); |
| | | |