/** * ฟังก์ชั่นอ่านค่าเวลาในรูป mktime * * @param int $mktime (optional) * @return int คืนค่าเวลาในรูป mktime ถ้าระบุ $mktime ฟังก์ชั่นจะคืนค่านี้ ถ้าไม่ระบุมา จะคืนค่าเวลาปัจจุบัน */ protected static function _mktime($mktime = 0) { if (!isset(self::$mktime)) { self::$mktime = mktime(date("H") + \Core\Gcms::get('config', 'hour', 0)); } return empty($mktime) ? self::$mktime : $mktime; }
/** * แปลง path เป็น query string ตามที่กำหนดโดย $url_rules * * @param string path เช่น /a/b/c.html * @param pointer $modules คืนค่า query string ที่ตัวแปรนี้ */ public static function parseRoutes($path, &$modules) { if (preg_match('/^\\/(.*)((\\.html?)|\\/)$/u', str_replace(BASE_PATH, '', $path), $match)) { $my_path = $match[1]; } else { if (preg_match('/^\\/(.*)$/u', str_replace(BASE_PATH, '', $path), $match)) { $my_path = $match[1]; } } if (isset($my_path)) { /** * กฏของ Router สำหรับการแยกหน้าเว็บไซต์ */ $config = array('/^(css|js).*?/' => array('', 'return'), '/^((sys\\-)?admin).*?/' => array('', 'user'), '/^([0-9a-z\\-]+)\\/([a-z]+)\\/([0-9]+)\\/([0-9]+)(\\/(.*))?$/' => array('', 'user', 'module', 'cat', 'id', '', 'document'), '/^([a-z]+)\\/([0-9]+)\\/([0-9]+)(\\/(.*))?$/' => array('', 'module', 'cat', 'id', '', 'document'), '/^([0-9a-z\\-]+)\\/([a-z]+)\\/([0-9]+)(\\/(.*))?$/' => array('', 'user', 'module', 'cat', '', 'document'), '/^([a-z]+)\\/([0-9]+)(\\/(.*))?$/' => array('', 'module', 'cat', '', 'document'), '/^([0-9a-z\\-]+)\\/([a-z]+)(\\/(.*))?$/' => array('', 'user', 'module', '', 'document'), '/^([a-z]+)(\\/(.*))?$/' => array('', 'module', '', 'document')); foreach (\Core\Gcms::get('router', 'route_rules', $config) as $patt => $items) { if (preg_match($patt, $my_path, $match)) { foreach ($items as $i => $key) { if (!empty($key) && isset($match[$i])) { $modules[$key] = $match[$i]; } } break; } } } }
/** * สร้างไฟล์ CSS * * @param mixed $params */ public function render($param = null) { // header foreach (\Core\Gcms::get('header') as $key => $value) { header("{$key}: {$value}"); } // result echo preg_replace(array('/[\\r\\n\\t]/s', '/[\\s]{2,}/s', '/;}/'), array('', ' ', '}'), $param); }
/** * สร้างเมนูตามตำแหน่งของเมนู (parent) * * @return array รายการเมนูทั้งหมด */ public function render() { $view = \Core\Gcms::createClass('Menu\\View'); $result = array(); foreach ($this->menu->items() as $parent => $items) { if ($parent != '') { $result[$parent] = $view->render($items); } } return $result; }
/** * inint Controller. * * @param array $modules */ public function inint($modules = null) { // ถ้าไม่มีโมดูลเลือกหน้า home $modules['module'] = empty($modules['module']) ? 'home' : $modules['module']; // สร้าง View $view = \Core\Gcms::createClass('Site\\View'); // สร้างเมนู $Menu = \Core\Gcms::createClass('Menu\\Controller'); $view->set(array('MENU' => $Menu->inint($modules), 'TITLE' => 'Welcome to GCMS++', 'CONTENT' => $view->loadTemplate('', '', $modules['module']))); // โหลดไฟล์ index.html $template = $view->loadTemplate('', '', 'index'); // output เป็น HTML $view->renderHTML($template); }
/** * ฟังก์ชั่นสร้าง URL จากโมดูล * * @param string $module URL ชื่อโมดูล * @param string $document (option) * @param int $catid (option) id ของหมวดหมู่ (default 0) * @param int $id (option) id ของข้อมูล (default 0) * @param string $query (option) query string อื่นๆ (default ค่าว่าง) * @param boolean $encode (option) true=เข้ารหัสด้วย rawurlencode ด้วย (default true) * * @return string URL ที่สร้าง */ public static function createUrl($module, $document = '', $catid = 0, $id = 0, $query = '', $encode = true) { /** * กฏของ URL ใช้สำหรับการสร้างลิงค์ */ $config = array(0 => 'index.php?module={module}-{document}&cat={catid}&id={id}', 1 => '{module}/{catid}/{id}/{document}.html'); $urls = \Core\Gcms::get('url', 'urls', $config); $patt = array(); $replace = array(); if (empty($document)) { $patt[] = '/[\\/-]{document}/'; $replace[] = ''; } else { $patt[] = '/{document}/'; $replace[] = $encode ? rawurlencode($document) : $document; } $patt[] = '/{module}/'; $replace[] = $encode ? rawurlencode($module) : $module; if (empty($catid)) { $patt[] = '/((cat={catid}&)|([\\/-]{catid}))/'; $replace[] = ''; } else { $patt[] = '/{catid}/'; $replace[] = (int) $catid; } if (empty($id)) { $patt[] = '/(((&|\\?)id={id})|([\\/-]{id}))/'; $replace[] = ''; } else { $patt[] = '/{id}/'; $replace[] = (int) $id; } $link = preg_replace($patt, $replace, $urls[\Core\Gcms::get('config', 'module_url', 0)]); if (!empty($query)) { $link = preg_match('/[\\?]/u', $link) ? $link . '&' . $query : $link . '?' . $query; } $obj = new static(); $obj->curr_parse = false; $obj->curr_url = WEB_URL . '/' . $link; return $obj->curr_url; }
/** * อ่านโมดูลที่ต้องการ * * @param string $module */ public function getModule($module) { $db = \Core\Gcms::Database(); // วันนี้ $date = \Core\Date::mktime_to_sql_date(); // อ่านโมดูล ตามภาษา $sql = "SELECT M.`module`,I.`id`,D.`topic`,D.`description`,D.`keywords`,D.`detail`,I.`visited`"; if (is_int($module)) { $sql .= " FROM `" . $db->prefix . \Core\Gcms::get('database', 'index') . "` AS I"; $sql .= " INNER JOIN `" . $db->prefix . \Core\Gcms::get('database', 'modules') . "` AS M ON M.`id`=I.`module_id`"; $sql .= " INNER JOIN `" . $db->prefix . \Core\Gcms::get('database', 'index_detail') . "` AS D ON D.`id`=I.`id` AND D.`module_id`=I.`module_id` AND D.`language`=I.`language`"; $sql .= " WHERE I.`id`=" . (int) $module . " AND I.`index`='1' AND I.`published`='1' AND I.`published_date`<='{$date}' LIMIT 1"; } else { $sql .= " FROM `" . $db->prefix . \Core\Gcms::get('database', 'index_detail') . "` AS D "; $sql .= " INNER JOIN `" . $db->prefix . \Core\Gcms::get('database', 'index') . "` AS I ON I.`id`=D.`id` AND I.`index`='1' AND I.`published`='1' AND I.`published_date`<='{$date}' AND I.`language`=D.`language`"; $sql .= " INNER JOIN `" . $db->prefix . \Core\Gcms::get('database', 'modules') . "` AS M ON M.`id`=D.`module_id` AND M.`module`='{$module}'"; $sql .= " WHERE D.`language` IN ('" . LANGUAGE . "','') LIMIT 1"; } $search = $db->customQuery($sql); return sizeof($search) == 1 ? $search[0] : false; }
/** * Class สำหรับเชื่อมต่อกับ database. * * @param type $param * * @return resource Database resource */ public function connect($param) { // parse the URL from the DSN string if (($dns = @parse_url($param)) === false) { \Core\Gcms::debug('Invalid DB connection string.'); } $params = array('dbdriver' => strtolower($dns['scheme']), 'hostname' => isset($dns['host']) ? rawurldecode($dns['host']) : '', 'port' => isset($dns['port']) ? $dns['port'] : '', 'username' => isset($dns['user']) ? rawurldecode($dns['user']) : '', 'password' => isset($dns['pass']) ? rawurldecode($dns['pass']) : '', 'dbname' => isset($dns['path']) ? rawurldecode(substr($dns['path'], 1)) : ''); if (isset($dsn['query'])) { parse_str($dsn['query'], $extra); foreach ($extra as $key => $val) { if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) { $val = var_export($val, true); } $params[$key] = $val; } } // inint database class require_once ROOT_PATH . 'core/database/driver.php'; if (!in_array($params['dbdriver'], array('mysqli')) && defined('PDO::ATTR_DRIVER_NAME')) { require_once ROOT_PATH . 'core/database/pdo_driver.php'; // driver string $driver = 'PDO_driver'; } elseif (is_file(ROOT_PATH . 'core/database/' . $params['dbdriver'] . '_driver.php')) { // โหลดจาก driver ที่กำหนด require_once ROOT_PATH . 'core/database/' . $params['dbdriver'] . '_driver.php'; // driver string $driver = strtoupper($params['dbdriver']) . '_driver'; } else { if (!empty($driver)) { \Core\Gcms::debug('You have not selected a database type to connect to.'); } $driver = 'Driver'; } // inint class $db = new $driver($params); // return class return $db; }
/** * inint Controller. * * @param array $modules */ public function inint($modules = null) { // cache 1 month $expire = 2592000; \Core\Gcms::header(array('Content-type' => 'text/css; charset: UTF-8', 'Cache-Control' => 'max-age=' . $expire . ', must-revalidate, public', 'Expires' => gmdate('D, d M Y H:i:s', time() + $expire) . ' GMT', 'Last-Modified' => gmdate('D, d M Y H:i:s', time() - $expire) . ' GMT')); // โหลด css หลัก $data = preg_replace('/url\\(([\'"])?fonts\\//isu', "url(\\1" . WEB_URL . '/skin/fonts/', file_get_contents(ROOT_PATH . 'skin/fonts.css')); $data .= file_get_contents(ROOT_PATH . 'skin/gcss.css'); // โหลดจาก template $template = str_replace(ROOT_PATH, '', \Core\Gcms::get('config', 'template_root')); $skin = 'skin/' . \Core\Gcms::get('config', 'skin'); $data2 = file_get_contents(ROOT_PATH . $template . $skin . '/style.css'); $data2 = preg_replace('/url\\(([\'"])?(img|fonts)\\//isu', "url(\\1" . WEB_URL . '/' . $skin . '/\\2/', $data2); // compress css $data = preg_replace(array('!/\\*[^*]*\\*+([^/][^*]*\\*+)*/!', '/\\s?([:;,>\\{\\}])\\s?/s'), array('', '\\1', ' '), $data . $data2); // ตัด > ใน ie ต่ำกว่า 7 if (preg_match('|MSIE ([0-9].[0-9]{1,2})|', \Core\Gcms::get($_SERVER, 'HTTP_USER_AGENT'), $matched)) { if ((int) $matched[1] < 7) { $data = str_replace('>', ' ', $data); } } // render \Core\Gcms::createClass('Css\\View')->render($data); }
public function inint($modules = null) { // สร้างเมนู return \Core\Gcms::createClass('Menu\\View')->render($modules); }
/** * โหลด GCMS เพื่อประมวลผล */ public function inint() { /** * โหลด config */ $config = array(); $config['hour'] = 0; $config['languages'][0] = 'th'; $config['skin'] = ''; $config['datas_folder'] = 'datas/'; $config['template_root'] = APP_PATH; self::$CFG['config'] = new \Core\ListItem($config); self::$CFG['config']->loadFromFile(APP_PATH . 'settings/config.php'); /** * display error */ if (self::get('config', 'debug', true)) { // ขณะออกแบบ แสดง error และ warning ของ PHP ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(-1); } else { // ขณะใช้งานจริง error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT); } /** * โฟลเดอร์สำหรับเก็บข้อมูลต่างๆ นับจาก root ของ server */ define('DATA_FOLDER', self::get('config', 'datas_folder')); define('DATA_PATH', APP_PATH . DATA_FOLDER); define('DATA_URL', WEB_URL . '/' . DATA_FOLDER); /** * ภาษาที่เลือก */ $languages = self::get('config', 'languages'); $language = self::get('GET,SESSION,COOKIE', 'lang,gcms_language,gcms_language', $languages[0]); $language = is_file(DATA_PATH . "language/{$language}.php") ? $language : 'th'; define('LANGUAGE', $language); /** * skin */ $skin = \Core\Gcms::get('config', 'skin'); $template_root = \Core\Gcms::get('config', 'template_root'); $skin = is_file($template_root . 'skin/' . $skin . '/style.css') ? $skin : 'default'; define('SKIN', "skin/{$skin}/"); /** * return current instance */ return self::$instance; }
<?php /* * projects/welcome/index.php. * * @author Goragod Wiriya <*****@*****.**> * * @link http://gcms.in.th/ * * @copyright 2015 Goragod.com * @license http://gcms.in.th/license/ */ // ตัวแปรที่จำเป็นสำหรับ Framework ใช้ระบุ root folder define('APP_PATH', dirname(__FILE__) . '/'); // load GCMS include APP_PATH . '../../core/load.php'; // inint GCMS Framework \Core\Gcms::createWebApplication()->run();
/** * ประมวลผลคำสั่ง SQL สำหรับสอบถามข้อมูล คืนค่าผลลัพท์เป็นแอเรย์ของข้อมูลที่ตรงตามเงื่อนไข. * * @param string $sql query string * * @return array คืนค่าผลการทำงานเป็น record ของข้อมูลทั้งหมดที่ตรงตามเงื่อนไข ไม่พบข้อมูลคืนค่าเป็น array ว่างๆ */ public function customQuery($sql) { $result = $this->_customQuery($sql); if ($result === false) { \Core\Gcms::debug($sql, $this->error_message); return array(); } else { return $result; } }
/** * แสดงผล เป็น HTML. */ public function renderHTML($template) { // default for template self::$datas['/{WEBTITLE}/'] = \Core\Gcms::get('config', 'web_title'); self::$datas['/{WEBDESCRIPTION}/'] = \Core\Gcms::get('config', 'web_description'); self::$datas['/{LANGUAGE}/'] = LANGUAGE; self::$datas['/{WEBURL}/'] = WEB_URL; self::$datas['/{SKIN}/'] = SKIN; self::$datas['/{ELAPSED}/'] = sprintf('%.3f', microtime(true) - BEGIN_TIME); self::$datas['/{USAGE}/'] = memory_get_usage(false) / 1024; // แทนที่ลงใน template echo \Core\Gcms::pregReplace(array_keys(self::$datas), array_values(self::$datas), $template); }
/** * inint Controller. * * @param array $modules */ public function inint($modules = null) { $install_modules = array(); $install_owners = array(); $module_list = array(); $site_model = \Core\Gcms::createClass('Site\\Model'); $site_view = \Core\Gcms::createClass('Site\\View'); $menu_controller = \Core\Gcms::createClass('Menu\\Controller'); // เมนูที่ติดตั้ง foreach ($menu_controller->inint() as $item) { if (!empty($item['module']) && !isset($install_modules[$item['module']])) { $install_modules[$item['module']] = $item; $install_owners[$item['owner']][] = $item['module']; } } // โมดูลทั้งหมดที่ติดตั้ง foreach ($site_model->inint() as $item) { if (!isset($install_modules[$item['module']])) { $install_modules[$item['module']] = $item; $install_owners[$item['owner']][] = $item['module']; } } // รายชื่อโมดูลทั้งหมด $module_list = array_keys($install_modules); // รายการ home $home = $menu_controller->homeMenu(); // ถ้าไม่มีโมดูล เลือกเมนูรายการแรก if (empty($modules['module'])) { if (!empty($home['menu_url'])) { $url = \Core\Gcms::createUrl($home['menu_url']); foreach ($url->get('query') as $k => $v) { $modules[$k] = $v; } if (empty($modules['module'])) { \Core\Router::parseRoutes($url->get('path'), $modules); } } if (empty($modules['module']) && !empty($home['module'])) { $modules['module'] = $home['module']; } } // ถ้าไม่มีโมดูลหรือ เลือกโมดูลแรกสุด if (empty($modules['module']) && !empty($module_list)) { $modules['module'] = $module_list[0]; } if (empty($module_list) || !in_array($modules['module'], $module_list)) { // ไม่พบโมดูลที่เรียก 404 $modules['module'] = '404'; } // หน้าที่เรียก $page = $site_model->getModule($modules['module']); // โหลดเมนูใส่ template $site_view->set($menu_controller->render()); // เนื้อหาทั่วไป $site_view->set(array('CONTENT' => $page['detail'], 'TITLE' => $page['topic'], 'DESCRIPTION' => $page['description'], 'KEYWORDS' => $page['keywords'], 'QURIES' => \Core\Gcms::database()->queryCount())); // widget+ภาษา $site_view->set(array('/{WIDGET_([A-Z]+)(([\\s_])(.*))?}/e' => '\\Core\\Gcms::getWidgets(array(1=>"$1",3=>"$3",4=>"$4"))', '/{(LNG_[A-Z0-9_]+)}/e' => '\\Core\\Language::get(array(1=>"$1"))'), FORMAT_PCRE); // โหลดไฟล์ index.html $template = $site_view->loadTemplate('', '', 'index'); // output เป็น HTML $site_view->renderHTML($template); }