/** * Creates a picture configuration. * * @param int|array|null $size * * @return array<PictureConfiguration,array> */ private function createConfig($size) { if (!is_array($size)) { $size = [0, 0, $size]; } $config = new PictureConfiguration(); $attributes = []; if (!isset($size[2]) || !is_numeric($size[2])) { $resizeConfig = new ResizeConfiguration(); if (isset($size[0]) && $size[0]) { $resizeConfig->setWidth($size[0]); } if (isset($size[1]) && $size[1]) { $resizeConfig->setHeight($size[1]); } if (isset($size[2]) && $size[2]) { $resizeConfig->setMode($size[2]); } $configItem = new PictureConfigurationItem(); $configItem->setResizeConfig($resizeConfig); if ($this->defaultDensities) { $configItem->setDensities($this->defaultDensities); } $config->setSize($configItem); return [$config, $attributes]; } /** @var ImageSizeModel $imageSizeModel */ $imageSizeModel = $this->framework->getAdapter(ImageSizeModel::class); $imageSizes = $imageSizeModel->findByPk($size[2]); $config->setSize($this->createConfigItem($imageSizes)); if ($imageSizes && $imageSizes->cssClass) { $attributes['class'] = $imageSizes->cssClass; } /** @var ImageSizeItemModel $imageSizeItemModel */ $imageSizeItemModel = $this->framework->getAdapter(ImageSizeItemModel::class); $imageSizeItems = $imageSizeItemModel->findVisibleByPid($size[2], ['order' => 'sorting ASC']); if (null !== $imageSizeItems) { $configItems = []; foreach ($imageSizeItems as $imageSizeItem) { $configItems[] = $this->createConfigItem($imageSizeItem); } $config->setSizeItems($configItems); } return [$config, $attributes]; }
/** * Get the config for one picture source element * * @param Model|object $imageSize The image size or image size item model * * @return PictureConfigurationItem */ protected function getConfigurationItem($imageSize) { $configItem = new PictureConfigurationItem(); $resizeConfig = new ResizeConfiguration(); $mode = $imageSize->resizeMode; if (substr_count($mode, '_') === 1) { $importantPart = $this->image->setImportantPart(null)->getImportantPart(); $mode = explode('_', $mode); if ($mode[0] === 'left') { $importantPart['width'] = 1; } elseif ($mode[0] === 'right') { $importantPart['x'] = $importantPart['width'] - 1; $importantPart['width'] = 1; } if ($mode[1] === 'top') { $importantPart['height'] = 1; } elseif ($mode[1] === 'bottom') { $importantPart['y'] = $importantPart['height'] - 1; $importantPart['height'] = 1; } $this->image->setImportantPart($importantPart); $mode = ResizeConfiguration::MODE_CROP; } $resizeConfig->setWidth($imageSize->width)->setHeight($imageSize->height)->setZoomLevel($imageSize->zoom); if ($mode) { $resizeConfig->setMode($mode); } $configItem->setResizeConfig($resizeConfig); if (isset($imageSize->sizes)) { $configItem->setSizes($imageSize->sizes); } if (isset($imageSize->densities)) { $configItem->setDensities($imageSize->densities); } if (isset($imageSize->media)) { $configItem->setMedia($imageSize->media); } return $configItem; }