/**
  * แสดงผล sitemap.xml
  *
  * @param Request $request
  */
 public function index(Request $request)
 {
     // ตัวแปรป้องกันการเรียกหน้าเพจโดยตรง
     define('MAIN_INIT', __FILE__);
     // create Response
     $response = new Response();
     // XML
     $content = '<' . '?xml version="1.0" encoding="UTF-8"?' . '>';
     $content .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"';
     $content .= ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"';
     $content .= ' xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9';
     $content .= ' http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">';
     // วันนี้
     $cdate = date('Y-m-d');
     // view
     $view = new \Index\Sitemap\View();
     // หน้าหลัก
     $content .= $view->render(WEB_URL . 'index.php', $cdate);
     // โมดูลที่ติดตั้งแล้ว
     $modules = array();
     $owners = array();
     foreach (\Index\Sitemap\Model::getModules() as $item) {
         $modules[$item->id] = $item->module;
         $owners[$item->owner][] = $item->id;
         $content .= $view->render(Gcms::createUrl($item->module, '', 0, 0, $item->language == '' ? '' : 'lang=' . $item->language), $cdate);
     }
     // modules
     $dir = ROOT_PATH . 'modules/';
     $f = @opendir($dir);
     if ($f) {
         while (false !== ($owner = readdir($f))) {
             if ($owner != '.' && $owner != '..' && $owner != 'index') {
                 if (is_file($dir . $owner . '/controllers/sitemap.php')) {
                     include $dir . $owner . '/controllers/sitemap.php';
                     foreach (createClass(ucfirst($owner) . '\\Sitemap\\Controller')->init($owners[$owner], $modules, $cdate) as $item) {
                         $content .= $view->render($item->url, $item->date);
                     }
                 }
             }
         }
         closedir($f);
     }
     $content .= '</urlset>';
     // send Response
     $response->withContent($content)->withHeader('Content-Type', 'application/xml; charset=UTF-8')->send();
 }
 /**
  * แสดงผลหน้าหลักเว็บไซต์
  *
  * @param Request $request
  */
 public function index(Request $request)
 {
     // ตัวแปรป้องกันการเรียกหน้าเพจโดยตรง
     define('MAIN_INIT', __FILE__);
     // session cookie
     $request->initSession();
     // ตรวจสอบการ login
     Login::create();
     // กำหนด skin ให้กับ template
     Template::init($request->get('skin', self::$cfg->skin)->toString());
     // backend
     Gcms::$view = new \Kotchasan\View();
     if ($login = Login::adminAccess()) {
         // โหลดโมดูลที่ติดตั้งแล้ว
         \Index\Index\Model::installedmodules();
         // Controller หลัก
         $main = new \Index\Main\Controller();
     } else {
         // forgot or login
         if ($request->request('action')->toString() === 'forgot') {
             $main = new \Index\Forgot\Controller();
         } else {
             $main = new \Index\Login\Controller();
         }
     }
     $languages = array();
     $uri = $request->getUri();
     foreach (array_merge(self::$cfg->languages, Language::installedLanguage()) as $i => $item) {
         $languages[$item] = '<a id=lang_' . $item . ' href="' . $uri->withParams(array('lang' => $item), true) . '" title="{LNG_Language} ' . strtoupper($item) . '" style="background-image:url(' . WEB_URL . 'language/' . $item . '.gif)" tabindex=1>&nbsp;</a>';
     }
     // เนื้อหา
     Gcms::$view->setContents(array('/{MAIN}/' => $main->execute($request), '/{VERSION}/' => self::$cfg->version, '/{LANGUAGES}/' => implode('', $languages), '/{TITLE}/' => $main->title() . ' (Admin)', '/{BACKURL(\\?([a-zA-Z0-9=&\\-_@\\.]+))?}/e' => '\\Kotchasan\\View::back'));
     if ($login) {
         $name = trim($login['fname'] . ' ' . $login['lname']);
         Gcms::$view->setContents(array('/{LOGINID}/' => $login['id'], '/{LOGINNAME}/' => empty($name) ? $login['email'] : $name, '/{STATUS}/' => $login['status'], '/{MENUS}/' => \Index\Menu\View::render()));
     }
     // ส่งออก เป็น HTML
     $response = new Response();
     $response->withContent(Gcms::$view->renderHTML())->send();
 }
 /**
  * แสดงผล index.html
  *
  * @param Request $request
  */
 public function index(Request $request)
 {
     // ตัวแปรป้องกันการเรียกหน้าเพจโดยตรง
     define('MAIN_INIT', __FILE__);
     // session cookie
     $request->initSession();
     // ตรวจสอบการ login
     Login::create();
     // กำหนด skin ให้กับ template
     self::$cfg->skin = $request->get('skin', self::$request->session('skin', self::$cfg->skin)->toString())->toString();
     self::$cfg->skin = is_file(ROOT_PATH . 'skin/' . self::$cfg->skin . '/style.css') ? self::$cfg->skin : 'bighead';
     $_SESSION['skin'] = self::$cfg->skin;
     Template::init(self::$cfg->skin);
     // ตรวจสอบหน้าที่จะแสดง
     if (!empty(self::$cfg->maintenance_mode) && !Login::isAdmin()) {
         Gcms::$view = new \Index\Maintenance\View();
     } elseif (!empty(self::$cfg->show_intro) && str_replace(array(BASE_PATH, '/'), '', $request->getUri()->getPath()) == '') {
         Gcms::$view = new \Index\Intro\View();
     } else {
         // counter และ useronline
         $new_day = \Index\Counter\Model::init();
         // View
         Gcms::$view = new \Gcms\View();
         // โมดูลที่ติดตั้ง
         $dir = ROOT_PATH . 'modules/';
         // โหลดโมดูลทั้งหมด
         foreach (\Index\Module\Model::getInstalledModule() as $owner) {
             if (is_file($dir . $owner . '/controllers/init.php')) {
                 include $dir . $owner . '/controllers/init.php';
                 $class = ucfirst($owner) . '\\Init\\Controller';
                 if (method_exists($class, 'init')) {
                     createClass($class)->init();
                 }
             }
             if ($new_day && is_file($dir . $owner . '/controllers/cron.php')) {
                 include $dir . $owner . '/controllers/cron.php';
                 $class = ucfirst($owner) . '\\Cron\\Controller';
                 if (method_exists($class, 'init')) {
                     createClass($class)->init();
                 }
             }
         }
         // โหลด Init ของ Widgets
         $dir = ROOT_PATH . 'Widgets/';
         $f = @opendir($dir);
         if ($f) {
             while (false !== ($text = readdir($f))) {
                 if ($text != "." && $text != "..") {
                     if (is_dir($dir . $text)) {
                         if (is_file($dir . $text . '/Controllers/Init.php')) {
                             include $dir . $text . '/Controllers/Init.php';
                             $class = 'Widgets\\' . ucfirst($text) . '\\Controllers\\Init';
                             if (method_exists($class, 'init')) {
                                 createClass($class)->init();
                             }
                         }
                     }
                 }
             }
             closedir($f);
         }
         // หน้า home มาจากเมนูรายการแรก
         $home = Gcms::$menu->homeMenu();
         if ($home) {
             $home->canonical = WEB_URL . 'index.php';
             // breadcrumb หน้า home
             Gcms::$view->addBreadcrumb($home->canonical, $home->menu_text, $home->menu_tooltip, 'icon-home');
         }
         // ตรวจสอบโมดูลที่เรียก
         $modules = \Index\Module\Controller::get($request->getQueryParams());
         if (!empty($modules)) {
             // โหลดโมดูลที่เรียก
             $page = createClass($modules->className)->{$modules->method}($request, $modules->module);
         }
         if (empty($page)) {
             // ไม่พบหน้าที่เรียก (index)
             $page = createClass('Index\\PageNotFound\\Controller')->init($request, 'index');
         }
         // title ของเว็บไซต์
         $web_title = strip_tags($page->topic);
         // meta tag
         $meta = array('generator' => '<meta name=generator content="GCMS AJAX CMS design by http://gcms.in.th">', 'og:title' => '<meta property="og:title" content="' . $web_title . '">', 'description' => '<meta name=description content="' . $page->description . '">', 'keywords' => '<meta name=keywords content="' . $page->keywords . '">', 'og:site_name' => '<meta property="og:site_name" content="' . $web_title . '">', 'og:type' => '<meta property="og:type" content="article">');
         // โมดูลแรกสุด ใส่ลงใน Javascript
         $module_list = array_keys(Gcms::$install_modules);
         $script = array('var FIRST_MODULE = "' . reset($module_list) . '";');
         // logo
         $image_logo = '';
         if (!empty(self::$cfg->logo) && is_file(ROOT_PATH . DATA_FOLDER . 'image/' . self::$cfg->logo)) {
             $image_src = WEB_URL . DATA_FOLDER . 'image/' . self::$cfg->logo;
             $info = getImageSize(ROOT_PATH . DATA_FOLDER . 'image/' . self::$cfg->logo);
             if ($info[0] > 0 || $info[1] > 0) {
                 $ext = explode('.', self::$cfg->logo);
                 if (strtolower(end($ext)) == 'swf') {
                     $script[] = '$G(window).Ready(function(){';
                     $script[] = 'if ($E("logo")) {';
                     $script[] = "new GMedia('logo_swf', '" . $image_src . "', {$info['0']}, {$info['1']}).write('logo');";
                     $script[] = '}';
                     $script[] = '});';
                 } else {
                     $image_logo = '<img src="' . $image_src . '" alt="{WEBTITLE}">';
                 }
             }
         }
         if (empty($page->image_src)) {
             if (is_file(ROOT_PATH . DATA_FOLDER . 'image/facebook_photo.jpg')) {
                 $page->image_src = WEB_URL . DATA_FOLDER . 'image/facebook_photo.jpg';
             }
         } elseif (!empty($image_src)) {
             $page->image_src = $image_src;
         }
         if (!empty($page->image_src)) {
             $meta['image_src'] = '<link rel=image_src href="' . $page->image_src . '">';
             $meta['og:image'] = '<meta property="og:image" content="' . $page->image_src . '">';
         }
         if (!empty(self::$cfg->facebook_appId)) {
             $meta['og:app_id'] = '<meta property="fb:app_id" content="' . self::$cfg->facebook_appId . '">';
         }
         if (isset($page->canonical)) {
             $meta['canonical'] = '<meta name=canonical content="' . $page->canonical . '">';
             $meta['og:url'] = '<meta property="og:url" content="' . $page->canonical . '">';
         }
         $meta['script'] = "<script>\n" . implode("\n", $script) . "\n</script>";
         Gcms::$view->setMetas($meta);
         // ภาษาที่ติดตั้ง
         $languages = Template::create('', '', 'language');
         foreach (self::$cfg->languages as $lng) {
             $languages->add(array('/{LNG}/' => $lng));
         }
         // เมนูหลัก
         Gcms::$view->setContents(Gcms::$menu->render(isset($page->menu) ? $page->menu : $page->module));
         // เนื้อหา
         Gcms::$view->setContents(array('/{CONTENT}/' => $page->detail, '/{TITLE}/' => $web_title, '/{LANGUAGES}/' => $languages->render(), '/{LOGO}/' => $image_logo));
     }
     // ส่งออก เป็น HTML
     $response = new Response();
     $response->withContent(Gcms::$view->renderHTML())->send();
 }
 /**
  * export database to file
  */
 public function export()
 {
     // referer, session, member
     if (self::$request->initSession() && self::$request->isReferer() && ($login = Login::isAdmin())) {
         if ($login['email'] != 'demo' && empty($login['fb'])) {
             $sqls = array();
             $rows = array();
             $database = array();
             $datas = array();
             foreach (self::$request->getParsedBody() as $table => $values) {
                 foreach ($values as $k => $v) {
                     if (isset($datas[$table][$v])) {
                         $datas[$table][$v]++;
                     } else {
                         $datas[$table][$v] = 1;
                     }
                 }
             }
             $web_url = str_replace(array('http://', 'https://', 'www.'), '', WEB_URL);
             $web_url = '/http(s)?:\\/\\/(www\\.)?' . preg_quote($web_url, '/') . '/';
             // database
             $model = new static();
             // ชื่อฐานข้อมูล
             $fname = $model->getSetting('dbname') . '.sql';
             // memory limit
             ini_set('memory_limit', '1024M');
             // prefix
             $prefix = $model->getSetting('prefix');
             // ตารางทั้งหมด
             $tables = $model->db()->customQuery('SHOW TABLE STATUS', true);
             // ตารางทั้งหมด
             foreach ($tables as $table) {
                 if (preg_match('/^' . $prefix . '(.*?)$/', $table['Name']) && isset($datas[$table['Name']])) {
                     $fields = $model->db()->customQuery('SHOW FULL FIELDS FROM ' . $table['Name'], true);
                     $primarykey = array();
                     $rows = array();
                     foreach ($fields as $field) {
                         if ($field['Key'] == 'PRI') {
                             $primarykey[] = '`' . $field['Field'] . '`';
                         }
                         $database[$table['Name']]['Field'][] = $field['Field'];
                         $rows[] = '`' . $field['Field'] . '` ' . $field['Type'] . ($field['Collation'] != '' ? ' collate ' . $field['Collation'] : '') . ($field['Null'] == 'NO' ? ' NOT NULL' : '') . ($field['Default'] != '' ? " DEFAULT '" . $field['Default'] . "'" : '') . ($field['Extra'] != '' ? ' ' . $field['Extra'] : '');
                     }
                     if (sizeof($primarykey) > 0) {
                         $rows[] = 'PRIMARY KEY (' . implode(',', $primarykey) . ')';
                     }
                     if (isset($datas[$table['Name']]['sturcture'])) {
                         $table_name = $prefix == '' ? $table['Name'] : preg_replace('/^' . $prefix . '/', '{prefix}', $table['Name']);
                         $sqls[] = 'DROP TABLE IF EXISTS `' . $table_name . '`;';
                         $q = 'CREATE TABLE `' . $table_name . '` (' . implode(',', $rows) . ') ENGINE=' . $table['Engine'];
                         $q .= ' DEFAULT CHARSET=' . preg_replace('/([a-zA-Z0-9]+)_.*?/Uu', '\\1', $table['Collation']) . ' COLLATE=' . $table['Collation'];
                         $q .= ($table['Create_options'] != '' ? ' ' . strtoupper($table['Create_options']) : '') . ';';
                         $sqls[] = $q;
                     }
                 }
             }
             // ข้อมูลในตาราง
             foreach ($tables as $table) {
                 if (preg_match('/^' . $prefix . '(.*?)$/', $table['Name'], $match)) {
                     if ($match[1] == '_emailtemplate') {
                         if (isset($datas[$table['Name']]['datas'])) {
                             if (($key = array_search('id', $database[$table['Name']]['Field'])) !== false) {
                                 unset($database[$table['Name']]['Field'][$key]);
                             }
                             $table_name = $prefix == '' ? $table['Name'] : preg_replace('/^' . $prefix . '/', '{prefix}', $table['Name']);
                             $data = "INSERT INTO `{$table_name}` (`" . implode('`, `', $database[$table['Name']]['Field']) . "`) VALUES ('%s');";
                             $records = $model->db()->customQuery('SELECT * FROM ' . $table['Name'], true);
                             foreach ($records as $record) {
                                 foreach ($record as $field => $value) {
                                     if ($field === 'copy_to' || $field === 'from_email') {
                                         $record[$field] = $value == $login['email'] ? '{WEBMASTER}' : '';
                                     } elseif ($field == 'id') {
                                         unset($record['id']);
                                     } else {
                                         $record[$field] = addslashes(preg_replace($web_url, '{WEBURL}', $value));
                                     }
                                 }
                                 $sqls[] = preg_replace(array('/[\\r]/u', '/[\\n]/u'), array('\\r', '\\n'), sprintf($data, implode("','", $record)));
                             }
                         }
                     } elseif (isset($datas[$table['Name']]['datas'])) {
                         $table_name = $prefix == '' ? $table['Name'] : preg_replace('/^' . $prefix . '/', '{prefix}', $table['Name']);
                         $data = "INSERT INTO `{$table_name}` (`" . implode('`, `', $database[$table['Name']]['Field']) . "`) VALUES ('%s');";
                         $records = $model->db()->customQuery('SELECT * FROM ' . $table['Name'], true);
                         foreach ($records as $record) {
                             foreach ($record as $field => $value) {
                                 $record[$field] = addslashes(preg_replace($web_url, '{WEBURL}', $value));
                             }
                             $sqls[] = preg_replace(array('/[\\r]/u', '/[\\n]/u'), array('\\r', '\\n'), sprintf($data, implode("','", $record)));
                         }
                     }
                 }
             }
             // send file
             $response = new Response();
             $response->withHeaders(array('Content-Type' => 'application/force-download', 'Content-Disposition' => 'attachment; filename=' . $fname))->withContent(preg_replace(array('/[\\\\]+/', '/\\\\"/'), array('\\', '"'), implode("\r\n", $sqls)))->send();
             exit;
         }
     }
     // ไม่สามารถดาวน์โหลดได้
     $response = new Response(404);
     $response->withContent('File Not Found!')->send();
 }