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];
}
}