/** * Initializes system folders. * * @param CAccount $oAccount Account object. * @param CApiMailFolderCollection $oFolderCollection Collection of folders. * @param bool $bCreateUnExistenSystemFilders Create non-existen system folders. * * @return bool */ private function _initSystemFolders($oAccount, &$oFolderCollection, $bCreateUnExistenSystemFilders) { $bAddSystemFolder = false; try { $aFoldersMap = $oAccount->Domain->GetFoldersMap(); unset($aFoldersMap[EFolderType::Inbox]); if (!$oAccount->isExtensionEnabled(CAccount::SpamFolderExtension) && isset($aFoldersMap[EFolderType::Spam])) { unset($aFoldersMap[EFolderType::Spam]); } $aTypes = array_keys($aFoldersMap); $aUnExistenSystemNames = array(); $aSystemNames = $this->getSystemFolderNames($oAccount); $oInbox = $oFolderCollection->getFolder('INBOX'); $oInbox->setType(EFolderType::Inbox); if (is_array($aSystemNames) && 0 < count($aSystemNames)) { unset($aSystemNames['INBOX']); $aUnExistenSystemNames = $aSystemNames; foreach ($aSystemNames as $sSystemFolderFullName => $iFolderType) { $iKey = array_search($iFolderType, $aTypes); if (false !== $iKey) { $oFolder = $oFolderCollection->getFolder($sSystemFolderFullName, true); if ($oFolder) { unset($aTypes[$iKey]); unset($aFoldersMap[$iKey]); unset($aUnExistenSystemNames[$sSystemFolderFullName]); $oFolder->setType($iFolderType); } } } } else { // set system type from flags $oFolderCollection->foreachWithSubFolders(function ($oFolder) use(&$aTypes, &$aFoldersMap) { $iXListType = $oFolder->getFolderXListType(); $iKey = array_search($iXListType, $aTypes); if (false !== $iKey && EFolderType::Custom === $oFolder->getType() && isset($aFoldersMap[$iXListType])) { unset($aTypes[$iKey]); unset($aFoldersMap[$iXListType]); $oFolder->setType($iXListType); } }); // set system type from domain settings if (is_array($aFoldersMap) && 0 < count($aFoldersMap)) { $oFolderCollection->foreachOnlyRoot(function ($oFolder) use(&$aFoldersMap) { if (EFolderType::Custom === $oFolder->getType()) { foreach ($aFoldersMap as $iFolderType => $aFoldersNames) { $aList = array(); if (is_array($aFoldersNames)) { $aList = $aFoldersNames; } else { if (is_string($aFoldersNames)) { $aList = array($aFoldersNames); } } if (is_array($aList) && 0 < count($aList)) { if (in_array($oFolder->getRawName(), $aList) || in_array($oFolder->getName(), $aList)) { unset($aFoldersMap[$iFolderType]); $oFolder->setType($iFolderType); } } } } }); } if (is_array($aFoldersMap) && 0 < count($aFoldersMap)) { $sNamespace = $oFolderCollection->getNamespace(); foreach ($aFoldersMap as $iFolderType => $mFolderName) { $sFolderFullName = is_array($mFolderName) && isset($mFolderName[0]) && is_string($mFolderName[0]) && 0 < strlen($mFolderName[0]) ? $mFolderName[0] : (is_string($mFolderName) && 0 < strlen($mFolderName) ? $mFolderName : ''); if (0 < strlen($sFolderFullName)) { $aUnExistenSystemNames[$sNamespace . $sFolderFullName] = $iFolderType; } } } } if ($bCreateUnExistenSystemFilders && is_array($aUnExistenSystemNames) && 0 < count($aUnExistenSystemNames)) { foreach ($aUnExistenSystemNames as $sFolderFullName => $iFolderType) { $this->createFolderByFullName($oAccount, $sFolderFullName); $bAddSystemFolder = true; } } } catch (Exception $oException) { $bAddSystemFolder = false; } return $bAddSystemFolder; }