Пример #1
0
 /**
  * อ่านข้อมูลการเยี่ยมชมในวันที่เลือก
  *
  * @param string $date
  * @return array
  */
 public static function get($date)
 {
     $datas = array();
     if (preg_match('/^([0-9]+)\\-([0-9]+)\\-([0-9]+)$/', $date, $match)) {
         $y = $match[1];
         $m = $match[2];
         $d = $match[3];
         $counter_dat = ROOT_PATH . DATA_FOLDER . 'counter/' . (int) $y . '/' . (int) $m . '/' . (int) $d . '.dat';
         if (is_file($counter_dat)) {
             foreach (file($counter_dat) as $a => $item) {
                 list($sid, $sip, $sref, $sagent, $time) = explode(chr(1), $item);
                 if (preg_match_all('%(?P<browser>Firefox|Safari|MSIE|AppleWebKit|bingbot|MJ12bot|Baiduspider|Googlebot|DotBot|Twitterbot|LivelapBot|facebookexternalhit|StatusNet|PaperLiBot|SurdotlyBot|Trident|archive\\.org_bot|Yahoo\\!\\sSlurp|Go[a-z\\-]+)([\\/\\s](?P<version>[^;\\s]+))?%ix', $sagent, $result, PREG_PATTERN_ORDER)) {
                     $sagent = '<span title="' . $sagent . '">' . $result['browser'][0] . (empty($result['version'][0]) ? '' : '/' . $result['version'][0]) . '</span>';
                 } elseif ($sagent != '') {
                     $sagent = '<span title="' . $sagent . '">unknown</span>';
                 }
                 $datas[$sip . $sref] = array('time' => isset($datas[$sip . $sref]) ? $datas[$sip . $sref]['time'] : $time, 'count' => isset($datas[$sip . $sref]) ? $datas[$sip . $sref]['count'] + 1 : 1, 'ip' => '<a href="http://' . $sip . '" target=_blank>' . $sip . '</a>', 'agent' => $sagent, 'referer' => '');
                 if (preg_match('/^(https?.*(www\\.)?google(usercontent)?.*)\\/.*[\\&\\?]q=(.*)($|\\&.*)/iU', $sref, $match)) {
                     // จาก google search
                     $title = rawurldecode(rawurldecode($match[4]));
                 } elseif (preg_match('/^(https?:\\/\\/(www.)?google[\\.a-z]+\\/url\\?).*&url=(.*)($|\\&.*)/iU', $sref, $match)) {
                     // จาก google cached
                     $title = rawurldecode(rawurldecode($match[3]));
                 } elseif ($sref != '') {
                     // ลิงค์ภายในไซต์
                     $title = rawurldecode(rawurldecode($sref));
                 }
                 if ($sref != '') {
                     $datas[$sip . $sref]['referer'] = '<a href="' . $sref . '" title="' . $title . '" target=_blank>' . Text::cut($title, 149) . '</a>';
                 }
             }
         }
     }
     return $datas;
 }
Пример #2
0
 /**
  * create class
  *
  * @param string $id รหัส Antispam ถ้าเป็น null หมายถึงการสร้าง Antispam ใหม่,
  * ถ้ามีการกำหนดค่ามาจะใช้ในการตวจสอบ Antispam
  * @param int $len ความยาวของอักขระ Antispam (ค่าเริ่มต้น 4)
  */
 public function __construct($id = null, $len = 4)
 {
     if ($id) {
         $this->antispamchar = (string) $id;
     } else {
         $this->antispamchar = Text::rndname(32);
         $_SESSION[$this->antispamchar] = Text::rndname($len);
     }
 }
Пример #3
0
 /**
  * จัดรูปแบบการแสดงผลในแต่ละแถว
  *
  * @param array $item
  * @return array
  */
 public function onRow($item)
 {
     foreach ($item as $key => $value) {
         if ($key != 'id') {
             $text = \Kotchasan\Text::toEditor(is_array($value) ? implode(', ', $value) : $value);
             $item[$key] = '<span title="' . $text . '">' . \Kotchasan\Text::cut($text, 50) . '</span>';
         }
     }
     return $item;
 }
