diff options
author | thomascube <thomas@roundcube.net> | 2010-03-26 16:38:20 +0000 |
---|---|---|
committer | thomascube <thomas@roundcube.net> | 2010-03-26 16:38:20 +0000 |
commit | a61bbb24aafec5718ca9bc985e7c596c5821f018 (patch) | |
tree | 0aac5efbd70ab7fbdb42cb4d7a0302a3a51f3fac /program/include | |
parent | c75f8e9526d629c9b5aa7396885ae76d20c5c255 (diff) |
Added basic contact groups feature
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/rcmail.php | 14 | ||||
-rw-r--r-- | program/include/rcube_addressbook.php | 14 | ||||
-rw-r--r-- | program/include/rcube_contacts.php | 180 |
3 files changed, 192 insertions, 16 deletions
diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 548ca6b12..1224822c6 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -300,19 +300,21 @@ class rcmail if ($abook_type != 'ldap') { $list['0'] = array( 'id' => 0, - 'name' => rcube_label('personaladrbook'), + 'name' => rcube_label('personaladrbook'), + 'groups' => true, 'readonly' => false, - 'autocomplete' => in_array('sql', $autocomplete) + 'autocomplete' => in_array('sql', $autocomplete) ); } if (is_array($ldap_config)) { foreach ($ldap_config as $id => $prop) $list[$id] = array( - 'id' => $id, - 'name' => $prop['name'], - 'readonly' => !$prop['writable'], - 'autocomplete' => in_array('sql', $autocomplete) + 'id' => $id, + 'name' => $prop['name'], + 'groups' => false, + 'readonly' => !$prop['writable'], + 'autocomplete' => in_array('sql', $autocomplete) ); } diff --git a/program/include/rcube_addressbook.php b/program/include/rcube_addressbook.php index b691ee8d5..ff525bc11 100644 --- a/program/include/rcube_addressbook.php +++ b/program/include/rcube_addressbook.php @@ -29,6 +29,7 @@ abstract class rcube_addressbook { /** public properties */ var $primary_key; + var $groups = false; var $readonly = true; var $ready = false; var $list_page = 1; @@ -63,6 +64,13 @@ abstract class rcube_addressbook abstract function list_records($cols=null, $subset=0); /** + * List all active contact groups of this source + * + * @return array Indexed list of contact groups, each a hash array + */ + function list_groups() { } + + /** * Search records * * @param array List of fields to search in @@ -124,6 +132,12 @@ abstract class rcube_addressbook } /** + * Setter for the current group + * (empty, has to be re-implemented by extending class) + */ + function set_group($gid) { } + + /** * Create a new contact record * * @param array Assoziative array with save data diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php index 23f86e852..41f47eae3 100644 --- a/program/include/rcube_contacts.php +++ b/program/include/rcube_contacts.php @@ -39,8 +39,10 @@ class rcube_contacts extends rcube_addressbook /** public properties */ var $primary_key = 'contact_id'; var $readonly = false; + var $groups = true; var $list_page = 1; var $page_size = 10; + var $group_id = 0; var $ready = false; @@ -82,6 +84,16 @@ class rcube_contacts extends rcube_addressbook /** + * Setter for the current group + * (empty, has to be re-implemented by extending class) + */ + function set_group($gid) + { + $this->group_id = $gid; + } + + + /** * Reset all saved results and search parameters */ function reset() @@ -92,6 +104,32 @@ class rcube_contacts extends rcube_addressbook $this->search_string = null; } + /** + * List all active contact groups of this source + * + * @param string Search string to match group name + * @return array Indexed list of contact groups, each a hash array + */ + function list_groups($search = null) + { + $results = array(); + $sql_filter = $search ? "AND " . $this->db->ilike('name', '%'.$search.'%') : ''; + + $sql_result = $this->db->query( + "SELECT * FROM ".get_table_name('contactgroups')." + WHERE del<>1 + AND user_id=? + $sql_filter + ORDER BY name", + $this->user_id); + + while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) { + $sql_arr['ID'] = $sql_arr['contactgroup_id']; + $results[] = $sql_arr; + } + + return $results; + } /** * List the current set of contact records @@ -109,18 +147,24 @@ class rcube_contacts extends rcube_addressbook // get contacts from DB if ($this->result->count) { + if ($this->group_id) + $join = "LEFT JOIN ".get_table_name('contactgroupmembers')." AS rcmgrouplinks". + " ON (rcmgrouplinks.contact_id=rcmcontacts.".$this->primary_key.")"; + $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first; $length = $subset != 0 ? abs($subset) : $this->page_size; $sql_result = $this->db->limitquery( - "SELECT * FROM ".$this->db_name." - WHERE del<>1 - AND user_id=?" . + "SELECT * FROM ".$this->db_name." AS rcmcontacts ".$join." + WHERE rcmcontacts.del<>1 + AND rcmcontacts.user_id=?" . + ($this->group_id ? " AND rcmgrouplinks.contactgroup_id=?" : ""). ($this->filter ? " AND (".$this->filter.")" : "") . - " ORDER BY name", + " ORDER BY rcmcontacts.name", $start_row, $length, - $this->user_id); + $this->user_id, + $this->group_id); } while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) @@ -184,14 +228,20 @@ class rcube_contacts extends rcube_addressbook */ function count() { + if ($this->group_id) + $join = "LEFT JOIN ".get_table_name('contactgroupmembers')." AS rcmgrouplinks". + " ON (rcmgrouplinks.contact_id=rcmcontacts.".$this->primary_key.")"; + // count contacts for this user $sql_result = $this->db->query( - "SELECT COUNT(contact_id) AS rows - FROM ".$this->db_name." - WHERE del<>1 - AND user_id=?". + "SELECT COUNT(rcmcontacts.contact_id) AS rows + FROM ".$this->db_name." AS rcmcontacts ".$join." + WHERE rcmcontacts.del<>1 + AND rcmcontacts.user_id=?". + ($this->group_id ? " AND rcmgrouplinks.contactgroup_id=?" : ""). ($this->filter ? " AND (".$this->filter.")" : ""), - $this->user_id); + $this->user_id, + $this->group_id); $sql_arr = $this->db->fetch_assoc($sql_result); return new rcube_result_set($sql_arr['rows'], ($this->list_page-1) * $this->page_size);; @@ -357,4 +407,114 @@ class rcube_contacts extends rcube_addressbook return $this->db->affected_rows(); } + + /** + * Create a contact group with the given name + * + * @param string The group name + * @return False on error, array with record props in success + */ + function create_group($name) + { + $result = false; + + $sql_result = $this->db->query( + "SELECT * FROM ".get_table_name('contactgroups')." + WHERE del<>1 + AND user_id=? + AND name LIKE ?", + $this->user_id, + $name . '%'); + + // make sure we have a unique name + if ($num = $this->db->num_rows($sql_result)) + $name .= ' ' . ($num+1); + + $this->db->query( + "INSERT INTO ".get_table_name('contactgroups')." (user_id, changed, name) + VALUES (".intval($this->user_id).", ".$this->db->now().", ".$this->db->quote($name).")" + ); + + if ($insert_id = $this->db->insert_id('contactgroups')) + $result = array('id' => $insert_id, 'name' => $name); + + return $result; + } + + /** + * Delete the given group and all linked group members + * + * @param string Group identifier + */ + function delete_group($gid) + { + $sql_result = $this->db->query( + "DELETE FROM ".get_table_name('contactgroupmembers')." + WHERE contactgroup_id=?", + $gid); + + $sql_result = $this->db->query( + "UPDATE ".get_table_name('contactgroups')." + SET del=1, changed=".$this->db->now()." + WHERE contactgroup_id=?", + $gid); + + return $this->db->affected_rows(); + } + + /** + * Add the given contact records the a certain group + * + * @param string Group identifier + * @param array List of contact identifiers to be added + */ + function add_to_group($group_id, $ids) + { + if (!is_array($ids)) + $ids = explode(',', $ids); + + $added = 0; + + foreach ($ids as $contact_id) { + $sql_result = $this->db->query( + "SELECT 1 FROM ".get_table_name('contactgroupmembers')." + WHERE contactgroup_id=? + AND contact_id=?", + $group_id, + $contact_id); + + if (!$this->db->num_rows($sql_result)) { + $this->db->query( + "INSERT INTO ".get_table_name('contactgroupmembers')." (contactgroup_id, contact_id, created) + VALUES (".intval($group_id).", ".intval($contact_id).", ".$this->db->now().")" + ); + if (!$this->db->db_error) + $added++; + } + } + + return $added; + } + + + /** + * Remove the given contact records from a certain group + * + * @param string Group identifier + * @param array List of contact identifiers to be removed + */ + function remove_from_group($group_id, $ids) + { + if (!is_array($ids)) + $ids = explode(',', $ids); + + $sql_result = $this->db->query( + "DELETE FROM ".get_table_name('contactgroupmembers')." + WHERE contactgroup_id=? + AND contact_id IN (".join(',', array_map(array($this->db, 'quote'), $ids)).")", + $group_id); + + return $this->db->affected_rows(); + } + } |