singletonIf('internalmail.attach', function ($app) { $attach = new Attachment(bff::path('im')); $attach->initSettings(); return $attach; }); return bff('internalmail.attach'); } public function initSettings() { $this->setMaxSize(config::sysAdmin('internalmail.attachments.maxsize', 5142880, TYPE_UINT)); $this->setAllowedExtensions(explode(',', config::sysAdmin('internalmail.attachments.whitelist', 'jpg,jpeg,gif,png,bmp,tiff,ico,odt,doc,docx,docm,xls,xlsx,xlsm,ppt,rtf,pdf,djvu,zip,gzip,gz,7z,rar,txt,xml'))); $this->setCheckFreeDiskSpace(false); } /** * URL директории хранения файлов * @return string */ public function getUrl(): string { return bff::url('im'); } /** * Формирование ссылки вложения * @param string $attachData данные о вложении, в формате "fileName;fileSize;extension;realFilename" или json encoded string * @param array $opts параметры ['asArray' => true - вернуть массив ссылок, 'targetBlank' => true - открывать в новой вкладке, 'linkAttr' => [] - массив атрибутов ссылки, 'divider' => '
' - разделитель ссылок] * @return string|array */ public function getAttachLink(string $attachData, array $opts = []) { if (empty($attachData)) { return ''; } $opts = array_merge([ 'targetBlank' => true, 'linkAttr' => [], 'divider' => '
', 'asArray' => true, ], $opts); $result = $opts['asArray'] ? [] : ''; $data = json_decode($attachData, true); if (! empty($data) && is_array($data)) { foreach ($data as $v) { if (empty($v['filename']) || empty($v['rfilename']) || empty($v['filesize'])) { continue; } $attr = $opts['linkAttr']; $attr['href'] = $this->getUrl() . $v['filename']; if ($opts['targetBlank']) { $attr['target'] = '_blank'; } $link = '' . strip_tags($v['rfilename']) . ' (' . tpl::filesize($v['filesize']) . ')'; if ($opts['asArray']) { $result[] = $link; } else { if (! empty($result)) { $result .= $opts['divider']; } $result .= $link; } } } else { $data = explode(';', strval($attachData), 4); if (empty($data) || sizeof($data) < 3) { return ''; } $opts['linkAttr']['href'] = $this->getUrl() . $data[0]; if ($opts['targetBlank']) { $opts['linkAttr']['target'] = '_blank'; } $link = '' . (!empty($data[3]) ? HTML::escape($data[3]) : $data[0]) . ' (' . tpl::filesize($data[1]) . ')'; if ($opts['asArray']) { $result[] = $link; } else { $result = $link; } } return $result; } /** * Формирование пути вложения * @param string $attachData * @return string */ public function getAttachPath(string $attachData): string { if (empty($attachData)) { return ''; } $data = explode(';', $attachData, 4); if (empty($data) || sizeof($data) < 3) { return ''; } return $this->path . $data[0]; } }