示例#1
0
 /**
  * @param CAccount $oAccount
  * @param CApiMailFolderCollection $oFolderCollection
  * @param bool $bCreateUnExistenSystemFilders
  *
  * @return bool
  */
 private function initSystemFolders($oAccount, &$oFolderCollection, $bCreateUnExistenSystemFilders)
 {
     $bAddSystemFolder = false;
     try {
         $aFoldersMap = $oAccount->Domain->GetFoldersMap();
         unset($aFoldersMap[EFolderType::Inbox]);
         if (!$oAccount->IsEnabledExtension(CAccount::SpamFolderExtension) && isset($aFoldersMap[EFolderType::Spam])) {
             unset($aFoldersMap[EFolderType::Spam]);
         }
         $aTypes = array_keys($aFoldersMap);
         $aUnExistenSystemNames = array();
         $aSystemNames = $this->GetSystemFolderNames($oAccount);
         $oInbox = $oFolderCollection->GetByFullNameRaw('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->GetByFullNameRaw($sSystemFolderFullName, true);
                     if ($oFolder) {
                         unset($aTypes[$iKey]);
                         unset($aFoldersMap[$iKey]);
                         unset($aUnExistenSystemNames[$sSystemFolderFullName]);
                         $oFolder->SetType($iFolderType);
                     }
                 }
             }
         } else {
             // set system type from flags
             $oFolderCollection->ForeachListWithSubFolders(function ($oFolder) use(&$aTypes, &$aFoldersMap) {
                 $iXListType = $oFolder->GetFolderXListType();
                 $iKey = array_search($iXListType, $aTypes);
                 if (false !== $iKey && EFolderType::Custom === $oFolder->Type() && 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->ForeachListOnRootInboxAndGmailSubFolder(function ($oFolder) use(&$aFoldersMap) {
                     if (EFolderType::Custom === $oFolder->Type()) {
                         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->NameRaw(), $aList) || in_array($oFolder->Name(), $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->FolderCreateFromFullNameRaw($oAccount, $sFolderFullName);
                 $bAddSystemFolder = true;
             }
         }
     } catch (Exception $oException) {
         $bAddSystemFolder = false;
     }
     return $bAddSystemFolder;
 }