From f94e442469deca30b39f3fa08aade83cbd0ede70 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Fri, 16 Dec 2011 13:38:59 -0500 Subject: [PATCH] Add more classes and options to HTML elements for better styleability --- program/include/rcube_addressbook.php | 70 ++++++++++++++++++++++++++++------- 1 files changed, 56 insertions(+), 14 deletions(-) diff --git a/program/include/rcube_addressbook.php b/program/include/rcube_addressbook.php index c580c40..5f17f4a 100644 --- a/program/include/rcube_addressbook.php +++ b/program/include/rcube_addressbook.php @@ -30,21 +30,28 @@ /** constants for error reporting **/ const ERROR_READ_ONLY = 1; const ERROR_NO_CONNECTION = 2; - const ERROR_INCOMPLETE = 3; + const ERROR_VALIDATE = 3; const ERROR_SAVING = 4; const ERROR_SEARCH = 5; - + /** public properties (mandatory) */ public $primary_key; public $groups = false; public $readonly = true; + public $searchonly = false; + public $undelete = false; public $ready = false; public $group_id = null; public $list_page = 1; public $page_size = 10; public $coltypes = array('name' => array('limit'=>1), 'firstname' => array('limit'=>1), 'surname' => array('limit'=>1), 'email' => array('limit'=>1)); - + protected $error; + + /** + * Returns addressbook name (e.g. for addressbooks listing) + */ + abstract function get_name(); /** * Save a search string for future listings @@ -89,12 +96,16 @@ * * @param array List of fields to search in * @param string Search value + * @param int Matching mode: + * 0 - partial (*abc*), + * 1 - strict (=), + * 2 - prefix (abc*) * @param boolean True if results are requested, False if count only * @param boolean True to skip the count query (select only) * @param array List of fields that cannot be empty * @return object rcube_result_set List of contact records and 'count' value */ - abstract function search($fields, $value, $strict=false, $select=true, $nocount=false, $required=array()); + abstract function search($fields, $value, $mode=0, $select=true, $nocount=false, $required=array()); /** * Count number of available contacts in database @@ -129,7 +140,7 @@ { return $this->error; } - + /** * Setter for errors for internal use * @@ -175,15 +186,16 @@ * If input isn't valid, the message to display can be fetched using get_error() * * @param array Assoziative array with data to save + * @param boolean Attempt to fix/complete record automatically * @return boolean True if input is valid, False if not. */ - public function validate($save_data) + public function validate(&$save_data, $autofix = false) { // check validity of email addresses foreach ($this->get_col_values('email', $save_data, true) as $email) { if (strlen($email)) { if (!check_email(rcube_idn_to_ascii($email))) { - $this->set_error('warning', rcube_label(array('name' => 'emailformaterror', 'vars' => array('email' => $email)))); + $this->set_error(self::ERROR_VALIDATE, rcube_label(array('name' => 'emailformaterror', 'vars' => array('email' => $email)))); return false; } } @@ -244,14 +256,25 @@ * Mark one or more contact records as deleted * * @param array Record identifiers + * @param bool Remove records irreversible (see self::undelete) */ - function delete($ids) + function delete($ids, $force=true) { /* empty for read-only address books */ } /** - * Remove all records from the database + * Unmark delete flag on contact record(s) + * + * @param array Record identifiers + */ + function undelete($ids) + { + /* empty for read-only address books */ + } + + /** + * Mark all records in database as deleted */ function delete_all() { @@ -274,6 +297,18 @@ { /* empty for address books don't supporting groups */ return array(); + } + + /** + * Get group properties such as name and email address(es) + * + * @param string Group identifier + * @return array Group properties as hash array + */ + function get_group($group_id) + { + /* empty for address books don't supporting groups */ + return null; } /** @@ -368,7 +403,7 @@ { $out = array(); foreach ($data as $c => $values) { - if (strpos($c, $col) === 0) { + if ($c === $col || strpos($c, $col.':') === 0) { if ($flat) { $out = array_merge($out, (array)$values); } @@ -378,7 +413,7 @@ } } } - + return $out; } @@ -397,7 +432,7 @@ array('/[\s;\+\-\/]+/i', '/(\d)[-.\s]+(\d)/', '/\s\w{1,3}\s/'), array(' ', '\\1\\2', ' '), $str)); - + foreach ($arr as $i => $part) { if (utf8_encode(utf8_decode($part)) == $part) { // is latin-1 ? $arr[$i] = utf8_encode(strtr(strtolower(strtr(utf8_decode($part), @@ -408,7 +443,7 @@ else $arr[$i] = mb_strtolower($part); } - + return join(" ", $arr); } @@ -417,9 +452,11 @@ * 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 + * * @return string Display name */ - public static function compose_display_name($contact) + public static function compose_display_name($contact, $list_mode = false) { $contact = rcmail::get_instance()->plugins->exec_hook('contact_displayname', $contact); $fn = $contact['name']; @@ -429,7 +466,12 @@ // 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 $email; + list($emailname) = explode('@', $email); if (preg_match('/(.*)[\.\-\_](.*)/', $emailname, $match)) $fn = trim(ucfirst($match[1]).' '.ucfirst($match[2])); -- Gitblit v1.9.1