Версия: 5.x
Подсистема изображений

Общие сведения. Получение ссылок на миниатюры

Подсистема изображений обеспечивает формирование миниатюр из оригиналов. Ссылки на миниатюры изображений формируются в коде по определенному алгоритму, при этом файлы уменьшенных изображений не создаются сразу. Файлы миниатюр создаются единожды, во время первого запроса изображений браузером. Так как в системе хранятся оригиналы изображений, в шаблоне можно в любое время получить ссылку на миниатюру любого размера и типа масштабирования.

Классы подсистемы изображений располагаются в пространстве имен RS::Img.

Класс RS::Img::Core обеспечивает низкоуровневую работу с изображениями. Конструктору класса необходимо сообщить пути к папкам, в которых располагаются оригиналы и миниатюры изображений.

С помощью метода getImageUrl можно получить ссылку на миниатюру.

$original_folder = '/storage/userphoto/original';
$preview_folder = '/storage/userphoto/resized';
$img_system = new \RS\Img\Core(
\Setup::$ROOT, //Путь к корневой папке сайта
$original_folder, //Относительный путь к папке с оригиналами изображений
$preview_folder //Относительный путь к папке с миниатюрами изображений
);
//Ожидается, что оригинал изображения находится здесь: /storage/userphoto/original/a/5sy94hyrnq0bjes.png
// Вернет относительную ссылку на изображение миниатюры:
// /storage/userphoto/resized/xy_400x300/a/5sy94hyrnq0bjes_a803d566.png
echo $img_system->getImageUrl(
'a/5sy94hyrnq0bjes.png', //имя файла оригинального изображения
400, //Ширина
300, //Высота
'xy' //Тип масштабирования(имя класса масштабирования)
);

Типы масштабирования

За то, какая часть изображения попадет в миниатюру отвечает параметр - тип масштабирования. Классы, отвечающие за масштабирование располагаются в пространстве имен RS::Img::Type.

В ReadyScript имеются следующие классы масштабирования:

Класс Краткий идентификатор Описание Пример
RS::Img::Type::Xy xy Изображение масштабируется с сохранением оригинальных пропорций. Итоговое изображение не может привышать размер ни по одной из осей. Соответственно, итоговое изображение, может оказаться меньше по одной из осей.
imgscale_xy.png
Тип масштабирования XY
RS::Img::Type::Cxy cxy CropXY. Изображение масштабируется в 2 шага. На первом шаге, изображение масштабируется с учетом исходных пропорций. На втором шаге выбирается запрошенная область из центра изображения.
imgscale_cxy.png
Тип масштабирования CXY
RS::Img::Type::Axy axy AbsoluteXY. Изображение масштабируется в 2 шага. На первом шаге, изображение масштабируется по типу XY. На втором шаге изображение центрируется и по краям добавляются белые полосы, если это необходимо. Итоговое изображение всегда точно соответствует запрошенным размерам.
imgscale_axy.png
Тип масштабирования AXY
RS::Img::Type::Cty cty Crop Top Y. Масштабирует изображение с учетом пропорций, возвращает верхнюю часть изображения. Подходит для создания миниатюр фото с лицами.
RS::Img::Type::Ccty ccty Crop Center Top Y. Масштабирует изображение с учетом пропорций. Запрошенное изображение ищется в центре исходного только по горизонтали. Итоговое изображение всегда будет запрошенного размера.

Контроллеры, создающие изображения

Для генерации изображения необходимо создать контроллер, который будет откливаться на URL картинки, в случае если файла с изображением не существует. В ReadyScript имеется базовый абстрактный класс для таких контроллеров RS::Img::Handler::AbstractHandler, в которм уже все предусмотрено и остается только указать пути к папкам с оригиналами изображений и миниатюрами.

Пример:

namespace UserPhoto\Controller;
class PhotoHandler extends \RS\Img\Handler\AbstractHandler
{
protected
$srcFolder = '/storage/userphoto/original',
$dstFolder = '/storage/userphoto/resized';
}

