* @since Version 1.0 * */ /** * PROPERTY DEFINITIONS * ------------------------------------------------- * DASHBOARD DATA PROPERTIES * ------------------------------------------------- * @property mixed FTD * @property mixed CONT_TYPE * @property int NOW * @property mixed QUARTERS * @property mixed SEL_QUARTER * @property mixed SEL_YEAR * @property mixed DASHBOARD_PORTLETS * @property mixed DASHBOARD_PORTLETS_2_TPL * @property mixed DASHBOARD_PORTLETS_SELECTED * @property mixed SYSTEM_NEWS * @property bool SYSTEM_NEWS_LOAD_MORE * @property bool SYSTEM_LOG * @property bool SYSTEM_LOG_LOAD_MORE * @property int PAGE * @property string TODAY * @property string CURRENT_MONTH * @property string NAME_DAYS * @property string STATUS_DATA * * ------------------------------------------------- * VIEW DATA PROPERTIESC * ------------------------------------------------- * @property mixed DIS_NEW_BTN * @property mixed DISABLE_TITLE * @property mixed SHOW_BTN_LABELS * @property mixed CUSTOM_TPL_HEADER_DATA * ------------------------------------------------- * VIEW DATA PROPERTIES * ------------------------------------------------- * @property mixed d * @property mixed data * @property mixed DATA * @property mixed DATE * @property mixed CFG * * ------------------------------------------------- * USER VIEW DATA PROPERTIES * ------------------------------------------------- * @property mixed U * @property mixed SYS_LOGIN * @property mixed TODAY_YEAR * @property mixed NONE_PAID * @property mixed CURRENT_YEAR * @property mixed CURRENT_QUARTER * @property mixed SUBSCRIPTION_DATA * @property mixed DISPLAY_RED_NOTIFICATION * @property mixed TRIAL * @property mixed TRIAL_EXPIRED * @property mixed TRIAL_TILL * @property mixed infoData * @property mixed NO_HEADER * @property mixed GENDER * @property mixed USER_ONLY_AUTH * @property mixed SESSION_EXPIRED_LOGIN * @property mixed SETTINGS_TITLE * @property mixed TBL_FIELDS * @property mixed PER_PAGE * @property mixed URLS2COMPANY * * ------------------------------------------------- * PARTNERS DATA PROPERTIES * ------------------------------------------------- * @property mixed P * @property mixed bUseNewStructure * @property mixed bEdit * @property mixed ONLY_BLANK * @property mixed EXTERNAL_SECTION * @property mixed EXTERNAL_FORM_TITLE * @property mixed SLIDER_IFRAME_LOAD * @property mixed PUB_FILE_UPLOAD * @property mixed TABLE * @property mixed SYS * @property mixed SYSTEM_GUIDES * @property mixed PRE_BODY * @property mixed USER_TITLE * @property mixed showYears * @property mixed DISABLE * @property mixed DISABLED * @property mixed TPASSWD * @property mixed PROP_CLASSES * @property mixed SUB * @property mixed USER * @property mixed CFG_INP * @property array LINKS * @property boolean PROFILE * @property mixed GOOGLE_AUTH * @property boolean HIDE_CLOSE * @property boolean PW_CHANGE * @property boolean FULL_HEADER_LINE * @property boolean DISABLE_HEADER_TYPES * @property boolean ASSOC_AP * @property string DEADLINE * @property array PRIORITIES * @property array LANGUAGES * @property array userCompanies * @property mixed TWO_FA_SECRET * @property mixed TWO_FA_SECRET_QR * @property boolean HIDE_SEARCH * @property mixed SHOW_PERSONAL_ON_LOAD * @property mixed PERSONALTYPES * @property mixed COUNTRYCODES * @property mixed ADDRESSES * @property mixed SETTINGS * @property mixed DEBCRED * @property mixed BANK * @property mixed REQ * @property mixed TRANSACTIONS * @property mixed INST_SECTOR * @property mixed TYPES_TO_SHOW * @property mixed TYPES_TO_SHOW_2 * @property mixed COMP_STARTING_YEAR * @property mixed DISABLE_CHANGE_CP_START_YEAR * @property mixed YEARS * @property mixed PARTNERS * @property mixed AP_METERS * @property mixed PROJECTS * @property mixed STATUS * @property mixed VAT_PAYER_STATUS * @property mixed TAX_STATUS * @property mixed BODY * @property array TBL_SORT * * ------------------------------------------------- * OBJECT DATA PROPERTIES * ------------------------------------------------- * @property array SUB_TITLE * @property array BILL_TYPES * @property array METER_UNITS_M * @property array METER_TYPES * @property array MEASUREMENT_TYPES * @property array CHANGE_NEXT_VER * @property array TYPES * @property array RP * @property array TYPES_OF_FOUNDS * @property array bType * @property array CODES * @property array ROWS * @property array LIST_BTN * @property array MODULE_TITLE * @property array TABLE_LEGEND * @property array DISABLED_NAVIGATING_ELEMENTS * @property array PRESERVE_BUTTONS * @property array DEFAULT_SEARCH_VALUES * @property array LIST_HEADER * @property array DATA_TABLE_NAME * @property array LIST_HEADER_SORTABLE * @property array LIST_DATA * @property array LIST_ACTIONS * @property bool DISABLE_SEARCH_HIDE * @property bool JOURNAL_BASED_ACCOUNT * * ------------------------------------------------- * OUTGOING MAIL CONTROLLER VIEW PROPERTIES * ------------------------------------------------- * @property mixed vLangs * @property mixed vMailTypes * @property bool readonly * @property int iDefaultLang * * ------------------------------------------------- * OTHER CONTROLLER VIEW PROPERTIES * ------------------------------------------------- * @property int OBJECTS * @property mixed SECTORS * @property mixed SECTOR_TYPES * @property mixed USERS * @property mixed ERROR_MESSAGE * @property mixed ASSIGNMENTS * @property mixed BUGS * @property mixed BUG_FINISHED * @property mixed vCFG * @property mixed JOURNAL_COLUMNS * @property mixed TABLE_BOTTOM_ADDITIONAL_DATA * * ------------------------------------------------- * ACCOUNTING VIEW PROPERTIES * ------------------------------------------------- * @property mixed TABLE_ROWS_CONTAINER * @property mixed DEPRECIATION * @property mixed MEASUREMENT * @property mixed DISABLE_DATES * @property mixed ADDITIONAL_STATUS_MSG * @property mixed R_ID * @property mixed COLUMNS * @property mixed CODE * @property mixed ASSETS * @property mixed PVN * @property mixed DIVISIONS * @property mixed TRANSPORTS * @property mixed REGTYPE * @property mixed VAT_PAYER * * * ------------------------------------------------- * DOCUMENT VIEW PROPERTIES * ------------------------------------------------- * @property mixed APARTMENTS * * * ------------------------------------------------- * DOCUMENT VIEW PROPERTIES * ------------------------------------------------- * @property mixed LAYOUT * @property mixed BILL_CORRECTION * @property mixed SHOW_FINAL_AMOUNT * @property mixed SHOW_ADVANCED_PAYMENTS * @property mixed SHOW_DEBT_OVERPAY * @property mixed DEBT_OVERPAY * @property array ADVANCED_PAYMENTS * @property mixed NO_PAIMENT * @property mixed LOCK_STATUS * @property mixed DATA_NOT_SAVED * @property mixed REGISTER_TYPES * @property mixed PAID_STATUS * @property mixed LINK * @property mixed DATA_ROW_EXISTS_CUSTOM_MSG * @property mixed DATA_ROW_EXISTS * @property mixed LOGO * @property mixed VAT * @property mixed TABLE_FIELDS * @property mixed SHOW_SUBTOTAL * @property mixed SHOW_SIG_FOR_SUP * @property mixed SHOW_SIG_FOR_BEN * @property mixed CONTENT * @property mixed PERSONAL * @property mixed PREFIX * @property mixed DOC_TYPES * @property mixed DOC_SETTINGS * @property mixed REQUISITES * @property mixed ADDRESS * @property mixed TABLE_DATA * @property mixed TOTAL_MILEAGE * @property mixed CONFIRM_STATUS * @property mixed CONFIRM_SETTINGS * @property mixed REQUISITES_DATA * @property mixed REQUISITES_ADDRESSES * @property mixed REQUISITES_PERSONAL * @property mixed DRIVERS * @property mixed ROWS_FILLED * @property mixed TABLE_SUMMARY * @property mixed ADDITIONAL_PDF_CSS_FILE * @property string DOCUMENT_TPL * @property string DOCUMENT_VIEW_TPL * @property string DOC_MESSAGES * @property string SIGNATURE_DATE_1 * @property string SIGNATURE_DATE_2 * * * * */ class cView { private $oTwig; private $oLoader; private $cConsole; private $cCoreModule; public $sTplDirCore; public $sTplDirHelpers; public $sTplDirLayouts; private $_js = []; private $_css = []; private $_cache = []; private $_params = []; private $_json_params = []; private $_fileVersion = 524; private $_sContentVarKey = 'CONTENT'; private $_tplExt = array('twig', 'tpl', 'html', 'htm'); public $bIsCms = false; public $bIsNew = false; public $bPubIsSys = true; public $template_cfg = []; /** * Class constructor * * @author Mareks Keišs * @category View * @param cCore|bool|object $cCoreInst */ public function __construct(&$cCoreInst = false) { // Define default values if (!defined('DEBUG_MODE')) define('DEBUG_MODE', false); if (!defined('CUSTOM_SESSION_LIFE')) define('CUSTOM_SESSION_LIFE', 60 * 60 * 24); if (!defined('CMS_VERSION')) define('CMS_VERSION', 'X'); if (!defined('COMPOSER_DIR')) define('COMPOSER_DIR', '/vendor/autoload.php'); if (!defined('SYS_LOGIN_MAP_ID')) define('SYS_LOGIN_MAP_ID', 0); if (!defined('PUB_LOGIN_MAP_ID')) define('PUB_LOGIN_MAP_ID', 0); // Setup dir path $sDir = __DIR__ ? __DIR__ : dirname(__FILE__); // Setup console output object - singleton $this->cConsole = cSysConsole::getInstance(); // Setup directories $this->sTplDirCore = "{$sDir}/tpl/core/"; $this->sTplDirHelpers = "{$sDir}/tpl/helpers/"; $this->sTplDirLayouts = "{$sDir}/tpl/layouts/"; // ---------------------------------------------------------------------- // Twig engine // ---------------------------------------------------------------------- // Set loader directories & setup TWIG $this->oLoader = new FilesystemLoader( [$this->sTplDirCore, $this->sTplDirHelpers, $this->sTplDirLayouts, __IMG__] ); $this->oTwig = new Environment($this->oLoader, [ 'cache' => (DEBUG_MODE ? false : __CACHE__) ]); // Append custom TWIG functions $oFunction = new TwigFunction('callFunction', function ($sFnTitle, $vFnData) { return $this->checkAndCallUserFunction($sFnTitle, $vFnData); }); $this->oTwig->addFunction($oFunction); $oFunction = new TwigFunction('prepForDisplayHtml', function ($data) { return prepForDisplayHtml($data); }); $this->oTwig->addFunction($oFunction); $oFunction = new TwigFunction('prepForOriginalHtml', function ($data) { return prepForOriginalHtml($data); }); $this->oTwig->addFunction($oFunction); $this->oTwig->addGlobal('cookies', $_COOKIE); // ---------------------------------------------------------------------- // End Twig engine // ---------------------------------------------------------------------- // Set core class instance $this->cCoreModule = $cCoreInst; } /** * Function to set variables to view * * @author Mareks Keišs * @category View * @param string $index * @param mixed $value * @return void */ public function __set($index, $value) { if ($index) { $this->_params[$index] = $value; } } /** * Function to set variables to view * * @author Mareks Keišs * @category View * @param mixed $index * @return mixed */ public function __get($index) { if (isset($this->_params[$index])) { return $this->_params[$index]; } return false; } /** * Function to get all variables set to view * * @author Mareks Keišs * @category View * @return mixed */ public function getAllSetParams() { if (!!$this->_params) { return $this->_params; } return false; } /** * Function to load js file * * @author Mareks Keišs * @category View * @param string $file_path - name to file * @param bool $cache - cache file name * @param array $vExcludeFiles - exclude files in cache mechanism * @return bool true */ public function setJs( $file_path, $cache = false, $vExcludeFiles = [ 'tinymce.min.js', 'jquery.tinymce.min.js', 'jquery.fileupload.js', 'jquery.iframe-transport.js', ] ) { $file = preg_replace('/\/+/', '/', (($cache ? __CACHE__ : __MDIR__) . $file_path)); if (file_exists($file) && filesize($file)) { if ($cache) { $this->_js = []; $this->_cache[] = $file_path; } else { $sBaseName = basename($file_path); if ( !DEBUG_MODE && !empty($this->cCoreModule->uri_data['p_autocache']) && !in_array($sBaseName, $vExcludeFiles) ) { // Check if file is cached - create cache & create copy in cache if (!file_exists(__CACHE__ . $sBaseName)) { if (!strpos('--' . $sBaseName, '.min.')) { $oMin = new cMinify(); if (!$oMin->minifyCssOrJsFileV2($file, cMinify::FILE_TYPE_JS, true)) return false; } else { // Save minified file to cache folder copy($file, __CACHE__ . $sBaseName); } } $this->_js[] = __RCACHE__ . $sBaseName; } else $this->_js[] = $file_path; } return true; } return false; } /** * Function to load css file * * @author Mareks Keišs * @category View * @param string $file_path - name to file * @param bool $cache - cache file name * @return bool true */ public function setCss($file_path, $cache = false) { $file = preg_replace('/\/+/', '/', (($cache ? __CACHE__ : __MDIR__) . $file_path)); if (file_exists($file) && filesize($file)) { if ($cache) { $this->_css = []; $this->_cache[] = $file_path; } else { if (!DEBUG_MODE && !empty($this->cCoreModule->uri_data['p_autocache'])) { // Check if file is cached - create cache & create copy in cache if (!file_exists(__CACHE__ . basename($file_path))) { if (!strpos('--' . basename($file_path), '.min.')) { $oMin = new cMinify(); if (!$oMin->minifyCssOrJsFileV2($file, cMinify::FILE_TYPE_CSS, true)) return false; } else { // Save minified file to cache folder copy($file, __CACHE__ . basename($file_path)); } } $this->_css[] = __RCACHE__ . basename($file_path); } else $this->_css[] = $file_path; } return true; } return false; } /** * Function to drop css & js modules * * @author Mareks Keišs * @category View * @return void */ public function dropCssJs() { $this->_js = []; $this->_css = []; $this->_cache = []; } /** * Helper function to set smarty directory * * @author Mareks Keišs * @category View * @param string $dir_path - name to folder * @return bool true */ public function setTemplateDir($dir_path) { // Add & set loader additional path for Twig $this->oLoader->prependPath("{$dir_path}"); $this->oTwig->setLoader($this->oLoader); return true; } /** * Function to set variables for JSON encode & js decode * * @author Mareks Keišs * @category View * @param string $index * @param mixed $value * @return void */ public function setAsJSON($index, $value) { if ($index) $this->_json_params[$index] = cJSON::encode($value, true); } /** * Helper function to display template * * @param bool|string $sTplName - name to template * @param bool|string $sSetToVar - set to named variable * @param bool $bDirectDisplay - display as base tpl * @return void - prints template data * @author Mareks Keišs * @category View */ public function display($sTplName = false, $sSetToVar = false, $bDirectDisplay = false) { // Set variables to view $this->setViewVariables(); // Check template exists if ( !$bDirectDisplay && isset($this->cCoreModule->uri_data['mod_use_tmpl']) && $this->cCoreModule->uri_data['mod_use_tmpl'] ) { // Check and add file extension $this->chkTplExt($sTplName); $this->chkTplExt($this->cCoreModule->uri_data['mod_use_tmpl']); // Lookup template if (!$this->oLoader->exists($this->cCoreModule->uri_data['mod_use_tmpl'])) { die($this->cCoreModule->gM('Main Template not found!')); } if ($sSetToVar) { if ($this->oLoader->exists($sTplName)) { $this->_params[$sSetToVar] = $this->renderViewTemplate($sTplName); } else { $this->_params[$sSetToVar] = $this->cCoreModule->gM('Template not found!'); } } // Set to template body $this->_params[$this->_sContentVarKey] = $this->renderViewTemplate( $this->cCoreModule->uri_data['mod_use_tmpl'] ); } else { // Set to template body $this->chkTplExt($sTplName); if (!$this->oLoader->exists($sTplName)) { die($this->cCoreModule->gM('Main Template not found!')); } $this->_params[$this->_sContentVarKey] = $this->renderViewTemplate($sTplName); } // Use cache if (!!$this->_cache) { foreach ($this->_cache as $v) { switch (getExtension($v)) { case 'js': array_unshift($this->_js, $v); break; case 'css': array_unshift($this->_css, $v); break; } } } // Setup user theme if (!!$this->cCoreModule) { $vThemes = false; $sUserThemeTitle = ''; if ($this->cCoreModule->is_cms) { $vThemes = sysUsersManagerController::$CMS_FORM_THEMES; } // Get user selected theme - if logged in if (!!$this->cCoreModule->oUser && !!$this->cCoreModule->oUser->oCfg) { $sUserThemeTitle = $this->cCoreModule->oUser->oCfg->getValueProperty('sThemetitle'); } // Set default theme if (!!$vThemes) { if (!isset($vThemes[$sUserThemeTitle])) { foreach ($vThemes as $k => $v) { if (!empty($v['default'])) { $sUserThemeTitle = $k; break; } } } // Add theme $this->setCss($vThemes[$sUserThemeTitle]['f']); } } // Display template $this->chkAndGenConsoleDataTpl(); // Set js versions if (!!$this->_js) { foreach ($this->_js as &$v) { $v .= "?v={$this->_fileVersion}"; } } // Set css versions if (!!$this->_css) { foreach ($this->_css as &$v) { $v .= "?v={$this->_fileVersion}"; } } // Setup css & js arrays $this->_params['JS'] = str_replace('\\', '/', $this->_js); $this->_params['CSS'] = str_replace('\\', '/', $this->_css); // Setup main details of page $this->_params['MAP'] = $this->cCoreModule->uri_data; // Switch base template $templateToRender = 'body.twig'; if ($this->bIsCms) { $templateToRender = ($this->bIsNew ? 'cms-html-n.twig' : 'cms-body.twig'); } // Render final template echo $this->renderViewTemplate($templateToRender); } /** * Helper function to get generated template * * @author Mareks Keišs * @category View * @param string $sTplName - template name * @return string - template data */ public function genTemplate($sTplName) { // Set variables $this->setViewVariables(); // Validate extension $this->chkTplExt($sTplName); // Get console template data $sConsole = $this->chkAndGenConsoleDataTpl(true); // Return template data if ($this->oLoader->exists($sTplName)) { return $this->renderViewTemplate($sTplName) . $sConsole; } else { return $this->cCoreModule->gM('Template not found!'); } } /** * Function to generate console template with data if DEBUG_MODE enabled * * @author Mareks Keišs * @category View * @param bool $bAddInitScript - add initialize script * @return string - template data */ private function chkAndGenConsoleDataTpl($bAddInitScript = false) { // If debug, setup console data if (DEBUG_MODE && $this->cCoreModule->cTimer) { // Stop base timer $this->cCoreModule->cTimer->stop(); // Set console data $this->_params['CONSOLE_SCRIPT'] = $bAddInitScript; $this->_params['CONSOLE_DATA'] = $this->cConsole->getLineData(); // Return tpl data only on posts - otherwise data included in core tpl if ($bAddInitScript) { if (file_exists("{$this->sTplDirHelpers}console/console.tpl")) { return $this->renderViewTemplate('console/console.tpl'); } } else { $this->setJs('/js/brs.console.js'); $this->setCss('/css/cms-debug-console.css'); } } return ''; } /** * Helper function to check template extension type and add if necessary * * @author Mareks Keišs * @category View * @param string $tplName - name of template * @return void */ public function chkTplExt(&$tplName) { $ext = getFileExtension($tplName); if ($ext) { if (!in_array($ext, $this->_tplExt)) { $tplName = substr($tplName, 0, strlen($tplName) - strlen($ext)) . $this->_tplExt[0]; } } else { $tplName .= '.' . $this->_tplExt[0]; } } /** * Helper function to generate template bases on different engine * * @author Mareks Keišs * @category View * @param string $sTplName - name of template * @return string */ private function renderViewTemplate($sTplName) { // Twig case $oTemplate = $this->oTwig->load($sTplName); $htmlData = $oTemplate->render($this->_params); return $htmlData; } /** * Helper function to get generated helper view template * * @author Mareks Keišs * @category View * @param string $sTplName - name to helper view * @return string - template name */ public function genHelperView($sTplName) { // Set variables $this->setViewVariables(); // Validate extension $this->chkTplExt($sTplName); // Get console template data $sConsole = $this->chkAndGenConsoleDataTpl(true); // Return template data if ($this->oLoader->exists($sTplName)) { return $this->renderViewTemplate($sTplName) . $sConsole; } else { return $this->cCoreModule->gM('Template not found!'); } } /** * Function to set view variables * * @author Mareks Keišs * @category View * @return void */ private function setViewVariables() { // Directory configuration $this->_params['DIR'] = [ 'js' => __JS__, 'css' => __CSS__, 'img' => __IMG__, 'upd' => __FILES__, 'lib' => __LIB__, 'thelper' => $this->sTplDirHelpers ]; // Set session life $this->_json_params['sessionTime'] = cJSON::encode(CUSTOM_SESSION_LIFE, true); $cartData = []; $cartCounter = 0; if (!empty($_SESSION['cart']['data']) && is_array($_SESSION['cart']['data'])) { $cartData = $_SESSION['cart']['data']; if (isset($cartData['total']) && is_numeric($cartData['total'])) { $cartCounter = (int)$cartData['total']; } elseif (!empty($cartData['cat']) && is_array($cartData['cat'])) { foreach ($cartData['cat'] as $products) { if (empty($products) || !is_array($products)) { continue; } foreach ($products as $item) { if (!empty($item['count'])) { $cartCounter += (int)$item['count']; } } } } if (!isset($cartData['subtotal']) || !is_numeric($cartData['subtotal'])) { $cartSubtotal = 0; if (!empty($cartData['cat']) && is_array($cartData['cat'])) { foreach ($cartData['cat'] as $products) { if (empty($products) || !is_array($products)) { continue; } foreach ($products as $item) { if (!empty($item['count']) && isset($item['p'])) { $cartSubtotal += ((float)$item['count'] * (float)$item['p']); } } } } $cartData['subtotal'] = $cartSubtotal; } $cartData['total'] = $cartCounter; } $this->_params['cart'] = $cartData; $this->_params['cart_counter'] = $cartCounter; // Set wishlist counter for logged in public user $wishlistCounter = 0; if (!$this->bIsCms && !empty($_SESSION['pub-user']['id'])) { $userId = (int)$_SESSION['pub-user']['id']; if ($userId > 0 && class_exists(pubUsersModule::class)) { $wishlistModule = new pubUsersModule(); $wishlistCounter = $wishlistModule->getWishlistCount($userId); } } $this->_params['wishlist_counter'] = $wishlistCounter; if (!$this->bIsCms && defined('PUB_LOGIN_MAP_ID')) { $this->setAsJSON('cartLink', $this->cCoreModule->gL(896)); $this->setAsJSON('profileLink', $this->cCoreModule->gL(905)); } // Set session expired login request link if ($this->bIsCms) { if (defined('SYS_LOGIN_MAP_ID')) { $sRequestUrl = $this->cCoreModule->gL(SYS_LOGIN_MAP_ID, 'action:loginf'); $this->_json_params['sessionLoginLink'] = cJSON::encode($sRequestUrl, true); } } elseif (defined('PUB_LOGIN_MAP_ID')) { if (!empty($this->cCoreModule->selCompId) && $this->cCoreModule->selCompId > 0) { $sRequestUrl = $this->cCoreModule->gL( PUB_LOGIN_MAP_ID, 'action:loginf/cp:' . urlencode( $this->cCoreModule->oDefuseCrypt->encrypt($this->cCoreModule->selCompId) ) ); $this->_json_params['sessionLoginLink'] = cJSON::encode($sRequestUrl, true); } } // Set json encode variables for auto decode in base class if (isset($this->_json_params)) { $this->_params['JSON_PARAMS'] = $this->_json_params; } // Load module for templates $this->_params['dt'] = &$this->cCoreModule; // Set constants $this->_params['CMS_VERSION'] = CMS_VERSION; $this->_params['BRAND_NAME'] = defined('BRAND_NAME') ? BRAND_NAME : 'Elixir Vault'; $this->_params['BRAND_NAME_UPPER'] = defined('BRAND_NAME_UPPER') ? BRAND_NAME_UPPER : 'ELIXIRVAULT'; $this->_params['BRAND_DOMAIN'] = defined('BRAND_DOMAIN') ? BRAND_DOMAIN : 'elixirvault.lv'; $this->_params['BRAND_LOCAL_DOMAIN'] = defined('BRAND_LOCAL_DOMAIN') ? BRAND_LOCAL_DOMAIN : 'local.elixirvault.lv'; $this->_params['BRAND_SUPPORT_EMAIL'] = defined('BRAND_SUPPORT_EMAIL') ? BRAND_SUPPORT_EMAIL : 'info@elixirvault.lv'; $this->_params['BRAND_STORE_NAME'] = defined('BRAND_STORE_NAME') ? BRAND_STORE_NAME : 'elixirvault.lv'; } /** * Function to get template names in array * * @author Mareks Keišs * @category View * @return array of available templates */ public function getTemplates() { $templates = []; $bannedTemplates = [ '' ]; foreach (scandir($this->sTplDirLayouts) as $v) { if (!in_array(strtolower($v), $bannedTemplates)) { if (!is_dir($this->sTplDirCore . $v)) { $templates[] = substr($v, 0, strrpos($v, '.')); } } } return $templates; } /** * Function to get indicator whether cache is used * * @author Mareks Keišs * @category View * @return bool true / false */ public function cacheUsed(): bool { return !!$this->_cache; } /** * Function to call user custom function from TWIG * * @author Mareks Keišs * @category View * @return bool true / false */ public function checkAndCallUserFunction($sFnTitle, $vFnData) { if (is_callable($sFnTitle)) { return call_user_func_array($sFnTitle, $vFnData); } return false; } }