/** * get special field value * * @param Tinebase_Record_Interface $_record * @param array $_param * @param string $_key * @param string $_cellType * @return string */ protected function _getSpecialFieldValue(Tinebase_Record_Interface $_record, $_param, $_key = NULL, &$_cellType = NULL) { $supplierId = $_record->getId(); if (!isset($this->_supplierAddresses[$supplierId])) { $all = $this->_addresses->filter('customer_id', $supplierId); $this->_addresses->removeRecords($all); $this->_supplierAddresses[$supplierId] = array('postal' => $all->filter('type', 'postal')->getFirstRecord(), 'billing' => array('records' => $all->filter('type', 'billing'), 'index' => 0), 'delivery' => array('records' => $all->filter('type', 'delivery'), 'index' => 0)); } switch ($_param['type']) { case 'postal': $address = $this->_supplierAddresses[$supplierId]['postal']; break; default: if (isset($this->_supplierAddresses[$supplierId][$_param['type']]['records'])) { $address = $this->_supplierAddresses[$supplierId][$_param['type']]['records']->getByIndex($this->_supplierAddresses[$supplierId][$_param['type']]['index']); $this->_supplierAddresses[$supplierId][$_param['type']]['index']++; } } return $address ? $this->_renderAddress($address, $_param['type']) : ''; }
/** * move messages from one folder to another * * @param Tinebase_Record_RecordSet $_messages * @param string $_folderId * @param Expressomail_Model_Folder|string $_targetFolder * @return boolean did we move messages? */ protected function _moveMessagesByFolder(Tinebase_Record_RecordSet $_messages, $_folderId, $_targetFolder) { $messagesInFolder = $_messages->filter('folder_id', $_folderId); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Moving messages: ' . print_r($messagesInFolder->getArrayOfIds(), TRUE)); } $result = TRUE; if ($_targetFolder === Expressomail_Model_Folder::FOLDER_TRASH) { $result = $this->_moveMessagesToTrash($messagesInFolder, $_folderId); } else { if ($_folderId === $_targetFolder->getId()) { // no need to move $result = FALSE; } else { if ($messagesInFolder->getFirstRecord()->account_id == $_targetFolder->account_id) { $this->_moveMessagesInFolderOnSameAccount($messagesInFolder, $_targetFolder); } else { $this->_moveMessagesToAnotherAccount($messagesInFolder, $_targetFolder); } } } if (!$result) { $_messages->removeRecords($messagesInFolder); } return $result; }
/** * resolved app records and fills the related_record property with the corresponding record * * NOTE: With this, READ ACL is implicitly checked as non readable records won't get retuned! * * @param Tinebase_Record_RecordSet $_relations of Tinebase_Model_Relation * @param boolean $_ignoreACL * @return void * * @todo make getApplicationInstance work for tinebase record (Tinebase_Model_User for example) */ protected function resolveAppRecords($_relations, $_ignoreACL = FALSE) { // separate relations by model $modelMap = array(); foreach ($_relations as $relation) { if (!(isset($modelMap[$relation->related_model]) || array_key_exists($relation->related_model, $modelMap))) { $modelMap[$relation->related_model] = new Tinebase_Record_RecordSet('Tinebase_Model_Relation'); } $modelMap[$relation->related_model]->addRecord($relation); } // fill related_record foreach ($modelMap as $modelName => $relations) { // check right $split = explode('_Model_', $modelName); $rightClass = $split[0] . '_Acl_Rights'; $rightName = 'manage_' . strtolower($split[1]) . 's'; if (class_exists($rightClass)) { $ref = new ReflectionClass($rightClass); $u = Tinebase_Core::getUser(); // if a manage right is defined and the user has no manage_record or admin right, remove relations having this record class as related model if (is_object($u) && $ref->hasConstant(strtoupper($rightName)) && !$u->hasRight($split[0], $rightName) && !$u->hasRight($split[0], Tinebase_Acl_Rights::ADMIN)) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { $_relations->removeRecords($relations); Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Skipping relation due to no manage right: ' . $modelName); } continue; } } $getMultipleMethod = 'getMultiple'; if ($modelName === 'Tinebase_Model_User') { // @todo add related backend here //$appController = Tinebase_User::factory($relations->related_backend); $appController = Tinebase_User::factory(Tinebase_User::getConfiguredBackend()); $records = $appController->{$getMultipleMethod}($relations->related_id); } else { try { $appController = Tinebase_Core::getApplicationInstance($modelName); if (method_exists($appController, $getMultipleMethod)) { $records = $appController->{$getMultipleMethod}($relations->related_id, $_ignoreACL); // resolve record alarms if (count($records) > 0 && $records->getFirstRecord()->has('alarms')) { $appController->getAlarms($records); } } else { throw new Tinebase_Exception_AccessDenied('Controller ' . get_class($appController) . ' has no method ' . $getMultipleMethod); } } catch (Tinebase_Exception_AccessDenied $tea) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Removing relations from result. Got exception: ' . $tea->getMessage()); } $_relations->removeRecords($relations); continue; } } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Resolving " . count($relations) . " relations"); } foreach ($relations as $relation) { $recordIndex = $records->getIndexById($relation->related_id); $relationIndex = $_relations->getIndexById($relation->getId()); if ($recordIndex !== false) { $_relations[$relationIndex]->related_record = $records[$recordIndex]; } else { // delete relation from set, as READ ACL is obviously not granted if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " removing {$relation->related_model} {$relation->related_backend} {$relation->related_id} (ACL)"); } unset($_relations[$relationIndex]); } } } }
/** * resolved app records and filles the related_record property with the corresponding record * * NOTE: With this, READ ACL is implicitly checked as non readable records won't get retuned! * * @param Tinebase_Record_RecordSet $_relations of Tinebase_Model_Relation * @param boolean $_ignoreACL * @return void * * @todo make getApplicationInstance work for tinebase record (Tinebase_Model_User for example) */ protected function resolveAppRecords($_relations, $_ignoreACL = FALSE) { // seperate relations by model $modelMap = array(); foreach ($_relations as $relation) { if (!array_key_exists($relation->related_model, $modelMap)) { $modelMap[$relation->related_model] = new Tinebase_Record_RecordSet('Tinebase_Model_Relation'); } $modelMap[$relation->related_model]->addRecord($relation); } // fill related_record foreach ($modelMap as $modelName => $relations) { $getMultipleMethod = 'getMultiple'; if ($modelName === 'Tinebase_Model_User') { // @todo add related backend here //$appController = Tinebase_User::factory($relations->related_backend); $appController = Tinebase_User::factory(Tinebase_User::getConfiguredBackend()); $records = $appController->{$getMultipleMethod}($relations->related_id); } else { try { $appController = Tinebase_Core::getApplicationInstance($modelName); $records = $appController->{$getMultipleMethod}($relations->related_id, $_ignoreACL); } catch (Tinebase_Exception_AccessDenied $tea) { // remove relations, user has no permission $_relations->removeRecords($relations); continue; } } foreach ($relations as $relation) { $recordIndex = $records->getIndexById($relation->related_id); $relationIndex = $_relations->getIndexById($relation->getId()); if ($recordIndex !== false) { $_relations[$relationIndex]->related_record = $records[$recordIndex]; } else { // delete relation from set, as READ ACL is obviously not granted if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " removing {$relation->related_model} {$relation->related_backend} {$relation->related_id} (ACL)"); } unset($_relations[$relationIndex]); } } } }