Beispiel #1
0
 /**
  * read all metadata from theme file.
  * @param type $theme_system_name
  * @return type
  */
 public function readThemeMetadata($theme_system_name)
 {
     // get theme config
     $Config = new \System\Libraries\Config();
     $Config->load('theme');
     $theme_dir = $Config->get('theme_dir', 'theme');
     unset($Config);
     $adapter = new Local($theme_dir);
     $filesystem = new Filesystem($adapter);
     unset($adapter, $theme_dir);
     $output = [];
     if ($filesystem->has($theme_system_name . DS . $theme_system_name . '.php')) {
         $content = $filesystem->read($theme_system_name . DS . $theme_system_name . '.php');
         preg_match_all('|([a-zA-Z0-9-_ ]+):(.*)$|mi', $content, $matches, PREG_PATTERN_ORDER);
         unset($content);
         if (isset($matches) && is_array($matches) && array_key_exists(1, $matches) && array_key_exists(2, $matches) && is_array($matches[1]) && is_array($matches[2])) {
             foreach ($matches[1] as $key => $item) {
                 if (!is_array($item) && array_key_exists($key, $matches[2]) && !is_array($matches[2][$key])) {
                     $output[trim($item)] = trim($matches[2][$key]);
                 }
             }
         }
     }
     // validate available metadata
     foreach ($this->available_metadata as $meta_name) {
         if (!array_key_exists($meta_name, $output)) {
             $output[$meta_name] = '';
         }
     }
     unset($filesystem, $item, $key, $matches, $meta_name);
     return $output;
 }
Beispiel #2
0
 /**
  * connect or prepare db connection.
  * 
  * @param array $db_config array config for override the default configuration.
  */
 private function connect(array $db_config = [])
 {
     if ($this->Conn != null && $this->EntityManager != null) {
         return;
     }
     \System\Libraries\Log::write('db_connection', 'debug', 'Starting open connection to db.', $db_config);
     $db_bootstrap = new \System\Libraries\Db\Bootstrap($db_config);
     $this->EntityManager = $db_bootstrap->EntityManager;
     $this->Conn = $db_bootstrap->Conn;
     unset($db_bootstrap);
     // set table prefix property.
     if (empty($db_config)) {
         $config = new \System\Libraries\Config();
         $config->load('db');
         $this->table_prefix = $config->get('table_prefix', 'db', 'an_');
         unset($config);
     } else {
         if (is_array($db_config) && array_key_exists('table_prefix', $db_config)) {
             $this->table_prefix = $db_config['table_prefix'];
         }
     }
     // check matched multi-site domain in sites table.
     $cache = new \System\Libraries\Cache();
     $cache->setSubFolder('system/Libraries/Db/Db.php');
     if ($cache->contains('Db-getCurrentSiteData-' . $this->getCurrentSiteId())) {
         $site = $cache->fetch('Db-getCurrentSiteData-' . $this->getCurrentSiteId());
         \System\Libraries\Log::write('db_connection', 'debug', 'Getting site data using cache name "Db-getCurrentSiteData-' . $this->getCurrentSiteId() . '"', [$site]);
     } else {
         $stmt = $this->prepare('SELECT `site_id`, `site_domain`, `site_status`, `site_settings` FROM `' . $this->getTableName('sites') . '` WHERE LOWER(`site_domain`) = :site_domain AND `site_status` = 1');
         $stmt->bindValue('site_domain', isset($_SERVER['HTTP_HOST']) ? strtolower($_SERVER['HTTP_HOST']) : '');
         $stmt->execute();
         $site = $stmt->fetch();
         $cache->save('Db-getCurrentSiteData-' . $this->getCurrentSiteId(), $site, 60 * 60 * 24 * 30);
         unset($stmt);
     }
     if (isset($site) && $site !== false && $site->site_id != 1) {
         // this is not main site.
         // @todo [cms][db] add plugin hook if there is multi-site::multi-db module plugs enabled then enable these code.
         /*$site_settings = json_decode($site->site_settings, true);
           if (
               (is_array($site_settings) && array_key_exists('db', $site_settings)) ||
               (is_object($site_settings) && property_exists($site_settings, 'db'))
           ) {
               // there is settings about db for this site. it can re-connect to this site's db (for multi-site::multi-db).
               $site_db_config = (is_array($site_settings) ? $site_settings['db'] : (is_object($site_settings) ? $site_settings->db : ''));
               if ($site_db_config != null && !empty($site_db_config) && empty($db_config)) {
                   $site_db_config['table_siteid_prefix'] = $site->site_id.'_';
                   $this->reconnect($site_db_config);
               }
           }
           unset($site_db_config, $site_settings);*/
         $this->table_siteid_prefix = $site->site_id . '_';
     }
     unset($site);
 }
