1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-16 23:00:51 +03:00

Автоматическое создание превью изображений медиа нужного размера

This commit is contained in:
Mzhelskiy Maxim 2014-02-17 22:28:21 +07:00
parent 201dba33f6
commit c1235f6507
6 changed files with 94 additions and 9 deletions

View file

@ -888,7 +888,7 @@ class ModuleBlog extends Module {
* Теперь можно удалить временный файл
*/
$this->Fs_RemoveFileLocal($sFileTmp);
$oBlog->setAvatar($this->Fs_GetPathRelative($sFileResult,true));
$oBlog->setAvatar($sFileResult);
return true;
}
/**

View file

@ -268,7 +268,8 @@ class ModuleMedia extends ModuleORM {
$oMedia=Engine::GetEntity('ModuleMedia_EntityMedia');
$oMedia->setUserId($this->oUserCurrent ? $this->oUserCurrent->getId() : null);
$oMedia->setType(self::TYPE_IMAGE);
$oMedia->setFilePath($this->Fs_GetPathRelative($sFileResult,true));
$oMedia->setTargetType($sTargetType);
$oMedia->setFilePath($sFileResult);
$oMedia->setFileName($aPathInfo['filename']);
$oMedia->setFileSize(filesize($sFileTmp));
$oMedia->setWidth($iWidth);
@ -596,10 +597,43 @@ class ModuleMedia extends ModuleORM {
));
return $bRes;
}
public function GetImageWebPath($sPath,$sWidth=null) {
public function GetFileWebPath($oMedia,$sSize=null) {
if ($oMedia->getType()==self::TYPE_IMAGE) {
/**
* Проверяем необходимость автоматического создания превью нужного размера - если разрешено настройками и файл НЕ существует
*/
if (Config::Get('module.media.image.autoresize') and !$this->Image_IsExistsFile($this->GetImagePathBySize($oMedia->getFilePath(),$sSize))) {
/**
* Запускаем генерацию изображения нужного размера
*/
$aSize=$this->ParsedImageSize($sSize);
$aParams=$this->Image_BuildParams('media.'.$oMedia->getTargetType());
$sNewFileName=$this->GetImagePathBySize($oMedia->getFilePath(),$sSize);
if($oImage=$this->Image_OpenFrom($oMedia->getFilePath(),$aParams)) {
if ($aSize['crop']) {
$oImage->cropProportion($aSize['w']/$aSize['h'],'center');
}
$oImage->resize($aSize['w'],$aSize['h'],true)->save($sNewFileName);
/**
* Обновляем список размеров
*/
$aSizeOld=(array)$oMedia->getDataOne('image_sizes');
$aSizeOld[]=$aSize;
$oMedia->setDataOne('image_sizes',$aSizeOld);
$oMedia->Update();
}
}
return $this->GetImageWebPath($oMedia->getFilePath(),$sSize);
}
return null;
}
public function GetImageWebPath($sPath,$sSize=null) {
$sPath=$this->Fs_GetPathWeb($sPath);
if ($sWidth) {
return $this->GetImagePathBySize($sPath,$sWidth);
if ($sSize) {
return $this->GetImagePathBySize($sPath,$sSize);
} else {
return $sPath;
}
@ -630,6 +664,44 @@ class ModuleMedia extends ModuleORM {
return $aPathInfo['dirname'].'/'.$aPathInfo['filename'].'_'.$sSize.'.'.$aPathInfo['extension'];
}
/**
* Парсит строку с размером изображения
* Варианты входной строки:
* 100
* 100crop
* 100x150
* 100x150crop
* x150
* 100x
*
* @param string $sSize
*
* @return array Массив вида array('w'=>100,'h'=>150,'crop'=>true)
*/
public function ParsedImageSize($sSize) {
$aSize=array(
'w'=>null,
'h'=>null,
'crop'=>false,
);
if (preg_match('#^(\d+)?(x)?(\d+)?([a-z]{2,10})?$#Ui',$sSize,$aMatch)) {
$iW=(isset($aMatch[1]) and $aMatch[1]) ? $aMatch[1] : null;
$iH=(isset($aMatch[3]) and $aMatch[3]) ? $aMatch[3] : null;
$bDelim=(isset($aMatch[2]) and $aMatch[2]) ? true : false;
$sMod=(isset($aMatch[4]) and $aMatch[4]) ? $aMatch[4] : '';
if (!$bDelim) {
$iW=$iH;
}
$aSize['w']=$iW;
$aSize['h']=$iH;
if ($sMod) {
$aSize[$sMod]=true;
}
}
return $aSize;
}
/**
* Проверка владельца с типом "topic"

View file

@ -51,9 +51,16 @@ class ModuleMedia_EntityMedia extends EntityORM {
return true;
}
public function getFileWebPath($sWidth=null) {
/**
* Возвращает URL до файла нужного размера, в основном используется для изображений
*
* @param null $sSize
*
* @return null
*/
public function getFileWebPath($sSize=null) {
if ($this->getFilePath()) {
return $this->Media_GetImageWebPath($this->getFilePath(),$sWidth);
return $this->Media_GetFileWebPath($this,$sSize);
} else {
return null;
}

View file

@ -192,6 +192,7 @@ $config['module']['image']['params']['blog_avatar']['size_max_height']=500;
/**
* Модуль Media
*/
$config['module']['media']['image']['autoresize'] = true; // Разрешает автоматическое создание изображений нужного размера при их запросе
$config['module']['media']['image']['max_size_url'] = 1024; // Максимальный размер изображения в kB для загрузки по URL
$config['module']['media']['image']['sizes'] = array( // список размеров, которые необходимо делать при загрузке изображения
array(

@ -1 +1 @@
Subproject commit db8666e71500a04d74fdf81c43b9f507031b92bc
Subproject commit 72e2e230186f03ed83fce20fd13e08e4291497f3

View file

@ -488,4 +488,9 @@ ALTER TABLE `prefix_poll_vote` ADD `answers` VARCHAR( 500 ) NOT NULL AFTER `user
-- 11.02.2014
ALTER TABLE `prefix_property` CHANGE `type` `type` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'text';
ALTER TABLE `prefix_property_value` ADD `value_date` DATETIME NULL DEFAULT NULL AFTER `value_varchar` ,
ADD INDEX ( `value_date` ) ;
ADD INDEX ( `value_date` ) ;
-- 17.02.2014
ALTER TABLE `prefix_media` ADD `target_type` VARCHAR( 50 ) NOT NULL AFTER `type` ,
ADD INDEX ( `target_type` ) ;