<?php
trait app_object_images
{
/**
* Содержит изобржения для объекта
* @var app_images_image[]
*/
protected $_images;
/**
* Метод возвращает директорию, куда необходимо сохранить файлы
* @return string
*/
abstract function getImagesUploadDirectory();
/**
* Возвращает данные
*/
abstract function getImagesRatio();
public function userInputImages($_images)
{
if (is_array($_images) && isset($_images['id']))
{
$increment = 0;
foreach ($_images['id'] as $_key => $_id)
{
if (
!isset($_images['id'][$_key]) || !isset($_images['name'][$_key]) || !isset($_images['filename'][$_key]) || !isset($_images['primary'][$_key])
|| !isset($_images['title'][$_key]) || !isset($_images['width']) || !isset($_images['height']) || !isset($_images['kx1'][$_key])
|| !isset($_images['ky1'][$_key]) || !isset($_images['kx2'][$_key]) || !isset($_images['ky2'][$_key]) || !isset($_images['xHumb'][$_key])
|| !$_images['name'][$_key] || !$_images['filename'][$_key]
)
{
continue;
}
if (!$_images['id'][$_key])
{
if (!($image = $this->addImage($_images['name'][$_key], $_images['filename'][$_key])))
{
continue;
}
if ($_images['primary'][$_key])
{
foreach ($this->getImages() as $image)
{
$image->setPrimary(false);
}
}
$image
->setXHumb($_images['xHumb'][$_key])
->setPrimary($_images['primary'][$_key])
->setTitle($_images['title'][$_key])
->setRatio($this->getImagesRatio())
->setKx1($_images['kx1'][$_key])
->setKy1($_images['ky1'][$_key])
->setKx2($_images['kx2'][$_key])
->setKy2($_images['ky2'][$_key])
;
}
else
{
if ($image = $this->getImageById($_images['id'][$_key]))
{
$image
->setTitle($_images['title'][$_key])
->setPrimary($_images['title'][$_key])
;
}
}
}
}
return $this;
}
/**
* Добавляем новое изображение
* @param string $name
* @param string $filename
* @return boolean|app_images_image
*/
public function addImage($name, $filename)
{
$this->getImages();
if (!file_exists($filename))
{
$this->addError("Файл [$filename] не существует");
return false;
}
if (!is_readable($filename))
{
$this->addError("Файл [$filename] не доступен для записи");
return false;
}
if (!($imageInfo = getimagesize($filename)))
{
$this->addError("Изображение не допустимого формата #1");
return false;
}
if (!$imageInfo[0] || !$imageInfo[1])
{
$this->addError("Изображение не допустимого формата #2");
return false;
}
return
$this->_images[]
=
(new app_images_image())
->setTempFilename($filename)
->setClass(get_class($this))
->setObjectId($this->getId())
->setName($name)
->setFilename(basename($filename))
->setWidth($imageInfo[0])
->setHeight($imageInfo[1])
->setPosition(sizeof($this->getImages()))
;
}
public function storeAndSaveImages()
{
if (!isset($this->_images) || !is_array($this->_images))
{
return $this;
}
if (!$this->getImagesUploadDirectory())
{
throw app_exception("Метод сохранения изображений не может получить директорию для записи", 503);
}
foreach ($this->_images as $image)
{
if (!$image->getId())
{
if (!$this->getId())
{
throw new app_exception("Ой.. Не смог скопировать изображения. Не определен id объекта", 503);
}
if (!$image->getTempFilename())
{
throw new app_exception("Ой.. Не смог скопировать изображения. Не определен getTempFailename()", 503);
}
$src = $image->getTempFilename();
$dst = $this->getImagesUploadDirectory().(substr($this->getImagesUploadDirectory(), -1, 1) != DIRECTORY_SEPARATOR ? "/" : null).$image->getFilename();
if (!file_exists($src) || !is_file($src) || !is_readable($src))
{
throw new app_exception("Ой.. Файл {$src} не существует или не доступн для чтения", 503);
}
if (!file_exists(dirname($dst)) || !is_dir(dirname($dst)) || !is_writable(dirname($dst)))
{
throw new app_exception("Ой.. Директория ".dirname($dst)." не существует или не доступна для записи", 503);
}
if (!copy($src, $dst))
{
throw new app_exception("Ой.. Не смог скопировать {$src} в {$dst} не существует или не доступна для записи", 503);
}
$image
->setObjectId($this->getId())
->setDirectory(dirname($dst))
->save()
;
}
else
{
$image->save();
}
}
}
public function setImages(array $images)
{
$this->_images = $images;
return $this;
}
/**
* Получаем изображения из базы данных
* @return app_images_images|multitype:app_images_array
*/
public function getImages()
{
if (isset($this->_images))
{
return new app_images_array($this->_images);
}
if (!$this->getId())
{
return new app_images_array(array());
}
$this->_images = array();
$db = (new app_db())->query("SELECT * FROM `app_images_image` WHERE `class` = '".get_class($this)."' && `objectId` = '".$this->getId()."' ORDER BY `position`");
while ($row = $db->fetch())
{
$this->_images[] = (new app_images_image())->setAttributes($row);
}
return new app_images_array($this->_images);
}
}