ebt_core-1.0.0-alpha3/src/Services/GenerateCSS.php
src/Services/GenerateCSS.php
<?php
namespace Drupal\ebt_core\Services;
use Drupal\Component\Utility\Html;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Theme\ThemeManagerInterface;
use Drupal\media\Entity\Media;
use Drupal\Core\File\FileUrlGeneratorInterface;
/**
* Transform Block settings in CSS.
*/
class GenerateCSS {
/**
* The EBT Core configuration.
*
* @var \Drupal\Core\Config\Config
*/
protected $config;
/**
* The theme manager.
*
* @var \Drupal\Core\Theme\ThemeManagerInterface
*/
protected $themeManager;
/**
* The file URL generator.
*
* @var \Drupal\Core\File\FileUrlGeneratorInterface
*/
protected $fileUrlGenerator;
/**
* Constructs a new GenerateCSS object.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* Config factory.
* @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager
* The theme manager.
* @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
* The file URL generator.
*/
public function __construct(ConfigFactoryInterface $config_factory, ThemeManagerInterface $theme_manager, FileUrlGeneratorInterface $file_url_generator = NULL) {
$this->config = $config_factory->get('ebt_core.settings');
$this->themeManager = $theme_manager;
if (!$file_url_generator && \Drupal::hasService('file_url_generator')) {
$file_url_generator = \Drupal::service('file_url_generator');
}
$this->fileUrlGenerator = $file_url_generator;
}
/**
* Generate CSS from $settings.
*/
public function generateFromSettings($settings, $block_class) {
$styles = '';
$global_styles = '';
$positions = [
'top',
'right',
'bottom',
'left',
];
if (!empty($settings['other_settings']['border_color'])) {
$border_color = str_replace('#', '', $settings['other_settings']['border_color']);
$border_color = '#' . Html::escape($border_color);
}
else {
$border_color = '#000';
}
$border_style = !empty($settings['other_settings']['border_style']) ? Html::escape($settings['other_settings']['border_style']) : 'solid';
foreach ($positions as $position) {
if (!empty($settings['box1']['margin_' . $position])) {
$margin_width = str_replace('px', '', $settings['box1']['margin_' . $position]);
$styles .= ' margin-' . $position . ': ' . Html::escape($margin_width) . 'px !important;';
}
if (!empty($settings['box1']['box2']['border_' . $position])) {
$border_width = str_replace('px', '', $settings['box1']['box2']['border_' . $position]);
$styles .= ' border-' . $position . ': ' . Html::escape($border_width) . 'px ' . Html::escape($border_color) . ' ' . Html::escape($border_style) . ' !important;';
}
if (!empty($settings['box1']['box2']['box3']['padding_' . $position])) {
$padding_width = str_replace('px', '', $settings['box1']['box2']['box3']['padding_' . $position]);
$styles .= ' padding-' . $position . ': ' . Html::escape($padding_width) . 'px !important;';
}
}
if (!empty($settings['other_settings']['border_radius']) && $settings['other_settings']['border_radius'] != 'none') {
$styles .= ' border-radius: ' . Html::escape($settings['other_settings']['border_radius']) . ';';
}
if (!empty($settings['other_settings']['background_media'])) {
$media = Media::load($settings['other_settings']['background_media']);
if (!empty($media) && $media->bundle() == 'image') {
// It is for image media.
/** @var \Drupal\file\Entity\File $file */
$file = $media->field_media_image->entity;
$uri = $file->getFileUri();
if ($this->fileUrlGenerator !== NULL) {
$media_url = $this->fileUrlGenerator->generateAbsoluteString($uri);
}
else {
// Add support for Drupal 9.2 and below.
$media_url = file_url_transform_relative(file_create_url($uri));
}
if (!empty($media_url)) {
if (!empty($settings['other_settings']['background_image_style']) &&
$settings['other_settings']['background_image_style'] != 'parallax') {
$styles .= ' background: url("' . $media_url . '") center center no-repeat;';
}
switch ($settings['other_settings']['background_image_style']) {
case 'cover':
$styles .= ' background-size: cover !important;';
break;
case 'contain':
$styles .= ' background-size: contain !important;';
break;
case 'repeat':
$styles .= ' background-repeat: repeat !important;';
break;
}
}
}
}
if (!empty($settings['other_settings']['background_color'])) {
$background_color = str_replace('#', '', $settings['other_settings']['background_color']);
$styles .= ' background-color: #' . Html::escape($background_color) . ';';
}
if (!empty($settings['other_settings']['edge_to_edge'])) {
$global_styles .= '.ebt-edge-to-edge {';
$global_styles .= ' overflow: hidden;';
$global_styles .= ' width: 100vw; ';
$global_styles .= ' max-width: 100vw; ';
$global_styles .= ' margin-left: calc(-50vw + 50%) !important; ';
$global_styles .= ' margin-right: calc(-50vw + 50%) !important; ';
$global_styles .= ' object-fit: cover; ';
$global_styles .= '} ';
// Center blocks in left aligned Olivero theme.
$current_theme = $this->themeManager->getActiveTheme();
if (!empty($current_theme) && $current_theme->getName() == 'olivero') {
$global_styles .= '@media only screen and (min-width: 75rem) {';
$global_styles .= '.ebt-edge-to-edge {';
$global_styles .= ' margin-left: calc(-50vw + 50% + 5.625rem * 2) !important; ';
$global_styles .= ' margin-right: calc(-50vw + 50%) !important; ';
$global_styles .= '} ';
$global_styles .= '} ';
}
$global_styles .= 'body { overflow-x: hidden; }';
if (!empty($settings['other_settings']['container_width']) &&
$settings['other_settings']['container_width'] != 'auto') {
$container_width_default = [
'xxsmall' => '280',
'xsmall' => '480',
'small' => '780',
'default' => '960',
'large' => '1120',
'xlarge' => '1320',
'xxlarge' => '1600',
];
$width = $this->config->get('ebt_core_' . $settings['other_settings']['container_width'] . '_width');
if (empty($width)) {
$width = $container_width_default[$settings['other_settings']['container_width']];
}
$global_styles .= ' .ebt-width-' . Html::escape($settings['other_settings']['container_width']) . ' .ebt-container { ';
$global_styles .= ' max-width: ' . $width . 'px; ';
$global_styles .= ' margin: 0 auto; ';
$global_styles .= '} ';
}
}
if (empty($styles) && empty($global_styles)) {
return '';
}
return '<style>.' . $block_class . '{' . $styles . '} ' . $global_styles . ' </style>';
}
}
