/** * returns multiple records prepared for json transport * * @param Tinebase_Record_RecordSet $_records Tinebase_Record_Abstract * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination needed for sorting * @return array data * * @todo perhaps we need to resolveContainerTagsUsers() before mergeAndRemoveNonMatchingRecurrences(), but i'm not sure about that * @todo use Calendar_Convert_Event_Json */ protected function _multipleRecordsToJson(Tinebase_Record_RecordSet $_records, $_filter = NULL, $_pagination = NULL) { if ($_records->getRecordClassName() == 'Calendar_Model_Event') { if (is_null($_filter)) { throw new Tinebase_Exception_InvalidArgument('Required argument $_filter is missing'); } Tinebase_Notes::getInstance()->getMultipleNotesOfRecords($_records); Calendar_Model_Attender::resolveAttendee($_records->attendee, TRUE, $_records); Calendar_Convert_Event_Json::resolveOrganizer($_records); Calendar_Convert_Event_Json::resolveRrule($_records); Calendar_Controller_Event::getInstance()->getAlarms($_records); Calendar_Model_Rrule::mergeAndRemoveNonMatchingRecurrences($_records, $_filter); $_records->sortByPagination($_pagination); $eventsData = parent::_multipleRecordsToJson($_records); foreach ($eventsData as $eventData) { if (!array_key_exists(Tinebase_Model_Grants::GRANT_READ, $eventData) || !$eventData[Tinebase_Model_Grants::GRANT_READ]) { $eventData['notes'] = array(); $eventData['tags'] = array(); } } return $eventsData; } return parent::_multipleRecordsToJson($_records); }
/** * returns multiple records prepared for json transport * * @param Tinebase_Record_RecordSet $_records Tinebase_Record_Abstract * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination * @return array data */ protected function _multipleRecordsToJson(Tinebase_Record_RecordSet $_records, $_filter = NULL, $_pagination = null) { switch ($_records->getRecordClassName()) { case 'Sipgate_Model_Connection': Sipgate_Controller_Line::getInstance()->resolveMultipleLines($_records); $this->_resolveMultipleContacts($_records); break; case 'Sipgate_Model_Line': Sipgate_Controller_Account::getInstance()->resolveMultipleAccounts($_records); Tinebase_User::getInstance()->resolveMultipleUsers($_records, $this->_resolveUserFields['Sipgate_Model_Line']); break; } return parent::_multipleRecordsToJson($_records); }
/** * returns multiple records prepared for json transport * * @param Tinebase_Record_RecordSet $_records Tinebase_Record_Abstract * @param Tinebase_Model_Filter_FilterGroup $_filter * @return array data */ protected function _multipleRecordsToJson(Tinebase_Record_RecordSet $_records, $_filter = NULL) { switch ($_records->getRecordClassName()) { case 'Tinebase_Model_AccessLog': // TODO use _resolveUserFields and remove this foreach ($_records as $record) { if (!empty($record->account_id)) { try { $record->account_id = Admin_Controller_User::getInstance()->get($record->account_id)->toArray(); } catch (Tinebase_Exception_NotFound $e) { $record->account_id = Tinebase_User::getInstance()->getNonExistentUser('Tinebase_Model_FullUser')->toArray(); } } } break; case 'Tinebase_Model_Container': case 'Tinebase_Model_CustomField_Config': $applications = Tinebase_Application::getInstance()->getApplications(); foreach ($_records as $record) { $idx = $applications->getIndexById($record->application_id); if ($idx !== FALSE) { $record->application_id = $applications[$idx]; } } break; } $result = parent::_multipleRecordsToJson($_records, $_filter); return $result; }
/** * compares two recordsets / only compares the ids / returns all records that are different in an array: * - removed -> all records that are in $this but not in $_recordSet * - added -> all records that are in $_recordSet but not in $this * - modified -> array of diffs for all different records that are in both record sets * * @param Tinebase_Record_RecordSet $recordSet * @return Tinebase_Record_RecordSetDiff */ public function diff($recordSet) { if (!$recordSet instanceof Tinebase_Record_RecordSet) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Did not get Tinebase_Record_RecordSet, skipping diff(' . $this->_recordClass . ')'); } return new Tinebase_Record_RecordSetDiff(array('model' => $this->getRecordClassName())); } if ($this->getRecordClassName() !== $recordSet->getRecordClassName()) { throw new Tinebase_Exception_InvalidArgument('can only compare recordsets with the same type of records'); } $existingRecordsIds = $this->getArrayOfIds(); $toCompareWithRecordsIds = $recordSet->getArrayOfIds(); $removedIds = array_diff($existingRecordsIds, $toCompareWithRecordsIds); $addedIds = array_diff($toCompareWithRecordsIds, $existingRecordsIds); $modifiedIds = array_intersect($existingRecordsIds, $toCompareWithRecordsIds); $removed = new Tinebase_Record_RecordSet($this->getRecordClassName()); $added = new Tinebase_Record_RecordSet($this->getRecordClassName()); $modified = new Tinebase_Record_RecordSet('Tinebase_Record_Diff'); foreach ($addedIds as $id) { $added->addRecord($recordSet->getById($id)); } // consider records without id, too foreach ($recordSet->getIdLessIndexes() as $index) { $added->addRecord($recordSet->getByIndex($index)); } foreach ($removedIds as $id) { $removed->addRecord($this->getById($id)); } // consider records without id, too foreach ($this->getIdLessIndexes() as $index) { $removed->addRecord($this->getByIndex($index)); } foreach ($modifiedIds as $id) { $diff = $this->getById($id)->diff($recordSet->getById($id)); if (!$diff->isEmpty()) { $modified->addRecord($diff); } } $result = new Tinebase_Record_RecordSetDiff(array('model' => $this->getRecordClassName(), 'added' => $added, 'removed' => $removed, 'modified' => $modified)); return $result; }
/** * returns multiple records prepared for json transport * * @param Tinebase_Record_RecordSet $_records Tinebase_Record_Abstract * @param Tinebase_Model_Filter_FilterGroup * @return array data */ protected function _multipleRecordsToJson(Tinebase_Record_RecordSet $_records, $_filter = NULL) { if ($_records->getRecordClassName() == 'Tasks_Model_Task') { // NOTE: in contrast to calendar, organizers in tasks are accounts atm. Tinebase_User::getInstance()->resolveMultipleUsers($_records, 'organizer', true); } //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(print_r($_records->toArray(), true)); return parent::_multipleRecordsToJson($_records); }
/** * resolves multiple records (fallback) * * @deprecated use Tinebase_ModelConfiguration to configure your models, so this won't be used anymore * @param Tinebase_Record_RecordSet $records the records * @param array $resolveFields */ public static function resolveMultipleIdFields($records, $resolveFields = NULL) { if (!$records instanceof Tinebase_Record_RecordSet || !$records->count()) { return; } /** @var Tinebase_Record_Interface $ownRecordClass */ $ownRecordClass = $records->getRecordClassName(); if ($resolveFields === NULL) { $resolveFields = $ownRecordClass::getResolveForeignIdFields(); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Resolving ' . $ownRecordClass . ' fields: ' . print_r($resolveFields, TRUE)); } foreach ((array) $resolveFields as $foreignRecordClassName => $fields) { if ($foreignRecordClassName === 'recursive') { foreach ($fields as $field => $model) { foreach ($records->{$field} as $subRecords) { self::resolveMultipleIdFields($subRecords); } } } else { self::_resolveForeignIdFields($records, $foreignRecordClassName, (array) $fields); } } }
/** * compares two recordsets / only compares the ids / returns all records that are different in an array: * - removed -> all records that are in $this but not in $_recordSet * - added -> all records that are in $_recordSet but not in $this * - modified -> array of diffs for all different records that are in both record sets * * @param Tinebase_Record_RecordSet $_recordSet * @return array */ public function diff($_recordSet) { if (!$_recordSet instanceof Tinebase_Record_RecordSet) { if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . ' Did not get Tinebase_Record_RecordSet, skipping diff()'); } return array(); } if ($this->getRecordClassName() !== $_recordSet->getRecordClassName()) { throw new Tinebase_Exception_InvalidArgument('can only compare recordsets with the same type of records'); } $removed = new Tinebase_Record_RecordSet($this->getRecordClassName()); $added = new Tinebase_Record_RecordSet($this->getRecordClassName()); $modified = array(); $result = array(); $migration = $this->getMigration($_recordSet->getArrayOfIds()); foreach ($migration['toDeleteIds'] as $id) { $added->addRecord($this->getById($id)); } foreach ($migration['toCreateIds'] as $id) { $removed->addRecord($_recordSet->getById($id)); } foreach ($migration['toUpdateIds'] as $id) { $diff = $this->getById($id)->diff($_recordSet->getById($id)); if (!empty($diff)) { $modified[$id] = $diff; } } foreach (array('removed', 'added', 'modified') as $subresult) { if (count(${$subresult}) > 0) { $result[$subresult] = ${$subresult}; } } return $result; }