%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/libs/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/libs/ProfileImage.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\libs;
use humhub\modules\content\components\ContentContainerActiveRecord;
use humhub\modules\content\models\ContentContainer;
use humhub\modules\file\libs\ImageHelper;
use humhub\modules\space\models\Space;
use humhub\modules\space\widgets\Image as SpaceImage;
use humhub\modules\user\widgets\Image as UserImage;
use Imagine\Image\Box;
use Imagine\Image\ManipulatorInterface;
use Imagine\Image\Point;
use Yii;
use yii\base\Exception;
use yii\helpers\Url;
use yii\helpers\FileHelper;
use yii\imagine\Image;
use yii\web\UploadedFile;
/**
* ProfileImage is responsible for all profile images.
*
* This class handles all tasks related to profile images.
* Will used for Space or User Profiles.
*
* Prefixes:
* "" = Resized profile image
* "_org" = Orginal uploaded file
*
* @since 0.5
* @author Luke
*/
class ProfileImage
{
/**
* @var String is the guid of user or space
*/
protected $guid = '';
/**
* @var ContentContainerActiveRecord
*/
protected $container;
/**
* @var Integer width of the Image
*/
protected $width = 150;
/**
* @var Integer height of the Image
*/
protected $height = 150;
/**
* @var String folder name inside the uploads directory
*/
protected $folder_images = 'profile_image';
/**
* @var String name of the default image
*/
protected $defaultImage;
/**
* Constructor of Profile Image
*
* UserId is optional, if not given the current user will used
*
* @param string $guid
* @param string $defaultImage
*/
public function __construct($guid, $defaultImage = 'default_user')
{
if ($guid instanceof ContentContainerActiveRecord) {
$this->container = $guid;
$this->guid = $this->container->guid;
} else {
$this->guid = $guid;
}
$this->defaultImage = $defaultImage;
}
/**
* Returns the URl of the Modified Profile Image
*
* @param String $prefix Prefix of the returned image
* @param boolean $scheme URL Scheme
* @return String Url of the profile image
* @throws \yii\base\InvalidConfigException
* @throws \yii\base\Exception
*/
public function getUrl($prefix = '', $scheme = false)
{
if (file_exists($this->getPath($prefix))) {
$path = '@web/uploads/' . $this->folder_images . '/';
$path .= $this->guid . $prefix;
$path .= '.jpg?m=' . filemtime($this->getPath($prefix));
} else {
$path = '@web-static/img/' . $this->defaultImage;
$path .= '.jpg';
$path = Yii::$app->view->theme->applyTo($path);
}
return Url::to(Yii::getAlias($path), $scheme);
}
/**
* Indicates there is a custom profile image
*
* @return Boolean is there a profile image
* @throws \yii\base\Exception
*/
public function hasImage()
{
return file_exists($this->getPath('_org'));
}
/**
* Returns the Path of the Modified Profile Image
*
* @param String $prefix for the profile image
* @return String Path to the profile image
* @throws \yii\base\Exception
*/
public function getPath($prefix = '')
{
$path = Yii::getAlias('@webroot/uploads/' . $this->folder_images . '/');
FileHelper::createDirectory($path);
$path .= $this->guid;
$path .= $prefix;
$path .= '.jpg';
return $path;
}
/**
* Crops the Original Image
*
* @param Int $x
* @param Int $y
* @param Int $h
* @param Int $w
* @return boolean indicates the success
* @throws \yii\base\Exception
*/
public function cropOriginal($x, $y, $h, $w)
{
$image = Image::getImagine()->open($this->getPath('_org'))
->crop(new Point($x, $y), new Box($w, $h));
$image->resize($image->getSize()->heighten($this->height))
->resize($image->getSize()->widen($this->width))
->save($this->getPath());
}
/**
* Sets a new profile image by given temp file
*
* @param mixed $file CUploadedFile or file path
* @throws Exception
*/
public function setNew($file)
{
if ($file instanceof UploadedFile) {
$file = $file->tempName;
}
ImageHelper::checkMaxDimensions($file);
$this->delete();
// Convert image to uploaded JPEG, fix orientation and remove additional meta information
$image = Image::getImagine()->open($file);
ImageHelper::fixJpegOrientation($image, $file);
$image->thumbnail($image->getSize())
->save($this->getPath('_org'), ['format' => 'jpg']);
// Make sure original file is max. 800 width
$image = Image::getImagine()->open($this->getPath('_org'));
if ($image->getSize()->getWidth() > 800) {
$image->resize($image->getSize()->widen(800));
}
$image->save($this->getPath('_org'), ['format' => 'jpg']);
// Create squared version
$image->thumbnail(new Box($this->width, $this->height), ManipulatorInterface::THUMBNAIL_OUTBOUND)
->save($this->getPath(''));
}
/** 1
* Deletes current profile
*/
public function delete()
{
if (file_exists(($this->getPath()))) {
FileHelper::unlink($this->getPath());
}
if (file_exists(($this->getPath('_org')))) {
FileHelper::unlink($this->getPath('_org'));
}
if (file_exists(($this->getPath('_cropped')))) {
FileHelper::unlink($this->getPath('_cropped'));
}
}
/**
* @return ContentContainerActiveRecord|string
* @throws \yii\db\IntegrityException
* @since 1.4
*/
public function getContainer()
{
if (!$this->container) {
$this->container = ContentContainer::findRecord([$this->guid]);
}
return $this->container;
}
/**
* Renders this profile image
* @param int $width
* @param array $cfg
* @return string
* @throws \yii\db\IntegrityException
* @since 1.4
*/
public function render($width = 32, $cfg = [])
{
$container = $this->getContainer();
if (!$container) {
return '';
}
$cfg['width'] = $width;
$widgetOptions = ['width' => $width];
// TODO: improve option handling...
if (isset($cfg['link'])) {
$widgetOptions['link'] = $cfg['link'];
unset($cfg['link']);
}
if (isset($cfg['showTooltip'])) {
$widgetOptions['showTooltip'] = $cfg['showTooltip'];
unset($cfg['showTooltip']);
}
if (isset($cfg['tooltipText'])) {
$widgetOptions['tooltipText'] = $cfg['tooltipText'];
unset($cfg['tooltipText']);
}
if ($container instanceof Space) {
$widgetOptions['space'] = $container;
$widgetOptions['htmlOptions'] = $cfg;
return SpaceImage::widget($widgetOptions);
}
$htmlOptions = [];
if (isset($cfg['htmlOptions'])) {
$htmlOptions = $cfg['htmlOptions'];
unset($cfg['htmlOptions']);
}
$widgetOptions['user'] = $container;
$widgetOptions['imageOptions'] = $cfg;
$widgetOptions['htmlOptions'] = $htmlOptions;
return UserImage::widget($widgetOptions);
}
/**
* Get width
*
* @return int
*/
public function width()
{
return $this->width;
}
/**
* Get height
*
* @return int
*/
public function height()
{
return $this->height;
}
/**
* Get aspect ratio
*
* @return float
*/
public function getAspectRatio()
{
return $this->width() / $this->height();
}
}