File "unitecreator_layout.class.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/unlimited-elements-for-elementor/inc_php/layouts/unitecreator_layout.class.php
File size: 54.19 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

defined('UNLIMITED_ELEMENTS_INC') or die('Restricted access');
class UniteCreatorLayoutWork extends UniteElementsBaseUC
{
    protected $id;
    protected $title, $name, $data, $gridData, $ordering, $gridDataFull, $record, $params, $arrAddonNames;
    protected static $arrCacheAddons = array();
    protected $addonType = null, $arrAllOptionsCache = null;
    protected $extraParams = array();
    protected $objShapes, $layoutType, $isTemplate = false, $objLayouts;
    protected $objLayoutType;
    const KEY_SETTINGS_ADDDATA = "uc_settings_adddata";
    const EXPORT_CAT_TYPE_PREFIX = "uc_addontype_";
    const FIELDS_LAYOUTS = "title,ordering,layout_data,catid,name,layout_type,parent_id,relate_id,params";
    const LAYOUTS_GLOBAL_SETTINGS_OPTION = "unitecreator_layouts_general_settings";
    public function __construct()
    {
        $this->objShapes = new UniteShapeManagerUC();
        $this->objLayouts = new UniteCreatorLayouts();
        parent::__construct();
    }
    public function setLayoutType($type)
    {
        $this->layoutType = $type;
        $this->objLayoutType = UniteCreatorAddonType::getAddonTypeObject($type, true);
        $this->isTemplate = $this->objLayoutType->isTemplate;
    }
    public function validateInited()
    {
        if (empty($this->id)) {
            UniteFunctionsUC::throwError("The layout is not inited");
        }
    }
    public function isInited()
    {
        if (!empty($this->id)) {
            return true;
        }
        return false;
    }
    private function validateTitle($title)
    {
        UniteFunctionsUC::validateNotEmpty($title, "Title");
    }
    private function validateNameNotExists($name, $layoutType)
    {
        $isExists = $this->isLayoutExistsByName($name, $layoutType);
        if ($isExists == true) {
            UniteFunctionsUC::throwError("The layout with name: {$name} already exists");
        }
    }
    private function validateName($name)
    {
        $fieldName = $this->objLayoutType->textSingle . esc_html__(" Name", "unlimited-elements-for-elementor");
        UniteFunctionsUC::validateNotEmpty($name, $fieldName);
        UniteFunctionsUC::validateUrlAlias($name, $fieldName);
        $this->validateNameNotExists($name, $this->layoutType);
    }
    private function validateLayoutNotExistsByTitle($title, $layoutType)
    {
        $isExists = $this->isLayoutExistsByTitle($title, $layoutType);
        if ($isExists == true) {
            UniteFunctionsUC::throwError("The layout with title: {$title} already exists");
        }
    }
    private function a_________STATIC_FUNCTIONS________()
    {
    }
    public static function getGridGlobalStoredValues()
    {
        $arrValues = UniteProviderFunctionsUC::getOption(self::LAYOUTS_GLOBAL_SETTINGS_OPTION, array());
        return $arrValues;
    }
    public static function getGlobalSettingsObject($includeGlobalOptions = true)
    {
        $filepathSettings = GlobalsUC::$pathSettings . "layouts_global_settings.xml";
        $objSettings = new UniteCreatorSettings();
        $objSettings->loadXMLFile($filepathSettings);
        if ($includeGlobalOptions == true) {
            $arrValues = self::getGridGlobalStoredValues();
            if (!empty($arrValues)) {
                $objSettings->setStoredValues($arrValues);
            }
        }
        return $objSettings;
    }
    public static function getLayoutGlobalSettingsValues()
    {
        $objSettings = self::getGlobalSettingsObject(true);
        $arrValues = $objSettings->getArrValues();
        return $arrValues;
    }
    public static function getGridSettingsObject()
    {
        $filepathSettings = GlobalsUC::$pathSettings . "layouts_grid_settings.xml";
        $objSettings = new UniteCreatorSettings();
        $objSettings->loadXMLFile($filepathSettings);
        return $objSettings;
    }
    public function getPageParamsSettingsObject()
    {
        switch ($this->objLayoutType->paramsSettingsType) {
            case UniteCreatorAddonType_Layout::LAYOUT_PARAMS_TYPE_SCREENSHOT:
                $filepathSettings = GlobalsUC::$pathSettings . "layout_grid_settings_screenshot.xml";
                break;
            default:
                UniteFunctionsUC::throwError("Wrong page params type: " . $this->objLayoutType->paramsSettingsType);
                break;
        }
        $objSettings = new UniteCreatorSettings();
        $objSettings->loadXMLFile($filepathSettings);
        $objSettings = UniteProviderFunctionsUC::applyFilters(UniteCreatorFilters::FILTER_LAYOUT_PROPERTIES_SETTINGS, $objSettings);
        $objSettings->setStoredValues($this->params);
        return $objSettings;
    }
    public function getPageParamsValuesWithDefaults()
    {
        $this->validateInited();
        $paramsType = $this->objLayoutType->paramsSettingsType;
        if (empty($paramsType)) {
            return $this->params;
        }
        $objSettings = $this->getPageParamsSettingsObject();
        $arrValues = $objSettings->getArrValues();
        if (is_array($this->params)) {
            $arrValues = array_merge($arrValues, $this->params);
        }
        return $arrValues;
    }
    public static function updateLayoutGlobalSettingsFromData($data)
    {
        $arrValues = UniteFunctionsUC::getVal($data, "settings_values");
        UniteProviderFunctionsUC::updateOption(self::LAYOUTS_GLOBAL_SETTINGS_OPTION, $arrValues);
    }
    public function initByName($name, $type)
    {
        $objType = UniteCreatorAddonType::getAddonTypeObject($type, true);
        $name = $this->db->escape($name);
        $sqlAddonType = $this->db->getSqlAddonType($type, "layout_type");
        $where = "name='{$name}' and {$sqlAddonType}";
        try {
            $record = $this->db->fetchSingle(GlobalsUC::$table_layouts, $where);
        } catch (Exception $e) {
            UniteFunctionsUC::throwError("Layout with name: {$name} not found");
        }
        UniteFunctionsUC::validateNotEmpty($record, "layout record");
        $this->initByRecord($record);
    }
    public function initByID($id)
    {
        $id = (int) $id;
        if (empty($id)) {
            UniteFunctionsUC::throwError("Empty layout ID");
        }
        $options = array();
        $options["tableName"] = GlobalsUC::$table_layouts;
        $options["where"] = "id=" . $id;
        $options["errorEmpty"] = "layout with id: {$id} not found";
        $record = $this->db->fetchSingle($options);
        $this->id = $id;
        $this->initByRecord($record);
    }
    private function a____________GET_OPTIONS_____________()
    {
    }
    public static function getGridGlobalOptions()
    {
        $settings = self::getGlobalSettingsObject();
        $arrValues = $settings->getArrValues();
        return $arrValues;
    }
    public static function getGridSettingsOptions($arrInitValues = array())
    {
        $objSettings = self::getGridSettingsObject();
        if (!empty($arrInitValues)) {
            $objSettings->setStoredValues($arrInitValues);
        }
        $arrValues = $objSettings->getArrValues();
        return $arrValues;
    }
    public static function getGridDefaultOptions()
    {
        $objGlobalSettings = self::getGlobalSettingsObject(false);
        $arrValuesGrid = self::getGridSettingsOptions();
        $arrValuesGlobal = $objGlobalSettings->getArrValues();
        $arrMerged = array_merge($arrValuesGlobal, $arrValuesGrid);
        return $arrMerged;
    }
    public function getAllGridOptions()
    {
        $this->validateInited();
        if (!empty($this->arrAllOptionsCache)) {
            return $this->arrAllOptionsCache;
        }
        $globalOptions = self::getGridGlobalOptions();
        $layoutOptions = UniteFunctionsUC::getVal($this->gridData, "options", array());
        if (empty($layoutOptions) || is_array($layoutOptions) == false) {
            $layoutOptions = array();
        }
        $allOptions = array_merge($globalOptions, $layoutOptions);
        $this->arrAllOptionsCache = $allOptions;
        return $allOptions;
    }
    public function getExtraParams()
    {
        return $this->extraParams;
    }
    private function a______________DATA_RELATED_______________()
    {
    }
    protected function modifyInitLayoutData($gridData)
    {
        if (empty($gridData)) {
            return $gridData;
        }
        $rows = UniteFunctionsUC::getVal($gridData, "rows");
        if (empty($rows)) {
            return $gridData;
        }
        foreach ($rows as $keyRow => $row) {
            $cols = UniteFunctionsUC::getVal($row, "cols");
            if (empty($cols)) {
                continue;
            }
            $arrContainer = array();
            $arrContainer["cols"] = $cols;
            $row["containers"] = array($arrContainer);
            unset($row["cols"]);
            $gridData["rows"][$keyRow] = $row;
        }
        return $gridData;
    }
    protected function generateName($title = "", $layoutType = null, $baseName = null)
    {
        if (empty($title)) {
            $title = $this->title;
        }
        UniteFunctionsUC::validateNotEmpty($title);
        if (empty($layoutType)) {
            $this->objLayouts->validateLayoutType($this->layoutType);
            $layoutType = $this->layoutType;
        }
        $alias = HelperUC::convertTitleToAlias($title);
        if (!empty($baseName)) {
            $alias = $baseName . "-" . $alias;
        }
        $isExists = $this->isLayoutExistsByName($alias, $layoutType);
        if ($isExists == true) {
            $alias .= "-" . UniteFunctionsUC::getRandomString(5);
        }
        return $alias;
    }
    public function initByRecord($record)
    {
        $this->title = UniteFunctionsUC::getVal($record, "title");
        $this->name = UniteFunctionsUC::getVal($record, "name");
        if (empty($this->id)) {
            $this->id = UniteFunctionsUC::getVal($record, "id");
        }
        $this->ordering = UniteFunctionsUC::getVal($record, "ordering");
        $this->layoutType = UniteFunctionsUC::getVal($record, "layout_type");
        if (empty($this->name)) {
            $this->name = $this->generateName(null, $this->layoutType);
        }
        $this->objLayoutType = UniteCreatorAddonType::getAddonTypeObject($this->layoutType, true);
        $this->isTemplate = $this->objLayoutType->isTemplate;
        $data = UniteFunctionsUC::getVal($record, "layout_data");
        $data = UniteFunctionsUC::maybeUnserialize($data);
        $this->record = $record;
        $this->data = $data;
        $params = UniteFunctionsUC::getVal($record, "params");
        if (!empty($params)) {
            $this->params = UniteFunctionsUC::jsonDecode($params);
        }
        if (empty($this->params)) {
            $this->params = array();
        }
        $gridData = UniteFunctionsUC::getVal($data, "grid_data");
        $gridData = $this->modifyInitLayoutData($gridData);
        $this->gridData = $gridData;
    }
    private function getAddonObject($name, $addontype = null)
    {
        if (empty($addontype)) {
            $addontype = $this->addonType;
        }
        $cacheName = $name;
        if (!empty($addontype)) {
            $cacheName = $name . "_" . $addontype;
        }
        if (isset(self::$arrCacheAddons[$cacheName])) {
            return self::$arrCacheAddons[$cacheName];
        }
        try {
            $addon = new UniteCreatorAddon();
            if (empty($addontype)) {
                $addon->initByName($name);
            } else {
                $addon->initByAlias($name, $addontype);
            }
            self::$arrCacheAddons[$cacheName] = $addon;
            return $addon;
        } catch (Exception $e) {
            return null;
        }
    }
    private function getAddonExtraData($name, $addon = null, $addontype = "")
    {
        if (empty($addon)) {
            $addon = $this->getAddonObject($name, $addontype);
        }
        if (empty($addon)) {
            return null;
        }
        $arrExtraData = array();
        $arrExtraData["id"] = $addon->getID();
        $arrExtraData["title"] = $addon->getTitle();
        $arrExtraData["url_icon"] = $addon->getUrlIcon();
        $arrExtraData["admin_labels"] = $addon->getAdminLabels();
        return $arrExtraData;
    }
    private function modifyAddonDataForEditor($addonData)
    {
        try {
            $objAddons = new UniteCreatorAddons();
            $objAddon = $objAddons->prepareAddonByData($addonData);
            $arrConfig = $objAddon->getProcessedMainParamsValues(UniteCreatorParamsProcessor::PROCESS_TYPE_CONFIG);
            $origConfig = UniteFunctionsUC::getVal($addonData, "config");
            if (empty($origConfig)) {
                $origConfig = array();
            }
            $addonData["config"] = array_merge($origConfig, $arrConfig);
            if ($objAddon->isHasItems()) {
                $arrItems = $objAddon->getProcessedItemsData(UniteCreatorParamsProcessor::PROCESS_TYPE_CONFIG, false);
                $addonData["items"] = $arrItems;
            }
            return $addonData;
        } catch (Exception $e) {
            return $addonData;
        }
    }
    protected function createGridDataFull_modifySettingsImage($settings, $key)
    {
        $value = UniteFunctionsUC::getVal($settings, $key);
        if (empty($value)) {
            return $settings;
        }
        if (is_numeric($value) == false) {
            return $settings;
        }
        $urlImage = UniteProviderFunctionsUC::getImageUrlFromImageID($value);
        if (empty($urlImage)) {
            return $settings;
        }
        $settings[$key] = $urlImage;
        $settings[$key . "_imageid"] = $value;
        return $settings;
    }
    private function createGridDataFull_modifySettingsShapes($settings)
    {
        if (empty($settings)) {
            return $settings;
        }
        $arr = array("top", "bottom");
        foreach ($arr as $pos) {
            if (array_key_exists("enable_shape_devider_{$pos}", $settings) == false) {
                continue;
            }
            if ($settings["enable_shape_devider_{$pos}"] === true) {
                continue;
            }
            unset($settings["enable_shape_devider_{$pos}"]);
            foreach ($settings as $key => $value) {
                if (strpos($key, "shape_devider_{$pos}_") === 0) {
                    unset($settings[$key]);
                }
            }
        }
        return $settings;
    }
    protected function createGridDataFull_modifySettingsBGAddons($settings, $addParams)
    {
        $settingsKey = "bg_addon_single";
        $bgAddonName = UniteFunctionsUC::getVal($settings, $settingsKey);
        if (empty($bgAddonName)) {
            return $settings;
        }
        $addonData = UniteFunctionsUC::getVal($settings, $settingsKey . "_data");
        if (empty($addonData)) {
            $addonData = array();
            $addonData["name"] = $bgAddonName;
            $addonData["addontype"] = GlobalsUC::ADDON_TYPE_BGADDON;
        }
        $addonData = $this->createGridDataFull_modifyAddonData($addonData, $addParams);
        $settings[$settingsKey . "_data"] = $addonData;
        return $settings;
    }
    protected function createGridDataFull_modifySettings($settings, $name, $addParams = null)
    {
        $settings = $this->createGridDataFull_modifySettingsImage($settings, "bg_image_url");
        $settings = $this->createGridDataFull_modifySettingsShapes($settings);
        $settings = $this->createGridDataFull_modifySettingsBGAddons($settings, $addParams);
        return $settings;
    }
    private function createGridDataFull_modifyAddonData($addonData, $addParams = null)
    {
        if (empty($addonData)) {
            return $addonData;
        }
        $addonData = $this->modifyAddonDataForEditor($addonData);
        $addonName = UniteFunctionsUC::getVal($addonData, "name");
        $addonType = UniteFunctionsUC::getVal($addonData, "addontype");
        if (empty($addonName)) {
            return $addonData;
        }
        $addonExtraData = $this->getAddonExtraData($addonName, null, $addonType);
        if (empty($addonExtraData)) {
            $addonExtraData = array();
            $addonExtraData["missing"] = true;
        }
        $addonData["extra"] = $addonExtraData;
        $isAddContent = UniteFunctionsUC::getVal($addParams, "add_addon_content");
        $isAddContent = UniteFunctionsUC::strToBool($isAddContent);
        if ($isAddContent == true) {
            $addons = new UniteCreatorAddons();
            $addonData["output"] = $addons->getLayoutAddonOutputData($addonData);
        }
        return $addonData;
    }
    private function createGridDataFull($addAddonContent = false)
    {
        if (!empty($this->gridDataFull)) {
            return $this->gridDataFull;
        }
        $addParams = array();
        $addParams["add_addon_content"] = $addAddonContent;
        $this->gridDataFull = $this->mapModifyLayoutDataAddons($this->gridData, "createGridDataFull_modifyAddonData", $addParams);
        $this->gridDataFull = $this->mapModifyLayoutDataSettings($this->gridDataFull, array($this, "createGridDataFull_modifySettings"), $addParams);
        return $this->gridDataFull;
    }
    public function modifyAddonDataForSave($data)
    {
        $name = UniteFunctionsUC::getVal($data, "name");
        $addonType = UniteFunctionsUC::getVal($data, "addontype");
        try {
            unset($data["url_icon"]);
            unset($data["title"]);
            unset($data["extra"]);
            unset($data["output"]);
            $config = UniteFunctionsUC::getVal($data, "config");
            $items = UniteFunctionsUC::getVal($data, "items");
            $addon = new UniteCreatorAddon();
            if (empty($addonType)) {
                $addon->initByName($name);
            } else {
                $addon->initByAlias($name, $addonType);
            }
            $addon->setParamsValues($config);
            if (!empty($items)) {
                $addon->setArrItems($items);
            }
            if (!empty($config)) {
                $arrImages = $addon->getProcessedMainParamsImages();
                if (!empty($arrImages)) {
                    $arrImages = $addon->modifyDataConvertToUrlAssets($arrImages);
                    $data["config"] = array_merge($config, $arrImages);
                }
            }
            if (!empty($items) && is_array($items)) {
                $arrItemsImages = $addon->getProcessedItemsData(UniteCreatorParamsProcessor::PROCESS_TYPE_SAVE, false, "uc_image");
                foreach ($arrItemsImages as $key => $itemImage) {
                    $itemImage = $addon->modifyDataConvertToUrlAssets($itemImage);
                    if (!empty($itemImage)) {
                        $items[$key] = array_merge($items[$key], $itemImage);
                    }
                }
                $data["items"] = $items;
            }
        } catch (Exception $e) {
            return $data;
        }
        return $data;
    }
    private function prepareDataForSave($gridData)
    {
        $data = array();
        if (is_string($gridData)) {
            $gridData = UniteFunctionsUC::decodeContent($gridData);
            $gridData = $this->modifyGridDataForSave($gridData);
            $data["grid_data"] = $gridData;
        } else {
            $data["grid_data"] = $gridData;
        }
        $data = serialize($data);
        return $data;
    }
    private function a______MAPPING_______()
    {
    }
    private function mapModifyLayoutDataSettings_columns($parent, $modifyFunc, $addParams = null)
    {
        $cols = UniteFunctionsUC::getVal($parent, "cols");
        if (empty($cols)) {
            return $parent;
        }
        foreach ($cols as $colIndex => $col) {
            $colSettings = UniteFunctionsUC::getVal($col, "settings");
            if (!empty($colSettings)) {
                $parent["cols"][$colIndex]["settings"] = call_user_func($modifyFunc, $colSettings, "col", $addParams);
            }
            $addonData = UniteFunctionsUC::getVal($col, "addon_data");
            if (empty($addonData)) {
                continue;
            }
            foreach ($addonData as $addonIndex => $addon) {
                $addonOptions = UniteFunctionsUC::getVal($addon, "options");
                if (empty($addonOptions)) {
                    continue;
                }
                $parent["cols"][$colIndex]["addon_data"][$addonIndex]["options"] = call_user_func($modifyFunc, $addonOptions, "addon", $addParams);
            }
        }
        return $parent;
    }
    private function checkSettingsAddData($arrElement, $keyOptions)
    {
        return $arrElement;
    }
    public function mapModifyLayoutDataSettings($arrData, $modifyFunc, $addParams = null)
    {
        $gridSettings = UniteFunctionsUC::getVal($arrData, "options");
        if (!empty($gridSettings)) {
            $arrData["options"] = call_user_func($modifyFunc, $gridSettings, "grid", $addParams);
        }
        $rows = UniteFunctionsUC::getVal($arrData, "rows");
        if (empty($rows)) {
            return false;
        }
        foreach ($rows as $rowIndex => $row) {
            $rowSettings = UniteFunctionsUC::getVal($row, "settings");
            if (!empty($rowSettings)) {
                $arrData["rows"][$rowIndex]["settings"] = call_user_func($modifyFunc, $rowSettings, "row", $addParams);
            }
            $arrContainers = UniteFunctionsUC::getVal($row, "containers");
            if (!empty($arrContainers)) {
                foreach ($arrContainers as $containerIndex => $container) {
                    $containerSettings = UniteFunctionsUC::getVal($container, "settings");
                    if (!empty($containerSettings)) {
                        $arrContainer = $arrData["rows"][$rowIndex]["containers"][$containerIndex];
                        $arrContainer["settings"] = call_user_func($modifyFunc, $containerSettings, "container", $addParams);
                        $arrData["rows"][$rowIndex]["containers"][$containerIndex] = $arrContainer;
                    }
                    $arrData["rows"][$rowIndex]["containers"][$containerIndex] = $this->mapModifyLayoutDataSettings_columns($container, $modifyFunc, $addParams);
                }
            } else {
                $arrData["rows"][$rowIndex] = $this->mapModifyLayoutDataSettings_columns($row, $modifyFunc, $addParams);
            }
        }
        return $arrData;
    }
    private function mapModifyLayoutDataAddons_columns($arrParent, $modifyFunc, $addParams = null)
    {
        $cols = UniteFunctionsUC::getVal($arrParent, "cols");
        if (empty($cols)) {
            return $arrParent;
        }
        foreach ($cols as $keyCol => $col) {
            $addonData = UniteFunctionsUC::getVal($col, "addon_data");
            if (isset($addonData["config"])) {
                $addonData = array($addonData);
            }
            if (empty($addonData)) {
                $addonData = array();
            }
            foreach ($addonData as $keyAddon => $addon) {
                if (is_array($modifyFunc)) {
                    $addon = call_user_func($modifyFunc, $addon);
                } else {
                    $addon = call_user_func(array($this, $modifyFunc), $addon, $addParams);
                }
                if (!empty($addon)) {
                    $addonData[$keyAddon] = $addon;
                } else {
                    unset($addonData[$keyAddon]);
                }
            }
            $col["addon_data"] = $addonData;
            $cols[$keyCol] = $col;
        }
        $arrParent["cols"] = $cols;
        return $arrParent;
    }
    public function mapModifyLayoutDataAddons($arrData, $modifyFunc, $addParams = null)
    {
        $rows = UniteFunctionsUC::getVal($arrData, "rows");
        if (empty($rows)) {
            return $arrData;
        }
        foreach ($rows as $keyRow => $row) {
            $containers = UniteFunctionsUC::getVal($row, "containers");
            if (!empty($containers)) {
                foreach ($containers as $keyContainer => $container) {
                    $row["containers"][$keyContainer] = $this->mapModifyLayoutDataAddons_columns($container, $modifyFunc, $addParams);
                }
            } else {
                $row = $this->mapModifyLayoutDataAddons_columns($row, $modifyFunc, $addParams);
            }
            $rows[$keyRow] = $row;
        }
        $arrData["rows"] = $rows;
        return $arrData;
    }
    public function mapModifyLayoutDataAll($arrData, $modifyFunc)
    {
        if (is_array($arrData)) {
            $arrData = call_user_func($modifyFunc, $arrData);
            foreach ($arrData as $index => $item) {
                if (is_array($item)) {
                    $item = call_user_func($modifyFunc, $item);
                    $arrData[$index] = $this->mapModifyLayoutDataAll($item, $modifyFunc);
                }
            }
        }
        return $arrData;
    }
    public function modifyParams($modifyFunc)
    {
        $this->params = call_user_func($modifyFunc, $this->params);
    }
    private function a_____________EXTERNAL_GETTERS____________()
    {
    }
    public function getGridDataForEditor($addAddonContent = false)
    {
        $this->validateInited();
        try {
            if (empty($this->gridDataFull)) {
                $this->createGridDataFull($addAddonContent);
            }
        } catch (Exception $e) {
            HelperHtmlUC::outputException($e);
            return $this->gridData;
        }
        return $this->gridDataFull;
    }
    public function getRowsFront()
    {
        $this->validateInited();
        $rows = UniteFunctionsUC::getVal($this->gridData, "rows");
        if (empty($rows)) {
            $rows = array();
        }
        return $rows;
    }
    public function getGridOptionsDiff()
    {
        $defaultOptions = self::getGridDefaultOptions();
        $allOptions = $this->getAllGridOptions();
        $arrDiffOptions = UniteFunctionsUC::getDiffArrItems($allOptions, $defaultOptions);
        return $arrDiffOptions;
    }
    public function getTitle($specialChars = false)
    {
        if ($specialChars == true) {
            return htmlspecialchars($this->title);
        } else {
            return $this->title;
        }
    }
    public function getName()
    {
        $this->validateInited();
        return $this->name;
    }
    public function getDescription($specialChars = false)
    {
        $this->validateInited();
        $description = UniteFunctionsUC::getVal($this->params, "description");
        if ($specialChars == true) {
            $description = htmlspecialchars($description);
        }
        return $description;
    }
    public function getIcon()
    {
        $this->validateInited();
        $icon = UniteFunctionsUC::getVal($this->params, "page_icon");
        return $icon;
    }
    public function getPreviewImage($getThumb = false)
    {
        $this->validateInited();
        $params = $this->getPageParamsValuesWithDefaults();
        $arrImageKeys = array("preview_image", "custom_preview_image", "page_image");
        foreach ($arrImageKeys as $key) {
            $urlPreview = UniteFunctionsUC::getVal($params, $key);
            $urlPreview = trim($urlPreview);
            if (empty($urlPreview)) {
                continue;
            }
            if (is_numeric($urlPreview)) {
                $urlPreview = UniteProviderFunctionsUC::getImageUrlFromImageID($urlPreview);
            }
            $urlPreview = HelperUC::URLtoFull($urlPreview);
            return $urlPreview;
        }
        return $urlPreview;
    }
    public function getPreviewImageFilepath()
    {
        $urlPreview = $this->getPreviewImage();
        if (empty($urlPreview)) {
            return null;
        }
        $pathImage = HelperUC::urlToPath($urlPreview);
        if (empty($pathImage)) {
            return null;
        }
        return $pathImage;
    }
    public function getID()
    {
        $this->validateInited();
        return $this->id;
    }
    public function getParentID()
    {
        dmp("getParentID - function for override");
        exit;
    }
    public function getLayoutType()
    {
        return $this->layoutType;
    }
    public function getObjLayoutType()
    {
        if (!empty($this->objLayoutType)) {
            return $this->objLayoutType;
        }
        if ($this->isInited() == true) {
            UniteFunctionsUC::throwError("The layout type should be inited");
        }
        $this->objLayoutType = UniteCreatorAddonType::getAddonTypeObject(GlobalsUC::ADDON_TYPE_REGULAR_LAYOUT, true);
        return $this->objLayoutType;
    }
    public function getCatNameForExport()
    {
        $arrCat = $this->getCategory();
        $catName = UniteFunctionsUC::getVal($arrCat, "name");
        if (empty($catName)) {
            return false;
        }
        $objLayoutType = $this->getObjLayoutType();
        $typeName = $objLayoutType->typeNameDistinct;
        $prefix = "";
        if ($typeName != GlobalsUC::ADDON_TYPE_REGULAR_LAYOUT) {
            $prefix = self::EXPORT_CAT_TYPE_PREFIX . $typeName . "___";
        }
        if (!empty($prefix)) {
            $catName = $prefix . $catName;
        }
        return $catName;
    }
    public function getCategory()
    {
        $this->validateInited();
        $category_info = array("layoutid" => $this->getID());
        $objCats = new UniteCreatorCategories();
        $catID = UniteFunctionsUC::getVal($this->record, "catid");
        if (empty($catID)) {
            $category_info["name"] = "Uncategorized";
            $category_info["id"] = 0;
        } else {
            $cat = $objCats->getCat($catID);
            $category_info["name"] = $cat["title"];
            $category_info["id"] = $cat["id"];
        }
        return $category_info;
    }
    public function getCategoryName()
    {
        $objCat = $this->getCategory();
        $catName = $objCat["name"];
        return $catName;
    }
    public function getRecord()
    {
        return $this->record;
    }
    public function getShortcode($shortcodeName = "")
    {
        $title = $this->getTitle(true);
        $id = $this->id;
        if (empty($shortcodeName)) {
            $shortcodeName = GlobalsUC::$layoutShortcodeName;
        }
        $shortcode = $shortcodeName . " id={$id} title=\"{$title}\"";
        $shortcode = UniteProviderFunctionsUC::wrapShortcode($shortcode);
        return $shortcode;
    }
    public function getAddonType()
    {
        return $this->addonType;
    }
    public function getRawLayoutData()
    {
        $this->validateInited();
        $strLayoutData = $this->record["layout_data"];
        return $strLayoutData;
    }
    public function getShortData()
    {
        $this->validateInited();
        $data = array();
        $data["title"] = $this->getTitle();
        $data["name"] = $this->getName();
        $data["description"] = $this->getDescription();
        $data["url_icon"] = $this->getIcon();
        $data["preview"] = $this->getPreviewImage();
        $data["id"] = $this->getID();
        $data["is_active"] = true;
        return $data;
    }
    protected function isLayoutExistsByTitle($title, $layoutType)
    {
        $title = $this->db->escape($title);
        $sqlType = $this->db->getSqlAddonType($layoutType, "layout_type");
        $response = $this->db->fetch(GlobalsUC::$table_layouts, "title='{$title}' and {$sqlType}");
        $isExists = !empty($response);
        return $isExists;
    }
    protected function isLayoutExistsByName($name, $layoutType)
    {
        $title = $this->db->escape($name);
        $sqlType = $this->db->getSqlAddonType($layoutType, "layout_type");
        $where = "name='{$name}' and {$sqlType}";
        if (!empty($this->id)) {
            $where .= " and id <> " . $this->id;
        }
        $response = $this->db->fetch(GlobalsUC::$table_layouts, $where);
        $isExists = !empty($response);
        return $isExists;
    }
    public function getNewLayoutTitle()
    {
        $titleBase = $this->objLayoutType->textSingle;
        $counter = 1;
        do {
            $title = $titleBase . $counter;
            $found = $this->isLayoutExistsByTitle($title, $this->layoutType);
            $counter++;
        } while ($found == true);
        return $title;
    }
    private function collectAddonSpecialAddons_params($paramsShapes, $config, $addonType)
    {
        foreach ($paramsShapes as $param) {
            $paramName = UniteFunctionsUC::getVal($param, "name");
            $shapeName = UniteFunctionsUC::getVal($config, $paramName);
            if (empty($shapeName)) {
                continue;
            }
            $shapeAddonName = $shapeName . "_" . $addonType;
            $this->arrAddonNames[$shapeAddonName] = null;
        }
    }
    private function getParamsShapesFromAddon($objAddon, $isItems = false)
    {
        if ($isItems == false) {
            $paramsShapes = $objAddon->getParams(UniteCreatorDialogParam::PARAM_SHAPE);
        } else {
            $paramsShapes = $objAddon->getParamsItems(UniteCreatorDialogParam::PARAM_SHAPE);
        }
        if (empty($paramsShapes)) {
            $paramsShapes = array();
        }
        if ($isItems == false) {
            $paramsAddonPickers = $objAddon->getParams(UniteCreatorDialogParam::PARAM_ADDONPICKER);
        } else {
            $paramsAddonPickers = $objAddon->getParamsItems(UniteCreatorDialogParam::PARAM_ADDONPICKER);
        }
        if (empty($paramsAddonPickers)) {
            return $paramsShapes;
        }
        foreach ($paramsAddonPickers as $param) {
            $addonType = UniteFunctionsUC::getVal($param, "addon_type");
            if ($addonType == GlobalsUC::ADDON_TYPE_SHAPES) {
                $paramsShapes[] = $param;
            }
        }
        return $paramsShapes;
    }
    private function collectAddonSpecialAddons($addonName, $addonData)
    {
        $objAddon = new UniteCreatorAddon();
        $objAddon->initByName($addonName);
        $paramsShapes = $this->getParamsShapesFromAddon($objAddon);
        if (!empty($paramsShapes)) {
            $config = UniteFunctionsUC::getVal($addonData, "config");
            $this->collectAddonSpecialAddons_params($paramsShapes, $config, GlobalsUC::ADDON_TYPE_SHAPES);
        }
        $hasItems = $objAddon->isHasItems();
        if ($hasItems == false) {
            return false;
        }
        $paramsItemsShapes = $this->getParamsShapesFromAddon($objAddon);
        if (empty($paramsItemsShapes)) {
            return false;
        }
        $arrItems = UniteFunctionsUC::getVal($addonData, "items");
        if (empty($arrItems) || is_array($arrItems) == false) {
            return false;
        }
        foreach ($arrItems as $item) {
            $this->collectAddonSpecialAddons_params($paramsItemsShapes, $item, GlobalsUC::ADDON_TYPE_SHAPES);
        }
    }
    private function modifyAddons_collectAddonNames($addonData)
    {
        $name = UniteFunctionsUC::getVal($addonData, "name");
        $this->arrAddonNames[$name] = null;
        $this->collectAddonSpecialAddons($name, $addonData);
        return null;
    }
    public function getRowSettingsCombined($row)
    {
        $settings = UniteFunctionsUC::getVal($row, "settings");
        $allOptions = $this->getAllGridOptions();
        if (empty($allOptions)) {
            return $settings;
        }
        if (empty($settings)) {
            return $allOptions;
        }
        foreach ($settings as $key => $value) {
            if ($value !== "") {
                continue;
            }
            $globalValue = UniteFunctionsUC::getVal($allOptions, $key);
            if ($globalValue !== "") {
                $settings[$key] = $globalValue;
            }
        }
        foreach ($allOptions as $key => $value) {
            $localValue = UniteFunctionsUC::getVal($settings, $key);
            if ($localValue !== "") {
                $value = $localValue;
            }
            $settings[$key] = $value;
        }
        return $settings;
    }
    public function getInfoText()
    {
        $textEmpty = esc_html__("empty layout", "unlimited-elements-for-elementor");
        if (empty($this->id)) {
            return $textEmpty;
        }
        $rows = UniteFunctionsUC::getVal($this->gridData, "rows");
        if (empty($rows)) {
            return $textEmpty;
        }
        if (is_array($rows) == false) {
            return $textEmpty;
        }
        $numRows = count($rows);
        $text = esc_html__("layout with", "unlimited-elements-for-elementor") . " " . $numRows . " " . __("sections", "unlimited-elements-for-elementor");
        return $text;
    }
    public function getRows()
    {
        $this->validateInited();
        $rows = UniteFunctionsUC::getVal($this->gridData, "rows");
        if (empty($rows)) {
            $rows = array();
        }
        return $rows;
    }
    public function getParams()
    {
        return $this->params;
    }
    public function getParam($paramName)
    {
        $value = UniteFunctionsUC::getVal($this->params, $paramName);
        return $value;
    }
    public function getUrlEditPost()
    {
        dmp("getUrlEditPost function for override");
        exit;
    }
    public function getUrlViewPost()
    {
        dmp("getUrlViewPost function for override");
        exit;
    }
    private function a_______________EXPORT_RELATED_____________()
    {
    }
    public function modifyLayoutElementsSettings($modifyFunc)
    {
        $this->validateInited();
        if (is_array($modifyFunc) == false) {
            UniteFunctionsUC::throwError("Wrong modify func");
        }
        $this->gridData = $this->mapModifyLayoutDataSettings($this->gridData, $modifyFunc);
    }
    public function modifyGridDataAddons($modifyFunc)
    {
        $this->validateInited();
        if (is_array($modifyFunc) == false) {
            UniteFunctionsUC::throwError("Wrong modify func");
        }
        $this->gridData = $this->mapModifyLayoutDataAddons($this->gridData, $modifyFunc);
    }
    private function getBGAddonNameFromSettings($settings)
    {
        $enableBackground = UniteFunctionsUC::getVal($settings, "bg_enable");
        $enableBackground = UniteFunctionsUC::strToBool($enableBackground);
        if ($enableBackground == false) {
            return null;
        }
        $bgAddonKey = "bg_addon_single";
        $bgAddonEnableKey = $bgAddonKey . "_enable";
        $enableBGAddon = UniteFunctionsUC::getVal($settings, $bgAddonEnableKey);
        $enableBGAddon = UniteFunctionsUC::strToBool($enableBGAddon);
        if ($enableBGAddon == false) {
            return null;
        }
        $bgAddonName = UniteFunctionsUC::getVal($settings, $bgAddonKey);
        if (empty($bgAddonName)) {
            return null;
        }
        return $bgAddonName;
    }
    public function modifySettings_collectSpecialAddonNames($settings, $elementType)
    {
        $nameTop = $this->objShapes->getShapeDividerNameFromSettings($settings, "top");
        if (!empty($nameTop)) {
            $this->arrAddonNames[$nameTop . "_" . GlobalsUC::ADDON_TYPE_SHAPE_DEVIDER] = GlobalsUC::ADDON_TYPE_SHAPE_DEVIDER;
        }
        $nameBottom = $this->objShapes->getShapeDividerNameFromSettings($settings, "bottom");
        if (!empty($nameBottom)) {
            $this->arrAddonNames[$nameBottom . "_" . GlobalsUC::ADDON_TYPE_SHAPE_DEVIDER] = GlobalsUC::ADDON_TYPE_SHAPE_DEVIDER;
        }
        $bgAddonName = $this->getBGAddonNameFromSettings($settings);
        if (!empty($bgAddonName)) {
            $this->arrAddonNames[$bgAddonName] = GlobalsUC::ADDON_TYPE_BGADDON;
        }
    }
    private function getErrorMessagePrefix()
    {
        $title = $this->getTitle(true);
        $prefix = esc_html__("Error in ", "unlimited-elements-for-elementor") . $title . " :";
        return $prefix;
    }
    public function getArrAddons()
    {
        $this->validateInited();
        $this->arrAddonNames = array();
        $this->mapModifyLayoutDataAddons($this->gridData, "modifyAddons_collectAddonNames");
        $this->mapModifyLayoutDataSettings($this->gridData, array($this, "modifySettings_collectSpecialAddonNames"));
        $arrAddons = array();
        foreach ($this->arrAddonNames as $name => $type) {
            try {
                $objAddon = new UniteCreatorAddon();
                switch ($type) {
                    case GlobalsUC::ADDON_TYPE_BGADDON:
                        $objAddon->initByAlias($name, $type);
                        break;
                    default:
                        $objAddon->initByMixed($name, $this->addonType);
                        break;
                }
                $arrAddons[] = $objAddon;
            } catch (Exception $e) {
                if ($type != GlobalsUC::ADDON_TYPE_SHAPE_DEVIDER) {
                    $message = $this->getErrorMessagePrefix();
                    $message .= $e->getMessage();
                    dmp($message);
                    UniteFunctionsUC::throwError($message);
                }
            }
        }
        return $arrAddons;
    }
    public function cleanLayoutDataBeforeExport($arrData)
    {
        if (is_array($arrData) == false) {
            return $arrData;
        }
        $arrDataNew = array();
        foreach ($arrData as $key => $item) {
            if (strpos($key, "_unite_selected_text") !== false) {
                continue;
            }
            $arrDataNew[$key] = $item;
        }
        return $arrDataNew;
    }
    public function cleanLayoutSettingsBeforeExport()
    {
        $cleanFunc = array($this, "cleanLayoutDataBeforeExport");
        $this->gridData = $this->mapModifyLayoutDataAll($this->gridData, $cleanFunc);
        $this->modifyParams($cleanFunc);
    }
    public function getRecordForExport()
    {
        $this->validateInited();
        $record = array();
        $record["title"] = $this->title;
        $record["name"] = $this->name;
        $record["type"] = $this->layoutType;
        $catName = $this->getCategoryName();
        if (!empty($catName)) {
            $record["catname"] = $catName;
        }
        $gridData = $this->modifyGridDataForSave($this->gridData);
        $record["params"] = $this->modifyParamsForSave($this->params);
        $this->data["grid_data"] = $gridData;
        $layoutData = serialize($this->data);
        $record["layout_data"] = $layoutData;
        return $record;
    }
    private function a________________MODIFY_FOR_SAVE____________()
    {
    }
    public function modifyGridDataForSave_containers($gridData)
    {
        $arrRows = UniteFunctionsUC::getVal($gridData, "rows");
        if (empty($arrRows)) {
            return $gridData;
        }
        foreach ($arrRows as $index => $row) {
            $arrContainers = UniteFunctionsUC::getVal($row, "containers");
            if (empty($arrContainers)) {
                continue;
            }
            if (count($arrContainers) > 1) {
                continue;
            }
            $container = $arrContainers[0];
            $settings = UniteFunctionsUC::getVal($container, "settings");
            if (!empty($settings)) {
                continue;
            }
            $cols = UniteFunctionsUC::getVal($container, "cols");
            $row["cols"] = $cols;
            unset($row["containers"]);
            $arrRows[$index] = $row;
        }
        $gridData["rows"] = $arrRows;
        return $gridData;
    }
    public function modifyLayoutDataForSave($arrSettings, $type)
    {
        if (isset($arrSettings["bg_image_url_url"])) {
            unset($arrSettings["bg_image_url_url"]);
        }
        $bgAddonSingleData = UniteFunctionsUC::getVal($arrSettings, "bg_addon_single_data");
        if (!empty($bgAddonSingleData)) {
            $arrSettings["bg_addon_single_data"] = $this->modifyAddonDataForSave($bgAddonSingleData);
        }
        return $arrSettings;
    }
    public function modifyGridDataForSave($gridData)
    {
        $gridData = $this->mapModifyLayoutDataSettings($gridData, array($this, "modifyLayoutDataForSave"));
        $gridData = $this->mapModifyLayoutDataAddons($gridData, "modifyAddonDataForSave");
        $gridData = $this->modifyGridDataForSave_containers($gridData);
        return $gridData;
    }
    protected function modifyParamsImagesForSave($params, $arrImageNames)
    {
        foreach ($arrImageNames as $name) {
            $unsetName = $name . "_url";
            if (isset($params[$unsetName])) {
                unset($params[$unsetName]);
            }
        }
        return $params;
    }
    public function modifyParamsForSave($params)
    {
        $arrImagesNames = array("preview_image", "custom_preview_image", "page_image");
        $params = $this->modifyParamsImagesForSave($params, $arrImagesNames);
        return $params;
    }
    private function a_____________EXTERNAL_SETTERS_____________()
    {
    }
    public function createLayoutInDB($arrInsert, $arrParams = array())
    {
        $objLayouts = new UniteCreatorLayouts();
        $maxOrder = $objLayouts->getMaxOrder();
        $arrInsert["ordering"] = $maxOrder + 1;
        if (!isset($arrInsert["catid"])) {
            $arrInsert["catid"] = '0';
        }
        if (!isset($arrInsert["parent_id"])) {
            $arrInsert["parent_id"] = '0';
        }
        if (!isset($arrInsert["relate_id"])) {
            $arrInsert["relate_id"] = '0';
        }
        if (!isset($arrInsert["params"])) {
            $arrInsert["params"] = '';
        }
        $id = $this->db->insert(GlobalsUC::$table_layouts, $arrInsert);
        return $id;
    }
    protected function getNewLayoutName($title, $importParams)
    {
        $name = $this->generateName($title);
        return $name;
    }
    public function createSmall($title, $name, $description, $catID, $importParams = array())
    {
        $arrInsert = array();
        $this->validateTitle($title);
        $this->objLayouts->validateLayoutType($this->layoutType);
        $name = $this->getNewLayoutName($title, $importParams);
        $name = HelperUC::convertTitleToAlias($name);
        $this->validateName($name);
        if (!is_numeric($catID)) {
            $catID = 0;
        }
        if (empty($catID)) {
            $catID = 0;
        }
        $arrInsert["title"] = $title;
        $arrInsert["layout_type"] = $this->layoutType;
        $arrInsert["name"] = $name;
        $arrInsert["catid"] = $catID;
        $arrParams = array();
        $description = $this->db->escape($description);
        $arrParams["description"] = $description;
        $arrInsert["params"] = json_encode($arrParams);
        $isNameExists = $this->isLayoutExistsByName($name, $this->layoutType);
        if ($isNameExists == true) {
            $objLayoutExisting = new UniteCreatorLayout();
            $objLayoutExisting->initByName($name, $this->layoutType);
            $objLayoutExisting->updateLayoutInDB($arrInsert);
            $this->id = $objLayoutExisting->getID();
            $this->initByID($this->id);
        } else {
            $this->id = $this->createLayoutInDB($arrInsert, $importParams);
            $this->initByID($this->id);
        }
        return $this->id;
    }
    public function create($data)
    {
        $title = UniteFunctionsUC::getVal($data, "title");
        unset($data["title"]);
        unset($data["layoutid"]);
        UniteFunctionsUC::validateNotEmpty($title, HelperUC::getText("layout_title"));
        $layoutType = UniteFunctionsUC::getVal($data, "layout_type");
        $objLayoutType = UniteCreatorAddonType::getAddonTypeObject($layoutType, true);
        $this->objLayoutType = $objLayoutType;
        $pageName = UniteFunctionsUC::getVal($data, "name");
        if (!empty($pageName)) {
            $pageName = HelperUC::convertTitleToAlias($pageName);
            $isExists = $this->isLayoutExistsByName($pageName, $layoutType);
            if ($isExists) {
                $pageName = null;
            }
        }
        if (empty($pageName)) {
            $pageName = $this->generateName($title);
        }
        $arrInsert = array();
        $arrInsert["title"] = $title;
        $arrInsert["name"] = $pageName;
        $gridData = UniteFunctionsUC::getVal($data, "grid_data");
        $arrInsert["layout_data"] = $this->prepareDataForSave($gridData);
        $params = UniteFunctionsUC::getVal($data, "params");
        if (!empty($params)) {
            $arrInsert["params"] = json_encode($params);
        }
        $catID = UniteFunctionsUC::getVal($data, "catid");
        if (!empty($catID)) {
            $objCategories = new UniteCreatorCategories();
            $objCategories->validateCatExist($catID);
            $arrInsert["catid"] = $catID;
        }
        if ($objLayoutType->allowDuplicateTitle == false) {
            $this->validateLayoutNotExistsByTitle($title, $layoutType);
        }
        if (!empty($layoutType)) {
            $arrInsert["layout_type"] = $layoutType;
        }
        $id = $this->createLayoutInDB($arrInsert);
        $arrResponse = array();
        $arrResponse["id"] = $id;
        $arrResponse["name"] = $pageName;
        return $arrResponse;
    }
    public function updateLayoutInDB($arrUpdate)
    {
        $this->validateInited();
        unset($arrUpdate["import_title"]);
        if (isset($arrUpdate["name"])) {
            $this->validateName($arrUpdate["name"]);
        }
        $where = "id={$this->id}";
        $this->db->update(GlobalsUC::$table_layouts, $arrUpdate, $where);
    }
    public function updateCategory($catID)
    {
        $this->validateInited();
        $catID = (int) $catID;
        $arrUpdate = array();
        $arrUpdate['catid'] = $catID;
        $this->updateLayoutInDB($arrUpdate);
    }
    public function updateTitle($title, $name = null)
    {
        $this->validateInited();
        $this->validateTitle($title);
        $arrUpdate = array();
        $arrUpdate["title"] = $title;
        if ($name !== null) {
            $this->validateName($name);
            $arrUpdate["name"] = $name;
        }
        $this->updateLayoutInDB($arrUpdate);
    }
    public function updateInternalParamsInDB()
    {
        $jsonParams = json_encode($this->params);
        $arrUpdate = array();
        $arrUpdate["params"] = $jsonParams;
        $this->updateLayoutInDB($arrUpdate);
    }
    public function updateParam($paramName, $paramValue)
    {
        $this->validateInited();
        $this->params[$paramName] = $paramValue;
        $this->updateInternalParamsInDB();
    }
    public function updateParams($arrParams, $isRewrite = false)
    {
        $this->validateInited();
        if (empty($arrParams)) {
            return false;
        }
        if (is_array($arrParams) == false) {
            return false;
        }
        if ($isRewrite == true) {
            $this->params = $arrParams;
        } else {
            $this->params = array_merge($this->params, $arrParams);
        }
        $this->updateInternalParamsInDB();
    }
    public function update($data)
    {
        $this->validateInited();
        $title = UniteFunctionsUC::getVal($data, "title");
        $this->validateTitle($title);
        $gridData = UniteFunctionsUC::getVal($data, "grid_data");
        $arrUpdate = array();
        $arrUpdate["title"] = $title;
        $arrUpdate["layout_data"] = $this->prepareDataForSave($gridData);
        if (isset($data["name"])) {
            $pageName = $data["name"];
            $arrUpdate["name"] = $pageName;
        }
        $this->updateLayoutInDB($arrUpdate);
        $params = UniteFunctionsUC::getVal($data, "params");
        if (!empty($params)) {
            $this->updateParams($params);
        }
    }
    public function updateGridData($gridData = null)
    {
        if ($gridData !== null) {
            if (is_string($gridData)) {
                $gridData = UniteFunctionsUC::decodeContent($gridData);
            }
            $this->gridData = $gridData;
        }
        $arrUpdate = array();
        $arrUpdate["layout_data"] = $this->prepareDataForSave($this->gridData);
        $this->updateLayoutInDB($arrUpdate);
    }
    public function delete()
    {
        $this->validateInited();
        $this->db->delete(GlobalsUC::$table_layouts, "id=" . $this->id);
    }
    protected function getDuplicateTitle()
    {
        $objLayouts = new UniteCreatorLayouts();
        $suffixTitle = " - copy";
        $title = $this->getTitle();
        $newTitle = $title . $suffixTitle;
        $isExists = $objLayouts->isLayoutExistsByTitle($newTitle, $this->layoutType);
        $num = 1;
        $limit = 1;
        while ($isExists == true && $limit < 10) {
            $limit++;
            $num++;
            $suffixTitle = " - copy" . $num;
            $newTitle = $title . $suffixTitle;
            $isExists = $objLayouts->isLayoutExistsByTitle($newTitle, $this->layoutType);
        }
        return $newTitle;
    }
    public function duplicate()
    {
        $this->validateInited();
        $newTitle = $this->getDuplicateTitle();
        $newName = $this->generateName($newTitle);
        $layouts = new UniteCreatorLayouts();
        $layouts->shiftOrder($this->ordering, $this->layoutType);
        $newOrder = $this->ordering + 1;
        $sqlSelect = "select " . self::FIELDS_LAYOUTS . " from " . GlobalsUC::$table_layouts . " where id={$this->id}";
        $sqlInsert = "insert into " . GlobalsUC::$table_layouts . " (" . self::FIELDS_LAYOUTS . ") ({$sqlSelect})";
        $this->db->runSql($sqlInsert);
        $lastID = $this->db->getLastInsertID();
        UniteFunctionsUC::validateNotEmpty($lastID);
        $arrUpdate = array();
        $arrUpdate["title"] = $newTitle;
        $arrUpdate["name"] = $newName;
        $arrUpdate["ordering"] = $newOrder;
        $this->db->update(GlobalsUC::$table_layouts, $arrUpdate, array("id" => $lastID));
        return $lastID;
    }
    private function a________________CREATE_CONTENT____________()
    {
    }
    public function getArrNewRow($arrAddonContent = array())
    {
        $row = array();
        $containers = array();
        $column = array();
        $addon = array();
        $column["size"] = "1_1";
        $arrAddons = array();
        if (!empty($arrAddonContent)) {
            $arrAddons[] = $arrAddonContent;
        }
        $column["addon_data"] = $arrAddons;
        $containers["cols"] = array($column);
        $row["containers"] = array($containers);
        return $row;
    }
    public function setRows($arrRows)
    {
        $this->validateInited();
        if (empty($this->gridData)) {
            $this->gridData = array();
        }
        $this->gridData["rows"] = $arrRows;
    }
    public function addRow($arrAddonContent = array())
    {
        $this->validateInited();
        if (empty($this->gridData)) {
            $this->gridData = array();
        }
        $arrRows = $this->getRows();
        $arrRows[] = $this->getArrNewRow($arrAddonContent);
        $this->setRows($arrRows);
    }
    public function addRowWithHtmlAddon($arrAddonContent)
    {
        $this->addRow($arrAddonContent);
    }
}