public function run() { extract($this->_params, EXTR_REFS); $this->updateSortOrderFromVars(); $title = _("Address Book Listing"); if (!$browse_source_count && $vars->get('key') != '**search') { $notification->push(_("There are no browseable address books."), 'horde.warning'); } else { try { $driver = $factory->create($source); } catch (Turba_Exception $e) { $notification->push($e, 'horde.error'); unset($driver); } } if (isset($driver)) { $actionID = $vars->get('actionID'); switch ($actionID) { case 'delete': $keys = $vars->get('objectkeys'); if (!is_array($keys)) { break; } $key = false; if ($vars->exists('key')) { $key = $vars->get('key'); } if ($key && $key != '**search') { // We are removing a contact from a list. $errorCount = 0; $list = $driver->getObject($key); foreach ($keys as $sourceKey) { list($objectSource, $objectKey) = explode(':', $sourceKey, 2); if (!$list->removeMember($objectKey, $objectSource)) { $errorCount++; } } if (!$errorCount) { $notification->push(sprintf(_("Successfully removed %d contact(s) from list."), count($keys)), 'horde.success'); } elseif (count($keys) == $errorCount) { $notification->push(sprintf(_("Error removing %d contact(s) from list."), count($keys)), 'horde.error'); } else { $notification->push(sprintf(_("Error removing %d of %d requested contact(s) from list."), $errorCount, count($keys)), 'horde.error'); } $list->store(); } else { // We are deleting an object. $errorCount = 0; foreach ($keys as $sourceKey) { list($objectSource, $objectKey) = explode(':', $sourceKey, 2); try { $driver->delete($objectKey); } catch (Turba_Exception $e) { ++$errorCount; } } if (!$errorCount) { $notification->push(sprintf(ngettext("Successfully deleted %d contact.", "Successfully deleted %d contacts.", count($keys)), count($keys)), 'horde.success'); } elseif (count($keys) == $errorCount) { $notification->push(sprintf(ngettext("Error deleting %d contact.", "Error deleting %d contacts.", count($keys)), count($keys)), 'horde.error'); } else { $notification->push(sprintf(ngettext("Error deleting %d of %d requested contact.", "Error deleting %d of %d requested contacts.", count($keys)), $errorCount, count($keys)), 'horde.error'); } } break; case 'move': case 'copy': $keys = $vars->get('objectkeys'); if (!(is_array($keys) && $keys)) { break; } // If we have data, try loading the target address book driver. $targetSource = $vars->get('targetAddressbook'); try { $targetDriver = $factory->create($targetSource); } catch (Turba_Exception $e) { $notification->push($e, 'horde.error'); break; } if (Turba::hasMaxContacts($targetDriver)) { break; } foreach ($keys as $sourceKey) { // Split up the key into source and object ids. list($objectSource, $objectKey) = explode(':', $sourceKey, 2); // Ignore this entry if the target is the same as the // source. if ($objectSource == $targetDriver->getName()) { continue; } // Try and load the driver for the source. try { $sourceDriver = $factory->create($objectSource); } catch (Turba_Exception $e) { $notification->push($e, 'horde.error'); continue; } try { $object = $sourceDriver->getObject($objectKey); } catch (Horde_Exception_NotFound $e) { $notification->push(_("Failed to find object to be added"), 'horde.error'); continue; } if ($object->isGroup()) { if ($actionID == 'move') { $notification->push(sprintf(_("\"%s\" was not moved because it is a list."), $object->getValue('name')), 'horde.warning'); } else { $notification->push(sprintf(_("\"%s\" was not copied because it is a list."), $object->getValue('name')), 'horde.warning'); } continue; } // Try adding to the target. $objAttributes = array(); // Get the values through the Turba_Object class. foreach (array_keys($targetDriver->getCriteria()) as $info_key) { if (!is_array($targetDriver->map[$info_key]) || isset($targetDriver->map[$info_key]['attribute'])) { $objectValue = $object->getValue($info_key); // Get 'data' value if object type is image, the // direct value in other case. $objAttributes[$info_key] = isset($attributes[$info_key]) && $attributes[$info_key]['type'] == 'image' ? $objectValue['load']['data'] : $objectValue; } } unset($objAttributes['__owner']); if ($actionID == 'copy') { unset($objAttributes['__uid']); } // Try adding tags. $objAttributes['__tags'] = $object->getValue('__tags'); try { $targetDriver->add($objAttributes); } catch (Turba_Exception $e) { $notification->push(sprintf(_("Failed to add %s to %s: %s"), $object->getValue('name'), $targetDriver->title, $e), 'horde.error'); break; } $notification->push(sprintf(_("Successfully added %s to %s"), $object->getValue('name'), $targetDriver->title), 'horde.success'); // If we're moving objects, and we succeeded, // delete them from the original source now. if ($actionID == 'move') { try { $sourceDriver->delete($objectKey, false); } catch (Turba_Exception $e) { $notification->push(sprintf(_("There was an error deleting \"%s\" from the source address book."), $object->getValue('name')), 'horde.error'); } /* Log the adding of this item in the history again, * because otherwise the delete log would be after the * add log. */ try { $history->log('turba:' . $targetDriver->getName() . ':' . $objAttributes['__uid'], array('action' => 'add'), true); } catch (Exception $e) { Horde::log($e, 'ERR'); } } } break; case 'add': // Add a contact to a list. $keys = $vars->get('objectkeys'); if (!($targetKey = $vars->get('targetList'))) { break; } $args = array(); if (strlen($vars->get('targetNew'))) { $targetSource = $vars->get('targetAddressbook'); $args['attr'] = array('name' => $targetKey); } else { list($targetSource, $args['gid']) = explode(':', $targetKey, 2); if (!isset($cfgSources[$targetSource])) { break; } } $members = array(); foreach ($keys as $key) { $members[] = explode(':', $key, 2); } try { $res = Turba_Object_Group::createGroup($targetSource, $members, $args); } catch (Turba_Exception $e) { $notification->push($e, 'horde.error'); break; } if (isset($args['name'])) { $notification->push(sprintf(_("Successfully created the contact list \"%s\"."), $args['name']), 'horde.success'); } if (!empty($res->error)) { if ($res->success) { $notification->push(sprintf(_("Error adding %d of %d requested contact(s) to list."), count($res->error), count($res->error) + $res->success), 'horde.error'); } else { $notification->push(sprintf(_("Error adding %d contact(s) to list."), count($res->error)), 'horde.error'); } } elseif ($res->success) { $notification->push(sprintf(_("Successfully added %d contact(s) to list."), $res->success), 'horde.success'); } break; } // We might get here from the search page but are not allowed to // browse the current address book. if ($actionID && empty($cfgSources[$source]['browse'])) { Horde::url($prefs->getValue('initial_page'), true)->redirect(); } } $templates = array(); if (isset($driver)) { Turba::addBrowseJs(); // Read the columns to display from the preferences. $sources = Turba::getColumns(); $columns = isset($sources[$source]) ? $sources[$source] : array(); $sortorder = Turba::getPreferredSortOrder(); if ($vars->get('key')) { // We are displaying a list. try { $list = $driver->getObject($vars->get('key')); } catch (Horde_Exception $e) { $notification->push(_("There was an error displaying the list"), 'horde.error'); $list = null; } if ($list && $list->isGroup()) { $title = sprintf(_("Contacts in list: %s"), $list->getValue('name')); $templates[] = '/browse/header.inc'; // Show List Members. try { $results = $list->listMembers($sortorder); if (count($results) != $list->count()) { $count = $list->count() - count($results); $notification->push(sprintf(ngettext("There is %d contact in this list that is not viewable to you", "There are %d contacts in this list that are not viewable to you", $count), $count), 'horde.message'); } $view = new Turba_View_List($results, null, $columns); $view->setType('list'); } catch (Turba_Exception $e) { $notification->push(_("Failed to browse list"), 'horde.error'); } } } else { // We are displaying an address book. $title = $cfgSources[$source]['title']; $templates[] = '/browse/header.inc'; if (empty($cfgSources[$source]['browse'])) { $notification->push(_("Your default address book is not browseable."), 'horde.warning'); } else { $type_filter = array(); switch ($vars->get('show')) { case 'contacts': $type_filter = array('__type' => 'Object'); break; case 'lists': $type_filter = array('__type' => 'Group'); break; } try { $results = $driver->search($type_filter, $sortorder, 'AND', array_merge(array('__uid'), $columns ? $columns : array('name'))); $view = new Turba_View_List($results, null, $columns); $view->setType('directory'); } catch (Turba_Exception $e) { $notification->push($e, 'horde.error'); } } } } else { $templates[] = '/browse/header.inc'; } $page_output->addScriptFile('quickfinder.js', 'horde'); $page_output->addScriptFile('scriptaculous/effects.js', 'horde'); $page_output->addScriptFile('redbox.js', 'horde'); $page_output->header(array('title' => $title)); $notification->notify(array('listeners' => 'status')); foreach ($templates as $template) { require TURBA_TEMPLATES . $template; } if (isset($view) && is_object($view)) { $view->display(); } $page_output->footer(); }
/** * Adds a group (and its members) to the source provided. * * @param string $name Group name. * @param array $members An array of members to add to the group. Format * is the same as the 'array' argument to the * import() API function. * @param array $opts Additional options: * <pre> * - attr: (array) Additional attributes to add to group. * - source: (string) Source to import contacts to. * </pre> * * @return array An array with the following keys: * <pre> * - added: (integer) The number of addresses added to the group. * - uid: (string) The uid of the group object. * </pre> * * @throws Turba_Exception */ public function addGroup($name, $members, array $opts = array()) { global $injector; $source = $this->_getSource(isset($opts['source']) ? $opts['source'] : null); $driver = $injector->getInstance('Turba_Factory_Driver')->create($source); if (!$driver->hasPermission(Horde_Perms::EDIT)) { throw new Turba_Exception(_("Permission denied")); } $group_add = array(); foreach ($members as $val) { $ob = null; $result = $driver->search($val); if (count($result)) { $ob = $result->reset(); } else { try { $ob = $driver->getObject($driver->add($this->_encodeContent($val))); } catch (Exception $e) { } } if ($ob) { $group_add[] = array($source, $ob->getValue('__key')); } } $res = Turba_Object_Group::createGroup($source, $group_add, array('attr' => array_merge(isset($opts['attr']) ? $opts['attr'] : array(), array('name' => $name)))); return array('added' => $res->success, 'uid' => $res->group->getValue('__uid')); }
$row['__owner'] = $driver->getContactOwner(); try { $driver->add($row); $imported++; } catch (Turba_Exception $e) { $notification->push(sprintf(_("There was an error importing the data: %s"), $e->getMessage()), 'horde.error'); $error = true; break; } } } // Now attempt to create Turba group objects. foreach ($contact_groups as $group) { $attributes = $group; unset($attributes['__members']); $group_obj = new Turba_Object_Group($driver, $attributes); foreach (explode(',', $group['__members']) as $uid) { $results = $driver->search(array('__uid' => $uid)); if (count($results->objects)) { $object = array_pop($results->objects); $group_obj->addMember($object->getValue('__key'), $object->getSource()); } } // We don't actually use the group object to save to storage since // it's not an existing group. We use it so it's responsible for // properly formatting the __members data, which we pull out and // place in the attributes array. $attributes['__members'] = $group_obj->getValue('__members'); $attributes['__type'] = 'group'; $driver->add($attributes); }