Files
2026-09-15 10:26:34 +08:00

285 lines
9.9 KiB
PHP
Executable File

<?php
/**
* Magezon
*
* This source file is subject to the Magezon Software License, which is available at https://www.magezon.com/license
* Do not edit or add to this file if you wish to upgrade the to newer versions in the future.
* If you wish to customize this module for your needs.
* Please refer to https://www.magezon.com for more information.
*
* @category Magezon
* @package Magezon_Core
* @copyright Copyright (C) 2019 Magezon (https://www.magezon.com)
*/
namespace Magezon\Core\Helper;
class Style extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* @var Data
*/
protected $dataHelper;
/**
* @param \Magezon\Core\Helper\Data $dataHelper
*/
public function __construct(
\Magezon\Core\Helper\Data $dataHelper
) {
$this->dataHelper = $dataHelper;
}
/**
* @param string|array $target
* @param array $styles
* @param string $suffix
* @return string
*/
public function getHtml($target, $styles, $suffix = '')
{
$html = '';
if (is_array($target)) {
foreach ($target as $k => $_selector) {
if (!$_selector) {
unset($target[$k]);
}
}
$i = 0;
$count = count($target);
foreach ($target as $_selector) {
$html .= $_selector . $suffix;
if ($i!=$count-1) {
$html .= ',';
}
$i++;
}
} else {
$html = $target . $suffix;
}
$stylesHtml = $this->parseStyles($styles);
if (!$stylesHtml) return;
if ($styles) {
$html .= '{';
$html .= $stylesHtml;
$html .= '}';
}
return $html;
}
/**
* @param array $styles
* @return string
*/
public function parseStyles($styles)
{
$result = '';
foreach ($styles as $k => $v) {
if ($v=='') continue;
$result .= $k . ':' . $v . ';';
}
return $result;
}
/**
* @param string $value
* @return string
*/
public function getColor($value, $important = false)
{
if ($value && (!$this->dataHelper->startsWith($value, '#') && !$this->dataHelper->startsWith($value, 'rgb'))) {
if ($value != 'transparent') {
$value = '#' . $value;
}
}
if ($value && $important) {
$value .= ' !important';
}
return $value;
}
/**
* @param string $value
* @return string
*/
public function getProperty($value, $important = false, $unit = '')
{
if (!$unit) $unit = 'px';
if (is_numeric($value)) {
$value .= $unit;
} else if ($value == '-') {
$value = '';
}
if ($value && $important) {
$value .= ' !important';
}
return $value;
}
/**
* @param string $value
* @return boolean
*/
public function isNull($value) {
if (is_numeric($value)) return false;
if ($value === '' || $value === null) {
return true;
}
return false;
}
/**
* @param array $data
* @return array
*/
public function getStyles($data)
{
$styles = [];
$config = new \Magento\Framework\DataObject($data);
$paddingTop = $this->getProperty($config['padding_top']);
$paddingRight = $this->getProperty($config['padding_right']);
$paddingBottom = $this->getProperty($config['padding_bottom']);
$paddingLeft = $this->getProperty($config['padding_left']);
if (!$this->isNull($paddingTop) && !$this->isNull($paddingRight) && !$this->isNull($paddingBottom) && !$this->isNull($paddingLeft)) {
if ($paddingTop == $paddingRight && $paddingTop == $paddingBottom && $paddingTop == $paddingLeft) {
$styles['padding'] = $paddingTop;
} else {
$styles['padding'] = $paddingTop . ' ' . $paddingRight . ' ' . $paddingBottom . ' ' . $paddingLeft;
}
} else {
$styles['padding-top'] = $paddingTop;
$styles['padding-right'] = $paddingRight;
$styles['padding-bottom'] = $paddingBottom;
$styles['padding-left'] = $paddingLeft;
}
$marginTop = $this->getProperty($config['margin_top']);
$marginRight = $this->getProperty($config['margin_right']);
$marginBottom = $this->getProperty($config['margin_bottom']);
$marginLeft = $this->getProperty($config['margin_left']);
if (!$this->isNull($marginTop) && !$this->isNull($marginRight) && !$this->isNull($marginBottom) && !$this->isNull($marginLeft)) {
if ($marginTop == $marginRight && $marginTop == $marginBottom && $marginTop == $marginLeft) {
$styles['margin'] = $marginTop;
} else {
$styles['margin'] = $marginTop . ' ' . $marginRight . ' ' . $marginBottom . ' ' . $marginLeft;
}
} else {
$styles['margin-top'] = $marginTop;
$styles['margin-right'] = $marginRight;
$styles['margin-bottom'] = $marginBottom;
$styles['margin-left'] = $marginLeft;
}
$borderStyle = $config['border_style'];
if ($borderStyle && $config['border_color']) {
$borderTopWidth = $this->getProperty($config['border_top_width']);
$borderRightWidth = $this->getProperty($config['border_right_width']);
$borderBottomWidth = $this->getProperty($config['border_bottom_width']);
$borderLeftWidth = $this->getProperty($config['border_left_width']);
$borderColor = $this->getColor($config['border_color']);
$styles['border-color'] = $this->getColor($config['border_color']);
if (!$this->isNull($borderTopWidth)) {
$styles['border-top-width'] = $borderTopWidth;
$styles['border-top-style'] = $borderStyle;
}
if (!$this->isNull($borderRightWidth)) {
$styles['border-right-width'] = $borderRightWidth;
$styles['border-right-style'] = $borderStyle;
}
if (!$this->isNull($borderBottomWidth)) {
$styles['border-bottom-width'] = $borderBottomWidth;
$styles['border-bottom-style'] = $borderStyle;
}
if (!$this->isNull($borderLeftWidth)) {
$styles['border-left-width'] = $borderLeftWidth;
$styles['border-left-style'] = $borderStyle;
}
if (!$this->isNull($borderTopWidth) && !$this->isNull($borderRightWidth) && !$this->isNull($borderBottomWidth) && !$this->isNull($borderLeftWidth)) {
unset($styles['border-top-style']);
unset($styles['border-right-style']);
unset($styles['border-bottom-style']);
unset($styles['border-left-style']);
$styles['border-style'] = $borderStyle;
if ($borderTopWidth == $borderRightWidth && $borderTopWidth == $borderBottomWidth && $borderTopWidth == $borderLeftWidth) {
$styles['border'] = $borderTopWidth . ' ' . $borderStyle . ' ' . $borderColor;
unset($styles['border-top-width']);
unset($styles['border-top-style']);
unset($styles['border-right-width']);
unset($styles['border-right-style']);
unset($styles['border-bottom-width']);
unset($styles['border-bottom-style']);
unset($styles['border-left-width']);
unset($styles['border-left-style']);
unset($styles['border-color']);
}
}
if ($this->isNull($borderTopWidth) && $this->isNull($borderRightWidth) && $this->isNull($borderBottomWidth) && $this->isNull($borderLeftWidth)) {
unset($styles['border-style']);
unset($styles['border-color']);
}
}
$borderTopLeftRadius = $this->getProperty($config['border_top_left_radius']);
$borderTopRightRadius = $this->getProperty($config['border_top_right_radius']);
$borderBottomRightRadius = $this->getProperty($config['border_bottom_right_radius']);
$borderBottomLeftRadius = $this->getProperty($config['border_bottom_left_radius']);
if (!$this->isNull($borderTopLeftRadius) || !$this->isNull($borderTopRightRadius) || !$this->isNull($borderBottomRightRadius) || !$this->isNull($borderBottomLeftRadius)) {
if ($borderTopLeftRadius == $borderTopRightRadius && $borderTopLeftRadius == $borderBottomRightRadius && $borderTopLeftRadius == $borderBottomLeftRadius) {
$styles['border-radius'] = $borderTopLeftRadius;
} else {
if (!$borderTopLeftRadius) $borderTopLeftRadius = 0;
if (!$borderTopRightRadius) $borderTopRightRadius = 0;
if (!$borderBottomRightRadius) $borderBottomRightRadius = 0;
if (!$borderBottomLeftRadius) $borderBottomLeftRadius = 0;
$styles['border-radius'] = $borderTopLeftRadius . ' ' . $borderTopRightRadius . ' ' . $borderBottomRightRadius . ' ' . $borderBottomLeftRadius;
}
}
$styles['background-color'] = $this->getColor($config['background_color']);
if ($backgroundImage = $config['background_image']) {
$styles['background-image'] = 'url(\'' . $this->dataHelper->getImageUrl($backgroundImage) . '\')';
$backgroundPosition = $config['background_position'];
if ($backgroundPosition == 'custom') {
if ($config['custom_background_position']) {
$styles['background-position'] = $config['custom_background_position'];
}
} else {
$styles['background-position'] = $backgroundPosition;
}
$backgroundSize = $config['background_size'];
if ($backgroundSize == 'custom') {
if ($config['custom_background_size']) {
$styles['background-size'] = $config['custom_background_size'];
}
} else {
$styles['background-size'] = $backgroundSize;
}
$styles['background-repeat'] = $config['background_repeat'];
}
if ($config['boxshadow']) {
$boxshadowHorizontal = $this->getProperty($config['boxshadow_horizontal']);
$boxshadowVertical = $this->getProperty($config['boxshadow_vertical']);
$boxshadowBlur = $this->getProperty($config['boxshadow_blur']);
$boxshadowSpread = $this->getProperty($config['boxshadow_spread']);
$boxshadowColor = $this->getColor($config['boxshadow_color']);
$styles['box-shadow'] = $boxshadowHorizontal . ' ' . $boxshadowVertical . ' ' . $boxshadowBlur . ' ' . $boxshadowSpread . ' ' . $boxshadowColor;
if ($config['boxshadow_position'] == 'inset') {
$styles['box-shadow'] .= ' inset';
}
}
return $styles;
}
}