Пример #4
0
 /**
  * หน้าสมัครสมาชิก
  *
  * @param bool $modal true แสดงแบบ modal, false (default) แสดงหน้าเว็บปกติ
  * @return object
  */
 public function register($modal = false)
 {
     $index = (object) array('canonical' => WEB_URL . 'index.php?module=register', 'topic' => Language::get('Create new account'), 'description' => self::$cfg->web_description);
     // antispam
     $antispamchar = Text::rndname(32);
     $_SESSION[$antispamchar] = Text::rndname(4);
     $template = Template::create('member', 'member', 'registerfrm');
     $template->add(array('/<PHONE>(.*)<\\/PHONE>/isu' => empty(self::$cfg->member_phone) ? '' : '\\1', '/<IDCARD>(.*)<\\/IDCARD>/isu' => empty(self::$cfg->member_idcard) ? '' : '\\1', '/<INVITE>(.*)<\\/INVITE>/isu' => empty(self::$cfg->member_invitation) ? '' : '\\1', '/{TOPIC}/' => $index->topic, '/{LNG_([\\w\\s\\.\\-\'\\(\\),%\\/:&\\#;]+)}/e' => '\\Kotchasan\\Language::get(array(1=>"$1"))', '/{ANTISPAM}/' => $antispamchar, '/{WEBURL}/' => WEB_URL, '/{MODAL}/' => $modal ? 'true' : 'false', '/{INVITE}/' => self::$request->cookie('invite')->topic()));
     $index->detail = $template->render();
     $index->keywords = $index->topic;
     if (isset(Gcms::$view)) {
         Gcms::$view->addBreadcrumb($index->canonical, Language::get('Register'));
     }
     return $index;
 }
Пример #5
0
 /**
  * บันทึก
  */
 public function save(Request $request)
 {
     // referer, session
     if ($request->initSession() && $request->isReferer()) {
         $ret = array();
         // ค่าที่ส่งมา
         $email = $request->post('forgot_email')->url();
         if ($email === '') {
             $ret['ret_forgot_email'] = Language::get('Please fill out this form');
         } else {
             $search = $this->db()->createQuery()->from('user')->where(array(array('email', $email), array('fb', '0')))->toArray()->first('id', 'email');
             if ($search === false) {
                 $ret['ret_forgot_email'] = Language::get('not a registered user');
             }
         }
         if (empty($ret)) {
             // รหัสผ่านใหม่
             $password = Text::rndname(6);
             // ข้อมูลอีเมล์
             $replace = array('/%PASSWORD%/' => $password, '/%EMAIL%/' => $search['email']);
             // send mail
             $err = Email::send(3, 'member', $replace, $search['email']);
             if (empty($err)) {
                 // อัปเดทรหัสผ่านใหม่
                 $save = array('password' => md5($password . $search['email']));
                 $this->db()->createQuery()->update('user')->set($save)->where($search['id'])->execute();
                 // คืนค่า
                 $ret['alert'] = Language::get('Your message was sent successfully');
                 $ret['ret_forgot_email'] = '';
                 $location = $request->post('modal')->url();
                 $ret['location'] = $location === 'true' ? 'close' : $location;
             } else {
                 $ret['ret_forgot_email'] = $err;
             }
         } else {
             $ret['input'] = 'forgot_email';
         }
         // คืนค่าเป็น JSON
         echo json_encode($ret);
     }
 }