Beispiel #3
0
 /**
  * get app config and set it to silex app.
  */
 protected function getAppConfig()
 {
     $config = new \System\Libraries\Config();
     $config->load('app');
     $loaded_app_config = $config->get('ALL', 'app');
     if (is_array($loaded_app_config)) {
         foreach ($loaded_app_config as $name => $value) {
             if (isset($this->Silexapp[$name])) {
                 $this->Silexapp[$name] = $value;
             }
         }
         // endforeach;
     }
     unset($config, $loaded_app_config, $name, $value);
 }
 /**
  * initialize the profiler.
  * 
  * @global \Okvee\Profiler\Profiler $Profiler
  * @return mixed
  */
 public function initProfiler()
 {
     if ($this->Profiler != null) {
         return true;
     }
     $config = new \System\Libraries\Config();
     $config->load('config');
     $profiler_config = $config->get('profiler', 'config');
     if ($profiler_config === true) {
         $this->Profiler = new \Okvee\Profiler\Profiler();
         // get global $Profiler.
         global $Profiler;
         // set new Profiler object to this variable that it can be access over any of php classes/functions.
         $Profiler = $this->Profiler;
         $this->Profiler->Console->registerLogSections(array('Logs', 'Time Load', 'Memory Usage', 'Database', 'Files', 'Session', 'Get', 'Post'));
     }
     unset($config);
 }
Beispiel #5
0
 /**
  * render the theme or views.
  * 
  * @param string $views_file path to theme file or views file.
  * @param array $output_data the data that will be sent to theme or views.
  */
 public function render($views_file, array $output_data = [])
 {
     // get the module name of this views.
     // the $module_name can be just name and folder/name. for example: Cms = Modules\Cms, System/Core = System\Core.
     $Modules = new \System\Libraries\Modules();
     $module_name = $Modules->currentModule();
     unset($Modules);
     // init config library to load theme config file.
     $config = new \System\Libraries\Config();
     $config->load('theme');
     // get the theme name.
     if (strpos($views_file, 'admin/') !== false) {
         $fallback_type = 'admin';
     } else {
         $fallback_type = 'front';
     }
     $theme_name = $this->getThemeNameWithFallback($config, $fallback_type);
     $theme_name_fallback = $this->getThemeFallback($config, $fallback_type);
     unset($fallback_type);
     $output = '';
     // check template engine enabled.
     $template_engine = $config->get('template_engine', 'theme');
     $theme_dir = $config->get('theme_dir', 'theme');
     if ($template_engine != null) {
         // theme config uses template engine.
         $TemplateClass = call_user_func($template_engine);
         $theme_location = $this->findThemeOrViewsLocation($views_file, $theme_dir, $theme_name, $theme_name_fallback, $module_name, $TemplateClass);
         if (is_array($theme_location) && array_key_exists('theme_path', $theme_location) && array_key_exists('theme_file', $theme_location) && array_key_exists('use_template', $theme_location) && array_key_exists('theme_name', $theme_location)) {
             // can find template location.
             if ($theme_location['use_template'] === true) {
                 // confirmed use template file.
                 // use load template and render it.
                 $output = $TemplateClass->render($theme_location['theme_path'], $theme_location['theme_file'], $theme_location['theme_name'], $module_name, $output_data);
             } else {
                 // cannot confirmed use template file.
                 // use normal load views file.
                 $output = $this->loadViews($theme_location['theme_path'] . '/' . $theme_location['theme_file'], $output_data);
             }
         } else {
             // cannot find template location.
             // use normal load views file.
             $output = $this->loadViews($theme_location['theme_path'] . '/' . $theme_location['theme_file'], $output_data);
         }
         unset($TemplateClass);
     } else {
         // theme config do not use template engine.
         $views_location = $this->findThemeOrViewsLocation($views_file, $theme_dir, $theme_name, $theme_name_fallback, $module_name);
         $output = $this->loadViews($views_location['theme_path'] . '/' . $views_location['theme_file'], $output_data);
     }
     unset($config, $module_name, $template_engine, $theme_dir, $theme_location, $theme_name, $theme_name_fallback, $views_location);
     return $output;
 }
