$demo) { if ($demo['published'] === true) { $total++; } } return $total; } public static function isMultiDemo() { return !empty(self::getDemo()); } public static function hasWebpack() { return !(isset($_REQUEST['webpack']) && !filter_var($_REQUEST['webpack'], FILTER_VALIDATE_BOOLEAN)); } public static function isFreeVersion() { if (isset($_REQUEST['free'])) { return filter_var($_REQUEST['free'], FILTER_VALIDATE_BOOLEAN); } return self::$freeVersion; } public static function setFreeVersion($flag) { return self::$freeVersion = $flag; } public static function putProVersionTooltip($attr = array()) { $attr['data-bs-toggle'] = 'tooltip'; $attr['title'] = "Available in Pro version"; $attr['data-bs-html'] = 'true'; if (empty($attr) || isset($attr['data-bs-placement']) === false) { $attr['data-bs-placement'] = 'bottom'; } if (Theme::isFreeVersion() === true) { echo Util::putHtmlAttributes($attr); } } public static function getOption($scope, $path = false, $default = null) { if (!self::hasOption($scope, $path)) { return $default; } $result = array(); if (!isset(self::$config[$scope])) { return null; } if ($path === false) { $result = self::$config[$scope]; } else { $result = Util::getArrayValue(self::$config[$scope], $path); } // check if its a callback if (is_callable($result) && !is_string($result)) { $result = call_user_func($result); } return $result; } public static function setOption($scope, $path, $value) { if (isset(self::$config[$scope])) { return Util::setArrayValue(self::$config[$scope], $path, $value); } else { return false; } } public static function hasOption($scope, $path = false) { if (isset(self::$config[$scope])) { if ($path === false) { return isset(self::$config[$scope]); } else { return Util::hasArrayValue(self::$config[$scope], $path); } } else { return false; } } public static function getPageGroupOptions($pagesConfig, $pagePath) { $parts = explode('/', $pagePath); $running = count($parts) - 1; for ($i = 0; $i <= count($parts); $i++) { $path = array(); for ($j = 0; $j <= $running; $j++) { $path[] = $parts[$j]; } $running--; $path = implode('/', $path); $path = $path . '/*'; if (Util::hasArrayValue($pagesConfig, $path)) { return Util::getArrayValue($pagesConfig, $path); } } return false; } public static function getPageOptionsByPath($path) { if (Util::hasArrayValue(self::$config['pages'], $path)) { return Util::getArrayValue(self::$config['pages'], $path); } else { return false; } } public static function getPageVendorFiles($type) { $files = array(); $vendors = Theme::getOption('vendors'); $pageVendors = Theme::getOption('page', 'assets/vendors'); if (empty($pageVendors)) { return array(); } foreach ($pageVendors as $name) { if (isset($vendors[$name]) && is_array($vendors[$name]) && isset($vendors[$name][$type])) { foreach ($vendors[$name][$type] as $each) { $files[] = $each; } } } return array_unique($files); } public static function hasPageVendorFiles($type) { $files = array(); $vendors = Theme::getOption('vendors'); $pageVendors = Theme::getOption('page', 'assets/vendors'); if (empty($pageVendors)) { return false; } foreach ($pageVendors as $name) { if (isset($vendors[$name]) && is_array($vendors[$name]) && isset($vendors[$name][$type])) { foreach ($vendors[$name][$type] as $each) { $files[] = $each; } } } return count(array_unique($files)) > 0; } public static function getPageVendorsCssFiles() { } public static function isProPage($path) { $pageConfig = self::getPageOptionsByPath($path); if ($pageConfig && isset($pageConfig['pro']) && $pageConfig['pro'] === true) { return true; } else { return false; } } public static function isExclusivePage($path) { $pageConfig = self::getPageOptionsByPath($path); if ($pageConfig && isset($pageConfig['exclusive']) && $pageConfig['exclusive'] === true) { return true; } else { return false; } } public static function getPageKey() { $el = (array)explode('/', self::getPagePath()); return end($el); } public static function getPagePath() { return self::$page; } public static function getPagePathPart($index) { $parts = explode('/', self::$page); return isset($parts[$index]) ? $parts[$index] : false; } public static function addHtmlAttribute($scope, $name, $value) { self::$htmlAttributes[$scope][$name] = $value; } public static function addHtmlAttributes($scope, $attributes) { foreach ($attributes as $key => $value) { self::$htmlAttributes[$scope][$key] = $value; } } public static function addHtmlClass($scope, $class) { self::$htmlClasses[$scope][] = $class; } public static function addCssVariable($scope, $name, $value) { self::$cssVariables[$scope][$name] = $value; } public static function printHtmlAttributes($scope) { $Attributes = array(); if (isset(self::$htmlAttributes[$scope]) && !empty(self::$htmlAttributes[$scope])) { echo Util::getHtmlAttributes(self::$htmlAttributes[$scope]); } echo ''; } public static function printHtmlClasses($scope, $full = true) { if (isset(self::$htmlClasses[$scope]) && !empty(self::$htmlClasses[$scope])) { $classes = implode(' ', self::$htmlClasses[$scope]); if ($full) { echo Util::getHtmlClass(self::$htmlClasses[$scope]); } else { echo Util::getHtmlClass(self::$htmlClasses[$scope], false); } } else { echo ''; } } public static function printCssVariables($scope) { $Attributes = array(); if (isset(self::$cssVariables[$scope]) && !empty(self::$cssVariables[$scope])) { echo Util::getCssVariables(self::$cssVariables[$scope]); } } public static function appendVersionToUrl($path) { // only at preview version if (self::$viewMode == 'preview') { $path .= '?v=' . self::getOption('theme/version'); } return $path; } public static function getView($path, $params = array(), $once = false) { global $_THEME_PATH, $_COMMON_PATH; $actual_path = $_THEME_PATH . '/dist/view/' . $path . '.php'; $common_path = $_COMMON_PATH . '/dist/view/' . $path . '.php'; // For multi demo, include from demo1 for other demos if (file_exists($actual_path) === false) { if (self::$demo != '' && self::$demo != 'demo1') { $actual_path = str_replace(self::$demo . '/', 'demo1/', $actual_path); } } // Get view from common(core)) if (file_exists($actual_path) === false && file_exists($common_path) === true) { // try to find in common $actual_path = $common_path; } // Override widget params if (self::hasOption('widgets')) { $widgets = self::getOption('widgets'); if (isset($widgets[$path]) && isset($widgets[$path]['params'])) { $params = array_replace_recursive($params, $widgets[$path]['params']); } } // Include view self::includeView($actual_path, $params, $once); } public static function getPageView($params = array()) { global $_THEME_PATH, $_COMMON_PATH; $actual_path = $_THEME_PATH . '/dist/view/pages/' . self::$config['page']['view'] . '.php'; $common_path = $_COMMON_PATH . '/dist/view/pages/' . self::$config['page']['view'] . '.php'; // For multi demo, include from demo1 for other demos if (file_exists($actual_path) === false) { if (self::$demo != '' && self::$demo != 'demo1') { $actual_path = str_replace(self::$demo . '/', 'demo1/', $actual_path); } } if (file_exists($actual_path) === false && file_exists($common_path) === true) { // try to find in common $actual_path = $common_path; } self::includeView($actual_path, $params); } public static function getCommonView($path, $params = array()) { global $_COMMON_PATH; $actual_path = $_COMMON_PATH . '/dist/view/' . $path . '.php'; self::includeView($actual_path, $params); } public static function includeView($path, $params = array(), $once = false) { if (!file_exists($path)) { echo '"' . $path . '" does not exist!
'; return; } if (isset($_REQUEST['layout-marker'])) { preg_match('/dist\/view\/(.*?)\.php$/', $path, $matches); if (! empty($matches)) { echo ''; if ($once === true) { include_once($path); } else { include($path); } echo ''; } } else { if ($once === true) { include_once($path); } else { include($path); } } return $path; } public static function importModal($name) { $modals = self::getOption('modals'); if (isset($modals[$name]) && isset(self::$importedModals[$name]) === false) { self::$importedModals[$name] = $modals[$name]; if (isset($modals[$name]['assets'])) { if (isset($modals[$name]['assets']['vendors'])) { if (isset(self::$config['page']['assets']['vendors'])) { self::$config['page']['assets']['vendors'] = array_merge(self::$config['page']['assets']['vendors'], $modals[$name]['assets']['vendors']); } else { self::$config['page']['assets']['vendors'] = $modals[$name]['assets']['vendors']; } } if (isset($modals[$name]['assets']['custom'])) { if (isset($modals[$name]['assets']['custom']['js'])) { if (isset(self::$config['page']['assets']['custom']['js'])) { self::$config['page']['assets']['custom']['js'] = array_merge(self::$config['page']['assets']['custom']['js'], $modals[$name]['assets']['custom']['js']); } else { self::$config['page']['assets']['custom']['js'] = $modals[$name]['assets']['custom']['js']; } } if (isset($modals[$name]['assets']['custom']['css'])) { if (isset(self::$config['page']['assets']['custom']['css'])) { self::$config['page']['assets']['custom']['css'] = array_merge(self::$config['page']['assets']['custom']['css'], $modals[$name]['assets']['custom']['css']); } else { self::$config['page']['assets']['custom']['css'] = $modals[$name]['assets']['custom']['css']; } } } } } } public static function importModalById($id) { $name = str_replace('#kt_modal_', '', $id); $name = str_replace('_', '-', $name); self::importModal($name); } public static function linkModal($name, $return = false) { $modals = self::getOption('modals'); if ($name && isset($modals[$name])) { self::importModal($name); } else { return; } $code = ' data-bs-toggle="modal"'; $code .= ' data-bs-target="#kt_modal_' . str_replace('-', '_', $name) . '"'; if ($return === true) { return $code; } else { echo $code; } } public static function hasImportedModals() { return !empty(self::$importedModals); } public static function includeImportedModals() { foreach (self::$importedModals as $name => $modal) { self::getView($modal['view'], (isset($modal['params']) ? $modal['params'] : null), true); } } public static function beginPageLayout($path, $params = array()) { self::$pageLayoutPath = $path; self::$pageLayoutParams = $params; ob_start(); } public static function getPageLayoutView() { echo self::$pageLayoutView; } public static function endPageLayout() { self::$pageLayoutView = ob_get_contents(); ob_end_clean(); self::getView(self::$pageLayoutPath, self::$pageLayoutParams); } public static function getAssetsPath() { global $_THEME_PATH; return $_THEME_PATH . '/dist/assets/'; } public static function getMediaPath() { return self::getAssetsPath() . 'media/'; } public static function getBaseUrlPath() { if (! isset($_SERVER['PHP_SELF'])) { return ''; } if (!empty($_SERVER['PHP_SELF'])) { return dirname($_SERVER['PHP_SELF']) . '/'; } return ''; } public static function getAssetsUrlPath() { return self::getBaseUrlPath() . 'assets/'; } public static function getMediaUrlPath() { return self::getAssetsUrlPath() . 'media/'; } public static function includeFonts($value = '') { if (self::hasOption('assets', 'fonts/google')) { $fonts = self::getOption('assets', 'fonts/google'); echo ''; } } public static function rtlCssFilename($path) { if (isset($_REQUEST['rtl']) && $_REQUEST['rtl'] == 1) { if (strpos($path, 'fullcalendar') !== false) { } else { $path = str_replace('.css', '.rtl.css', $path); } if (self::isDarkModeEnabled() && self::isDarkMode() && @$_REQUEST['mode'] != 'rtl') { if (strpos($path, 'plugins.bundle') !== false || strpos($path, 'style.bundle') !== false) { // import dark mode css $path = str_replace('.bundle', '.' . self::getCurrentMode() . '.bundle', $path); } } } elseif (self::isDarkModeEnabled() && self::isDarkMode() && @$_REQUEST['mode'] != 'rtl') { if (strpos($path, 'plugins.bundle.css') !== false || strpos($path, 'style.bundle.css') !== false) { // import dark mode css $path = str_replace('.bundle', '.' . self::getCurrentMode() . '.bundle', $path); } } return $path; } public static function isRTL() { if (isset($_REQUEST['rtl']) && $_REQUEST['rtl'] == 1) { return true; } else { return false; } } public static function strposa($haystack, $needle, $offset = 0) { if (!is_array($needle)) { $needle = array($needle); } foreach ($needle as $query) { if (strpos($haystack, $query, $offset) !== false) { return true; } // stop on first true result } return false; } /** * Check if current theme has dark mode * * @return bool */ public static function isDarkModeEnabled() { return (bool) self::getOption('layout', 'main/dark-mode-enabled'); } /** * Get current mode * * @return mixed|string */ public static function getCurrentMode() { if (self::isDarkModeEnabled() && isset($_REQUEST['mode']) && $_REQUEST['mode']) { return $_REQUEST['mode']; } return self::getOption('layout', 'main/dark-mode-default') === true ? 'dark' : 'light'; } /** * Check dark mode * * @return mixed|string */ public static function isDarkMode() { return self::getCurrentMode() === 'dark'; } public static function isPageBgWhite() { return (bool) self::getOption('layout', 'main/page-bg-white'); } public static function getPageUrl($path, $demo = '', $mode = null) { // Disable pro page URL's for the free version if (self::isFreeVersion() === true && self::isProPage($path) === true) { return "#"; } if ($path === '#') { return $path; } $baseUrl = self::getBaseUrlPath(); $params = ''; if (isset($_REQUEST['type']) && $_REQUEST['type'] === 'html') { // param keep in url if (isset($_REQUEST['rtl']) && $_REQUEST['rtl']) { $params = 'rtl/'; } if ($mode !== null) { if ($mode) { $params = $mode . '/'; } } else { if (isset($_REQUEST['mode']) && $_REQUEST['mode']) { $params = $_REQUEST['mode'] . '/'; } } if (!empty($demo)) { if (self::getViewMode() === 'release') { // force add link to other demo in release $baseUrl .= '../../' . $demo . '/dist/'; } else { // for preview $baseUrl .= '../' . $demo . '/' . $params; } } else { $d = ''; if (!empty(self::getDemo())) { $d = '../' . self::getDemo() . '/'; } if (self::getViewMode() === 'release') { // force add link to other demo in release $baseUrl .= '../' . $d . 'dist/'; } else { // for preview $baseUrl .= $d . $params; } } $url = $baseUrl . $path . '.html'; // skip layout builder page for generated html if (strpos($path, 'builder') !== false && self::getViewMode() === 'release') { if (!empty(self::getDemo())) { $path = self::getDemo() . '/' . $path; } $url = self::getOption('product', 'preview') . '/' . $path . '.html'; } } else { if (isset($_REQUEST['rtl']) && $_REQUEST['rtl']) { $params = '&rtl=1'; } if ($mode !== null) { if ($mode) { $params = '&mode=' . $mode; } } else { if (isset($_REQUEST['mode']) && $_REQUEST['mode']) { $params = '&mode=' . $_REQUEST['mode']; } } if (!empty($demo)) { // force add link to other demo $baseUrl .= '../../' . $demo . '/dist/'; } $url = $baseUrl . '?page=' . $path . $params; } return $url; } public static function isCurrentPage($path) { return self::$page === $path; } public static function getSvgIcon($path, $class = '', $svgClass = '') { $path = str_replace('\\', '/', trim($path)); $full_path = $path; if (! file_exists($path)) { $full_path = self::getMediaPath() . $path; if (! is_string($full_path)) { return ''; } if (! file_exists($full_path)) { return "\n"; } } $svg_content = file_get_contents($full_path); $dom = new DOMDocument(); $dom->loadXML($svg_content); // remove unwanted comments $xpath = new DOMXPath($dom); foreach ($xpath->query('//comment()') as $comment) { $comment->parentNode->removeChild($comment); } // add class to svg if (! empty($svgClass)) { foreach ($dom->getElementsByTagName('svg') as $element) { $element->setAttribute('class', $svgClass); } } // remove unwanted tags $title = $dom->getElementsByTagName('title'); if ($title['length']) { $dom->documentElement->removeChild($title[0]); } $desc = $dom->getElementsByTagName('desc'); if ($desc['length']) { $dom->documentElement->removeChild($desc[0]); } $defs = $dom->getElementsByTagName('defs'); if ($defs['length']) { $dom->documentElement->removeChild($defs[0]); } // remove unwanted id attribute in g tag $g = $dom->getElementsByTagName('g'); foreach ($g as $el) { $el->removeAttribute('id'); } $mask = $dom->getElementsByTagName('mask'); foreach ($mask as $el) { $el->removeAttribute('id'); } $rect = $dom->getElementsByTagName('rect'); foreach ($rect as $el) { $el->removeAttribute('id'); } $xpath = $dom->getElementsByTagName('path'); foreach ($xpath as $el) { $el->removeAttribute('id'); } $circle = $dom->getElementsByTagName('circle'); foreach ($circle as $el) { $el->removeAttribute('id'); } $use = $dom->getElementsByTagName('use'); foreach ($use as $el) { $el->removeAttribute('id'); } $polygon = $dom->getElementsByTagName('polygon'); foreach ($polygon as $el) { $el->removeAttribute('id'); } $ellipse = $dom->getElementsByTagName('ellipse'); foreach ($ellipse as $el) { $el->removeAttribute('id'); } $string = $dom->saveXML($dom->documentElement); // remove empty lines $string = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string); $cls = array('svg-icon'); if (! empty($class)) { $cls = array_merge($cls, explode(' ', $class)); } $asd = explode('/media/', $path); if (isset($asd[1])) { $path = 'assets/media/' . $asd[1]; } $output = "\n"; $output .= '' . $string . ''; $output .= "\n"; return $output; } public static function getProductName() { if (Theme::isFreeVersion() === true && self::getOption('product', 'name-free')) { return self::getOption('product', 'name-free'); } elseif (self::getOption('product', 'name-pro')) { return self::getOption('product', 'name-pro'); } else { return self::getOption('product', 'name'); } } public static function getProductNameHtml() { return '' . self::getProductName() . ' '; } public static function getProductDescription() { return self::getOption('product', 'description'); } public static function getSassVariableMap($key) { global $_COMMON_PATH; // get cache if available $variables = Util::getCache(__CLASS__ . '-' . __FUNCTION__); if (empty($variables)) { // get variable scss file content $content = file_get_contents($_COMMON_PATH . '/src/sass/components/_variables.scss'); // regex capture variables with array preg_match_all('/\$([A-Za-z0-9-]+): ?\((.*?)\) ?!default;/sm', $content, $matches); $variables = array_combine($matches[1], $matches[2]); foreach ($variables as &$variable) { preg_match_all('/"?([A-Za-z0-9-]+)"? ?:/', $variable, $matched); $variable = $matched[1]; } // keep cache in file Util::putCache(__CLASS__ . '-' . __FUNCTION__, $variables); } if (isset($variables[$key])) { return $variables[$key]; } return null; } public static function getPackageReferences() { global $_COMMON_PATH; $content = file_get_contents($_COMMON_PATH . '/tools/package.json'); $json = json_decode($content, true); $dependencies = $json['dependencies']; // predefined $references = array( array( 'name' => 'Node.js', 'url' => 'https://www.npmjs.com/', 'version' => '14.16.0', ), array( 'name' => 'Gulp', 'url' => 'https://gulpjs.com/', 'version' => '4.0.2', ), array( 'name' => 'Yarn', 'url' => 'https://yarnpkg.com/', 'version' => '1.22.10', ), array( 'name' => 'Duotune Icons', 'url' => 'https://keenthemes.com/products/duotune-pro', 'version' => '1.0.0', ), array( 'name' => 'FormValidation', 'url' => 'https://formvalidation.io/', 'version' => '1.8.0', ), array( 'name' => 'bootstrap-multiselectsplitter', 'url' => 'https://github.com/poolerMF/bootstrap-multiselectsplitter/', 'version' => '1.0.4', ), array( 'name' => 'toastr', 'url' => 'https://github.com/petekeller2/toastr', 'version' => '2.1.4', ), ); foreach ($dependencies as $plugin => $version) { try { $json_file = $_COMMON_PATH . '/tools/node_modules/' . $plugin . '/package.json'; if (!file_exists($json_file)) { continue; } $plugin_content = file_get_contents($json_file); $plugin_json = json_decode($plugin_content, true); $url = ''; if (isset($plugin_json['homepage'])) { $url = $plugin_json['homepage']; } elseif (isset($plugin_json['repository']['url'])) { // if it is a git url convert to normal url $url = preg_replace('/(git)?(\+https)?:\/\/(.*?)\.git$/', 'https://$3', $plugin_json['repository']['url']); } elseif (isset($plugin_json['bugs']['url'])) { $url = $plugin_json['bugs']['url']; } elseif (isset($plugin_json['funding'])) { $url = $plugin_json['funding']; if (isset($plugin_json['funding']['url'])) { $url = $plugin_json['funding']['url']; } } if (!empty($url)) { $references[$url] = array( 'name' => $plugin, 'url' => $url, 'version' => $plugin_json['version'] ?? '', ); } } catch (Exception $exception) { } } return $references; } public static function getChangelogInfo() { global $_THEME_PATH, $_COMMON_PATH; $changelog = array(); $common_path = $_COMMON_PATH . '/dist/changelog'; $current_path = $_THEME_PATH . '/dist/changelog'; // For multi demo, include from demo1 for other demos if (file_exists($current_path) === false) { if (self::$demo != '' && self::$demo != 'demo1') { $current_path = str_replace(self::$demo . '/', 'demo1/', $current_path); } } // Read core changelog dir if ($handle = @opendir($common_path)) { while (false !== ($entry = readdir($handle))) { $path = $common_path . '/' . $entry; if ($entry != "." && $entry != ".." && file_exists($path)) { $array = include($common_path . '/' . $entry); $changelog = array_replace_recursive($changelog, $array); } } closedir($handle); } // Read current changelog dir if ($handle = @opendir($current_path)) { while (false !== ($entry = readdir($handle))) { $path = $current_path . '/' . $entry; if ($entry != "." && $entry != ".." && file_exists($path)) { $array = include($path); $changelog = array_replace_recursive($changelog, $array); } } closedir($handle); } // reverse sort by key uasort($changelog, function ($a, $b) { $a = strtotime($a['date']); $b = strtotime($b['date']); if ($a == $b) { return 0; } return ($a < $b) ? 1 : -1; }); return $changelog; } public static function getVersion() { return self::getOption("product", "version"); } public static function addPageJs($path) { self::$config["page"]["assets"]['custom']['js'][] = $path; } public static function getCorePath() { return __DIR__ . '/../..'; } public static function getImageUrl($folder, $file, $flip = true) { $folder = ltrim($folder, '/'); $folder = rtrim($folder, '/'); $path = Theme::getMediaUrlPath() . $folder . '/' . $file; if (Theme::isDarkMode() && $flip === true) { $file = str_replace(".svg", "-dark.svg", $file); $file = str_replace(".png", "-dark.png", $file); $file = str_replace(".jpg", "-dark.jpg", $file); $path_dark_path = Theme::getMediaPath() . $folder . '/' . $file; $path_dark_url_path = Theme::getMediaUrlPath() . $folder . '/' . $file; if (file_exists($path_dark_path)) { return $path_dark_url_path; } } return $path; } public static function getIllustrationUrl($file, $flip = true) { $folder = 'illustrations/' . Theme::getOption('layout', 'illustrations/set'); $folder = ltrim($folder, '/'); $folder = rtrim($folder, '/'); $path = Theme::getMediaUrlPath() . $folder . '/' . $file; return self::getImageUrl($folder, $file, $flip); } public static function getPagesConfig($config, &$result = array()) { foreach ($config as $key => $page) { if ($key === '*') { continue; } if (isset($page['view']) && (isset($page['title']))) { $page['path'] = $config['path'] . '/' . $key; $result[] = $page; } elseif (is_array($page)) { if (isset($config['path'])) { $page['path'] = $config['path'] . '/' . $key; } else { $page['path'] = $key; } self::getPagesConfig($page, $result); } } return $result; } public static function printJsHostUrl() { echo sprintf('var hostUrl = "%s";', self::getAssetsUrlPath()); } }