Пример #6
0
 /**
  * ตรวจสอบการ login เมื่อมีการเรียกใช้ class new Login
  * action=logout ออกจากระบบ
  * มาจากการ submit ตรวจสอบการ login
  * ถ้าไม่มีทั้งสองส่วนด้านบน จะตรวจสอบการ login จาก session และ cookie ตามลำดับ
  *
  * @return \static
  */
 public static function create()
 {
     // create class
     $login = new static();
     // การเข้ารหัส
     $pw = new Password(self::$cfg->password_key);
     // ชื่อฟิลด์สำหรับการรับค่าเป็นรายการแรกของ login_fields
     $field_name = reset(self::$cfg->login_fields);
     // อ่านข้อมูลจากฟอร์ม login ฟิลด์ login_username
     self::$text_username = self::$request->post('login_username', null)->toString();
     if (self::$text_username === null) {
         if (isset($_SESSION['login']) && isset($_SESSION['login'][$field_name])) {
             // from session
             self::$text_username = $_SESSION['login'][$field_name];
         } else {
             // from cookie
             $datas = self::$request->getCookieParams();
             self::$text_username = isset($datas['login_username']) ? $pw->decode($datas['login_username']) : null;
         }
         $login->from_submit = false;
     } else {
         $login->from_submit = true;
     }
     self::$text_username = Text::username(self::$text_username);
     // ค่าที่ส่งมา
     self::$text_password = $login->get('password', $pw);
     $login_remember = $login->get('remember', $pw) == 1 ? 1 : 0;
     // ตรวจสอบการ login
     if (self::$request->get('action')->toString() === 'logout' && !$login->from_submit) {
         // logout ลบ session และ cookie
         unset($_SESSION['login']);
         $time = time();
         setCookie('login_username', '', $time, '/');
         setCookie('login_password', '', $time, '/');
         self::$login_message = Language::get('Logout successful');
     } elseif (self::$request->post('action')->toString() === 'forgot') {
         // ตรวจสอบอีเมล์สำหรับการขอรหัสผ่านใหม่
         return $login->forgot(self::$request);
     } else {
         // ตรวจสอบค่าที่ส่งมา
         if (self::$text_username == '') {
             if ($login->from_submit) {
                 self::$login_message = Language::get('Please fill out this form');
                 self::$login_input = 'login_username';
             }
         } elseif (self::$text_password == '') {
             if ($login->from_submit) {
                 self::$login_message = Language::get('Please fill out this form');
                 self::$login_input = 'login_password';
             }
         } elseif (!$login->from_submit || $login->from_submit && self::$request->isSafe()) {
             // ตรวจสอบการ login กับฐานข้อมูล
             $login_result = $login->checkLogin(self::$text_username, self::$text_password);
             if (is_string($login_result)) {
                 // ข้อความผิดพลาด
                 self::$login_input = self::$login_input == 'password' ? 'login_password' : 'login_username';
                 self::$login_message = Language::get($login_result);
                 // logout ลบ session และ cookie
                 unset($_SESSION['login']);
                 $time = time();
                 setCookie('login_username', '', $time, '/');
                 setCookie('login_password', '', $time, '/');
             } else {
                 // save login session
                 $login_result['password'] = self::$text_password;
                 $_SESSION['login'] = $login_result;
                 // save login cookie
                 $time = time() + 2592000;
                 if ($login_remember == 1) {
                     setcookie('login_username', $pw->encode(self::$text_username), $time, '/');
                     setcookie('login_password', $pw->encode(self::$text_password), $time, '/');
                     setcookie('login_remember', $login_remember, $time, '/');
                 }
                 setcookie('login_id', $login_result['id'], $time, '/');
             }
         }
         return $login;
     }
 }
Пример #7
0
 /**
  * Generated from @assert ('012 3465') [==] '0123465'.
  *
  * @covers Kotchasan\Text::username
  */
 public function testUsername2()
 {
     $this->assertEquals('0123465', \Kotchasan\Text::username('012 3465'));
 }
