<?php
/**
* @package Unlimited Elements
* @author unlimited-elements.com
* @copyright (C) 2021 Unlimited Elements, All Rights Reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* */
if ( ! defined( 'ABSPATH' ) ) exit;
class UniteCreatorOutputWork extends HtmlOutputBaseUC{
private static $serial = 0;
const SELECTOR_VALUE_PLACEHOLDER = "{{value}}";
const TEMPLATE_HTML = "html";
const TEMPLATE_CSS = "css";
const TEMPLATE_CSS_ITEM = "css_item";
const TEMPLATE_JS = "js";
const TEMPLATE_HTML_ITEM = "item";
const TEMPLATE_HTML_ITEM2 = "item2";
private $addon;
private $isInited = false;
private $objTemplate;
private $isItemsExists = false;
private $itemsType = null;
private $paramsCache = null;
private $cacheConstants = null;
private $processType = null;
private $generatedID = null;
private $systemOutputID = null;
private $isModePreview = false;
private $arrOptions;
private $isShowDebugData = false;
private $debugDataType = "";
private $valuesForDebug = null;
private $itemsSource = "";
private $isGutenberg = false;
private $isBackground = false;
private $isGutenbergBackground = false;
private static $isGutenbergGlobalCssAdded = false;
private static $arrScriptsHandles = array();
private static $arrUrlCacheCss = array();
private static $arrHandleCacheCss = array();
private static $arrUrlCacheJs = array();
private static $arrHandleCacheJs = array();
public static $isBufferingCssActive = false;
public static $bufferBodyCss;
public static $bufferCssIncludes;
private static $arrGeneratedIDs = array();
private $htmlDebug = "";
private $processedItemsData = false;
/**
* construct
*/
public function __construct(){
$this->addon = new UniteCreatorAddon();
if(GlobalsUC::$isProVersion)
$this->objTemplate = new UniteCreatorTemplateEnginePro();
else
$this->objTemplate = new UniteCreatorTemplateEngine();
$this->processType = UniteCreatorParamsProcessor::PROCESS_TYPE_OUTPUT;
if(GlobalsProviderUC::$renderPlatform == GlobalsProviderUC::RENDER_PLATFORM_GUTENBERG)
$this->isGutenberg = true;
}
/**
* set output type
*/
public function setProcessType($type){
UniteCreatorParamsProcessor::validateProcessType($type);
$this->processType = $type;
}
/**
* validate inited
*/
private function validateInited(){
if($this->isInited == false)
UniteFunctionsUC::throwError("Output error: addon not inited");
}
private function a_________INCLUDES_______(){}
/**
* clear includes cache, avoid double render bug
*/
public static function clearIncludesCache(){
// define handles we want to keep
$preserveHandles = array(
"font-awesome",
"font-awesome-4-shim"
);
$keepHandles = array();
// save flags before clearing
foreach ($preserveHandles as $handle) {
if (isset(self::$arrHandleCacheCss[$handle])) {
$keepHandles[$handle] = true;
}
}
// reset caches
self::$arrHandleCacheCss = array();
self::$arrHandleCacheJs = array();
self::$arrUrlCacheCss = array();
self::$arrUrlCacheJs = array();
// restore preserved handles
foreach ($keepHandles as $handle => $val) {
self::$arrHandleCacheCss[$handle] = $val;
}
}
/**
* cache include
*/
private function cacheInclude($url, $handle, $type){
if($type == "css"){ //cache css
self::$arrUrlCacheCss[$url] = true;
self::$arrHandleCacheCss[$handle] = true;
}else{
//cache js
self::$arrUrlCacheJs[$url] = true;
self::$arrHandleCacheJs[$handle] = true;
}
}
/**
* check that the include located in cache
*/
private function isIncludeInCache($url, $handle, $type){
if(empty($url) || empty($handle))
return(false);
if($type == "css"){
if(isset(self::$arrUrlCacheCss[$url]))
return(true);
if(isset(self::$arrHandleCacheCss[$handle]))
return(true);
}else{ //js
if(isset(self::$arrUrlCacheJs[$url]))
return(true);
if(isset(self::$arrHandleCacheJs[$handle]))
return(true);
}
return(false);
}
/**
* check include condition
* return true to include and false to not include
*/
private function checkIncludeCondition($condition){
if(empty($condition))
return(true);
if(!is_array($condition))
return(true);
$name = UniteFunctionsUC::getVal($condition, "name");
$value = UniteFunctionsUC::getVal($condition, "value");
if(empty($name))
return(true);
if($name == "never_include")
return(false);
$params = $this->getAddonParams();
if(array_key_exists($name, $params) == false)
return(true);
$paramValue = $params[$name];
if(is_array($value)){
$index = array_search($paramValue, $value);
$isEqual = ($index !== false);
}else
$isEqual = ($paramValue === $value);
return($isEqual);
}
/**
* process includes list, get array("url", type)
*/
private function processIncludesList($arrIncludes, $type){
$arrIncludesProcessed = array();
foreach($arrIncludes as $handle => $include){
$urlInclude = $include;
if(is_array($include)){
$urlInclude = UniteFunctionsUC::getVal($include, "url");
$condition = UniteFunctionsUC::getVal($include, "condition");
$isIncludeByCondition = $this->checkIncludeCondition($condition);
if($isIncludeByCondition == false)
continue;
}
if(is_numeric($handle) || empty($handle)){
$addonName = $this->addon->getName();
$handle = HelperUC::getUrlHandle($urlInclude, $addonName);
}
$urlInclude = HelperUC::urlToSSLCheck($urlInclude);
$deps = array();
$includeAsModule = false;
//process params
$params = UniteFunctionsUC::getVal($include, "params");
if(!empty($params)){
$includeAfterFrontend = UniteFunctionsUC::getVal($params, "include_after_elementor_frontend");
$includeAfterFrontend = UniteFunctionsUC::strToBool($includeAfterFrontend);
if($includeAfterFrontend == true)
$deps[]= "elementor-frontend";
//include as module handle.
//add to handles array, and later check if need to add the module addition to output
$includeAsModule = UniteFunctionsUC::getVal($params, "include_as_module");
$includeAsModule = UniteFunctionsUC::strToBool($includeAsModule);
if($includeAsModule == true)
GlobalsProviderUC::$arrJSHandlesModules[$handle] = true;
//change the handle
$customHandle = UniteFunctionsUC::getVal($params, "include_handle");
$customHandle = trim($customHandle);
if(!empty($customHandle))
$handle = $customHandle;
}
$arrIncludeNew = array();
$arrIncludeNew["url"] = $urlInclude;
$arrIncludeNew["type"] = $type;
if(!empty($handle))
$arrIncludeNew["handle"] = $handle;
if(!empty($deps))
$arrIncludeNew["deps"] = $deps;
if($includeAsModule == true)
$arrIncludeNew["is_module"] = true;
$arrIncludesProcessed[] = $arrIncludeNew;
}
return($arrIncludesProcessed);
}
/**
* exclude alrady existing includes on page
* like font awesome
* function for override
*/
protected function excludeExistingInlcudes($arrIncludes){
return($arrIncludes);
}
/**
* get processed includes list
* includes type = js / css / all
*/
public function getProcessedIncludes($includeLibraries = false, $processProviderLibrary = false, $includesType = "all"){
$this->validateInited();
//get list of js and css
$arrLibJs = array();
$arrLibCss = array();
if($includeLibraries == true){
//get all libraries without provider process
$arrLibraries = $this->addon->getArrLibraryIncludesUrls($processProviderLibrary);
}
$arrIncludesJS = array();
$arrIncludesCss = array();
//get js
if($includesType != "css"){
if($includeLibraries)
$arrLibJs = $arrLibraries["js"];
$arrIncludesJS = $this->addon->getJSIncludes();
$arrIncludesJS = array_merge($arrLibJs, $arrIncludesJS);
$arrIncludesJS = $this->processIncludesList($arrIncludesJS, "js");
}
//get css
if($includesType != "js"){
if($includeLibraries)
$arrLibCss = $arrLibraries["css"];
$arrIncludesCss = $this->addon->getCSSIncludes();
$arrIncludesCss = array_merge($arrLibCss, $arrIncludesCss);
$arrIncludesCss = $this->processIncludesList($arrIncludesCss, "css");
}
$arrProcessedIncludes = array_merge($arrIncludesJS, $arrIncludesCss);
$arrProcessedIncludes = $this->excludeExistingInlcudes($arrProcessedIncludes);
// add widget scripts to editor
if(!empty(HelperUC::$arrWidgetScripts)){
foreach(HelperUC::$arrWidgetScripts as $handle => $urlScript){
$arrScript = array(
"type" => "js",
"handle" => $handle,
"url" => $urlScript,
);
$arrProcessedIncludes[] = $arrScript;
}
//empty the array
HelperUC::$arrWidgetScripts = array();
}
return $arrProcessedIncludes;
}
/**
* get includes html
*/
private function getHtmlIncludes($arrIncludes = null, $filterType = null){
$this->validateInited();
if(empty($arrIncludes))
return("");
$addonName = $this->addon->getName();
$html = "";
foreach($arrIncludes as $include){
$type = $include["type"];
//filter
if($filterType == "js" && $type != "js")
continue;
if($filterType == "css" && $type != "css")
continue;
$url = $include["url"];
$handle = UniteFunctionsUC::getVal($include, "handle");
if(empty($handle))
$handle = HelperUC::getUrlHandle($url, $addonName);
if( $handle == 'jquery' ) {
if ( !wp_script_is( 'jquery', 'enqueued' ) ) {
wp_enqueue_script( 'jquery' );
}
continue;
}
$isInCache = $this->isIncludeInCache($url, $handle, $type);
//if inside hidden template - no cache needed. should output the css each time.
if($isInCache == true && GlobalsProviderUC::$isInsideHiddenTemplate !== true){
continue;
}
$this->cacheInclude($url, $handle, $type);
switch($type){
case "js":
$htmlType = "text/javascript";
$isModule = UniteFunctionsUC::getVal($include, "is_module");
$isModule = UniteFunctionsUC::strToBool($isModule);
if($isModule == true)
$htmlType = "module";
// phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
$html .= self::TAB2."<script type='{$htmlType}' src='{$url}'></script>".self::BR;
break;
case "css":
$cssID = "{$handle}-css";
$isDelayedScript = apply_filters("unlimited_element_is_style_delayed", $cssID);
if($isDelayedScript === true){
// phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet
$styleHtml = "<link id='{$cssID}' data-debloat-delay='' data-href='{$url}' type='text/css' rel='stylesheet' media='all' >";
$html .= self::TAB2.$styleHtml.self::BR;
}
else
// phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet
$html .= self::TAB2."<link id='{$cssID}' href='{$url}' type='text/css' rel='stylesheet' >".self::BR;
break;
default:
UniteFunctionsUC::throwError("Wrong include type: {$type} ");
break;
}
}
return($html);
}
/**
* process includes
* includes type = "all,js,css"
*/
public function processIncludes($includesType = "all"){
$arrIncludes = $this->getProcessedIncludes(true, true, $includesType);
$addonName = $this->addon->getName();
$arrDep = $this->addon->getIncludesJsDependancies();
foreach($arrIncludes as $include){
$type = $include["type"];
$url = $include["url"];
$handle = UniteFunctionsUC::getVal($include, "handle");
$deps = UniteFunctionsUC::getVal($include, "deps");
if(empty($handle))
$handle = HelperUC::getUrlHandle($url, $addonName);
$isInCache = $this->isIncludeInCache($url, $handle, $type);
if($isInCache == true){
continue;
}
$this->cacheInclude($url, $handle, $type);
$arrIncludeDep = $arrDep;
if(!empty($deps))
$arrIncludeDep = array_merge($arrIncludeDep, $deps);
switch($type){
case "js":
//deregister script first if exists
wp_deregister_script( $handle );
UniteProviderFunctionsUC::addScript($handle, $url, false, $arrIncludeDep);
break;
case "css":
wp_deregister_style($handle);
UniteProviderFunctionsUC::addStyle($handle, $url);
break;
default:
UniteFunctionsUC::throwError("Wrong include type: {$type} ");
break;
}
}
//process special includes if available
}
private function a________PREVIEW_HTML________(){}
/**
* put header additions in header html, functiob for override
*/
protected function putPreviewHtml_headerAdd(){
}
/**
* put footer additions in body html, functiob for override
*/
protected function putPreviewHtml_footerAdd(){
}
/**
* function for override
*/
protected function onPreviewHtml_scriptsAdd(){
/*function for override */
}
/**
* modify preview includes, function for override
*/
protected function modifyPreviewIncludes($arrIncludes){
return($arrIncludes);
}
private function ______CSS_SELECTORS_______(){}
/*
private function processParamCSSSelector_number($param, $selectors){
$values = array(
"desktop" => UniteFunctionsUC::getVal($param, "value"),
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
$style = "";
foreach($values as $device => $value){
if(empty($value) === true)
continue;
foreach($selectors as $selector => $selectorValue){
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
}
return $style;
}
*/
/**
* process css selector of number param
*/
private function processParamCSSSelector_number($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$isOldFormat = is_array($value) && !empty($value);
if($isOldFormat){
$values = array(
"desktop" => $value,
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
} else {
$values = array(
"desktop" => UniteFunctionsUC::getVal($param, "value"),
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
}
$style = "";
foreach($values as $device => $value){
if(empty($value) === true)
continue;
foreach($selectors as $selector => $selectorValue){
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
}
return $style;
}
/*
private function processParamCSSSelector_background($param, $selectors){
$name = UniteFunctionsUC::getVal($param, "name");
$value = UniteFunctionsUC::getVal($param, "value");
$type = UniteFunctionsUC::getVal($value, $name . "_type");
$style = "";
$selector = $this->combineCSSSelectors($selectors);
switch($type){
case "solid":
$regularFields = array(
$name . "_solid_color" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "color"),
$name . "_solid_image_attachment" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "attachment"),
);
$responsiveFields = array(
$name . "_solid_image" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "image"),
$name . "_solid_image_position" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "position"),
$name . "_solid_image_repeat" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "repeat"),
$name . "_solid_image_size" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "size"),
);
$style .= $this->prepareCSSSelectorFieldsStyle($regularFields, $selector, $value);
$style .= $this->prepareCSSSelectorResponsiveFieldsStyle($responsiveFields, $selector, $value);
break;
case "gradient":
$color1 = UniteFunctionsUC::getVal($value, $name . "_gradient1_color");
$stop1 = UniteFunctionsUC::getVal($value, $name . "_gradient1_stop");
$color2 = UniteFunctionsUC::getVal($value, $name . "_gradient2_color");
$stop2 = UniteFunctionsUC::getVal($value, $name . "_gradient2_stop");
$type = UniteFunctionsUC::getVal($value, $name . "_gradient_type");
$angle = UniteFunctionsUC::getVal($value, $name . "_gradient_angle");
$position = UniteFunctionsUC::getVal($value, $name . "_gradient_position");
$stop1 = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $stop1);
$stop2 = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $stop2);
$angle = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $angle);
if($color1 !== "" && $stop1 !== "" && $color2 !== "" && $stop2 !== "" && $type !== "" && $angle !== "" && $position !== ""){
$selectorValue = ($type === "radial")
? HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "radial-gradient")
: HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "linear-gradient");
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{angle}}" => $angle,
"{{position}}" => $position,
"{{color1}}" => $color1,
"{{stop1}}" => $stop1,
"{{color2}}" => $color2,
"{{stop2}}" => $stop2,
));
$style .= $this->prepareCSSSelectorStyle($selector, $css);
}
break;
}
return $style;
}
*/
/*
* process css selector of background param
*/
private function processParamCSSSelector_background($param, $selectors){
$name = UniteFunctionsUC::getVal($param, "name");
$value = UniteFunctionsUC::getVal($param, "value");
$isOldFormat = is_array($value) && !empty($value);
if($isOldFormat){
$type = UniteFunctionsUC::getVal($value, $name . "_type");
} else {
$type = UniteFunctionsUC::getVal($param, "background_type");
$value = $param;
}
$selector = $this->combineCSSSelectors($selectors);
$style = '';
switch($type){
case "solid":
$regularFields = array(
$name . "_solid_color" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "color"),
$name . "_solid_image_attachment" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "attachment"),
);
$responsiveFields = array(
$name . "_solid_image" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "image"),
$name . "_solid_image_position" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "position"),
$name . "_solid_image_repeat" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "repeat"),
$name . "_solid_image_size" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "size"),
);
// Нужно преобразовать ключи для нового формата
if(!$isOldFormat){
// Для нового формата ключи без префикса name
$regularFields = array(
"solid_color" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "color"),
"solid_image_attachment" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "attachment"),
);
$responsiveFields = array(
"solid_bg_image" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "image"),
"solid_bg_image_position" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "position"),
"solid_bg_image_repeat" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "repeat"),
"solid_bg_image_size" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "size"),
);
}
$style .= $this->prepareCSSSelectorFieldsStyle($regularFields, $selector, $value);
$style .= $this->prepareCSSSelectorResponsiveFieldsStyle($responsiveFields, $selector, $value);
break;
case "gradient":
// Определяем префиксы ключей в зависимости от формата
$prefix = $isOldFormat ? $name . "_" : "";
$color1 = UniteFunctionsUC::getVal($value, $prefix . "gradient_color1");
$stop1 = UniteFunctionsUC::getVal($value, $prefix . "gradient1_stop");
$color2 = UniteFunctionsUC::getVal($value, $prefix . "gradient_color2");
$stop2 = UniteFunctionsUC::getVal($value, $prefix . "gradient2_stop");
$gradientType = UniteFunctionsUC::getVal($value, $prefix . "gradient_type");
$angle = UniteFunctionsUC::getVal($value, $prefix . "gradient_angle");
$position = UniteFunctionsUC::getVal($value, $prefix . "gradient_position");
$stop1 = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $stop1);
$stop2 = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $stop2);
$angle = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $angle);
if($color1 !== "" && $stop1 !== "" && $color2 !== "" && $stop2 !== "" && $gradientType !== "" && $angle !== "" && $position !== ""){
$selectorValue = ($gradientType === "radial")
? HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "radial-gradient")
: HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BACKGROUND, "linear-gradient");
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{angle}}" => $angle,
"{{position}}" => $position,
"{{color1}}" => $color1,
"{{stop1}}" => $stop1,
"{{color2}}" => $color2,
"{{stop2}}" => $stop2,
));
$style .= $this->prepareCSSSelectorStyle($selector, $css);
}
break;
}
return $style;
}
/*
private function processParamCSSSelector_border($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$type = UniteFunctionsUC::getVal($value, "type", "none");
$color = UniteFunctionsUC::getVal($value, "color", "#000000");
// echo json_encode($param) . ' ==[2]';
if($type === "none")
return null;
$style = "";
$selector = $this->combineCSSSelectors($selectors);
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BORDER, "style");
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $type);
$style .= $this->prepareCSSSelectorStyle($selector, $css);
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BORDER, "color");
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $color);
$style .= $this->prepareCSSSelectorStyle($selector, $css);
$widths = array(
"desktop" => UniteFunctionsUC::getVal($value, "width"),
"tablet" => UniteFunctionsUC::getVal($value, "width_tablet"),
"mobile" => UniteFunctionsUC::getVal($value, "width_mobile"),
);
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BORDER, "width");
foreach($widths as $device => $value){
if(empty($value) === true)
continue;
$css = $this->prepareCSSSelectorDimentionsCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
return $style;
}
*/
private function processParamCSSSelector_border($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$isOldFormat = is_array($value) && !empty($value);
if($isOldFormat){
// from block settings
$type = UniteFunctionsUC::getVal($value, "type", "none");
$color = UniteFunctionsUC::getVal($value, "color", "#000000");
} else {
// from block defaults
$type = UniteFunctionsUC::getVal($param, "border_type", "none");
$color = UniteFunctionsUC::getVal($param, "border_color", "#000000");
$value = $param; // для единообразия
}
if($type === "none")
return null;
$style = "";
$selector = $this->combineCSSSelectors($selectors);
// border-style
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BORDER, "style");
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $type);
$style .= $this->prepareCSSSelectorStyle($selector, $css);
// border-color
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BORDER, "color");
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $color);
$style .= $this->prepareCSSSelectorStyle($selector, $css);
// border-width (responsive)
$widths = array();
if($isOldFormat){
$widths = array(
"desktop" => UniteFunctionsUC::getVal($value, "width"),
"tablet" => UniteFunctionsUC::getVal($value, "width_tablet"),
"mobile" => UniteFunctionsUC::getVal($value, "width_mobile"),
);
} else {
// Новый формат: width_desktop_top, width_tablet_top, width_mobile_top
$widths = array(
"desktop" => array(
"top" => UniteFunctionsUC::getVal($value, "width_desktop_top"),
"right" => UniteFunctionsUC::getVal($value, "width_desktop_right"),
"bottom" => UniteFunctionsUC::getVal($value, "width_desktop_bottom"),
"left" => UniteFunctionsUC::getVal($value, "width_desktop_left"),
"unit" => "px"
),
"tablet" => array(
"top" => UniteFunctionsUC::getVal($value, "width_tablet_top"),
"right" => UniteFunctionsUC::getVal($value, "width_tablet_right"),
"bottom" => UniteFunctionsUC::getVal($value, "width_tablet_bottom"),
"left" => UniteFunctionsUC::getVal($value, "width_tablet_left"),
"unit" => "px"
),
"mobile" => array(
"top" => UniteFunctionsUC::getVal($value, "width_mobile_top"),
"right" => UniteFunctionsUC::getVal($value, "width_mobile_right"),
"bottom" => UniteFunctionsUC::getVal($value, "width_mobile_bottom"),
"left" => UniteFunctionsUC::getVal($value, "width_mobile_left"),
"unit" => "px"
),
);
}
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BORDER, "width");
foreach($widths as $device => $widthValue){
if(empty($widthValue) === true)
continue;
$css = $this->prepareCSSSelectorDimentionsCSS($selectorValue, $widthValue);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
return $style;
}
/*
private function processParamCSSSelector_dimentions($param, $selectors, $type){
$values = array(
"desktop" => UniteFunctionsUC::getVal($param, "value"),
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
$style = "";
$selector = $this->combineCSSSelectors($selectors);
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam($type);
foreach($values as $device => $value){
if(empty($value) === true)
continue;
$css = $this->prepareCSSSelectorDimentionsCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
return $style;
}
*/
/**
* process css selector of dimentions param
*/
private function processParamCSSSelector_dimentions($param, $selectors, $type){
$value = UniteFunctionsUC::getVal($param, "value");
$isOldFormat = is_array($value) && !empty($value);
if($isOldFormat){
$values = array(
"desktop" => $value,
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
} else {
$values = array(
"desktop" => UniteFunctionsUC::getVal($param, "value"),
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
}
$style = "";
$selector = $this->combineCSSSelectors($selectors);
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam($type);
foreach($values as $device => $value){
if(empty($value) === true)
continue;
$css = $this->prepareCSSSelectorDimentionsCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
return $style;
}
/**
* process css selector of slider param
*/
private function processParamCSSSelector_slider($param, $selectors){
$name = UniteFunctionsUC::getVal($param, "name");
$value = UniteFunctionsUC::getVal($param, "value");
$isOldFormat = is_array($value) && isset($value["size"]);
if($isOldFormat){
$tabletValue = UniteFunctionsUC::getVal($param, "value_tablet");
$mobileValue = UniteFunctionsUC::getVal($param, "value_mobile");
$values = array(
"desktop" => $value,
"tablet" => is_array($tabletValue) && isset($tabletValue["size"]) ? $tabletValue : null,
"mobile" => is_array($mobileValue) && isset($mobileValue["size"]) ? $mobileValue : null,
);
} else {
$defaultValue = UniteFunctionsUC::getVal($param, "default_value");
$defaultValueTablet = UniteFunctionsUC::getVal($param, "default_value_tablet");
$defaultValueMobile = UniteFunctionsUC::getVal($param, "default_value_mobile");
$desktopValue = UniteFunctionsUC::getVal($param, "value");
if(empty($desktopValue) && $desktopValue !== "0") $desktopValue = $defaultValue;
$tabletValue = UniteFunctionsUC::getVal($param, "value_tablet");
if(empty($tabletValue) && $tabletValue !== "0") $tabletValue = $defaultValueTablet;
$mobileValue = UniteFunctionsUC::getVal($param, "value_mobile");
if(empty($mobileValue) && $mobileValue !== "0") $mobileValue = $defaultValueMobile;
$desktopUnit = UniteFunctionsUC::getVal($param, "unit");
$tabletUnit = UniteFunctionsUC::getVal($param, "unit_tablet");
$mobileUnit = UniteFunctionsUC::getVal($param, "unit_mobile");
$defaultUnit = UniteFunctionsUC::getVal($param, "units");
if(empty($defaultUnit)) $defaultUnit = "px";
if(strpos($defaultUnit, "_") !== false){
$unitsArray = explode("_", $defaultUnit);
$defaultUnit = $unitsArray[0];
}
if(empty($desktopUnit)) $desktopUnit = $defaultUnit;
if(empty($tabletUnit)) $tabletUnit = $desktopUnit;
if(empty($mobileUnit)) $mobileUnit = $desktopUnit;
$values = array(
"desktop" => (!empty($desktopValue) || $desktopValue === "0") ? array("size" => (int)$desktopValue, "unit" => $desktopUnit) : null,
"tablet" => (!empty($tabletValue) || $tabletValue === "0") ? array("size" => (int)$tabletValue, "unit" => $tabletUnit) : null,
"mobile" => (!empty($mobileValue) || $mobileValue === "0") ? array("size" => (int)$mobileValue, "unit" => $mobileUnit) : null,
);
}
$style = "";
// $style .= "/* =[12] " . json_encode($param) . " */ ";
foreach($values as $device => $value){
if($value === null || (is_array($value) && empty($value)))
continue;
if(is_array($value) && (!isset($value["size"]) || $value["size"] === ""))
continue;
foreach($selectors as $selector => $selectorValue){
$css = $this->prepareCSSSelectorSliderCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
}
return $style;
}
/**
* process css selector of typography param
*/
private function processParamCSSSelector_typography($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
// Проверяем, является ли $value массивом с данными (старый формат)
$isOldFormat = is_array($value) && !empty($value);
if(!$isOldFormat){
// Новый формат: значения прямо в $param
$value = $param;
}
$style = "";
$selector = $this->combineCSSSelectors($selectors);
// import font family
$fontFamily = UniteFunctionsUC::getVal($value, "font_family");
if(empty($fontFamily) === false){
$fontData = HelperUC::getFontPanelData();
$googleFonts = UniteFunctionsUC::getVal($fontData, "arrGoogleFonts");
if(empty($googleFonts[$fontFamily]) === false){
$fontUrl = HelperHtmlUC::getGoogleFontUrl($googleFonts[$fontFamily]);
$this->addon->addCssInclude($fontUrl);
}
}
$regularFields = array(
"font_family" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "family"),
"font_style" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "style"),
"font_weight" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "weight"),
"text_decoration" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "decoration"),
"text_transform" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "transform"),
);
$responsiveFields = array(
"font_size" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "size"),
"line_height" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "line-height"),
"letter_spacing" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "letter-spacing"),
"word_spacing" => HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TYPOGRAPHY, "word-spacing"),
);
$style .= $this->prepareCSSSelectorFieldsStyle($regularFields, $selector, $value);
$style .= $this->prepareCSSSelectorResponsiveFieldsStyle($responsiveFields, $selector, $value);
return $style;
}
/**
* process css selector of text shadow param
*/
private function processParamCSSSelector_textShadow($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
// Проверяем, является ли $value массивом с данными (старый формат)
$isOldFormat = is_array($value) && !empty($value);
if(!$isOldFormat){
// Новый формат: значения прямо в $param
$value = $param;
}
$x = UniteFunctionsUC::getVal($value, "x");
$y = UniteFunctionsUC::getVal($value, "y");
$blur = UniteFunctionsUC::getVal($value, "blur");
$color = UniteFunctionsUC::getVal($value, "color");
$x = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $x);
$y = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $y);
$blur = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $blur);
$css = "";
if($x !== "" && $y !== "" && $blur !== "" && $color !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TEXTSHADOW);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{x}}" => $x,
"{{y}}" => $y,
"{{blur}}" => $blur,
"{{color}}" => $color,
));
}
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
/*
private function processParamCSSSelector_textShadow($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$x = UniteFunctionsUC::getVal($value, "x");
$y = UniteFunctionsUC::getVal($value, "y");
$blur = UniteFunctionsUC::getVal($value, "blur");
$color = UniteFunctionsUC::getVal($value, "color");
$x = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $x);
$y = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $y);
$blur = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $blur);
$css = "";
if($x !== "" && $y !== "" && $blur !== "" && $color !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TEXTSHADOW);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{x}}" => $x,
"{{y}}" => $y,
"{{blur}}" => $blur,
"{{color}}" => $color,
));
}
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
*/
private function processParamCSSSelector_textStroke($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
// Проверяем, является ли $value массивом с данными (старый формат)
$isOldFormat = is_array($value) && !empty($value);
if(!$isOldFormat){
// Новый формат: значения прямо в $param
$value = $param;
}
$width = UniteFunctionsUC::getVal($value, "width");
$color = UniteFunctionsUC::getVal($value, "color");
// Prepare CSS for stroke width
$width = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $width);
$css = "";
// If both width and color are available, apply the text stroke
if($width !== "" && $color !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TEXTSTROKE);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{width}}" => $width,
"{{color}}" => $color,
));
}
// Combine the selectors and prepare the style
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
/*
private function processParamCSSSelector_textStroke($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$width = UniteFunctionsUC::getVal($value, "width");
$color = UniteFunctionsUC::getVal($value, "color");
// Prepare CSS for stroke width
$width = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $width);
$css = "";
// If both width and color are available, apply the text stroke
if($width !== "" && $color !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_TEXTSTROKE);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{width}}" => $width,
"{{color}}" => $color,
));
}
// Combine the selectors and prepare the style
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
*/
/**
* process css selector of box shadow param
*/
private function processParamCSSSelector_boxShadow($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
// Проверяем, является ли $value массивом с данными (старый формат)
$isOldFormat = is_array($value) && !empty($value);
if(!$isOldFormat){
// Новый формат: значения прямо в $param
$value = $param;
}
$x = UniteFunctionsUC::getVal($value, "x");
$y = UniteFunctionsUC::getVal($value, "y");
$blur = UniteFunctionsUC::getVal($value, "blur");
$spread = UniteFunctionsUC::getVal($value, "spread");
$color = UniteFunctionsUC::getVal($value, "color");
$position = UniteFunctionsUC::getVal($value, "position");
$x = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $x);
$y = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $y);
$blur = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $blur);
$spread = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $spread);
$css = "";
if($x !== "" && $y !== "" && $blur !== "" && $spread !== "" && $color !== "" && $position !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BOXSHADOW);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{x}}" => $x,
"{{y}}" => $y,
"{{blur}}" => $blur,
"{{spread}}" => $spread,
"{{color}}" => $color,
"{{position}}" => $position,
));
}
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
/*
private function processParamCSSSelector_boxShadow($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$x = UniteFunctionsUC::getVal($value, "x");
$y = UniteFunctionsUC::getVal($value, "y");
$blur = UniteFunctionsUC::getVal($value, "blur");
$spread = UniteFunctionsUC::getVal($value, "spread");
$color = UniteFunctionsUC::getVal($value, "color");
$position = UniteFunctionsUC::getVal($value, "position");
$x = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $x);
$y = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $y);
$blur = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $blur);
$spread = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $spread);
$css = "";
if($x !== "" && $y !== "" && $blur !== "" && $spread !== "" && $color !== "" && $position !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_BOXSHADOW);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{x}}" => $x,
"{{y}}" => $y,
"{{blur}}" => $blur,
"{{spread}}" => $spread,
"{{color}}" => $color,
"{{position}}" => $position,
));
}
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
*/
/**
* process css selector of css filters param
*/
private function processParamCSSSelector_cssFilters($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
// Проверяем, является ли $value массивом с данными (старый формат)
$isOldFormat = is_array($value) && !empty($value);
if(!$isOldFormat){
// Новый формат: значения прямо в $param
$value = $param;
}
$blur = UniteFunctionsUC::getVal($value, "blur");
$brightness = UniteFunctionsUC::getVal($value, "brightness");
$contrast = UniteFunctionsUC::getVal($value, "contrast");
$saturation = UniteFunctionsUC::getVal($value, "saturation");
$hue = UniteFunctionsUC::getVal($value, "hue");
$blur = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $blur);
$brightness = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $brightness);
$contrast = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $contrast);
$saturation = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $saturation);
$hue = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $hue);
$css = "";
if($blur !== "" && $brightness !== "" && $contrast !== "" && $saturation !== "" && $hue !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_CSS_FILTERS);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{blur}}" => $blur,
"{{brightness}}" => $brightness,
"{{contrast}}" => $contrast,
"{{saturate}}" => $saturation,
"{{hue}}" => $hue,
));
}
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
/*
private function processParamCSSSelector_cssFilters($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$blur = UniteFunctionsUC::getVal($value, "blur");
$brightness = UniteFunctionsUC::getVal($value, "brightness");
$contrast = UniteFunctionsUC::getVal($value, "contrast");
$saturation = UniteFunctionsUC::getVal($value, "saturation");
$hue = UniteFunctionsUC::getVal($value, "hue");
$blur = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $blur);
$brightness = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $brightness);
$contrast = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $contrast);
$saturation = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $saturation);
$hue = $this->prepareCSSSelectorSliderCSS(self::SELECTOR_VALUE_PLACEHOLDER, $hue);
$css = "";
if($blur !== "" && $brightness !== "" && $contrast !== "" && $saturation !== "" && $hue !== ""){
$selectorValue = HelperHtmlUC::getCSSSelectorValueByParam(UniteCreatorDialogParam::PARAM_CSS_FILTERS);
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{blur}}" => $blur,
"{{brightness}}" => $brightness,
"{{contrast}}" => $contrast,
"{{saturate}}" => $saturation,
"{{hue}}" => $hue,
));
}
$selector = $this->combineCSSSelectors($selectors);
$style = $this->prepareCSSSelectorStyle($selector, $css);
return $style;
}
*/
/**
* process css selector based on value
*/
private function processParamCSSSelector_value($param, $selectors){
$value = UniteFunctionsUC::getVal($param, "value");
$name = UniteFunctionsUC::getVal($param, "name");
$isOldFormat = is_array($value) && !empty($value);
if($isOldFormat){
$values = array(
"desktop" => $value,
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
} else {
// Получаем значения или используем default_value
$defaultValue = UniteFunctionsUC::getVal($param, "default_value");
$defaultValueTablet = UniteFunctionsUC::getVal($param, "default_value_tablet");
$defaultValueMobile = UniteFunctionsUC::getVal($param, "default_value_mobile");
$desktopValue = UniteFunctionsUC::getVal($param, "value");
if(empty($desktopValue) && $desktopValue !== "0") $desktopValue = $defaultValue;
$tabletValue = UniteFunctionsUC::getVal($param, "value_tablet");
if(empty($tabletValue) && $tabletValue !== "0") $tabletValue = $defaultValueTablet;
$mobileValue = UniteFunctionsUC::getVal($param, "value_mobile");
if(empty($mobileValue) && $mobileValue !== "0") $mobileValue = $defaultValueMobile;
$values = array(
"desktop" => $desktopValue,
"tablet" => $tabletValue,
"mobile" => $mobileValue,
);
}
$options = UniteFunctionsUC::getVal($param, "options");
if(empty($options) === false){
$phpFilter = UniteFunctionsUC::getVal($param, "php_filter_name");
if(empty($phpFilter) === false)
$options = array_flip($options);
foreach($values as $device => $value){
if(in_array($value, $options) === false)
unset($values[$device]);
}
}
$style = "";
// $style .= "/* " . json_encode($param) . " */ /* " . $name . ": start */ ";
foreach($values as $device => $value){
// Улучшенная проверка пустых значений
if($value === null || $value === "")
continue;
foreach($selectors as $selector => $selectorValue){
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
}
// $style .= "/* " . $name . ": end */ ";
return $style;
}
/*
private function processParamCSSSelector_value($param, $selectors){
$values = array(
"desktop" => UniteFunctionsUC::getVal($param, "value"),
"tablet" => UniteFunctionsUC::getVal($param, "value_tablet"),
"mobile" => UniteFunctionsUC::getVal($param, "value_mobile"),
);
$options = UniteFunctionsUC::getVal($param, "options");
if(empty($options) === false){
// fix: flip options back, due to a bug with the filter
// (see UniteCreatorParamsProcessorWork->checkModifyParamOptions)
$phpFilter = UniteFunctionsUC::getVal($param, "php_filter_name");
if(empty($phpFilter) === false)
$options = array_flip($options);
// check if the value exists in the options
foreach($values as $device => $value){
if(in_array($value, $options) === false)
unset($values[$device]);
}
}
$style = "";
foreach($values as $device => $value){
if(empty($value) === true)
continue;
foreach($selectors as $selector => $selectorValue){
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $value);
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
}
return $style;
}
*/
/**
* prepare css selector dimentions css
*/
function prepareCSSSelectorDimentionsCSS($selectorValue, $value){
$top = UniteFunctionsUC::getVal($value, "top");
$right = UniteFunctionsUC::getVal($value, "right");
$bottom = UniteFunctionsUC::getVal($value, "bottom");
$left = UniteFunctionsUC::getVal($value, "left");
$unit = UniteFunctionsUC::getVal($value, "unit", "px");
$rawSides = array($top, $right, $bottom, $left);
$hasValue = false;
foreach ($rawSides as $sideValue) {
if ($sideValue !== '' && $sideValue !== null && $sideValue !== false) {
$sideValue = trim((string)$sideValue);
if ($sideValue !== '') {
$hasValue = true;
break;
}
}
}
if ($hasValue === false) return "";
$prepareSide = function($v) use ($unit) {
if ($v === '' || $v === null || $v === false)
return '';
$v = trim((string)$v);
if ($v === '')
return '';
return $v . $unit;
};
$css = $this->processCSSSelectorReplaces($selectorValue, array(
"{{top}}" => $prepareSide($top),
"{{right}}" => $prepareSide($right),
"{{bottom}}" => $prepareSide($bottom),
"{{left}}" => $prepareSide($left),
));
return $css;
}
/**
* prepare css selector image css
*/
private function prepareCSSSelectorImageCSS($selectorValue, $value){
$id = UniteFunctionsUC::getVal($value, "id");
$url = UniteFunctionsUC::getVal($value, "url");
$size = UniteFunctionsUC::getVal($value, "size", "full");
if(empty($id) === false)
$url = UniteProviderFunctionsUC::getImageUrlFromImageID($id, $size);
else
$url = HelperUC::URLtoFull($url);
$css = $this->prepareCSSSelectorValueCSS($selectorValue, $url);
return $css;
}
/**
* prepare css selector slider css
*/
private function prepareCSSSelectorSliderCSS($selectorValue, $value){
$size = UniteFunctionsUC::getVal($value, "size");
$unit = UniteFunctionsUC::getVal($value, "unit", "px");
if($size === "")
return "";
$css = $this->processCSSSelectorReplaces($selectorValue, array(
self::SELECTOR_VALUE_PLACEHOLDER => $size . $unit,
"{{size}}" => $size,
"{{unit}}" => $unit,
));
return $css;
}
/**
* prepare css selector value css
*/
private function prepareCSSSelectorValueCSS($selectorValue, $value){
if($value === null || $value === "")
return "";
$css = $this->processCSSSelectorReplaces($selectorValue, array(self::SELECTOR_VALUE_PLACEHOLDER => $value));
return $css;
}
/**
* prepare css selector field css
*/
private function prepareCSSSelectorFieldCSS($selectorValue, $value){
if (is_array($value) === false)
return $this->prepareCSSSelectorValueCSS($selectorValue, $value);
if(array_key_exists("top", $value) === true
&& array_key_exists("right", $value) === true
&& array_key_exists("bottom", $value) === true
&& array_key_exists("left", $value) === true
&& array_key_exists("unit", $value) === true)
return $this->prepareCSSSelectorDimentionsCSS($selectorValue, $value);
if(array_key_exists("id", $value) === true
&& array_key_exists("url", $value) === true
&& array_key_exists("size", $value) === true)
return $this->prepareCSSSelectorImageCSS($selectorValue, $value);
if(array_key_exists("size", $value) === true
&& array_key_exists("unit", $value) === true)
return $this->prepareCSSSelectorSliderCSS($selectorValue, $value);
return "";
UniteFunctionsUC::throwError(__FUNCTION__ . " Error: Value processing is not implemented (" . json_encode($value) . ")");
}
/**
* prepare css selector fields style
*/
private function prepareCSSSelectorFieldsStyle($fields, $selector, $value){
$css = "";
foreach($fields as $fieldName => $selectorValue){
$fieldValue = UniteFunctionsUC::getVal($value, $fieldName);
$css .= $this->prepareCSSSelectorFieldCSS($selectorValue, $fieldValue);
}
return $this->prepareCSSSelectorStyle($selector, $css);
}
/**
* prepare css selector responsive fields style
*/
private function prepareCSSSelectorResponsiveFieldsStyle($fields, $selector, $value){
$style = "";
$responsive = array(
"desktop" => "",
"tablet" => "_tablet",
"mobile" => "_mobile",
);
foreach($responsive as $device => $suffix){
$css = "";
foreach($fields as $fieldName => $selectorValue){
$fieldValue = UniteFunctionsUC::getVal($value, $fieldName . $suffix);
$css .= $this->prepareCSSSelectorFieldCSS($selectorValue, $fieldValue);
}
$style .= $this->prepareCSSSelectorStyle($selector, $css, $device);
}
return $style;
}
/**
* prepare css selector style
*/
private function prepareCSSSelectorStyle($selector, $css, $device = "desktop"){
if(empty($css) === true)
return "";
$style = $selector . "{" . $css . "}";
switch($device){
case "tablet":
$style = HelperHtmlUC::wrapCssMobile($style, true);
break;
case "mobile":
$style = HelperHtmlUC::wrapCssMobile($style);
break;
}
return $style;
}
/**
* prepare css selector
*/
private function prepareCSSSelector($selector){
$wrapperId = $this->getWidgetWrapperID();
$selectors = explode(",", $selector);
$selectors = array_filter($selectors);
$selectors = array_unique($selectors);
foreach($selectors as $index => $selector){
$selectors[$index] = ".ue-widget-root." . $wrapperId . " " . trim($selector);
}
return implode(",", $selectors);
}
/**
* combine css selectors
*/
private function combineCSSSelectors($selectors){
$selectors = array_keys($selectors);
return implode(",", $selectors);
}
/**
* process css selector replaces
*/
private function processCSSSelectorReplaces($css, $replaces){
foreach($replaces as $placeholder => $replace){
$css = str_replace(strtolower($placeholder), $replace, $css);
$css = str_replace(strtoupper($placeholder), $replace, $css);
}
return $css;
}
/**
* prepare param css selectors
*/
private function prepareParamCSSSelectors($param){
$keys = array("selector", "selector1", "selector2", "selector3");
$selectors = array();
foreach($keys as $key){
$selector = UniteFunctionsUC::getVal($param, $key);
$selectorValue = UniteFunctionsUC::getVal($param, $key . "_value");
if(empty($selector) === true)
continue;
$selector = $this->prepareCSSSelector($selector);
$selectors[$selector] = $selectorValue;
}
return $selectors;
}
/**
* process params css selector
*/
private function processParamsCSSSelector($params, $paramsCats = array()){
$styles = '';
$displayCats = array();
foreach($paramsCats as $cat) {
$catID = UniteFunctionsUC::getVal($cat, "id");
if(empty($catID))
continue;
$displayCats[$catID] = UEParamsManager::isParamPassesConditions($params, $cat);
}
foreach($params as $param){
$passed = UEParamsManager::isParamPassesConditions($params, $param);
if($passed === false) {
continue;
}
// param's cat disabled
$catID = UniteFunctionsUC::getVal($param, GlobalsUC::ATTR_CATID);
$isDisplayCat = UniteFunctionsUC::getVal($displayCats, $catID);
$isDisplayCat == UniteFunctionsUC::strToBool($isDisplayCat);
if(!empty($catID) && $isDisplayCat == false) {
continue;
}
$style = $this->processParamCSSSelector($param);
if(empty($style) === false)
$styles .= $style;
}
return $styles;
}
/**
* process advanced tab css selectors
*/
public function getAdvancedTabCssSelectors() {
$styles = '';
$wrapperId = $this->getWidgetWrapperID();
$paramsTmp = $this->getAddonParams();
// Get default values for advanced parameters
$allParams = $this->addon->getParams();
$advancedDefaults = array();
foreach($allParams as $param) {
$paramName = UniteFunctionsUC::getVal($param, 'name');
// Only process advanced_ parameters
if (strpos($paramName, 'advanced_') === 0) {
$defaultValue = UniteFunctionsUC::getVal($param, 'default_value');
// Check if default value exists and is not empty
if ($defaultValue !== null && $defaultValue !== '' && $defaultValue !== false) {
// Only add if not already set by user
$currentValue = UniteFunctionsUC::getVal($paramsTmp, $paramName);
if ($currentValue === '' || $currentValue === null) {
$advancedDefaults[$paramName] = $defaultValue;
}
}
}
}
// Merge defaults with user-set values (user values take precedence)
if (!empty($advancedDefaults)) {
$paramsTmp = array_merge($advancedDefaults, $paramsTmp);
}
$advanced_styles = '';
// z-index
$zIndexVal = UniteFunctionsUC::getVal($paramsTmp, 'advanced_z_index');
if ($zIndexVal !== '' && $zIndexVal !== null) {
$zIndex = (int)$zIndexVal['size'];
$advanced_styles .= 'z-index: ' . $zIndex . '; ';
}
$sides = ['top', 'right', 'bottom', 'left'];
// padding
$padding = UniteFunctionsUC::getVal($paramsTmp, 'advanced_padding');
if (is_array($padding)) {
$unit = !empty($padding['unit']) ? $padding['unit'] : 'px';
if(!empty($padding['is_linked']) && $padding['is_linked'] && $padding['top'] !== '' && $padding['top'] !== null) {
$val = (string)$padding['top'];
if ($val !== '' && $val !== null && $val !== false) {
$val = trim((string)$val);
if ($val !== '') {
$advanced_styles .= 'padding: ' . $val . $unit . '; ';
}
}
} else {
foreach($sides as $side) {
$val = UniteFunctionsUC::getVal($padding, $side);
if ($val === '' || $val === null || $val === false) {
continue;
}
$val = trim((string)$val);
if ($val === '') {
continue;
}
$advanced_styles .= 'padding-' . $side . ': ' . $val . $unit . '; ';
}
}
}
// margin
$margin = UniteFunctionsUC::getVal($paramsTmp, 'advanced_margin');
if (is_array($margin)) {
if(!empty($margin['is_linked']) && $margin['is_linked'] && $margin['top'] !== '' && $margin['top'] !== null) {
$val = (string)$margin['top'];
if($val !== '' && $val !== null) {
$advanced_styles .= 'margin: ' . $val . $margin['unit'] . '; ';
}
} else {
foreach($sides as $side) {
$val = UniteFunctionsUC::getVal($margin, $side);
if($val !== '' && $val !== null && $val !== false) {
$advanced_styles .= 'margin-' . $side . ': ' . (string)$val . $margin['unit'] . '; ';
}
}
}
}
// background
$bgType = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_type');
if (!empty($bgType)) {
if ($bgType === 'solid') {
$bgColor = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_color');
if (empty($bgColor)) {
$bgColor = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_solid_color');
}
if (!empty($bgColor)) {
$advanced_styles .= 'background-color:' . $bgColor . '; ';
}
$bgImage = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_image');
if (empty($bgImage)) {
$bgImage = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_solid_image');
}
$bgUrl = '';
if (is_array($bgImage)) {
$attachment_id = UniteFunctionsUC::getVal($bgImage, 'id');
if ($attachment_id) {
$bgUrl = wp_get_attachment_url($attachment_id);
} else {
$bgUrl = UniteFunctionsUC::getVal($bgImage, 'url');
}
} elseif (is_string($bgImage)) {
$bgUrl = $bgImage;
}
if (!empty($bgUrl)) {
if (strpos($bgUrl, 'http') !== 0) {
$uploads = wp_upload_dir();
$bgUrl = rtrim($uploads['baseurl'], '/') . '/' . ltrim($bgUrl, '/');
}
}
if (!empty($bgUrl)) {
if (stripos($bgUrl, 'url(') === false) {
$advanced_styles .= "background-image:url('".$bgUrl."'); ";
} else {
$advanced_styles .= 'background-image:' . $bgUrl . '; ';
}
$bgRepeat = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_repeat');
if (empty($bgRepeat)) {
$bgRepeat = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_solid_image_repeat');
}
if (!empty($bgRepeat)) {
$advanced_styles .= 'background-repeat:' . $bgRepeat . '; ';
}
$bgPos = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_position');
if (empty($bgPos)) {
$bgPos = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_solid_image_position');
}
if (!empty($bgPos)) {
$advanced_styles .= 'background-position:' . $bgPos . '; ';
}
$bgSize = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_size');
if (empty($bgSize)) {
$bgSize = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_solid_image_size');
}
if (!empty($bgSize)) {
$advanced_styles .= 'background-size:' . $bgSize . '; ';
}
$bgAttach = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_attachment');
if (empty($bgAttach)) {
$bgAttach = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_solid_image_attachment');
}
if (!empty($bgAttach)) {
$advanced_styles .= 'background-attachment:' . $bgAttach . '; ';
}
}
} elseif ($bgType === 'gradient') {
$c1 = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_gradient1_color');
$c2 = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_gradient2_color');
$stop1Raw = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_gradient1_stop');
$stop2Raw = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_gradient2_stop');
$stop1 = '';
if (is_array($stop1Raw)) {
$s = UniteFunctionsUC::getVal($stop1Raw, 'size', '');
$u = UniteFunctionsUC::getVal($stop1Raw, 'unit', '%');
if ($s !== '' && $s !== null) $stop1 = trim($s) . (empty($u) ? '%' : $u);
} elseif (is_numeric($stop1Raw)) {
$stop1 = $stop1Raw . '%';
}
$stop2 = '';
if (is_array($stop2Raw)) {
$s = UniteFunctionsUC::getVal($stop2Raw, 'size', '');
$u = UniteFunctionsUC::getVal($stop2Raw, 'unit', '%');
if ($s !== '' && $s !== null) $stop2 = trim($s) . (empty($u) ? '%' : $u);
} elseif (is_numeric($stop2Raw)) {
$stop2 = $stop2Raw . '%';
}
$gType = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_gradient_type', 'linear');
$gType = strtolower(trim((string)$gType));
if ($gType !== 'radial') {
$gType = 'linear';
}
$angleRaw = UniteFunctionsUC::getVal($paramsTmp, 'advanced_background_gradient_angle');
$angle = 180;
if (is_array($angleRaw)) {
$sz = UniteFunctionsUC::getVal($angleRaw, 'size');
if ($sz !== '' && $sz !== null && is_numeric($sz)) {
$angle = (int)$sz;
}
} elseif ($angleRaw !== '' && $angleRaw !== null && is_numeric($angleRaw)) {
$angle = (int)$angleRaw;
}
$angle = $angle % 360;
if ($angle < 0) $angle += 360;
if (!empty($c1)) {
$advanced_styles .= 'background-color:' . $c1 . '; ';
}
if ($gType === 'linear') {
$parts = [];
$parts[] = $c1 . (!empty($stop1) ? ' ' . $stop1 : '');
$parts[] = $c2 . (!empty($stop2) ? ' ' . $stop2 : '');
$advanced_styles .= 'background-image: linear-gradient(' . $angle . 'deg, ' . implode(', ', $parts) . '); ';
} else {
$parts = [];
$parts[] = $c1 . (!empty($stop1) ? ' ' . $stop1 : '');
$parts[] = $c2 . (!empty($stop2) ? ' ' . $stop2 : '');
$advanced_styles .= 'background-image: radial-gradient(circle, ' . implode(', ', $parts) . '); ';
}
}
}
// border
$borderType = UniteFunctionsUC::getVal($paramsTmp, 'advanced_border_type');
$bw = UniteFunctionsUC::getVal($paramsTmp, 'advanced_border_width');
$bColor = UniteFunctionsUC::getVal($paramsTmp, 'advanced_border_color');
if (is_string($borderType)) {
$borderType = trim($borderType);
}
if (!empty($borderType) && $borderType !== 'none') {
if (empty($bColor)) {
$bColor = '#000';
}
if (is_array($bw) && !empty($bw['is_linked']) && $bw['is_linked'] && $bw['top'] !== '' && $bw['top'] !== null) {
$unit = !empty($bw['unit']) ? $bw['unit'] : 'px';
$w = (string)$bw['top'];
$advanced_styles .= 'border:' . $w . $unit . ' ' . $borderType . ' ' . $bColor . '; ';
} else {
$unit = 'px';
if (is_array($bw) && !empty($bw['unit'])) {
$unit = $bw['unit'];
}
$advanced_styles .= 'border-style:' . $borderType . '; border-color:' . $bColor . '; ';
if (is_array($bw)) {
foreach (array('top','right','bottom','left') as $side) {
$val = UniteFunctionsUC::getVal($bw, $side);
if ($val !== '' && $val !== null && $val !== false) {
$advanced_styles .= 'border-' . $side . '-width:' . (string)$val . $unit . '; ';
}
}
}
}
}
if($advanced_styles != '') {
$styles .= "\n." . $wrapperId . " {" . $advanced_styles . "}";
}
// -------------------- RESPONSIVE VISIBILITY --------------------
$hideDesktop = UniteFunctionsUC::getVal($paramsTmp, 'advanced_hide_on_desktop');
$hideTablet = UniteFunctionsUC::getVal($paramsTmp, 'advanced_hide_on_tablet');
$hideMobile = UniteFunctionsUC::getVal($paramsTmp, 'advanced_hide_on_mobile');
$isAdmin = function_exists('is_admin') && is_admin();
if ($isAdmin) {
if ((int)$hideDesktop) {
$styles .= "\n@media (min-width:1025px){ #{$wrapperId}{ opacity:.55; filter:blur(1px) grayscale(1); pointer-events:none; } }";
}
if ((int)$hideTablet) {
$styles .= "\n@media (min-width:768px) and (max-width:1024px){ #{$wrapperId}{ opacity:.55; filter:blur(1px) grayscale(1); pointer-events:none; } }";
}
if ((int)$hideMobile) {
$styles .= "\n@media (max-width:767px){ #{$wrapperId}{ opacity:.55; filter:blur(1px) grayscale(1); pointer-events:none; } }";
}
} else {
if ((int)$hideDesktop) {
$styles .= "\n@media (min-width:1025px){ #{$wrapperId}{ display:none !important; } }";
}
if ((int)$hideTablet) {
$styles .= "\n@media (min-width:768px) and (max-width:1024px){ #{$wrapperId}{ display:none !important; } }";
}
if ((int)$hideMobile) {
$styles .= "\n@media (max-width:767px){ #{$wrapperId}{ display:none !important; } }";
}
}
return $styles;
}
/**
* process param css selector
*/
private function processParamCSSSelector($param){
$selectors = $this->prepareParamCSSSelectors($param);
if(empty($selectors) === true)
return null;
$type = UniteFunctionsUC::getVal($param, "type");
switch($type){
case UniteCreatorDialogParam::PARAM_NUMBER:
$style = $this->processParamCSSSelector_number($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_BACKGROUND:
$style = $this->processParamCSSSelector_background($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_BORDER:
$style = $this->processParamCSSSelector_border($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_PADDING:
case UniteCreatorDialogParam::PARAM_MARGINS:
case UniteCreatorDialogParam::PARAM_BORDER_DIMENTIONS:
$style = $this->processParamCSSSelector_dimentions($param, $selectors, $type);
break;
case UniteCreatorDialogParam::PARAM_SLIDER:
$style = $this->processParamCSSSelector_slider($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_TYPOGRAPHY:
$style = $this->processParamCSSSelector_typography($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_TEXTSHADOW:
$style = $this->processParamCSSSelector_textShadow($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_TEXTSTROKE:
$style = $this->processParamCSSSelector_textStroke($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_BOXSHADOW:
$style = $this->processParamCSSSelector_boxShadow($param, $selectors);
break;
case UniteCreatorDialogParam::PARAM_CSS_FILTERS:
$style = $this->processParamCSSSelector_cssFilters($param, $selectors);
break;
default:
$style = $this->processParamCSSSelector_value($param, $selectors);
break;
}
return $style;
}
/**
* check what params has selectors in them, and include their css
*/
private function processPreviewParamsSelectors(){
$styles = "";
$mainParams = $this->addon->getParams();
$paramsCats = $this->addon->getParamsCats();
if(empty($mainParams) === false)
$styles .= $this->processParamsCSSSelector($mainParams, $paramsCats);
$styles .= $this->processItemsSelectors();
$styles .= $this->getAdvancedTabCssSelectors();
if(empty($styles) === true)
return null;
return $styles;
}
private function getProcessedItemsData() {
if(empty($this->processedItemsData)) {
$this->processedItemsData = $this->addon->getProcessedItemsData($this->processType);
}
return $this->processedItemsData;
}
/**
* process items selectors
*/
private function processItemsSelectors(){
$styles = "";
$items = $this->addon->getArrItemsNonProcessed();
$itemsProcessed = $this->getProcessedItemsData();
$params = $this->addon->getProcessedItemsParams();
// $styles = '/* =[8] ' . json_encode($items) . ' =[9] */';
if (empty($items) === true || empty($params) === true)
return $styles;
foreach($items as $k => $item){
$itemData = $itemsProcessed[$k]['item'];
$itemId = UniteFunctionsUC::getVal($itemData, "_generated_id");
$itemParams = array();
foreach($params as $param){
$paramName = UniteFunctionsUC::getVal($param, "name");
$itemValue = UniteFunctionsUC::getVal($item, $paramName);
$itemParams[] = array_merge($param, array("value" => $itemValue));
}
$itemStyles = $this->processParamsCSSSelector($itemParams);
$itemStyles = $this->processCSSSelectorReplaces($itemStyles, array("{{current_item}}" => ".elementor-repeater-item-" . $itemId));
$styles .= $itemStyles;
}
return $styles;
}
/**
* get selectors css
*/
public function getSelectorsCss(){
$style = $this->processPreviewParamsSelectors();
return $style;
}
/**
* get addon preview html
*/
public function getPreviewHtml(){
$this->validateInited();
$outputs = "";
$title = $this->addon->getTitle();
$title .= " ". esc_html__("Preview","unlimited-elements-for-elementor");
$title = htmlspecialchars($title);
//get libraries, but not process provider
$htmlBody = $this->getHtmlBody(false);
$arrIncludes = $this->getProcessedIncludes(true, false);
$arrIncludes = $this->modifyPreviewIncludes($arrIncludes);
$htmlInlcudesCss = $this->getHtmlIncludes($arrIncludes,"css");
$htmlInlcudesJS = $this->getHtmlIncludes($arrIncludes,"js");
//process selectors only for preview (elementor output uses its own processing)
$this->processPreviewParamsSelectors();
$arrCssCustomStyles = UniteProviderFunctionsUC::getCustomStyles();
$htmlCustomCssStyles = HelperHtmlUC::getHtmlCustomStyles($arrCssCustomStyles);
$arrJsCustomScripts = UniteProviderFunctionsUC::getCustomScripts();
$htmlJSScripts = HelperHtmlUC::getHtmlCustomScripts($arrJsCustomScripts);
$options = $this->addon->getOptions();
$bgCol = $this->addon->getOption("preview_bgcol");
$previewSize = $this->addon->getOption("preview_size");
$previewWidth = "100%";
switch($previewSize){
case "column":
$previewWidth = "300px";
break;
case "custom":
$previewWidth = $this->addon->getOption("preview_custom_width");
if(!empty($previewWidth)){
$previewWidth = (int)$previewWidth;
$previewWidth .= "px";
}
break;
}
$style = "";
$style .= "max-width:{$previewWidth};";
$style .= "background-color:{$bgCol};";
$urlPreviewCss = GlobalsUC::$urlPlugin."css/unitecreator_preview.css";
$html = "";
$htmlHead = "";
$htmlHead = "<!DOCTYPE html>".self::BR;
$htmlHead .= "<html>".self::BR;
//output head
$htmlHead .= self::TAB."<head>".self::BR;
$html .= $htmlHead;
//get head html
$htmlHead .= self::TAB2."<title>{$title}</title>".self::BR;
// phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet
$htmlHead .= self::TAB2."<link rel='stylesheet' href='{$urlPreviewCss}' type='text/css'>".self::BR;
$htmlHead .= $htmlInlcudesCss;
if(!empty($htmlCustomCssStyles))
$htmlHead .= self::BR.$htmlCustomCssStyles;
$html .= $htmlHead;
$output["head"] = $htmlHead;
$htmlAfterHead = "";
$htmlAfterHead .= self::TAB."</head>".self::BR;
//output body
$htmlAfterHead .= self::TAB."<body>".self::BR;
$htmlAfterHead .= self::BR.self::TAB2."<div class='uc-preview-wrapper' style='{$style}'>";
$htmlAfterHead .= self::BR.$htmlBody;
$htmlAfterHead .= self::BR.self::TAB2."</div>";
$html .= $htmlAfterHead;
$output["after_head"] = $htmlAfterHead;
$htmlEnd = "";
$htmlEnd .= $htmlInlcudesJS.self::BR;
$htmlEnd .= $htmlJSScripts.self::BR;
$htmlEnd .= self::BR.self::TAB."</body>".self::BR;
$htmlEnd .= "</html>";
$html .= $htmlEnd;
$output["end"] = $htmlEnd;
$output["full_html"] = $html;
return($output);
}
/**
* put html preview
*/
public function putPreviewHtml(){
$output = $this->getPreviewHtml();
uelm_echo($output["head"]);
//$this->putPreviewHtml_headerAdd();
uelm_echo($output["after_head"]);
$this->putPreviewHtml_footerAdd();
uelm_echo($output["end"]);
}
private function a________DYNAMIC___________(){}
/**
* init dynamic params
*/
protected function initDynamicParams(){
$isDynamicAddon = UniteFunctionsUC::getVal($this->arrOptions, "dynamic_addon");
$isDynamicAddon = UniteFunctionsUC::strToBool($isDynamicAddon);
if($isDynamicAddon == false)
return(false);
$postID = $this->getDynamicPostID();
if(!empty($postID)){
$arrPostAdditions = HelperProviderUC::getPostAdditionsArray_fromAddonOptions($this->arrOptions);
$this->addPostParamToAddon($postID, $arrPostAdditions);
}
}
/**
* get post ID
*/
protected function getDynamicPostID(){
$postID = "";
//get post from preview
if($this->isModePreview){
$postID = UniteFunctionsUC::getVal($this->arrOptions, "dynamic_post");
return($postID);
}
//if not preview get the current post
$post = get_post();
if(!empty($post))
$postID = $post->ID;
return($postID);
}
/**
* add post param to addon
*/
private function addPostParamToAddon($postID, $arrPostAdditions){
$arrParam = array();
$arrParam["type"] = UniteCreatorDialogParam::PARAM_POST;
$arrParam["name"] = "current_post";
$arrParam["default_value"] = $postID;
$arrParam["post_additions"] = $arrPostAdditions;
$this->addon->addParam($arrParam);
}
private function ___________DEBUG_DATA___________(){}
/**
* check and output debug if needed
*/
public function checkOutputDebug($objAddon = null){
if(empty($objAddon))
$objAddon = $this->addon;
$arrValues = $objAddon->getOriginalValues();
if(empty($arrValues))
return(false);
$isShowData = UniteFunctionsUC::getVal($arrValues, "show_widget_debug_data");
$isShowData = UniteFunctionsUC::strToBool($isShowData);
if($isShowData == false)
return(false);
$dataType = UniteFunctionsUC::getVal($arrValues, "widget_debug_data_type");
$this->showDebugData($isShowData, $dataType, $arrValues);
}
/**
* set to show debug data of the addon
*/
public function showDebugData($isShow = true, $dataType = null, $arrValues = null){
$this->isShowDebugData = $isShow;
$this->debugDataType = $dataType;
$this->valuesForDebug = $arrValues;
}
/**
* get debug html
*/
public function getHtmlDebug(){
return($this->htmlDebug);
}
/**
* put debug data html
*/
private function putDebugDataHtml_default($arrData, $arrItemData){
$isShowData = $this->debugDataType != "items_only";
$html = "";
if($isShowData == true){
//modify the data
$arrData = UniteFunctionsUC::modifyDataArrayForShow($arrData);
$html .= dmpGet($arrData);
}
//show settings values
if($this->debugDataType == "settings_values"){
$html .= dmpGet("<b>----------- Settings Values -----------</b>");
$html .= dmpGet($this->valuesForDebug);
}
$html .= dmpGet("<b>Widget Items Data</b>");
if(empty($arrItemData)){
$html .= dmpGet("no items found");
return($html);
}
$arrItemData = $this->modifyItemsDataForShow($arrItemData);
$html .= dmpGet($arrItemData);
return($html);
}
/**
* modify debug array - output for debug, fordebug
*/
private function modifyDebugArray($arrDebug){
if(is_array($arrDebug) == false)
$arrDebug = (array)$arrDebug;
if(empty($arrDebug))
return($arrDebug);
$output = array();
foreach($arrDebug as $key => $value){
if(is_array($value) && count($value) == 1)
$value = $value[0];
if(is_string($value) == false)
continue;
$value = htmlspecialchars($value);
if(strlen($value) > 200)
$value = substr($value, 0, 200)."...";
$key = " ".$key;
$output[$key] = $value;
}
return($output);
}
/**
* put debug data - current post
*/
private function putDebugDataHTML_currentPostData(){
$post = get_post();
if(empty($post)){
$html = "no current post found";
return($html);
}
$arrPost = $this->modifyDebugArray($post);
$html = dmpGet("<b> ------- Post ------- </b>");
$html .= dmpGet($arrPost);
dmp("<b> ------- Post Meta ------- </b>");
$meta = get_post_meta($post->ID);
$meta = $this->modifyDebugArray($meta);
$html .= dmpGet($meta);
$html .= dmpGet("<b> ----------Terms--------- </b>");
$terms = UniteFunctionsWPUC::getPostTermsTitlesString($post, true);
$html .= dmpGet($terms);
return($html);
}
/**
* put debug data - posts
*/
private function putDebugDataHtml_posts($arrItemData){
$numPosts = count($arrItemData);
$html = "";
$html .= dmpGet("Found $numPosts posts.");
if(empty($arrItemData))
return($html);
$isShowMeta = ($this->debugDataType == "post_meta");
foreach($arrItemData as $index => $item){
$isPost = false;
if($item instanceof WP_Post)
$isPost = true;
//check the multisource type
if($isPost == false){
$itemTest = UniteFunctionsUC::getVal($item, "item");
$objectType = UniteFunctionsUC::getVal($itemTest, "object_type");
$objectID = UniteFunctionsUC::getVal($itemTest, "object_id");
if(!empty($objectID) && $objectType === "posts"){
$item = get_post($objectID);
$isPost = true;
}
}
if($isPost == false){
$item = UniteFunctionsUC::getVal($item, "item");
$postData = UniteFunctionsUC::getArrFirstValue($item);
$title = UniteFunctionsUC::getVal($postData, "title");
$alias = UniteFunctionsUC::getVal($postData, "alias");
$id = UniteFunctionsUC::getVal($postData, "id");
$post = get_post($id);
}else{
$post = $item;
$title = $post->post_title;
$id = $post->ID;
$alias = $post->post_name;
}
$num = $index+1;
$status = $post->post_status;
$menuOrder = $post->menu_order;
$arrTermsNames = UniteFunctionsWPUC::getPostTermsTitles($post, true);
$strTerms = implode(",", $arrTermsNames);
$htmlAfterAlias = "";
if($status != "publish")
$htmlAfterAlias = ", [$status post]";
$text = "{$num}. <b>$title</b> (<i style='font-size:13px;'>$alias{$htmlAfterAlias}, $id | $strTerms </i>), menu order: $menuOrder";
$html .= dmpGet($text);
if($isShowMeta == false)
continue;
$html .= ("<b> ------- Post Meta ------- </b>");
$postMeta = get_post_meta($id, "", false);
$postMeta = $this->modifyDebugArray($postMeta);
$html .= dmpGet($postMeta);
$html .= ("<b> ------- Post Terms ------- </b>");
$terms = UniteFunctionsWPUC::getPostTermsTitlesString($post, true);
$html .= dmpGet($terms);
}
return($html);
}
/**
* get items from listing
*/
private function putDebugDataHtml_getItemsFromListing($paramListing, $arrData){
$name = UniteFunctionsUC::getVal($paramListing, "name");
$source = UniteFunctionsUC::getVal($arrData, $name."_source");
$arrItemsRaw = UniteFunctionsUC::getVal($arrData, $name."_items");
if(empty($arrItemsRaw))
$arrItemsRaw = array();
$useFor = UniteFunctionsUC::getVal($paramListing, "use_for");
$useForGallery = ($useFor == "gallery");
$arrItems = array();
foreach($arrItemsRaw as $item){
if($useForGallery == true && isset($item["postid"])){
$post = get_post($item["postid"]);
$arrItems[] = $post;
continue;
}
$object = UniteFunctionsUC::getVal($item, "object");
$arrItems[] = $object;
}
return($arrItems);
}
/**
* put debug data
*/
private function putDebugDataHtml($arrData, $arrItemData){
$html = "<div class='uc-debug-output' style='font-size:16px;color:black;text-decoration:none;background-color:white;padding:3px;'>";
$html .= dmpGet("<b>Widget Debug Data</b> (turned on by setting in widget advanced section)<br>",true);
//get data from listing
$paramListing = $this->addon->getListingParamForOutput();
if(!empty($paramListing) && $this->itemsType == "template"){
$arrItemData = $this->putDebugDataHtml_getItemsFromListing($paramListing, $arrData);
}
switch($this->debugDataType){
case "post_titles":
case "post_meta":
$html .= $this->putDebugDataHtml_posts($arrItemData);
break;
case "current_post_data":
$html .= $this->putDebugDataHTML_currentPostData();
break;
default:
$html .= $this->putDebugDataHtml_default($arrData, $arrItemData);
break;
}
$html .= "</div>";
$this->htmlDebug = $html;
}
private function a________GUTENBERG_BACKGROUND_AND_ADDITIONS___________(){}
/**
* modify js for gutenberg background output
*/
private function modifyGutenbergBGJS($js){
$ucID = $this->generatedID;
$js = "
jQuery(document).ready(function(){ \n
jQuery(\"#{$ucID}-root\").parent().css({\"position\":\"relative\"});
jQuery(\"#{$ucID}-root\").addClass(\"uc-background-active\");
$js
}) //onready wrapper;
";
return($js);
}
/**
* modify css for gutenberg output
*/
private function modifyGutenbergBGCSS($css){
$ucID = $this->generatedID;
$isInsideEditor = $this->isInsideEditor();
//back css
if($isInsideEditor == true){
$css = ".{$ucID}-root .uc-background-editor-placeholder{
font-size:12px;
padding:20px;
color:black;
}
.{$ucID}-root{
position:relative;
border:1px solid gray;
background-color:lightgray;
}
$css";
return($css);
}
//front css
$arrValues = $this->addon->getOriginalValues();
$backgroundLocation = UniteFunctionsUC::getVal($arrValues, "background_location");
$zIndex = -1;
if($backgroundLocation == "front")
$zIndex = 999;
$css = "
/* background wrapper */
.{$ucID}-root.uc-background-active{
position: absolute;
top:0px;
left:0px;
height:100%;
width:100%;
z-index:{$zIndex} !important;
}
$css
";
return($css);
}
/**
* modify gutenberg bg html
*/
private function modifyGutenbergBGHTML(){
$html = "";
$isInsideEditor = $this->isInsideEditor();
if($isInsideEditor == false)
return($html);
$addonTitle = $this->addon->getTitle();
$addonTitle = esc_html($addonTitle);
$text = __("Background Placeholder for ","unlimited-elements-for-elementor");
$text2 = __("Will cover the parent block in front end.","unlimited-elements-for-elementor");
$html .= "<div class='uc-background-editor-placeholder'>{$text} <b>{$addonTitle}</b>. $text2</div>";
return($html);
}
/**
* add gutenberg global css
*/
private function addGutenbergGlobalCss($css){
if(self::$isGutenbergGlobalCssAdded == true)
return($css);
self::$isGutenbergGlobalCssAdded = true;
$css .= "/* Gutenberg Global */\n";
$css .= ".ue-widget-root {position:relative;}";
$css .= 'html .wp-block:has(.ue-widget-root) {margin-top: 0; margin-bottom:0;}';
return($css);
}
private function a________GENERAL___________(){}
/**
* modify items data for show
*/
private function modifyItemsDataForShow($arrItemData){
if(is_array($arrItemData) == false)
return(null);
$arrItemsForShow = array();
foreach($arrItemData as $item){
if(is_array($item) == false){
$arrItemsForShow[] = $item;
continue;
}
$item = UniteFunctionsUC::getVal($item, "item");
$itemFirstValue = UniteFunctionsUC::getArrFirstValue($item);
if(is_array($itemFirstValue))
$item = UniteFunctionsUC::modifyDataArrayForShow($itemFirstValue);
else
$item = UniteFunctionsUC::modifyDataArrayForShow($item);
$arrItemsForShow[] = $item;
}
return($arrItemsForShow);
}
/**
* process html before output, function for override
*/
protected function processHtml($html){
return($html);
}
/**
* get only processed html template
*/
public function getProcessedHtmlTemplate(){
$html = $this->objTemplate->getRenderedHtml(self::TEMPLATE_HTML);
$html = $this->processHtml($html);
return($html);
}
/**
* get items html
*/
public function getHtmlItems(){
$keyTemplate = "uc_template_items_special";
$htmlTemplate = "{{put_items()}}";
$keyTemplate2 = "uc_template_items_special2";
$htmlTemplate2 = "{{put_items2()}}";
$this->objTemplate->addTemplate($keyTemplate, $htmlTemplate, false);
$this->objTemplate->addTemplate($keyTemplate2, $htmlTemplate2, false);
$html = $this->objTemplate->getRenderedHtml($keyTemplate);
$html2 = $this->objTemplate->getRenderedHtml($keyTemplate2);
$html = $this->processHtml($html);
$html2 = $this->processHtml($html2);
$output = array();
$output["html_items1"] = $html;
$output["html_items2"] = $html2;
return($output);
}
/**
* get only html template output, no css and no js
*/
public function getHtmlOnly(){
$this->validateInited();
$html = $this->objTemplate->getRenderedHtml(self::TEMPLATE_HTML);
$html = $this->processHtml($html);
return($html);
}
/**
* get script handle with serial
*/
private function getScriptHandle($handle){
if(isset(self::$arrScriptsHandles[$handle]) == false){
self::$arrScriptsHandles[$handle] = true;
return($handle);
}
$counter = 2;
do{
$outputHandle = $handle.$counter;
$isExists = isset(self::$arrScriptsHandles[$outputHandle]);
$counter++;
}while($isExists);
self::$arrScriptsHandles[$outputHandle] = true;
return($outputHandle);
}
/**
* place output by shortcode
*/
public function getHtmlBody($scriptHardCoded = true, $putCssIncludes = false, $putCssInline = true, $params = null){
$this->validateInited();
//render the js inside "template" tag always if available
if(GlobalsProviderUC::$renderJSForHiddenContent == true)
$scriptHardCoded = true;
$title = $this->addon->getTitle(true);
$isOutputComments = HelperProviderCoreUC_EL::getGeneralSetting("output_wrapping_comments");
$isOutputComments = UniteFunctionsUC::strToBool($isOutputComments);
try{
$html = $this->objTemplate->getRenderedHtml(self::TEMPLATE_HTML);
$html = $this->processHtml($html);
if(!empty($this->htmlDebug))
$html = $this->htmlDebug . $html;
//make css
$css = $this->objTemplate->getRenderedHtml(self::TEMPLATE_CSS);
$js = $this->objTemplate->getRenderedHtml(self::TEMPLATE_JS);
$arrData = $this->getConstantData();
//gutenberg styles
if($this->isGutenberg == true)
$css = $this->addGutenbergGlobalCss($css);
if($this->isGutenbergBackground){
$params["wrap_js_timeout"] = false;
$js = $this->modifyGutenbergBGJS($js);
$css = $this->modifyGutenbergBGCSS($css);
}
//fetch selectors (add google font includes on the way)
$isAddSelectors = UniteFunctionsUC::getVal($params, "add_selectors_css");
$isAddSelectors = UniteFunctionsUC::strToBool($isAddSelectors);
$cssSelectors = "";
if($isAddSelectors === true)
$cssSelectors = $this->getSelectorsCss();
//get css includes if needed
$arrCssIncludes = array();
if($putCssIncludes == true)
$arrCssIncludes = $this->getProcessedIncludes(true, true, "css");
if($isOutputComments == true)
$output = "\n<!-- start {$title} -->";
else
$output = "\n";
//add css includes if needed
if(!empty($arrCssIncludes)){
$htmlIncludes = $this->getHtmlIncludes($arrCssIncludes);
if(self::$isBufferingCssActive == true)
self::$bufferCssIncludes .= self::BR . $htmlIncludes;
else
$output .= "\n" . $htmlIncludes;
}
//add css
if(!empty($css)){
$widgetText = GlobalsProviderUC::$widgetText;
$css = "/* {$widgetText}: $title */" . self::BR2 . $css . self::BR2;
if(self::$isBufferingCssActive == true){
//add css to buffer
if(!empty(self::$bufferBodyCss))
self::$bufferBodyCss .= self::BR2;
self::$bufferBodyCss .= $css;
}else{
if($putCssInline == true)
$output .= "\n<style>$css</style>";
else
HelperUC::putInlineStyle($css);
}
}
//add css selectors
if($isAddSelectors == true){
$selectorsStyleID = "selectors_css_" . $this->generatedID;
$output .= "\n<style id=\"$selectorsStyleID\" name=\"uc_selectors_css\">$cssSelectors</style>";
}
//add html
$addWrapper = false;
if(GlobalsProviderUC::$renderPlatform == GlobalsProviderUC::RENDER_PLATFORM_GUTENBERG)
$addWrapper = true;
if($isAddSelectors == true)
$addWrapper = true;
if($addWrapper == true){
$id = $this->getWidgetWrapperID();
$rootId = UniteFunctionsUC::getVal($params, "root_id");
if(empty($rootId) === true)
$rootId = $this->getWidgetID();
$currentHideDebug = GlobalsUC::$hideDebug;
GlobalsUC::$hideDebug = true;
$params = $this->addon->getProcessedMainParamsValues($this->processType);
GlobalsUC::$hideDebug = $currentHideDebug;
$advancedAddClasses = UniteFunctionsUC::getVal($params, "advanced_css_classes");
$output .= "\n<div id=\"" . esc_attr($id) . "\" class=\"ue-widget-root " . esc_attr($advancedAddClasses) . " " . esc_attr($id) . "\" data-id=\"" . esc_attr($rootId) . "\">";
}
$output .= "\n\n" . $html;
if($isAddSelectors == true)
$output .= "\n</div>";
//add background placeholder after the wrapper
if($this->isGutenbergBackground)
$output .= $this->modifyGutenbergBGHTML();
//add js
$isOutputJs = false;
if(!empty($js))
$isOutputJs = true;
if(isset($params["wrap_js_start"]) || isset($params["wrap_js_timeout"]))
$isOutputJs = true;
//output js
if($isOutputJs == true){
$isJSAsModule = $this->addon->getOption("js_as_module");
$isJSAsModule = UniteFunctionsUC::strToBool($isJSAsModule);
$title = $this->addon->getTitle();
$js = "\n/* $title scripts: */ \n\n" . $js;
$addonName = $this->addon->getAlias();
$handle = $this->getScriptHandle("ue_script_" . $addonName);
if($scriptHardCoded == false){
UniteProviderFunctionsUC::printCustomScript($js, false, $isJSAsModule, $handle);
}else{
$wrapInTimeout = UniteFunctionsUC::getVal($params, "wrap_js_timeout");
$wrapInTimeout = UniteFunctionsUC::strToBool($wrapInTimeout);
$wrapStart = UniteFunctionsUC::getVal($params, "wrap_js_start");
$wrapEnd = UniteFunctionsUC::getVal($params, "wrap_js_end");
$jsType = "text/javascript";
if($isJSAsModule == true)
$jsType = "module";
$htmlHandle = "";
if($wrapInTimeout == false) //add id's in front
$htmlHandle = " id=\"{$handle}\"";
$output .= "\n<script type=\"$jsType\" $htmlHandle>";
if(!empty($wrapStart))
$output .= "\n" . $wrapStart;
if($wrapInTimeout == true)
$output .= "\nsetTimeout(function(){";
$output .= "\n" . $js;
if($wrapInTimeout == true)
$output .= "\n},300);";
if(!empty($wrapEnd))
$output .= "\n" . $wrapEnd;
$output .= "\n</script>";
}
}
if($isOutputComments == true)
$output .= "\n<!-- end {$title} -->";
}catch(Exception $e){
$message = "Widget \"$title\" Error: " . $e->getMessage();
if(GlobalsUC::$SHOW_TRACE === true){
dmp($message);
UniteFunctionsUC::throwError($e);
}
UniteFunctionsUC::throwError($message);
}
return $output;
}
/**
* get addon uc_id
*/
public function getWidgetID(){
$data = $this->getConstantData();
$widgetID = UniteFunctionsUC::getVal($data, "uc_id");
return($widgetID);
}
/**
* get widget wrapper id
*/
private function getWidgetWrapperID(){
$params = $this->getAddonParams();
$cssId = UniteFunctionsUC::getVal($params, 'advanced_css_id');
if (!empty($cssId)) {
$cssId = preg_replace('/[^A-Za-z0-9\-_]/', '-', $cssId);
if (!empty($cssId)) return $cssId;
}
$rootId = UniteFunctionsUC::getVal($params, '_rootId');
if (!empty($rootId)) return $rootId;
return $this->getWidgetID() . "-root";
}
/**
* get if inside editor or not
*/
private function isInsideEditor(){
$data = $this->getConstantData();
$insideEditor = UniteFunctionsUC::getVal($data, "uc_inside_editor");
if($insideEditor == "yes")
return(true);
return(false);
}
/**
* get addon contstant data that will be used in the template
*/
public function getConstantData(){
$this->validateInited();
if(!empty($this->cacheConstants))
return($this->cacheConstants);
$data = array();
$prefix = "ucid";
if($this->isInited)
$prefix = "uc_".$this->addon->getName();
//add serial number:
self::$serial++;
//set output widget id
$generatedSerial = self::$serial.UniteFunctionsUC::getRandomString(4, true);
if(!empty($this->systemOutputID))
$generatedID = $prefix."_".$this->systemOutputID;
else
$generatedID = $prefix.$generatedSerial;
//protection in listings
if(isset(self::$arrGeneratedIDs[$generatedID]))
$generatedID .= self::$serial;
//double protection
if(isset(self::$arrGeneratedIDs[$generatedID]))
$generatedID .= $generatedSerial;
self::$arrGeneratedIDs[$generatedID] = true;
$this->generatedID = $generatedID;
$data["uc_serial"] = $generatedSerial;
$data["uc_id"] = $this->generatedID;
//add assets url
$urlAssets = $this->addon->getUrlAssets();
if(!empty($urlAssets))
$data["uc_assets_url"] = $urlAssets;
//set if it's for editor
$isInsideEditor = false;
if($this->processType == UniteCreatorParamsProcessor::PROCESS_TYPE_OUTPUT_BACK)
$isInsideEditor = true;
//$data["is_inside_editor"] = $isInsideEditor;
$data = UniteProviderFunctionsUC::addSystemConstantData($data);
$data = UniteProviderFunctionsUC::applyFilters(UniteCreatorFilters::FILTER_ADD_ADDON_OUTPUT_CONSTANT_DATA, $data);
$this->cacheConstants = $data;
return($data);
}
/**
* get item extra variables
*/
public function getItemConstantDataKeys(){
$arrKeys = array(
"item_id",
"item_index",
"item_repeater_class",
);
return($arrKeys);
}
/**
* get constant data keys
*/
public function getConstantDataKeys($filterPlatformKeys = false){
$constantData = $this->getConstantData();
if($filterPlatformKeys == true){
unset($constantData["uc_platform"]);
unset($constantData["uc_platform_title"]);
}
$arrKeys = array_keys($constantData);
return($arrKeys);
}
/**
* get addon params
*/
private function getAddonParams(){
if(!empty($this->paramsCache)) {
return($this->paramsCache);
}
$this->paramsCache = $this->addon->getProcessedMainParamsValues($this->processType, true);
$allParamDefs = $this->addon->getParams();
return($this->paramsCache);
}
/**
* modify items data, add "item" to array
*/
protected function normalizeItemsData($arrItems, $extraKey=null, $addObjectID = false){
if(empty($arrItems))
return(array());
foreach($arrItems as $key=>$item){
if(!empty($extraKey)){
$arrAdd = array($extraKey=>$item);
//add object id
if($addObjectID === true){
$objectID = UniteFunctionsUC::getVal($item, "id");
if(!empty($objectID))
$arrAdd["object_id"] = $objectID;
$postType = UniteFunctionsUC::getVal($item, "post_type");
if(!empty($postType))
$arrAdd["object_type"] = $postType;
}
}
else
$arrAdd = $item;
$arrItems[$key] = array("item"=>$arrAdd);
}
return($arrItems);
}
/**
* get special items - instagram
*/
private function getItemsSpecial_Instagram($arrData){
$paramInstagram = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_INSTAGRAM);
$instaName = UniteFunctionsUC::getVal($paramInstagram, "name");
$dataInsta = $arrData[$instaName];
$instaMain = UniteFunctionsUC::getVal($dataInsta, "main");
$instaItems = UniteFunctionsUC::getVal($dataInsta, "items");
$error = UniteFunctionsUC::getVal($dataInsta, "error");
if(empty($instaMain))
$instaMain = array();
$instaMain["hasitems"] = !empty($instaItems);
if(!empty($error))
$instaMain["error"] = $error;
$arrItemData = $this->normalizeItemsData($instaItems, $instaName);
$arrData[$instaName] = $instaMain;
$output = array();
$output["main"] = $arrData;
$output["items"] = $arrItemData;
return($output);
}
/**
* get params for modify
*/
private function modifyTemplatesForOutput_getParamsForModify(){
$arrParams = $this->addon->getParams();
$arrParamsForModify = array();
foreach($arrParams as $param){
$type = UniteFunctionsUC::getVal($param, "type");
if($type != UniteCreatorDialogParam::PARAM_SPECIAL)
continue;
$attributeType = UniteFunctionsUC::getVal($param, "attribute_type");
switch($attributeType){
case "schema":
case "entrance_animation":
$param["modify_type"] = $attributeType;
$arrParamsForModify[] = $param;
break;
}
}
return($arrParamsForModify);
}
/**
* modify template for output, add some code according the params
*/
private function modifyTemplatesForOutput($html, $css, $js){
$isModify = false;
$arrParams = $this->modifyTemplatesForOutput_getParamsForModify();
$arrValues = $this->addon->getOriginalValues();
$enableSchema = UniteFunctionsUC::getVal($arrValues, "ue_schema_enable");
$enableSchema = UniteFunctionsUC::strToBool($enableSchema);
//add schema function
if($enableSchema == true){
$html .= "{{ucfunc(\"put_schema_items_json_global\")}}\n\n";
$isModify = true;
}
if(empty($arrParams))
$arrParams = array();
foreach($arrParams as $param){
$name = UniteFunctionsUC::getVal($param, "name");
$type = UniteFunctionsUC::getVal($param, "modify_type");
switch($type){
case "entrance_animation":
$css = "{{ucfunc(\"put_entrance_animation_css\",\"{$name}\")}}\n\n".$css;
$js = "{{ucfunc(\"put_entrance_animation_js\",\"{$name}\")}}\n\n".$js;
$isModify = true;
break;
case "schema":
$html .= "{{ucfunc(\"put_schema_items_json_byparam\",\"{$name}\")}}\n\n";
$isModify = true;
break;
}
}
if($isModify == false)
return(null);
$output = array();
$output["html"] = $html;
$output["css"] = $css;
$output["js"] = $js;
return($output);
}
/**
* init the template
*/
private function initTemplate(){
$this->validateInited();
//set params
$arrData = $this->getConstantData();
$arrParams = $this->getAddonParams();
$arrData = array_merge($arrData, $arrParams);
//set templates
$html = $this->addon->getHtml();
$css = $this->addon->getCss();
//set item css call
$cssItem = $this->addon->getCssItem();
$cssItem = trim($cssItem);
if(!empty($cssItem))
$css .= "\n{{put_css_items()}}";
$js = $this->addon->getJs();
$arrModify = $this->modifyTemplatesForOutput($html, $css, $js);
if(!empty($arrModify)){
$html = $arrModify["html"];
$css = $arrModify["css"];
$js = $arrModify["js"];
}
$this->objTemplate->setAddon($this->addon);
$this->objTemplate->addTemplate(self::TEMPLATE_CSS_ITEM, $cssItem);
$this->objTemplate->addTemplate(self::TEMPLATE_HTML, $html);
$this->objTemplate->addTemplate(self::TEMPLATE_CSS, $css);
$this->objTemplate->addTemplate(self::TEMPLATE_JS, $js);
//add custom templates
$arrCustomTemplates = array();
$arrCustomTemplates = apply_filters("ue_get_twig_templates", $arrCustomTemplates);
if(!empty($arrCustomTemplates)){
foreach($arrCustomTemplates as $templateName => $templateValue){
$this->objTemplate->addTemplate($templateName, $templateValue);
}
}
$arrItemData = null;
$paramPostsList = null;
$itemsSource = null; //from what object the items came from
//set items template
if($this->isItemsExists === false){
$this->objTemplate->setParams($arrData);
}else{
if($this->processType == UniteCreatorParamsProcessor::PROCESS_TYPE_CONFIG)
$arrItemData = array();
else
switch($this->itemsType){
case "instagram":
$response = $this->getItemsSpecial_Instagram($arrData);
$arrData = $response["main"];
$arrItemData = $response["items"];
break;
case "post": //move posts data from main to items
$paramPostsList = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_POSTS_LIST);
if(empty($paramPostsList))
UniteFunctionsUC::throwError("Some posts list param should be found");
$postsListName = UniteFunctionsUC::getVal($paramPostsList, "name");
$arrItemData = $this->normalizeItemsData($arrData[$postsListName], $postsListName, true);
//set main param (true/false)
$arrData[$postsListName] = !empty($arrItemData);
$itemsSource = "posts";
break;
case UniteCreatorAddon::ITEMS_TYPE_DATASET:
$paramDataset = $this->addon->getParamByType(UniteCreatorDialogParam::PARAM_DATASET);
if(empty($paramDataset))
UniteFunctionsUC::throwError("Dataset param not found");
$datasetType = UniteFunctionsUC::getVal($paramDataset, "dataset_type");
$datasetQuery = UniteFunctionsUC::getVal($paramDataset, "dataset_{$datasetType}_query");
$arrRecords = array();
$arrItemData = UniteProviderFunctionsUC::applyFilters(UniteCreatorFilters::FILTER_GET_DATASET_RECORDS, $arrRecords, $datasetType, $datasetQuery);
if(!empty($arrItemData)){
$paramName = $paramDataset["name"];
$arrItemData = $this->normalizeItemsData($arrItemData, $paramName);
}
break;
case "listing":
$paramListing = $this->addon->getListingParamForOutput();
if(empty($paramListing))
UniteFunctionsUC::throwError("Some listing param should be found");
$paramName = UniteFunctionsUC::getVal($paramListing, "name");
$arrItemData = UniteFunctionsUC::getVal($arrData, $paramName . "_items");
if(empty($arrItemData))
$arrItemData = array();
else
$arrItemData = $this->normalizeItemsData($arrItemData, $paramName);
break;
case "multisource":
$paramListing = $this->addon->getListingParamForOutput();
if(empty($paramListing))
UniteFunctionsUC::throwError("Some multisource dynamic attribute should be found");
$paramName = UniteFunctionsUC::getVal($paramListing, "name");
$dataValue = UniteFunctionsUC::getVal($arrData, $paramName);
if(is_string($dataValue) && $dataValue === "uc_items"){
$arrItemData = $this->getProcessedItemsData();
}elseif(is_array($dataValue)){
$arrItemData = $dataValue;
}else{
dmp($arrItemData);
UniteFunctionsUC::throwError("Wrong multisouce data");
}
UniteCreatetorParamsProcessorMultisource::checkShowItemsDebug($arrItemData);
break;
default:
$arrItemData = $this->getProcessedItemsData();
break;
}
//some small protection
if(empty($arrItemData))
$arrItemData = array();
$itemIndex = 0;
foreach($arrItemData as $key => $item){
$itemIndex++;
$arrItem = $item["item"];
$arrItem["item_index"] = $itemIndex;
$arrItem["item_id"] = $this->generatedID . "_item" . $itemIndex;
$arrItemData[$key]["item"] = $arrItem;
}
$this->objTemplate->setParams($arrData);
$this->objTemplate->setArrItems($arrItemData);
if(!empty($itemsSource))
$this->objTemplate->setItemsSource($itemsSource);
$htmlItem = $this->addon->getHtmlItem();
$htmlItem2 = $this->addon->getHtmlItem2();
$this->objTemplate->addTemplate(self::TEMPLATE_HTML_ITEM, $htmlItem);
$this->objTemplate->addTemplate(self::TEMPLATE_HTML_ITEM2, $htmlItem2);
}
if(!empty($paramPostsList)){
$postListValue = UniteFunctionsUC::getVal($paramPostsList, "value");
if(!empty($paramPostsList) && is_array($postListValue))
$arrData = array_merge($arrData, $postListValue);
}
if($this->isShowDebugData === true)
$this->putDebugDataHtml($arrData, $arrItemData);
}
/**
* preview addon mode
* dynamic addon should work from the settings
*/
public function setPreviewAddonMode(){
$this->isModePreview = true;
}
/**
* set system output id for the generated id
*/
public function setSystemOutputID($systemID){
$this->systemOutputID = $systemID;
}
/**
* init by addon
*/
public function initByAddon(UniteCreatorAddon $addon){
if(empty($addon))
UniteFunctionsUC::throwError("Wrong addon given");
//debug data
HelperUC::clearDebug();
$this->isInited = true;
$this->addon = $addon;
$this->isItemsExists = $this->addon->isHasItems();
$this->itemsType = $this->addon->getItemsType();
$this->arrOptions = $this->addon->getOptions();
$typeName = $this->addon->getType();
if($typeName == GlobalsUC::ADDON_TYPE_BGADDON)
$this->isBackground = true;
if($this->isBackground == true && $this->isGutenberg == true)
$this->isGutenbergBackground = true;
//modify by special type
switch($this->itemsType){
case "instagram":
case "post":
case "listing":
case "multisource":
$this->isItemsExists = true;
break;
}
$this->initDynamicParams();
$this->initTemplate();
}
}