| | |
| | | |
| | | $SEARCH_MODS_DEFAULT = array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1); |
| | | |
| | | // select source |
| | | $source = get_input_value('_source', RCUBE_INPUT_GPC); |
| | | |
| | | if (!$RCMAIL->action && !$OUTPUT->ajax_call) { |
| | | // add list of address sources to client env |
| | | $js_list = $RCMAIL->get_address_sources(); |
| | | |
| | | // if source is not set use first directory |
| | | if (empty($source)) |
| | | $source = $js_list[key($js_list)]['id']; |
| | | |
| | | $search_mods = $RCMAIL->config->get('addressbook_search_mods', $SEARCH_MODS_DEFAULT); |
| | | $OUTPUT->set_env('search_mods', $search_mods); |
| | | $OUTPUT->set_env('address_sources', $js_list); |
| | | } |
| | | |
| | | // instantiate a contacts object according to the given source |
| | | $CONTACTS = $RCMAIL->get_address_book($source); |
| | | |
| | | $CONTACTS->set_pagesize($CONFIG['pagesize']); |
| | | |
| | | // set list properties and session vars |
| | | if (!empty($_GET['_page'])) |
| | | $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page']))); |
| | | else |
| | | $CONTACTS->set_page(isset($_SESSION['page']) ?$_SESSION['page'] : 1); |
| | | |
| | | if (!empty($_REQUEST['_gid'])) |
| | | $CONTACTS->set_group(get_input_value('_gid', RCUBE_INPUT_GPC)); |
| | | |
| | | // set data source env |
| | | $OUTPUT->set_env('source', $source ? $source : '0'); |
| | | $OUTPUT->set_env('readonly', $CONTACTS->readonly); |
| | | if (!$OUTPUT->ajax_call) { |
| | | $search_mods = $RCMAIL->config->get('addressbook_search_mods', $SEARCH_MODS_DEFAULT); |
| | | $OUTPUT->set_env('search_mods', $search_mods); |
| | | $OUTPUT->set_pagetitle(rcube_label('addressbook')); |
| | | } |
| | | |
| | | |
| | | // general definition of contact coltypes |
| | | $CONTACT_COLTYPES = array( |
| | | 'name' => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('name'), 'category' => 'main'), |
| | |
| | | // TODO: define fields for vcards like GEO, KEY |
| | | ); |
| | | |
| | | |
| | | // Addressbook UI |
| | | if (!$RCMAIL->action && !$OUTPUT->ajax_call) { |
| | | // add list of address sources to client env |
| | | $js_list = $RCMAIL->get_address_sources(); |
| | | |
| | | // use first directory by default |
| | | $source = $js_list[key($js_list)]['id']; |
| | | |
| | | // find writeable source |
| | | foreach ($js_list as $s) { |
| | | if (!$s['readonly']) { |
| | | $OUTPUT->set_env('writable_source', $s['id']); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | $search_mods = $RCMAIL->config->get('addressbook_search_mods', $SEARCH_MODS_DEFAULT); |
| | | $OUTPUT->set_env('search_mods', $search_mods); |
| | | $OUTPUT->set_env('address_sources', $js_list); |
| | | |
| | | $OUTPUT->set_pagetitle(rcube_label('addressbook')); |
| | | |
| | | $CONTACTS = rcmail_contact_source($source, true); |
| | | } |
| | | |
| | | |
| | | // instantiate a contacts object according to the given source |
| | | function rcmail_contact_source($source=null, $init_env=false) |
| | | { |
| | | global $RCMAIL, $OUTPUT, $CONFIG, $CONTACT_COLTYPES; |
| | | |
| | | if (!strlen($source)) { |
| | | $source = get_input_value('_source', RCUBE_INPUT_GPC); |
| | | } |
| | | |
| | | if (!strlen($source)) { |
| | | return null; |
| | | } |
| | | |
| | | // Get object |
| | | $CONTACTS = $RCMAIL->get_address_book($source); |
| | | $CONTACTS->set_pagesize($CONFIG['pagesize']); |
| | | |
| | | // set list properties and session vars |
| | | if (!empty($_GET['_page'])) |
| | | $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page']))); |
| | | else |
| | | $CONTACTS->set_page(isset($_SESSION['page']) ? $_SESSION['page'] : 1); |
| | | |
| | | if (!empty($_REQUEST['_gid'])) |
| | | $CONTACTS->set_group(get_input_value('_gid', RCUBE_INPUT_GPC)); |
| | | |
| | | if (!$init_env) |
| | | return $CONTACTS; |
| | | |
| | | $OUTPUT->set_env('readonly', $CONTACTS->readonly); |
| | | $OUTPUT->set_env('source', $source); |
| | | |
| | | // reduce/extend $CONTACT_COLTYPES with specification from the current $CONTACT object |
| | | if (is_array($CONTACTS->coltypes)) { |
| | | // remove cols not listed by the backend class |
| | |
| | | } |
| | | |
| | | $OUTPUT->set_env('photocol', is_array($CONTACT_COLTYPES['photo'])); |
| | | |
| | | return $CONTACTS; |
| | | } |
| | | |
| | | |
| | | function rcmail_default_source($writable=false) |
| | | { |
| | | global $RCMAIL; |
| | | |
| | | // get list of address sources |
| | | $list = $RCMAIL->get_address_sources($writable); |
| | | |
| | | // use first directory by default |
| | | return $list[key($list)]['id']; |
| | | } |
| | | |
| | | |
| | | function rcmail_directory_list($attrib) |
| | |
| | | while ($row = $result->next()) { |
| | | $a_row_cols = array(); |
| | | |
| | | // build contact ID with source ID |
| | | if (isset($row['sourceid'])) { |
| | | $row['ID'] = $row['ID'].'-'.$row['sourceid']; |
| | | } |
| | | |
| | | // format each col |
| | | foreach ($a_show_cols as $col) |
| | | $a_row_cols[$col] = Q($row[$col]); |
| | |
| | | } |
| | | |
| | | |
| | | function rcmail_get_rowcount_text() |
| | | function rcmail_get_rowcount_text($result=null) |
| | | { |
| | | global $CONTACTS; |
| | | global $CONTACTS, $CONFIG; |
| | | |
| | | // read nr of contacts |
| | | if (!$result) { |
| | | $result = $CONTACTS->get_result(); |
| | | } |
| | | if (!$result) { |
| | | $result = $CONTACTS->count(); |
| | | } |
| | |
| | | 'name' => 'contactsfromto', |
| | | 'vars' => array( |
| | | 'from' => $result->first + 1, |
| | | 'to' => min($result->count, $result->first + $CONTACTS->page_size), |
| | | 'to' => min($result->count, $result->first + $CONFIG['pagesize']), |
| | | 'count' => $result->count) |
| | | )); |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Returns contact ID(s) and source(s) from GET/POST data |
| | | * |
| | | * @return array List of contact IDs per-source |
| | | */ |
| | | function rcmail_get_cids() |
| | | { |
| | | // contact ID (or comma-separated list of IDs) is provided in two |
| | | // forms. If _source is an empty string then the ID is a string |
| | | // containing contact ID and source name in form: <ID>-<SOURCE> |
| | | |
| | | $cid = get_input_value('_cid', RCUBE_INPUT_GPC); |
| | | $source = get_input_value('_source', RCUBE_INPUT_GPC); |
| | | |
| | | if (!preg_match('/^[a-zA-Z0-9\+\/=_-]+(,[a-zA-Z0-9\+\/=_-]+)*$/', $cid)) { |
| | | return array(); |
| | | } |
| | | |
| | | $cid = explode(',', $cid); |
| | | $got_source = strlen($source); |
| | | $result = array(); |
| | | |
| | | // create per-source contact IDs array |
| | | foreach ($cid as $id) { |
| | | // if _source is not specified we'll find it from decoded ID |
| | | if (!$got_source) { |
| | | list ($c, $s) = explode('-', $id, 2); |
| | | if (strlen($s)) { |
| | | $result[$s][] = $c; |
| | | } |
| | | else if (strlen($source)) { |
| | | $result[$source][] = $c; |
| | | } |
| | | } |
| | | else { |
| | | $result[$source][] = $id; |
| | | } |
| | | } |
| | | |
| | | return $result; |
| | | } |
| | | |
| | | // register UI objects |
| | | $OUTPUT->add_handlers(array( |
| | | 'directorylist' => 'rcmail_directory_list', |