Пример #8
0
 public function chklogin(Request $request)
 {
     $data = $request->post('data')->toString();
     if (!empty($data) && $request->initSession() && $request->isSafe()) {
         // สุ่มรหัสผ่านใหม่
         $login_password = Text::rndname(6);
         // ข้อมูลที่ส่งมา
         $facebook_data = array();
         foreach (explode('&', $data) as $item) {
             list($k, $v) = explode('=', $item);
             if ($k === 'gender') {
                 $facebook_data['sex'] = $v === 'male' ? 'm' : 'f';
             } elseif ($k === 'link') {
                 $facebook_data['website'] = str_replace(array('http://', 'https://', 'www.'), '', $v);
             } elseif ($k === 'first_name') {
                 $facebook_data['fname'] = $v;
                 $facebook_data['displayname'] = $v;
             } elseif ($k === 'last_name') {
                 $facebook_data['lname'] = $v;
             } elseif ($k === 'email') {
                 $facebook_data['email'] = $v;
             } elseif ($k === 'id') {
                 $fb_id = $v;
             } elseif ($k === 'birthday' && preg_match('/^([0-9]+)[\\/\\-]([0-9]+)[\\/\\-]([0-9]+)$/', $v, $match)) {
                 $facebook_data['birthday'] = "{$match['3']}-{$match['1']}-{$match['2']}";
             }
         }
         // ไม่มีอีเมล์ ใช้ id ของ Facebook
         if (empty($facebook_data['email'])) {
             $facebook_data['email'] = $fb_id;
         }
         // db
         $db = $this->db();
         // table
         $user_table = $this->getFullTableName('user');
         // ตรวจสอบสมาชิกกับ db
         $search = $db->createQuery()->from('user')->where(array('email', $facebook_data['email']), array('displayname', $facebook_data['displayname']), 'OR')->toArray()->first('id', 'email', 'visited', 'fb', 'website');
         if ($search === false) {
             // ยังไม่เคยลงทะเบียน, ลงทะเบียนใหม่
             $facebook_data['id'] = $db->getNextId($this->getTableName('user'));
             $facebook_data['fb'] = 1;
             $facebook_data['subscrib'] = 1;
             $facebook_data['visited'] = 0;
             $facebook_data['ip'] = $request->getClientIp();
             $facebook_data['password'] = md5($login_password . $facebook_data['email']);
             $facebook_data['lastvisited'] = time();
             $facebook_data['create_date'] = $facebook_data['lastvisited'];
             $facebook_data['icon'] = $facebook_data['id'] . '.jpg';
             $facebook_data['country'] = 'TH';
             $db->insert($user_table, $facebook_data);
         } elseif ($search['fb'] == 1) {
             // facebook เคยเยี่ยมชมแล้ว อัปเดทการเยี่ยมชม
             $facebook_data['visited'] = $search['visited'] + 1;
             $facebook_data['lastvisited'] = time();
             $facebook_data['ip'] = $request->getClientIp();
             $facebook_data['password'] = md5($login_password . $search['email']);
             $db->update($user_table, $search['id'], $facebook_data);
         } else {
             // ไม่สามารถ login ได้ เนื่องจากมี email อยู่ก่อนแล้ว
             $facebook_data = false;
             $ret['alert'] = str_replace(':name', Language::get('User'), Language::get('This :name is already registered'));
             $ret['isMember'] = 0;
         }
         if (is_array($facebook_data)) {
             // อัปเดท icon สมาชิก
             $data = @file_get_contents('https://graph.facebook.com/' . $fb_id . '/picture');
             if ($data) {
                 $f = @fopen(ROOT_PATH . self::$cfg->usericon_folder . $facebook_data['icon'], 'wb');
                 if ($f) {
                     fwrite($f, $data);
                     fclose($f);
                 }
             }
             // login
             $facebook_data['password'] = $login_password;
             $_SESSION['login'] = $facebook_data;
             // clear
             $request->removeToken();
             // reload
             $ret['isMember'] = 1;
             $u = $request->post('u')->toString();
             if (preg_match('/module=(do)?login/', $u) || preg_match('/(do)?login\\.html/', $u)) {
                 $ret['location'] = 'back';
             } else {
                 $ret['location'] = 'reload';
             }
         }
         // คืนค่าเป็น json
         echo json_encode($ret);
     }
 }
