. * */ namespace Vvveb\Controller; use \Vvveb\System\Core\FrontController; use \Vvveb\System\Functions\Str; use function Vvveb\availableCurrencies; use function Vvveb\availableLanguages; use function Vvveb\clearLanguageCache; use function Vvveb\filter; use function Vvveb\setLanguage; use function Vvveb\siteSettings; use Vvveb\System\Core\View; use Vvveb\System\Event; use Vvveb\System\Images; use Vvveb\System\PageCache; use Vvveb\System\Sites; use Vvveb\System\User\Admin; use Vvveb\System\User\User; #[\AllowDynamicProperties] class Base { protected $global; protected function language($defaultLanguage = false, $defaultLanguageId = false, $defaultLocale = false, $defaultCode = false, $languages = null) { $languages = $languages ?? availableLanguages(); $default_language = $this->session->get('default_language'); $default_language_id = $this->session->get('default_language_id'); $default_locale = $this->session->get('default_locale'); $default_code = $this->session->get('default_code'); $default_rtl = false; $site_language = false; if (($lang = ($this->request->post['language'] ?? $this->request->get['language'] ?? false)) && ! is_array($lang)) { $language = filter('/[A-Za-z_-]+/', $lang, 10); if (isset($languages[$language])) { $this->session->set('language', $language); $this->session->set('language_id', $languages[$language]['language_id']); $this->session->set('locale', $languages[$language]['locale']); $this->session->set('code', $languages[$language]['code']); $this->session->set('rtl', $languages[$language]['rtl'] ?? false); $default_language = false; //recheck default language //clearLanguageCache($language); } } if (! $default_language) { foreach ($languages as $code => $lang) { //set site language if ($defaultLanguageId && ($defaultLanguageId == $lang['language_id'])) { $site_language = $code; $site_language_id = $lang['language_id']; $site_locale = $lang['locale']; $site_code = $lang['code']; } //set global default language if ($lang['default']) { $default_language = $code; $default_language_id = $lang['language_id']; $default_locale = $lang['locale']; $default_code = $lang['code']; $default_rtl = $lang['rtl'] ?? false; } } if ($site_language) { $default_language = $site_language; $default_language_id = $site_language_id; $default_locale = $site_locale; $default_code = $site_code; } //no valid default site or global language? set english as default if (! $default_language) { $default_language = 'en'; $default_language_id = 1; $default_locale = 'en-us'; $default_code = 'en_US'; $default_rtl = false; } $this->session->set('default_language', $default_language); $this->session->set('default_language_id', $default_language_id); $this->session->set('default_locale', $default_locale); $this->session->set('default_code', $default_code); } $language = $this->session->get('language') ?? $default_language; $language_id = $this->session->get('language_id') ?? $default_language_id; $locale = $this->session->get('locale') ?? $default_locale; $code = $this->session->get('code') ?? $default_code; $rtl = $this->session->get('rtl') ?? false; //if no default language configured then set first language as current language if (! isset($languages[$language])) { $language = null; $default_language = key($languages); $lang = $languages[$default_language] ?? []; if ($lang) { $default_language_id = $lang['language_id'] ?? $defaultLanguageId; $default_locale = $lang['locale'] ?? $defaultLocale; $default_code = $lang['code'] ?? $defaultCode; $default_rtl = $lang['rtl'] ?? false; } } //if no language configured then set default language as current language if (! $language) { $language = $default_language; $language_id = $default_language_id; $locale = $default_locale; $code = $default_code; $rtl = $default_rtl; $this->session->set('language', $language); $this->session->set('language_id', $language_id); $this->session->set('locale', $locale); $this->session->set('code', $code); $this->session->set('rtl', $rtl); } $this->global['language'] = $language; $this->global['locale'] = $locale; $this->global['language_id'] = $language_id; $this->global['rtl'] = $rtl; $this->global['default_language'] = $default_language; $this->global['default_locale'] = $default_locale; $this->global['default_language_id'] = $default_language_id; setLanguage($code); } protected function currency($defaultCurrency = false, $defaultCurrencyId = false) { if (($currency = ($this->request->post['currency'] ?? false)) && ! is_array($currency)) { $currency = filter('/[A-Za-z_-]+/', $currency, 50); $currencies = availableCurrencies(); if (isset($currencies[$currency])) { $this->session->set('currency_id', $currencies[$currency]['currency_id']); $this->session->set('currency', $currency); \Vvveb\System\Cart\Cart::getInstance($this->global)->updateCart(); } } $currency = $this->session->get('currency'); $currency_id = $this->session->get('currency_id'); if (! $currency || ! $currency_id) { $currencies = availableCurrencies(); if ($currencies) { foreach ($currencies as $code => $c) { if ($defaultCurrency && ($defaultCurrency == $c['code']) || ($defaultCurrencyId && ($defaultCurrencyId == $c['currency_id']))) { $currency = $c['code']; $currency_id = $c['currency_id']; break; } } //if no site currency configured set first available currency if (! $currency) { $c = reset($currencies); $currency = $c['code']; $currency_id = $c['currency_id']; } } $this->session->set('currency', $currency); $this->session->set('currency_id', $currency_id); } $this->global['currency'] = $currency; $this->global['currency_id'] = $currency_id; } protected function initEcommerce($countryId, $regionId) { $tax = \Vvveb\System\Cart\Tax::getInstance(); $tax->setRegionRules($countryId, $regionId, 'store'); } function init() { if (! $this->session->get('csrf')) { $this->session->set('csrf', Str::random()); } $admin = Admin::current(); //check if theme preview $theme = $this->request->get['theme'] ?? false; if ($theme) { //check if admin user to allow theme preview if ($admin) { $this->view->setTheme($theme); } } $siteData = Sites :: getSiteData(); if (isset($siteData['state']) && $siteData['state'] != 'live') { if (! $admin) { $template = Sites::getStates()[$siteData['state']]['template']; $this->view->template($template); //die($this->view->render()); $this->response->output(); } } $site = siteSettings(); list($site) = Event::trigger(__CLASS__, __FUNCTION__, $site); $user = User::current(); if ($user && isset($user['avatar'])) { $user['avatar_url'] = Images::image($user['avatar'], 'user'); } if ($admin && isset($admin['avatar'])) { $admin['avatar_url'] = Images::image($admin['avatar'], 'admin'); } /* $site['url'] = \Vvveb\url('index/index',[ 'host' => $_SERVER['HTTP_HOST'] ?? false, 'scheme' => $_SERVER['REQUEST_SCHEME'] ?? 'http', ]); */ $site['url'] = $siteData['host'] ?? ('//' . ($_SERVER['HTTP_HOST'] ?? '')); $this->global['site_id'] = SITE_ID ?? 1; $this->global['user_id'] = $user['user_id'] ?? false; $this->global['user_group_id'] = $user['user_group_id'] ?? 1; $this->global['site'] = &$site; $this->global['user'] = $user ?? []; $this->global['admin'] = $admin ?? []; $this->global['current_year'] = date('Y'); $languages = availableLanguages(); $language = $languages[$site['language'] ?? 'en'] ?? ['slug' => 'en', 'language_id' => 1, 'locale' => 'en', 'code' => 'en_US', $languages]; $this->language($language['slug'], $language['language_id'], $language['locale'], $language['code']); $this->currency($site['currency'] ?? false, $site['currency_id'] ?? false); $language_id = $this->global['language_id']; if (isset($site['description'][$language_id])) { $site['description'] = $site['description'][$language_id]; } if (isset($site['country_id'])) { $this->initEcommerce($site['country_id'], $site['region_id']); } $view = $this->view; $view->global = $this->global; if ($errors = $this->session->get('errors')) { if (is_array($errors)) { $view->errors = ($view->errors ?? []) + $errors; } else { $view->errors['session'] = $errors; } $this->session->delete('errors'); } if ($success = $this->session->get('success')) { if (is_array($success)) { $view->success = ($view->success ?? []) + $success; } else { $view->success['session'] = $success; } $this->session->delete('success'); } if (\Vvveb\isEditor()) { $this->view->errors[] = 'This is a dummy error message!'; $this->view->success[] = 'This is a dummy success message!'; $this->view->info[] = 'This is a dummy info message!'; $this->view->message[] = 'This is a dummy message!'; } list($this->global) = Event::trigger(__CLASS__, __FUNCTION__ . ':after', $this->global); } protected function redirect($url = '/', $parameters = []) { $redirect = \Vvveb\url($url, $parameters); if ($redirect) { $url = $redirect; } if (isset($this->session)) { $this->session->close(); } FrontController::closeConnections(); PageCache::getInstance()->cleanUp(); header("Location: $url"); die(); } /** * Call this method if the action requires login, if the user is not logged in, a login form will be shown. * */ protected function requireLogin() { $view = view :: getInstance(); $view :: template(DS . 'login.html'); die(view :: getInstance()->render()); } /** * Call this function if the requeste information was not found, for example if the specifed news, image, profile etc is not found then call this function. * It shows a "Not found" page and it also send 404 http status code, this is usefull for search engines etc. * * @param unknown_type $code * @param mixed $service * @param mixed $statusCode * @param null|mixed $message */ protected function notFound($service = false, $message = null, $statusCode = 404) { return FrontController::notFound($service, $message, $statusCode); } }