Beispiel #6
0
 /**
  * get index file.
  * 
  * @param mixed $index include index file or not. value is 'auto', true, false. 'auto' and true is up to configuration. false will not include.
  * @return string return the index file.
  */
 public function getIndexFile($index = 'auto')
 {
     if ($index === 'auto' || $index === true) {
         $config = new \System\Libraries\Config();
         $config->load('config');
         $index_file = $config->get('index_file', 'config');
         unset($config);
         if ($index_file != null) {
             return $index_file;
         }
     }
 }
Beispiel #7
0
 /**
  * initialize logger class. this help usage of monolog shorter.
  * 
  * @param string $channel channel name. more detail, see https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#leveraging-channels
  * @param string $log_level log level can be debug, info, notice, warning, error, critical, alert, emergency *(not recommend). more detail, see https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#log-levels
  * @param string $log_file log file name. it is automatic generate. more detail, see https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md
  */
 public function __construct($channel = 'cms', $log_level = 'info', $log_file = '')
 {
     $config = new \System\Libraries\Config();
     $config->load('config');
     $config_log = $config->get('log', 'config');
     if (isset($config_log) && is_array($config_log)) {
         if (array_key_exists('enable', $config_log) && $config_log['enable'] == false) {
             // disabled log.
             $this->log_enabled = false;
             return;
         } else {
             $this->log_enabled = true;
         }
         if (array_key_exists('donot_log_level', $config_log)) {
             $donot_log_level = $config_log['donot_log_level'];
         } else {
             $donot_log_level = 0;
         }
     }
     unset($config, $config_log);
     if ($channel == null) {
         $channel = 'cms';
     }
     switch (strtolower($log_level)) {
         case 'debug':
             $this->log_level_number = 0;
             $this->log_level = Logger::DEBUG;
             break;
         case 'info':
             $this->log_level_number = 1;
             $this->log_level = Logger::INFO;
             break;
         case 'notice':
             $this->log_level_number = 2;
             $this->log_level = Logger::NOTICE;
             break;
         case 'warning':
             $this->log_level_number = 3;
             $this->log_level = Logger::WARNING;
             break;
         case 'error':
             $this->log_level_number = 4;
             $this->log_level = Logger::ERROR;
             break;
         case 'critical':
             $this->log_level_number = 5;
             $this->log_level = Logger::CRITICAL;
             break;
         case 'alert':
             $this->log_level_number = 6;
             $this->log_level = Logger::ALERT;
             break;
         case 'emergency':
             $this->log_level_number = 7;
             $this->log_level = Logger::EMERGENCY;
             break;
         default:
             $log_level = 'debug';
             $this->log_level_number = 0;
             $this->log_level = Logger::DEBUG;
             break;
     }
     $log_level = strtolower($log_level);
     $this->log_level_text = $log_level;
     if (isset($donot_log_level) && $this->log_level_number < $donot_log_level) {
         $this->log_enabled = false;
         return false;
     } else {
         $this->log_enabled = true;
     }
     if ($log_file == null) {
         $log_file = STORAGE_PATH . DS . 'logs' . DS . $log_level . DS . date('Y-m-d') . '.log';
     }
     $this->Logger = new Logger($channel);
     $this->Streamhandler = new StreamHandler($log_file, $this->log_level);
 }
