public function execute() { // only allowed to admin if ($this->getRights('backend') <= 1) { throw new waRightsException(_w('Access denied')); } $ids = waRequest::request('ids', array(), 'array_int'); $collection = new contactsCollection('id/' . implode(',', $ids)); $collection->orderBy('~data', 'DESC'); $contacts = $collection->getContacts('*,photo_url_96', 0, 500); foreach ($contacts as &$c) { $c['name'] = waContactNameField::formatName($c); } unset($c); // Field names $fields = array(); // field id => field name foreach (waContactFields::getAll('enabled') as $field_id => $field) { $fields[$field_id] = $field->getName(); // Format data for template if needed foreach ($contacts as &$c) { if (empty($c[$field_id])) { continue; } if (!is_array($c[$field_id]) || $this->is_assoc($c[$field_id])) { $c[$field_id] = $field->format($c[$field_id], 'html'); } else { foreach ($c[$field_id] as &$v) { $v = $field->format($v, 'html'); } unset($v); $c[$field_id] = implode(', ', $c[$field_id]); } } unset($c); } // skip some fields in the list $fields = array_diff_key($fields, array('title' => true, 'name' => true, 'photo' => true, 'firstname' => true, 'middlename' => true, 'lastname' => true, 'locale' => true, 'timezone' => true)); // Initialize 'master_only' key foreach ($contacts as &$c) { $c['master_only'] = ''; } unset($c); // Event to allow other applications to add their data if needed $params = array_keys($contacts); $links = wa()->event('links', $params); $apps = wa()->getApps(); foreach ($links as $app_id => $app_links) { foreach ($app_links as $contact_id => $contact_links) { foreach ($contact_links as $l) { // Show information about links $field_name = $apps[$app_id]['name'] . '/' . $l['role']; $fields[$field_name] = $field_name; $contacts[$contact_id][$field_name] = _w("%d link", "%d links", $l['links_number']); // Show warning if this contact cannot be merged into other contacts. if (!empty($l['forbid_merge_reason'])) { if (!empty($contacts[$contact_id]['master_only'])) { $contacts[$contact_id]['master_only'] .= '<br>'; } else { $contacts[$contact_id]['master_only'] = ''; } $contacts[$contact_id]['master_only'] .= $l['forbid_merge_reason']; } } } } // List of contacts that can be safely merged into other contacts $slave_ids = array(); foreach ($contacts as &$c) { if ($c['is_user'] > 0) { $c['master_only'] = ($c['master_only'] ? $c['master_only'] . '<br>' : '') . _w('Users can not be merged into other contacts.'); } else { if (empty($c['master_only'])) { $slave_ids[] = $c['id']; } } $author = array('name' => ''); if ($c['create_contact_id']) { $author_contact = new waContact($c['create_contact_id']); if ($author_contact->exists()) { $author = $author_contact; } } $c['author'] = $author; } unset($c); $this->view->assign('slave_ids', $slave_ids); $this->view->assign('contacts', $contacts); $this->view->assign('fields', $fields); }
public function getLastViewContext() { if ($this->getRequest()->get('last_hash') === null) { return null; } $params = array('hash' => $this->getRequest()->get('last_hash', ''), 'sort' => $this->getRequest()->get('sort', ''), 'order' => $this->getRequest()->get('order', 1, 'int') ? ' ASC' : ' DESC', 'offset' => $this->getRequest()->get('offset', 0)); $context = null; $plugins_context = wa()->event('backend_last_view_context', $params); foreach ($plugins_context as $cntx) { if (!empty($cntx)) { $context = $cntx; break; } } if (!$context) { $hash = $params['hash']; $sort = $params['sort']; $order = $params['order']; $offset = $params['offset']; $collection = new contactsCollection($hash); if ($sort) { $collection->orderBy($sort, $order); } $total_count = $collection->count(); $ids = array_keys($collection->getContacts('id', max($offset - 1, 0), 3)); $prev = null; $next = null; if ($offset > 0) { $prev = $ids[0]; if ($offset < $total_count - 1) { $next = $ids[2]; } } else { if ($offset < $total_count - 1) { $next = $ids[1]; } } $context = array('total_count' => $total_count, 'offset' => $offset, 'prev' => $prev, 'next' => $next); } return $context; }
public function execute() { $this->prepare(); if ($query = trim(waRequest::post('query'), '/')) { if (strpos($query, '/') === false) { $h = $hash = 'search/' . $query; } else { $h = $hash = $query; if (substr($hash, 0, 14) == 'import/results') { $h = str_replace('import/results', 'import', $hash); } } } else { $h = $hash = ''; } $h_parts = explode('/', $h, 2); $add_fields = array(); if ($h_parts[0] == 'explore') { $collection = new contactsCollection(); $event_params = array('collection' => $collection, 'hash' => $h_parts[1]); $result = wa()->event('explore', $event_params); if ($result) { $result = reset($result); $add_fields = ifset($result['fields']); $this->response['add_fields'] = $add_fields; $this->response['name'] = $result['name']; } } else { $collection = new contactsCollection($h); } $this->response['fields'] = array(); $fields = '*,photo_url_32,photo_url_96'; if ($h_parts[0] === 'users') { $fields .= ',_access'; $this->response['fields']['_access'] = array('id' => '_access', 'name' => _w('Access'), 'type' => 'Access', 'vertical' => true); } $collection->orderBy($this->sort, $this->order); $this->response['count'] = $collection->count(); $view = waRequest::post('view'); if ($view == 'list') { // Preload info to cache to avoid excess DB access $cm = new waCountryModel(); $cm->preload(); } $this->response['contacts'] = array_values($collection->getContacts($fields, $this->offset, $this->limit)); $this->workupContacts($this->response['contacts']); $this->response['total_count'] = $collection->count(); foreach ($this->response['contacts'] as $i => &$c) { $c['offset'] = $this->offset + $i; } unset($c); if ($view == 'list') { // Need to format field values correctly for this view. foreach ($this->response['contacts'] as &$cdata) { $c = new waContact($cdata['id']); $c->setCache($cdata); $data = $c->load('list,js') + $cdata; contactsHelper::normalzieContactFieldValues($data, waContactFields::getInfo($c['is_company'] ? 'company' : 'person', true)); if (isset($data['photo'])) { $data['photo'] = $c->getPhoto(); } $c->removeCache(array_keys($cdata)); $cdata = $data; } $this->response['fields'] = array_merge($this->response['fields'], contactsHelper::getFieldsDescription(array('title', 'name', 'photo', 'firstname', 'middlename', 'lastname', 'locale', 'timezone', 'jobtitle', 'company', 'sex', 'company_contact_id'), true)); unset($cdata); } // for companies set name to company name // for contacts with empty name, set it to <no name> foreach ($this->response['contacts'] as &$c) { if (isset($c['name']) && trim($c['name'])) { continue; } if (isset($c['company']) && trim($c['company'])) { $c['name'] = $c['company']; unset($c['company']); continue; } $c['name'] = '<' . _w('no name') . '>'; } unset($c); $title = $collection->getTitle(); $hm = new contactsHistoryModel(); if ($hash) { $type = explode('/', $hash); $hash = substr($hash, 0, 1) == '/' ? $hash : '/contacts/' . $hash; $type = $type[0]; // if search query looks like a quick search then remove field name from header if ($type == 'search' && preg_match('~^/contacts/search/(name\\*=[^/]*|email\\*=[^/]*@[^/]*)/?$~i', $hash)) { $title = preg_replace("~^[^=]+=~", '', $title); } // save history if ($type == 'search') { $hm->save($hash, $title, $type, $this->response['count']); $this->logAction('search'); } // Information about system category in categories view if (substr($hash, 0, 19) === '/contacts/category/') { $category_id = (int) substr($hash, 19); $cm = new waContactCategoryModel(); $category = $cm->getById($category_id); if ($category && $category['system_id']) { $this->response['system_category'] = $category['system_id']; } } } // Update history in user's browser $this->response['history'] = $hm->get(); $this->response['title'] = $title; }