Перейти к основному содержимому

Изображения

Изображение

поле Image

Поле изображения (image) хранится в базе данных в колонке типа INT. В этой колонке хранится ID связанного \Pimcore\Model\Asset\Image. В отличие от других типов отношений объектов, связь с изображением не сохраняется в таблице relations (это историческое поведение), однако при этом создаётся зависимость в таблице dependencies.

Чтобы программно задать полю объекта изображение, в соответствующий сеттер нужно передать объект \Pimcore\Model\Asset\Image.

$image = Asset\Image::getByPath("/examples/example1.jpg");  
$object->setImage($image);
$object->save();

В интерфейсе поле изображения представлено зоной перетаскивания изображения (image drop area). Ширина и высота этой зоны настраиваются в параметрах класса:

поле Image в интерфейсе

Работа с изображениями на фронтенде

Чтобы получить миниатюру (thumbnail) из поля изображения, вызовите метод getThumbnail() у возвращённого объекта ассета.

{% if object.myImage is instanceof('Pimcore\Model\Asset\Image') %}  
{{ object.myImage.thumbnail('myThumbnailDefinitionName').html }}
{% endif %}

Поскольку $object->getImage() возвращает объект ассета, доступны все остальные возможности миниатюр, предоставляемые Pimcore\Model\Asset\Image.

Внешнее изображение

Этот тип позволяет указать URL внешнего изображения, которое затем показывается в превью.

поле External Image

{% if object.getExternalImage() is instanceof('\\Pimcore\\Model\\DataObject\\Data\\ExternalImage') %}  
<img src="{{ object.getExternalImage().getUrl() }}" />
{% endif %}

Галерея изображений

Галерея — это коллекция объектов Advanced Images (см. ниже). Порядок элементов в галерее можно менять перетаскиванием (drag & drop).

Image Gallery

Заполнение галереи изображений

<?php  

$galleryData = [
AssetImage,
AssetImage,
//....
];

$items = [];
foreach($galleryData as $img){

$advancedImage = new \Pimcore\Model\DataObject\Data\Hotspotimage();
$advancedImage->setImage($img);
$items[] = $advancedImage;
}

$news->setGallery(new \Pimcore\Model\DataObject\Data\ImageGallery($items));

?>

Расширённое изображение (поддержка Hotspots/Markers/Cropping)

Этот тип данных является расширением базового типа изображения и позволяет определять «hotspots» (зоны интереса), «markers» (маркеры) и обрезку (cropping) для присвоенного изображения.

поле Image Advanced

Hotspot определяется именем и хранится в виде массива с атрибутами name, top, left, width, height. Значения top, left, width, height хранятся в виде процентов от размеров изображения.

Получение Hotspots

Для программного доступа к hotspots можно использовать следующий фрагмент кода.

$hotspotImage = $object->getHotspot1(); // имя поля в классе — "hotspot1"  

// получить связанный Asset\Image
$image = $hotspotImage->getImage();

// получить массив всех определённых hotspot
$hotspots = $hotspotImage->getHotspots();

Пример содержимого $hotspots:

Array  
(
[0] => Array
(
[name] => hotspot1
[top] => 3.8922155688623
[left] => 48.076923076923
[width] => 8.3333333333333
[height] => 48.802395209581
)

[1] => Array
(
[name] => hotspot2
[top] => 8.9820359281437
[left] => 70.897435897436
[width] => 14.230769230769
[height] => 44.011976047904
)

)

Эти данные можно использовать на фронтенде для визуализации зон интереса.

Получение маркеров (Markers)

Работа с маркерами выполняется по той же схеме:

$hotspotImage = $object->getHotspot1(); // имя поля в классе — "hotspot1"
// получить массив маркеров
$marker = $hotspotImage->getMarker();

Пример содержимого $marker:

Array  
(
[0] => Array
(
[top] => 3.8922155688623
[left] => 48.076923076923
)

[1] => Array
(
[top] => 8.9820359281437
[left] => 70.897435897436
)

)

Получение обрезанного изображения

Чтобы получить обрезанное изображение, используйте метод getThumbnail():

$hotspotImage = $object->getHotspot1(); // имя поля в классе — "hotspot1"  

echo $hotspotImage->getThumbnail(); // вернёт обрезанное изображение с оригинальными размерами

echo $hotspotImage->getThumbnail("myCustomThumbnail"); // вернёт обрезанную миниатюру согласно настройке миниатюр (аналогично $this->image() в документе)

Миниатюра изображения

Конечно, вы можете использовать приведенный выше код независимо от того, обрезано изображение или нет:

$hotspotImage->getThumbnail("myCustomThumbnail"); // если $hotspotImage не содержит информации об обрезке, миниатюра вернётся как обычно (см. $assetImage->getThumbnail("..."); )  

Заполнение расширённого типа изображения

$image = Asset::getById(123);  
$advancedImage = new DataObject\Data\Hotspotimage();
$advancedImage->setImage($image);
// ...

$object->setMyAdvancedImage($advancedImage);

Предопределённые шаблоны данных

Кроме пустого стандартного шаблона, в определении класса можно задать JSON-конфигурацию, описывающую дополнительные пользовательские шаблоны. Эти шаблоны будут отображаться как пункты выпадающего меню в интерфейсе «add marker» / «add hotspot».

{  
"marker": [{
"menuName": "marker config 1",
"name": "hotspot name",
"data": [{
"name": "my asset href",
"type": "asset",
"value": "/screenshots/glossary.png"
}, {
"name": "my textfield",
"type": "textfield"
}]
}],
"hotspot": [{
"menuName": "hotspot config 1"
}]
}


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.