Beispiel #8
0
 /**
  * execute command
  * 
  * @param InputInterface $input
  * @param OutputInterface $output
  */
 public function execute(InputInterface $input, OutputInterface $output)
 {
     $names = $input->getOption('names');
     if ($names == null) {
         $output->writeln('<error>Sorry, you did not enter theme folder name.</error>');
         unset($names);
         return false;
     }
     if ($names != null) {
         // get theme config
         $Config = new \System\Libraries\Config();
         $Config->load('theme');
         $theme_dir = $Config->get('theme_dir', 'theme');
         unset($Config);
         $names_exp = explode(',', str_replace(', ', ',', $names));
         $style = new \Symfony\Component\Console\Formatter\OutputFormatterStyle('white', 'green');
         $output->getFormatter()->setStyle('success', $style);
         unset($style);
         if (is_array($names_exp) && !empty($names_exp)) {
             foreach ($names_exp as $name) {
                 if ($name != null) {
                     $output->write('Theme "' . $name . '": ');
                     if (is_dir($theme_dir . DS . $name)) {
                         if (is_file($theme_dir . DS . $name . DS . $name . '.php')) {
                             $Metadata = new \System\Libraries\Themes\Metadata();
                             $theme_metadata = $Metadata->readThemeMetadata($name);
                             if (is_array($theme_metadata) && array_key_exists('Version', $theme_metadata) && $theme_metadata['Version'] != null) {
                                 // check theme exists or not.
                                 $options['theme_system_name'] = $name;
                                 $ThemesDb = new \System\Core\Models\ThemesDb($this->Db);
                                 $theme = $ThemesDb->getTheme($options);
                                 unset($options, $ThemesDb);
                                 if ($theme == null || empty($theme)) {
                                     // theme is not exists.
                                     $qb = $this->Db->Conn->createQueryBuilder();
                                     $qb->insert($this->Db->getTableName('themes'))->values(['theme_system_name' => ':theme_system_name', 'theme_version' => ':theme_version'])->setParameter('theme_system_name', $name, \PDO::PARAM_STR)->setParameter('theme_version', $theme_metadata['Version'], \PDO::PARAM_STR)->execute();
                                     $theme_id = $this->Db->Conn->lastInsertId();
                                     $qb->resetQueryParts();
                                     $output->writeln('<success>added successfully.</success>');
                                 } else {
                                     $output->writeln('<info>already exists.</info>');
                                 }
                             } else {
                                 $output->writeln('<error>could not add, there is no metadata in theme file.</error>');
                             }
                             unset($Metadata, $theme_metadata);
                         } else {
                             $output->writeln('<error>could not add, theme metadata file not found.</error>');
                         }
                     } else {
                         $output->writeln('<error>could not add, theme folder is not exists.</error>');
                     }
                 }
                 // endif $name not null.
             }
             // endforeach;
         }
         // endif is array $name_exp
     }
     // also clear cache about this thing. ---------------------------
     $Command = $this->getApplication()->find('System\\Core\\Console\\Cache');
     $arguments = ['command' => 'System\\Core\\Console\\Cache', '--subfolder' => 'system/Core/Models/ThemesDb.php'];
     $CmdInput = new \Symfony\Component\Console\Input\ArrayInput($arguments);
     $Command->run($CmdInput, new \Symfony\Component\Console\Output\NullOutput());
     unset($arguments, $CmdInput, $Command);
     // end clear cache ------------------------------------------------
     unset($name, $names, $names_exp, $theme_dir);
 }