Чтобы данный контроллер отзывался на запрошенный URL, необходимо добавить маршрт в систему.

namespace UserPhoto\Config;
class Handlers extends \RS\Event\HandlerAbstract
{
function init()
{
$this->bind('getroute');
}
public static function getRoute($routes)
{
$routes[] = new \RS\Router\Route('photo.image', '/storage/userphoto/resized/{type}/{picid}\.{ext}$', array(
'controller' => 'userphoto-photohandler'
), t('Изображение'), true);
return $routes;
}
}

Для создания миниатюр внутри контроллера используется метод RS::Img::Core::toOutput(), который в свою очередь вызывает метод RS::Img::Core::buildImage(), а затем отправляет созданный файл на вывод.

Модуль Фотографии

Модуль Фотографии, предоставляет более высокий уровень абстракции работы с изображениями. Модуль предоставляет готовый блок управления фотографиями, привязанными к объекту, для удобной вставки на страницы административной части. Готовые API для загрузки, удаления, выборки фотографий для объектов.

Модуль называется photo, соответственно все его файлы находятся в каталоге /modules/photo/, а все классы в пространстве имен Photo. Оригиналы изображений у модуля Photo хранятся в папке /storage/photo/original.
Миниатюры изображений хранятся в папке /storage/photo/resized

Для привязки фото к объекту используется 2 параметра:

  • Тип связи. Это символьный идентификатор, обозначающий к каким объектам привязываются фото. Например: article(статья), catalog(товар), ...
  • ID объекта. Непосредственный ID конкретного объекта, к которому идет привязка фото.

Для вставки блока добавления/изменения фото у какого-либо объекта в панели администратора достаточно в шаблоне с формой этого объекта добавить следующую конструкцию:

{* В $element_id - должен быть ID объекта, к которому происходит привязка*}
{moduleinsert name="\Photo\Controller\Admin\BlockPhotos" type="your_type" linkid=$element_id}

В результате, в панели администратора появится полноценный блок с возможностью мультизагрузки, удаления, поворота изображений, установки подписей.

Для выборки фотографий какого-либо объекта, можно воспользоваться классом Photo::Model::PhotoApi.

$photo_api = new \Photo\Model\PhotoApi();
$photos = $photo_api
->setFilter(array(
'type' => 'catalog',
'linkid' => '120'))
->getList();//Вернет массив объектов \Photo\Model\Orm\Image
foreach($photos as $photo) {
echo $photo['title'].':'.$photo->getUrl(120,120, 'xy')."<br>"; //Выведет: подпись к фото:ссылка на миниатюру
}

Для добавления фотографий к объекту из PHP API, есть метод addFromUrl. Метод принимает следующие аргументы:

  • $url - string, URL для загрузки фото или путь к файлу изображения на диске.
  • $type - string, тип связи
  • $linkid - integer, ID объекта, к которому будет привязано изображение
  • $copy - bool, по-умолчанию false. Если true, то файл будет скопирован из URL, иначе перемещен.
  • $extra - mixed. Дополнительные сведения для фотографии.
  • $enable_resize - bool, по-умолчанию true. Если true, то файл будет загружен в систему согласно параметрам модуля "Блок фотографий", иначе файл будет перемещен как есть без пережатия.
$photo_api = new \Photo\Model\PhotoApi();
$photo_api->addFromUrl(
'http://full.readyscript.ru/storage/photo/resized/xy_310x310/i/46s7ye2cobjx5j6_4cfabc85.jpg',
'catalog',
'120',
false,
null,
false
);
Заметки
В случае, если в разделе Веб-сайт → Настройка модулей → Блок фотографий включена опция Изменять размер оригинальной фотографии при загрузке, то под оригиналом изображения понимается файл, созданный на основе загруженной фотографии с заданными в настройках размерами.