/** * update foreign key values * * @param string $_mode create|update * @param Tinebase_Record_Interface $_record */ protected function _updateForeignKeys($_mode, Tinebase_Record_Interface $_record) { if (!empty($this->_foreignTables)) { foreach ($this->_foreignTables as $modelName => $join) { if (!(isset($join['field']) || array_key_exists('field', $join))) { continue; } $idsToAdd = array(); $idsToRemove = array(); if (!empty($_record->{$modelName})) { $idsToAdd = Tinebase_Record_RecordSet::getIdsFromMixed($_record->{$modelName}); } $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb()); if ($_mode == 'update') { $select = $this->_db->select(); $select->from(array($join['table'] => $this->_tablePrefix . $join['table']), array($join['field']))->where($this->_db->quoteIdentifier($join['table'] . '.' . $join['joinOn']) . ' = ?', $_record->getId()); Tinebase_Backend_Sql_Abstract::traitGroup($select); $stmt = $this->_db->query($select); $currentIds = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); $stmt->closeCursor(); $idsToRemove = array_diff($currentIds, $idsToAdd); $idsToAdd = array_diff($idsToAdd, $currentIds); } if (!empty($idsToRemove)) { $where = '(' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $join['table'] . '.' . $join['joinOn']) . ' = ?', $_record->getId()) . ' AND ' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $join['table'] . '.' . $join['field']) . ' IN (?)', $idsToRemove) . ')'; $this->_db->delete($this->_tablePrefix . $join['table'], $where); } foreach ($idsToAdd as $id) { $recordArray = array($join['joinOn'] => $_record->getId(), $join['field'] => $id); $this->_db->insert($this->_tablePrefix . $join['table'], $recordArray); } Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId); } } }
/** * remove members from list * * @param mixed $_listId * @param mixed $_membersToRemove * @return Addressbook_Model_List */ public function removeListMember($_listId, $_membersToRemove) { /** @var Addressbook_Model_List $list */ $list = $this->get($_listId); if (empty($_membersToRemove)) { return $list; } $removeMembers = Tinebase_Record_RecordSet::getIdsFromMixed($_membersToRemove); $idsToRemove = array_intersect($list->members, $removeMembers); $listId = Tinebase_Record_Abstract::convertId($_listId, $this->_modelName); $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb()); if (!empty($idsToRemove)) { $where = '(' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $this->_foreignTables['members']['table'] . '.' . $this->_foreignTables['members']['joinOn']) . ' = ?', $listId) . ' AND ' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $this->_foreignTables['members']['table'] . '.' . $this->_foreignTables['members']['field']) . ' IN (?)', $idsToRemove) . ')'; $this->_db->delete($this->_tablePrefix . $this->_foreignTables['members']['table'], $where); } Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId); return $this->get($_listId); }
/** * remove members from list * * @param mixed $_listId * @param mixed $_removeMembers * @param boolean $_removeFromGroup * @return Addressbook_Model_List */ public function removeListMember($_listId, $_removeMembers, $_removeFromGroup = true) { $list = $this->get($_listId); $this->_checkGrant($list, 'update', TRUE, 'No permission to remove list member.'); $this->_checkGroupGrant($list, TRUE, 'No permission to remove list member.'); $list = $this->_backend->removeListMember($_listId, $_removeMembers); if (true === $_removeFromGroup && !empty($list->group_id)) { foreach (Tinebase_Record_RecordSet::getIdsFromMixed($_removeMembers) as $userId) { Admin_Controller_Group::getInstance()->removeGroupMember($list->group_id, $userId, false); } } return $this->get($list->getId()); }