. * */ namespace Vvveb\System\Component; use function Vvveb\session as sess; use function Vvveb\siteSettings; use Vvveb\System\Core\Request; use Vvveb\System\Core\View; use Vvveb\System\Event; use Vvveb\System\Session; use Vvveb\System\User\User; #[\AllowDynamicProperties] class ComponentBase { public $cacheKey; public $cacheExpire = 3600; //seconds public static $global; protected $options; protected $_hash; public static $defaultOptions = []; function __construct($options = []) { $request = Request :: getInstance(); if (! self :: $global) { $user = User::current(); $site = siteSettings(); self :: $global['start'] = 0; self :: $global['site_id'] = (APP == 'admin') ? sess('site_id') ?? SITE_ID : (defined('SITE_ID') ? SITE_ID : 0); //self :: $global['site'] = siteSettings(); self :: $global['user_id'] = $user['user_id'] ?? null; self :: $global['user_group_id'] = $user['user_group_id'] ?? 1; self :: $global['languages'] = $site['languages'] ?? []; self :: $global['default_language'] = sess('default_language') ?? $site['language'] ?? 'en'; self :: $global['default_language_id'] = sess('default_language_id') ?? $site['language_id'] ?? 1; self :: $global['currency_id'] = sess('currency_id') ?? $site['currency_id'] ?? 1; self :: $global['currency'] = sess('currency') ?? $site['currency'] ?? 'usd'; self :: $global['currencies'] = $site['currencies'] ?? []; self :: $global['language'] = ($site['language'] ?? '') ?: 'en'; self :: $global['language_id'] = ($site['language_id'] ?? '') ?: 1; if ($language = sess('language')) { self :: $global['language'] = $language; } if ($language_id = sess('language_id')) { self :: $global['language_id'] = $language_id; } if (isset($request->request['language']) && is_string($request->request['language'])) { self :: $global['language'] = $request->request['language']; } if (isset($request->request['language_id']) && is_string($request->request['language_id'])) { self :: $global['language_id'] = $request->request['language_id']; } } static :: $defaultOptions = array_merge(self :: $global, static :: $defaultOptions); foreach (['site_id', 'language_id', 'currency_id', 'user_id', 'user_group_id'] as $key) { if (! isset(static :: $defaultOptions[$key]) || empty(static :: $defaultOptions[$key])) { static :: $defaultOptions[$key] = self :: $global[$key]; } } if (isset(static :: $defaultOptions)) { $this->options = $this->filter($options); } foreach ($this->options as $key => &$value) { if (is_array($value)) { foreach ($value as $val) { if (strpos($val, 'url') === 0) { //check if url parameter is specified ex: url.slug if ($dot = strrpos($val,'.')) { $key = substr($val, $dot + 1); } if (isset($request->request[$key])) { $value = $request->request[$key]; break; } else { if (isset($value[1])) { $value = $value[1]; } else { $value = null; } } } } } if ($value && is_string($value) && strpos($value, 'url') === 0) { //check if url parameter is specified ex: url.slug if ($dot = strrpos($value,'.')) { $key = substr($value, $dot + 1); } $value = ($request->request[$key] ?? ($request->get[$key] ?? null)); } if ($value === null) { unset($this->options[$key]); } } list($this->options) = Event :: trigger(get_class($this), __FUNCTION__, $this->options); $this->di($this); } static function di(&$component) { $component->request = Request::getInstance(); $component->view = View::getInstance(); $component->session = Session::getInstance(); } function invalidateCache() { } function cacheKey() { if (isset($this->cacheKey)) { return $this->cacheKey; } $className = strtolower(str_replace(['Vvveb\Plugins\\', 'Vvveb\Component\\', '\Component\\'], '',get_class($this))); $this->cacheKey = str_replace('\\','-', $className) . '.' . md5(serialize($this->options)); return $this->cacheKey; } function filter(&$options) { //remove fields not declared in the class if (is_array($options)) { if (isset($options['_hash'])) { $this->_hash = $options['_hash']; unset($options['_hash']); } //$intersect = array_intersect_key($options, static :: $defaultOptions); //$diff = array_diff_key(static :: $defaultOptions, $options); //return $options = $intersect + $diff; return array_merge(static :: $defaultOptions, $options); } else { return static :: $defaultOptions; } return $options; } function results() { //check cache $cache = Cache :: getInstance(); return $cache->get($this->cacheKey); } function generateCache($results) { $cache = Cache :: getInstance(); $expire = $_SERVER['REQUEST_TIME'] + $this->cacheExpire; if (! $results) { $results = 0; } $cache->set($this->cacheKey, $results, $expire + COMPONENT_CACHE_EXPIRE); return $cache->set('expire_' . $this->cacheKey, $expire, $expire + COMPONENT_CACHE_EXPIRE); } }