Пример #9
0
 /**
  * รับค่าจาก action
  */
 public function action(Request $request)
 {
     if ($request->initSession() && $request->isReferer() && ($login = Login::isAdmin())) {
         if ($login['email'] == 'demo' || !empty($login['fb'])) {
             echo Language::get('Unable to complete the transaction');
         } else {
             // รับค่าจากการ POST
             $action = $request->post('action')->toString();
             // id ที่ส่งมา
             if (preg_match_all('/,?([0-9]+),?/', $request->post('id')->toString(), $match)) {
                 // Model
                 $model = new \Kotchasan\Model();
                 // ตาราง user
                 $user_table = $model->getFullTableName('user');
                 if ($action === 'delete') {
                     // ลบไอคอนสมาชิก
                     $query = $model->db()->createQuery()->select('icon')->from('user')->where(array(array('id', $match[1]), array('id', '!=', 1), array('icon', '!=', '')));
                     foreach ($query->toArray()->execute() as $item) {
                         @unlink(ROOT_PATH . self::$cfg->usericon_folder . $item['icon']);
                     }
                     // ลบสมาชิก
                     $model->db()->delete($user_table, array(array('id', $match[1]), array('id', '!=', 1)), 0);
                 } elseif ($action === 'accept') {
                     // ยอมรับสมาชิกที่เลือก
                     $model->db()->update($user_table, array(array('id', $match[1]), array('fb', '0')), array('activatecode' => ''));
                 } elseif ($action === 'ban' || $action === 'unban') {
                     // ระงับ/ยกเลิก การใช้งานสมาชิก
                     $model->db()->update($user_table, array(array('id', $match[1]), array('id', '!=', 1)), array('ban' => $action == 'ban' ? 1 : 0));
                 } elseif ($action === 'activate' || $action === 'sendpassword') {
                     // ส่งอีเมล์ยืนยันสมาชิก
                     $query = $model->db()->createQuery()->select('id', 'email', 'activatecode')->from('user')->where(array(array('id', $match[1]), array('id', '!=', 1), array('fb', '0')));
                     $msgs = array();
                     foreach ($query->toArray()->execute() as $item) {
                         // รหัสผ่านใหม่
                         $password = Text::rndname(6);
                         // ข้อมูลอีเมล์
                         $replace = array('/%PASSWORD%/' => $password, '/%EMAIL%/' => $item['email']);
                         $save = array('password' => md5($password . $item['email']));
                         if ($action === 'activate' || !empty($item['activatecode'])) {
                             // activate หรือ ยังไม่ได้ activate
                             $save['activatecode'] = empty($item['activatecode']) ? Text::rndname(32) : $item['activatecode'];
                             $replace['/%ID%/'] = $save['activatecode'];
                             // send mail
                             $err = Email::send(1, 'member', $replace, $item['email']);
                         } else {
                             // send mail
                             $err = Email::send(3, 'member', $replace, $item['email']);
                         }
                         $msgs = array();
                         if (empty($err)) {
                             // อัปเดทรหัสผ่านใหม่
                             $model->db()->update($user_table, $item['id'], $save);
                         } else {
                             $msgs[] = $err;
                         }
                         if (empty($msgs)) {
                             // ส่งอีเมล์ สำเร็จ
                             echo Language::get('Your message was sent successfully');
                         } else {
                             // มีข้อผิดพลาด
                             echo implode("\n", $msgs);
                         }
                     }
                 } elseif ($request->post('module')->toString() === 'status') {
                     // เปลี่ยนสถานะสมาชิก
                     $model->db()->update($user_table, array(array('id', $match[1]), array('id', '!=', 1), array('fb', '0')), array('status' => (int) $action));
                 }
             }
         }
     }
 }
Пример #10
0
 /**
  * กำหนดคีย์ของแคชจาก query
  * 
  * @param string $sql
  * @param array $values
  * @return Item
  */
 public function init($sql, $values)
 {
     return $this->db_cache->getItem(Text::replace($sql, $values));
 }
Пример #11
0
 /**
  * อ่านข้อมูลจากแคช
  *
  * @param string $key
  * @param array $values (options)
  * @return mixed คืนค่าข้อมูลหรือ false ถ้าไม่มีแคช
  */
 public function get($sql, $values)
 {
     $this->item = $this->db_cache->getItem(Text::replace($sql, $values));
     return $this->item->isHit() ? $this->item->get() : false;
 }
Пример #12
0
 /**
  * ฟังก์ชั่นบันทึกการ query sql
  *
  * @param string $type
  * @param string $sql
  * @param array $values (options)
  */
 protected function log($type, $sql, $values = array())
 {
     if (DB_LOG == true) {
         $datas = array('<b>' . $type . ' :</b> ' . Text::replace($sql, $values));
         foreach (debug_backtrace() as $a => $item) {
             if (isset($item['file']) && isset($item['line'])) {
                 if ($item['function'] == 'all' || $item['function'] == 'first' || $item['function'] == 'count' || $item['function'] == 'save' || $item['function'] == 'find' || $item['function'] == 'execute') {
                     $datas[] = '<br>[' . $a . '] <b>' . $item['function'] . '</b> in <b>' . $item['file'] . '</b> line <b>' . $item['line'] . '</b>';
                     break;
                 }
             }
         }
         // บันทึก log
         Logger::create()->info(implode('', $datas));
     }
 }
Пример #13
0
 /**
  * ฟังก์ชั่นส่งอีเมล์ลืมรหัสผ่าน
  */
 public function forgot(Request $request)
 {
     // ค่าที่ส่งมา
     $email = $request->post('login_username')->url();
     if (empty($email)) {
         if ($request->post('action')->toString() === 'forgot') {
             self::$login_message = Language::get('Please fill out this form');
         }
     } else {
         self::$text_username = $email;
         // ค้นหาอีเมล์หรือโทรศัพท์
         $model = new Model();
         $user_table = $model->getFullTableName('user');
         $search = $model->db()->first($user_table, array(array('email', $email), array('fb', '0')));
         if ($search === false) {
             self::$login_message = Language::get('not a registered user');
         } else {
             // รหัสผ่านใหม่
             $password = Text::rndname(6);
             // ข้อมูลอีเมล์
             $replace = array('/%PASSWORD%/' => $password, '/%EMAIL%/' => $search->email);
             // send mail
             $err = Email::send(3, 'member', $replace, $search->email);
             if (empty($err)) {
                 // อัปเดทรหัสผ่านใหม่
                 $model->db()->update($user_table, (int) $search->id, array('password' => md5($password . $search->email)));
                 // คืนค่า
                 self::$login_message = Language::get('Your message was sent successfully');
                 self::$request = $request->withParsedBody(array('action' => 'login'));
             } else {
                 self::$login_message = $err;
             }
         }
     }
 }
Пример #14
0
 /**
  * ฟังก์ชั่น แปลง html เป็น text
  * สำหรับตัด tag หรือเอา BBCode ออกจากเนื้อหาที่เป็น HTML ให้เหลือแต่ข้อความล้วน
  *
  * @param string $text ข้อความ
  * @return string คืนค่าข้อความ
  */
 public static function html2txt($text, $len = 0)
 {
     $patt = array();
     $replace = array();
     // ตัด style
     $patt[] = '@<style[^>]*?>.*?</style>@siu';
     $replace[] = '';
     // ตัด comment
     $patt[] = '@<![\\s\\S]*?--[ \\t\\n\\r]*>@u';
     $replace[] = '';
     // ตัด tag
     $patt[] = '@<[\\/\\!]*?[^<>]*?>@iu';
     $replace[] = '';
     // ตัด keywords
     $patt[] = '/{(WIDGET|LNG)_[a-zA-Z0-9_]+}/su';
     $replace[] = '';
     // ลบ BBCode
     $patt[] = '/(\\[code(.+)?\\]|\\[\\/code\\]|\\[ex(.+)?\\])/ui';
     $replace[] = '';
     // ลบ BBCode ทั่วไป [b],[i]
     $patt[] = '/\\[([a-z]+)([\\s=].*)?\\](.*?)\\[\\/\\1\\]/ui';
     $replace[] = '\\3';
     $replace[] = ' ';
     // ตัดตัวอักษรที่ไม่ต้องการออก
     $patt[] = '/(&amp;|&quot;|&nbsp;|[_\\(\\)\\-\\+\\r\\n\\s\\"\'<>\\.\\/\\\\?&\\{\\}]){1,}/isu';
     $replace[] = ' ';
     $text = trim(preg_replace($patt, $replace, $text));
     if ($len > 0) {
         $text = Text::cut($text, $len);
     }
     return $text;
 }
Пример #15
0
 /**
  * บันทึก
  */
 public function save(Request $request)
 {
     $ret = array();
     // referer, session
     if ($request->initSession() && $request->isReferer()) {
         $antispam = new Antispam($request->post('register_antispamid')->toString());
         if (!$antispam->valid($request->post('register_antispam')->toString())) {
             // Antispam ไม่ถูกต้อง
             $ret['ret_register_antispam'] = 'this';
             $ret['input'] = 'register_antispam';
         } else {
             // รับค่าจากการ POST
             $save = array();
             foreach ($request->getParsedBody() as $key => $value) {
                 $k = str_replace('register_', '', $key);
                 switch ($k) {
                     case 'email':
                         $save['email'] = $request->post($key)->username();
                         break;
                     case 'phone1':
                     case 'idcard':
                         $save[$k] = $request->post($key)->number();
                         break;
                     case 'invite':
                         $save[$k] = $request->post($key)->toInt();
                         break;
                     case 'password':
                     case 'repassword':
                     case 'accept':
                     case 'next':
                         ${$k} = $request->post($key)->toString();
                         break;
                 }
             }
             if ($accept === '1') {
                 // ชื่อตาราง user
                 $user_table = $this->getFullTableName('user');
                 // database connection
                 $db = $this->db();
                 // ตรวจสอบค่าที่ส่งมา
                 $input = false;
                 // อีเมล์
                 if (empty($save['email'])) {
                     $ret['ret_register_email'] = 'this';
                     $input = !$input ? 'register_email' : $input;
                 } elseif (!Validator::email($save['email'])) {
                     $ret['ret_register_email'] = str_replace(':name', Language::get('Email'), Language::get('Invalid :name'));
                     $input = !$input ? 'register_email' : $input;
                 } else {
                     // ตรวจสอบอีเมล์ซ้ำ
                     $search = $db->first($user_table, array('email', $save['email']));
                     if ($search !== false) {
                         $ret['ret_register_email'] = str_replace(':name', Language::get('Email'), Language::get('This :name is already registered'));
                         $input = !$input ? 'register_email' : $input;
                     } else {
                         $ret['ret_register_email'] = '';
                     }
                 }
                 // password
                 if (mb_strlen($password) < 4) {
                     // รหัสผ่านต้องไม่น้อยกว่า 4 ตัวอักษร
                     $ret['ret_register_password'] = '******';
                     $input = !$input ? 'register_password' : $input;
                 } elseif ($repassword != $password) {
                     // ถ้าต้องการเปลี่ยนรหัสผ่าน กรุณากรอกรหัสผ่านสองช่องให้ตรงกัน
                     $ret['ret_register_repassword'] = '******';
                     $input = !$input ? 'register_repassword' : $input;
                 } else {
                     $save['password'] = md5($password . $save['email']);
                     $ret['ret_register_password'] = '';
                     $ret['ret_register_repassword'] = '';
                 }
                 // phone1
                 if (!empty($save['phone1'])) {
                     if (!preg_match('/[0-9]{9,10}/', $save['phone1'])) {
                         $ret['ret_register_phone1'] = str_replace(':name', Language::get('phone number'), Language::get('Invalid :name'));
                         $input = !$input ? 'register_phone1' : $input;
                     } else {
                         // ตรวจสอบโทรศัพท์
                         $search = $db->first($user_table, array('phone1', $save['phone1']));
                         if ($search !== false) {
                             $ret['ret_register_phone1'] = str_replace(':name', Language::get('phone number'), Language::get('This :name is already registered'));
                             $input = !$input ? 'register_phone1' : $input;
                         } else {
                             $ret['ret_register_phone1'] = '';
                         }
                     }
                 } elseif (self::$cfg->member_phone == 2) {
                     $ret['ret_register_phone1'] = 'this';
                     $input = !$input ? 'register_phone1' : $input;
                 }
                 // idcard
                 if (!empty($save['idcard'])) {
                     if (!Validator::idCard($save['idcard'])) {
                         $ret['ret_register_idcard'] = str_replace(':name', Language::get('Identification number'), Language::get('Invalid :name'));
                         $input = !$input ? 'register_idcard' : $input;
                     } else {
                         // ตรวจสอบ idcard ซ้ำ
                         $search = $db->first($user_table, array('idcard', $save['idcard']));
                         if ($search !== false) {
                             $ret['ret_register_idcard'] = str_replace(':name', Language::get('Identification number'), Language::get('This :name is already registered'));
                             $input = !$input ? 'register_idcard' : $input;
                         } else {
                             $ret['ret_register_idcard'] = '';
                         }
                     }
                 } elseif (self::$cfg->member_idcard == 2) {
                     $ret['ret_idcard'] = 'this';
                     $input = !$input ? 'idcard' : $input;
                 }
                 // invite
                 if (isset($save['invite'])) {
                     $ret['ret_invite'] = '';
                     if (!empty($save['invite'])) {
                         $search = $db->first($user_table, $save['invite']);
                         if ($search === false) {
                             $ret['ret_register_invite'] = str_replace(':name', Language::get('Invitation code'), Language::get('Invalid :name'));
                             $input = !$input ? 'register_invite' : $input;
                         }
                     }
                 }
                 if (!$input) {
                     $save['create_date'] = time();
                     $save['subscrib'] = 1;
                     $save['status'] = 0;
                     list($displayname, $domain) = explode('@', $save['email']);
                     $save['displayname'] = $displayname;
                     $a = 1;
                     while (true) {
                         if (false === $db->first($user_table, array('displayname', $save['displayname']))) {
                             break;
                         } else {
                             $a++;
                             $save['displayname'] = $displayname . $a;
                         }
                     }
                     // รหัสยืนยัน
                     $save['activatecode'] = empty(self::$cfg->user_activate) ? '' : Text::rndname(32);
                     // บันทึกลงฐานข้อมูล
                     $save['id'] = $db->insert($user_table, $save);
                     // ส่งอีเมล์
                     $replace = array('/%EMAIL%/' => $save['email'], '/%PASSWORD%/' => $password, '/%ID%/' => $save['activatecode']);
                     Email::send(empty(self::$cfg->user_activate) ? 2 : 1, 'member', $replace, $save['email']);
                     if (empty(self::$cfg->user_activate)) {
                         // login
                         $save['password'] = $password;
                         $_SESSION['login'] = $save;
                         // แสดงข้อความตอบรับการสมัครสมาชิก
                         $ret['alert'] = str_replace(':email', $save['email'], Language::get('Registration information sent to :email complete. We will take you to edit your profile'));
                         // ถ้าไม่มีการกำหนดหน้าถัดไปมา ไปแก้ไขข้อมูลส่วนตัว
                         $ret['location'] = isset($next) ? $next : WEB_URL . 'index.php?module=editprofile';
                     } else {
                         // แสดงข้อความตอบรับการสมัครสมาชิก
                         $ret['alert'] = str_replace(':email', $save['email'], Language::get('Register successfully, We have sent complete registration information to :email'));
                         // ถ้าไม่มีการกำหนดหน้าถัดไปมา กลับไปหน้าหลักเว็บไซต์
                         $ret['location'] = isset($next) ? $next : WEB_URL . 'index.php';
                     }
                     // clear antispam
                     $antispam->delete();
                 } else {
                     $ret['input'] = $input;
                 }
             }
         }
     }
     // คืนค่าเป็น JSON
     if (!empty($ret)) {
         echo json_encode($ret);
     }
 }