Esempio n. 1
0
 public function post_signup()
 {
     // get parameters and set to local variables
     $mymobile = utility::post('mobile', 'filter');
     $mypass = utility::post('password', 'hash');
     // check for mobile exist
     $tmp_result = $this->sql()->tableUsers()->whereUser_mobile($mymobile)->select();
     // if exist
     if ($tmp_result->num() == 1) {
         debug::error(T_("mobile number exist!"));
     } elseif ($tmp_result->num() == 0) {
         $qry = $this->sql()->tableUsers()->setUser_mobile($mymobile)->setUser_pass($mypass)->setUser_permission(3)->setUser_createdate(date('Y-m-d H:i:s'));
         $sql = $qry->insert();
         // ======================================================
         // you can manage next event with one of these variables,
         // commit for successfull and rollback for failed
         // if query run without error means commit
         $this->commit(function ($_mobile) {
             // \lib\utility\Sms::send($_mobile, 'signup', $_code);
             debug::true(T_("register successfully"));
             // $this->redirector()->set_url('verification?from=signup&mobile='.$_mobile.'&referer='.$myreferer);
             // $this->redirector()->set_url('login?from=signup&mobile='.$_mobile);
         }, $mymobile);
         // if a query has error or any error occour in any part of codes, run roolback
         $this->rollback(function () {
             debug::error(T_("register failed!"));
         });
     } else {
         debug::error(T_("please forward this message to administrator"));
     }
 }
Esempio n. 2
0
 function post_changepass()
 {
     $myid = $this->login('id');
     $newpass = utility::post('password-new', 'hash');
     $oldpass = utility::post('password-old');
     $tmp_result = $this->sql()->tableUsers()->where('id', $myid)->and('user_status', 'active')->select();
     // if exist
     if ($tmp_result->num() == 1) {
         $tmp_result = $tmp_result->assoc();
         $myhashedPassword = $tmp_result['user_pass'];
         // if password is correct. go for login:)
         if (isset($myhashedPassword) && utility::hasher($oldpass, $myhashedPassword)) {
             $newpass = utility::post('password-new', 'hash');
             $qry = $this->sql()->table('users')->where('id', $myid)->set('user_pass', $newpass);
             $sql = $qry->update();
             $this->commit(function () {
                 debug::true(T_("change password successfully"));
                 $this->redirector()->set_domain()->set_url();
                 // \lib\utility\Sms::send($_mobile, 'changepass');
             });
             // if a query has error or any error occour in any part of codes, run roolback
             $this->rollback(function () {
                 debug::error(T_("change password failed!"));
             });
         } else {
             debug::error(T_("Password is incorrect"));
         }
     } elseif ($tmp_result->num() == 0) {
         debug::error(T_("user is incorrect"));
     } else {
         debug::error(T_("Please forward this message to administrator"));
     }
     sleep(0.1);
 }
Esempio n. 3
0
 /**
  * Update options data
  * @return run update query and no return value
  */
 function put_options()
 {
     $myFields = ['title' => 'site-title', 'desc' => 'site-desc', 'email' => 'site-email', 'url' => 'site-url', 'redirect' => 'site-redirect', 'register' => 'site-reg', 'permissions' => 'site-role'];
     foreach ($myFields as $field => $postName) {
         $qry = $this->sql()->table('options')->where('option_cat', 'options')->and('option_key', $field)->and('post_id', '#NULL')->and('user_id', '#NULL');
         $fieldExist = $qry->select()->num();
         // if exist more than 2 times remove all the properties
         if ($fieldExist > 1) {
             debug::true(T_("We find a problem and solve it!"));
             $qry->delete();
             $fieldExist = 0;
         }
         $value = utility::post($postName);
         if (!$value) {
             $value = '#""';
         }
         $qry = $qry->set('option_cat', 'options')->set('option_status', 'enable')->set('option_key', $field)->set('option_value', $value);
         // if exist update field
         if ($fieldExist == 1) {
             $qry->update();
         } else {
             $qry->insert('IGNORE');
         }
     }
     // exit();
     $this->commit(function () {
         debug::true(T_("Update Successfully"));
         // $this->redirector()->set_url($_module.'/edit='.$_postId);
     });
     // if a query has error or any error occour in any part of codes, run roolback
     $this->rollback(function () {
         debug::title(T_("Transaction error") . ': ');
     });
 }
Esempio n. 4
0
 /**
  * signup to system
  * @return [type] [description]
  */
 public function post_signup()
 {
     // get parameters and set to local variables
     $mymobile = utility::post('mobile', 'filter');
     $mypass = utility::post('password', 'hash');
     $myperm = $this->option('account');
     if (!$myperm) {
         $myperm = 'NULL';
     }
     $user_id = \lib\db\users::signup($mymobile, $mypass, $myperm);
     if ($user_id) {
         // generate verification code
         // save in logs table
         // set SESSION verification_mobile
         $code = \lib\utility\filter::generate_verification_code($user_id, $mymobile);
         if ($code) {
             \lib\utility\sms::send($mymobile, 'signup', $code);
             debug::true(T_("Register successfully"));
             $this->redirector()->set_url('verification?from=signup&mobile=' . $mymobile);
             // $this->redirector()->set_url('login?from=signup&cp=1&mobile='.$mymobile);
         } else {
             debug::error(T_("Please contact to administrator!"));
         }
     } elseif ($user_id === false) {
         debug::error(T_("Mobile number exist!"));
     } else {
         debug::error(T_("Please contact to administrator!"));
     }
 }
Esempio n. 5
0
 /**
  * this function set custom operator for each custom module in cp
  * @param  [type] $_id [description]
  * @return [type]      [description]
  */
 function cp_create_query($_id = null)
 {
     if (!$_id) {
         $_id = $this->childparam('edit');
     }
     $cpModule = $this->cpModule();
     $mymodule = $this->cpModule('raw');
     $qry = $this->sql();
     $datarow = array();
     $datarow['slug'] = utility::post('slug', 'filter');
     $datarow['parent'] = utility::post('parent');
     if (!$datarow['slug']) {
         $datarow['slug'] = utility\filter::slug(utility::post('title'));
     }
     if ($datarow['parent']) {
         $datarow['url'] = $this->sql()->table('terms')->where('id', $datarow['parent'])->select()->assoc('term_url') . '/' . $datarow['slug'];
     } else {
         $datarow['parent'] = '#NULL';
         $datarow['url'] = $datarow['slug'];
     }
     if ($cpModule['raw'] === 'bookcategories') {
         $datarow['url'] = 'book-index/' . preg_replace("#^(book-index\\/)+#", "", $datarow['url']);
     }
     // var_dump($datarow['slug']);exit();
     if (utility::post('title')) {
         $qry = $qry->table('terms')->set('term_type', $cpModule['type'])->set('term_language', utility::post('language'))->set('term_title', utility::post('title'))->set('term_slug', $datarow['slug'])->set('term_desc', utility::post('desc'))->set('term_parent', $datarow['parent'])->set('term_url', $datarow['url']);
     } else {
         debug::error(T_("Please enter title!"));
         return false;
     }
     $post_new_id = null;
     if ($_id) {
         // on edit
         $qry = $qry->where('id', $_id)->update();
         $post_new_id = $_id;
     } else {
         // on add
         $qry = $qry->insert();
         $post_new_id = $qry->LAST_INSERT_ID();
     }
     // ======================================================
     // you can manage next event with one of these variables,
     // commit for successfull and rollback for failed
     // if query run without error means commit
     $this->commit(function ($_module, $_postId, $_edit = null) {
         if ($_edit) {
             debug::true(T_("Update Successfully"));
             // $this->redirector()->set_url($_module.'/edit='.$_postId);
         } else {
             debug::true(T_("Insert Successfully"));
             $this->redirector()->set_url($_module . '/add');
             // $this->redirector()->set_url($_module.'/edit='.$_postId);
         }
     }, $mymodule, $post_new_id, $_id);
     // if a query has error or any error occour in any part of codes, run roolback
     $this->rollback(function () {
         debug::title(T_("Transaction error") . ': ');
     });
 }
Esempio n. 6
0
 public function post_login()
 {
     // get parameters and set to local variables
     $mymobile = utility::post('mobile', 'filter');
     $mypass = utility::post('password');
     // check for mobile exist
     $tmp_result = $this->sql()->tableUsers()->whereUser_mobile($mymobile)->and('user_status', 'active')->select();
     // $tmp_result =  $this->sql()->tableUsers()->select();
     // if exist
     if ($tmp_result->num() == 1) {
         $tmp_result = $tmp_result->assoc();
         $myhashedPassword = $tmp_result['user_pass'];
         // if password is correct. go for login:)
         if (isset($myhashedPassword) && utility::hasher($mypass, $myhashedPassword)) {
             // you can change the code way easily at any time!
             // $qry		= $this->sql()->tableUsers ()
             // 				->setUser_logincounter  ($tmp_result['user_logincounter'] +1)
             // 				->whereId               ($tmp_result['id']);
             // $sql		= $qry->update();
             $myfields = array('id', 'user_displayname', 'user_mobile', 'user_meta', 'user_status');
             $this->setLoginSession($tmp_result, $myfields);
             // ======================================================
             // you can manage next event with one of these variables,
             // commit for successfull and rollback for failed
             // if query run without error means commit
             $this->commit(function () {
                 // $this->logger('login');
                 // create code for pass with get to service home page
                 debug::true(T_("Login Successfully"));
                 \lib\utility\session::save();
                 $referer = \lib\router::urlParser('referer', 'host');
                 // set redirect to homepage
                 $this->redirector()->set_domain()->set_url();
                 if (\lib\utility\option::get('account', 'status')) {
                     $_redirect_sub = \lib\utility\option::get('account', 'meta', 'redirect');
                     if ($_redirect_sub !== 'home') {
                         if (\lib\utility\option::get('config', 'meta', 'fakeSub')) {
                             $this->redirector()->set_url($_redirect_sub);
                         } else {
                             $this->redirector()->set_sub_domain($_redirect_sub);
                         }
                     }
                 }
                 // do not use pushstate and run link direct
                 debug::msg('direct', true);
             });
             $this->rollback(function () {
                 debug::error(T_("Login failed!"));
             });
         } else {
             debug::error(T_("Mobile or password is incorrect"));
         }
     } elseif ($tmp_result->num() == 0) {
         debug::error(T_("Mobile or password is incorrect"));
     } else {
         debug::error(T_("Please forward this message to administrator"));
     }
     // sleep(0.1);
 }
Esempio n. 7
0
 public function post_login()
 {
     // get parameters and set to local variables
     $mymobile = utility::post('mobile', 'filter');
     $mypass = utility::post('password');
     // check for mobile exist
     $tmp_result = $this->sql()->tableUsers()->whereUser_mobile($mymobile)->and('user_status', 'active')->select();
     // $tmp_result =  $this->sql()->tableUsers()->select();
     // if exist
     if ($tmp_result->num() == 1) {
         $tmp_result = $tmp_result->assoc();
         $myhashedPassword = $tmp_result['user_pass'];
         // if password is correct. go for login:)
         if (isset($myhashedPassword) && utility::hasher($mypass, $myhashedPassword)) {
             // you can change the code way easily at any time!
             // $qry		= $this->sql()->tableUsers ()
             // 				->setUser_logincounter  ($tmp_result['user_logincounter'] +1)
             // 				->whereId               ($tmp_result['id']);
             // $sql		= $qry->update();
             $myfields = array('id', 'user_displayname', 'user_mobile', 'user_status');
             $this->setLoginSession($tmp_result, $myfields);
             // ======================================================
             // you can manage next event with one of these variables,
             // commit for successfull and rollback for failed
             // if query run without error means commit
             $this->commit(function () {
                 // $this->logger('login');
                 // create code for pass with get to service home page
                 debug::true(T_("Login Successfully"));
                 $referer = \lib\router::urlParser('referer', 'host');
                 /**
                  * temporary: after fix permissions below line must be delete
                  */
                 if ($referer == 'archiver.dev' || $referer == 'irancamera.ir') {
                     $this->redirector()->set_domain()->set_sub_domain('files')->set_url();
                 } elseif (\lib\router::get_storage('CMS')) {
                     $this->redirector()->set_domain()->set_sub_domain(\lib\router::get_storage('CMS'))->set_url();
                 } else {
                     $this->redirector()->set_domain()->set_url();
                 }
             });
             $this->rollback(function () {
                 debug::error(T_("Login failed!"));
             });
         } else {
             debug::error(T_("Mobile or password is incorrect"));
         }
     } elseif ($tmp_result->num() == 0) {
         debug::error(T_("Mobile or password is incorrect"));
     } else {
         debug::error(T_("Please forward this message to administrator"));
     }
     sleep(0.1);
 }
Esempio n. 8
0
 /**
  * Update profile data
  * @return run update query and no return value
  */
 function put_profile()
 {
     $qry = $this->sql()->table('users')->where('id', $this->login('id'))->set('user_mobile', utility::post('mobile'))->set('user_email', utility::post('email'))->set('user_displayname', utility::post('displayname'));
     $qry->update();
     $this->commit(function () {
         debug::true(T_("Update Successfully"));
         // $this->redirector()->set_url($_module.'/edit='.$_postId);
     });
     // if a query has error or any error occour in any part of codes, run roolback
     $this->rollback(function () {
         debug::title(T_("Transaction error") . ': ');
     });
 }
Esempio n. 9
0
 public function put_verification()
 {
     // get parameters and set to local variables
     $mycode = utility::post('code');
     $mymobile = utility::post('mobile', 'filter');
     if ($mymobile == '' && isset($_SESSION['verification_mobile'])) {
         $mymobile = $_SESSION['verification_mobile'];
     }
     $myuserid = $this->sql()->table('users')->field('id')->where('user_mobile', $mymobile)->select()->assoc('id');
     // check for mobile exist
     $tmp_result = $this->sql()->table('logs')->where('user_id', $myuserid)->and('log_data', $mycode)->and('log_status', 'enable')->select();
     if ($tmp_result->num()) {
         // mobile and code exist update the record and verify
         $qry = $this->sql()->table('logs')->set('log_status', 'expire')->where('user_id', $myuserid)->and('log_data', $mycode)->and('log_status', 'enable');
         $sql = $qry->update();
         $sql_users = $this->sql()->table('users')->where('id', $myuserid)->set('user_status', 'active')->update();
         // ======================================================
         // you can manage next event with one of these variables,
         // commit for successfull and rollback for failed
         //
         // if query run without error means commit
         $this->commit(function ($_mobile, $_userid) {
             $myfrom = utility\cookie::read('from');
             if ($myfrom == 'signup') {
                 // login user to system
                 $this->model()->setLogin($_userid);
                 //Send SMS
                 \lib\utility\sms::send($_mobile, 'verification');
                 debug::true(T_("verify successfully."));
             } else {
                 // login user to system
                 $this->model()->setLogin($_userid, false);
                 $this->redirector()->set_url('changepass');
                 $myreferer = utility\cookie::write('mobile', $_mobile, 60 * 5);
                 $myreferer = utility\cookie::write('from', 'verification', 60 * 5);
                 debug::true(T_("verify successfully.") . ' ' . T_("please Input your new password"));
             }
         }, $mymobile, $myuserid);
         // if a query has error or any error occour in any part of codes, run roolback
         $this->rollback(function () {
             debug::error(T_("verify failed!"));
         });
     } elseif ($tmp_result->num() == 0) {
         debug::error(T_("this data is incorrect"));
     } else {
         debug::error(T_("please forward this message to administrator"));
     }
 }
Esempio n. 10
0
 /**
  * Update profile data
  * @return run update query and no return value
  */
 function put_profile()
 {
     // Check permission and if user can do this operation
     // allow to do it, else show related message in notify center
     $this->access('cp', 'posts', 'delete', 'notify');
     $qry = $this->sql()->table('users')->where('id', $this->login('id'))->set('user_mobile', utility::post('mobile'))->set('user_email', utility::post('email'))->set('user_displayname', utility::post('displayname'));
     $qry->update();
     $this->commit(function () {
         debug::true(T_("Update Successfully"));
         // $this->redirector()->set_url($_module.'/edit='.$_postId);
     });
     // if a query has error or any error occour in any part of codes, run roolback
     $this->rollback(function () {
         debug::title(T_("Transaction error") . ': ');
     });
 }
Esempio n. 11
0
 public function permList($_fill = false)
 {
     $permResult = [];
     $permCond = ['view', 'add', 'edit', 'delete', 'admin'];
     foreach ($this->permContentsList() as $myContent) {
         // for superusers allow access
         if ($_fill === "su") {
             $permResult[$myContent]['enable'] = true;
         } elseif ($_fill) {
             // step1: get and fill content enable status
             $postValue = \lib\utility::post('content-' . $myContent);
             if ($postValue === 'on') {
                 $permResult[$myContent]['enable'] = true;
             } else {
                 $permResult[$myContent]['enable'] = false;
             }
         } else {
             $permResult[$myContent]['enable'] = null;
         }
         // step2: fill content modules status
         foreach ($this->permModulesList($myContent) as $myLoc => $value) {
             foreach ($permCond as $cond) {
                 // for superusers allow access
                 if ($_fill === "su") {
                     $permResult[$myContent]['modules'][$myLoc][$cond] = true;
                 } elseif ($_fill) {
                     $locName = $myContent . '-' . $myLoc . '-' . $cond;
                     $postValue = \lib\utility::post($locName);
                     if ($postValue === 'on') {
                         $permResult[$myContent]['modules'][$myLoc][$cond] = true;
                     }
                     // else
                     // {
                     // $permResult[$myContent]['modules'][$myLoc][$cond] = null;
                     // }
                 } else {
                     $permResult[$myContent]['modules'][$myLoc][$cond] = null;
                 }
             }
         }
     }
     return $permResult;
 }
Esempio n. 12
0
 public function post_recovery()
 {
     // get parameters and set to local variables
     $mymobile = utility::post('mobile', 'filter');
     // check for mobile exist
     $tmp_result = $this->sql()->table('users')->where('user_mobile', $mymobile)->select();
     if ($tmp_result->num() == 1) {
         $myuserid = $tmp_result->assoc('id');
         $mylogitem = $this->sql()->table('logitems')->field('id')->where('logitem_title', 'account/recovery')->select()->assoc('id');
         if (!isset($mylogitem)) {
             return;
         }
         $mycode = utility::randomCode();
         $qry = $this->sql()->table('logs')->set('logitem_id', $mylogitem)->set('user_id', $myuserid)->set('log_data', $mycode)->set('log_status', 'enable')->set('log_createdate', date('Y-m-d H:i:s'));
         // var_dump($qry->insertString());
         // return;
         $sql = $qry->insert();
         // ======================================================
         // you can manage next event with one of these variables,
         // commit for successfull and rollback for failed
         //
         // if query run without error means commit
         $this->commit(function ($_mobile, $_code) {
             $myreferer = utility\Cookie::read('referer');
             //Send SMS
             \lib\utility\Sms::send($_mobile, 'recovery', $_code);
             debug::true(T_("we send a verification code for you"));
             $myreferer = utility\Cookie::write('mobile', $_mobile, 60 * 5);
             $myreferer = utility\Cookie::write('from', 'recovery', 60 * 5);
             $this->redirector()->set_url('verification?from=recovery&mobile=' . $_mobile . '&referer=' . $myreferer);
         }, $mymobile, $mycode);
         // if a query has error or any error occour in any part of codes, run roolback
         $this->rollback(function () {
             debug::error(T_("recovery failed!"));
         });
     } elseif ($tmp_result->num() == 0) {
         debug::error(T_("Mobile number is incorrect"));
     } else {
         debug::error(T_("please forward this message to administrator"));
     }
 }
Esempio n. 13
0
 /**
  * create a related query and run it
  * @param  [type] $_type [description]
  * @return [type]        [description]
  */
 protected function qryPermission($_type)
 {
     $newPerm = utility::post('pName');
     switch ($_type) {
         case 'add':
             if (!$newPerm) {
                 debug::warn(T_("First you must enter name of permission"));
                 return;
             }
             // check permission exist or not
             $qryExist = $this->qryCreator($_type);
             $qryExist = $qryExist->select()->num();
             // if exist show related message
             if ($qryExist) {
                 debug::warn(T_("This permission name exist!") . " " . T_("You can edit this permission"));
                 return;
             }
             // get last id in permissions
             $qryMaxID = $this->qryCreator();
             $qryMaxID = $qryMaxID->field('#max(option_key) as id')->select()->assoc('id');
             // permission id start from 2 because id 1 used for superuser
             $qryMaxID += $qryMaxID == 0 ? 2 : 1;
             $qryAdd = $this->qryCreator();
             $qryAdd = $qryAdd->set('option_cat', 'permissions')->set('option_key', $qryMaxID)->set('option_value', $newPerm)->set('option_status', 'enable')->insert();
             $qryAdd = $qryAdd;
             break;
         case 'delete':
             $delParam = $this->childparam('delete');
             // if user pass child param, get this param and update status of permission
             if ($delParam) {
                 $qryDel = $this->qryCreator($_type, $delParam);
                 $qryDel = $qryDel->set('option_status', 'disable')->update();
                 \lib\utility\session::deleteByPerm($editParam);
             }
             break;
         case 'edit':
             $editParam = $this->childparam('edit');
             if ($editParam) {
                 $permResult = \lib\utility\permission::permListFill(true);
                 $permResult = json_encode($permResult, JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE);
                 $qryEdit = $this->qryCreator($_type, $editParam);
                 $qryEdit = $qryEdit->set('option_meta', $permResult)->update();
                 \lib\utility\session::deleteByPerm($editParam);
                 $this->setPermissionSession();
             }
             break;
         default:
             break;
     }
     $this->commit(function ($_type, $_permName) {
         switch ($_type) {
             case 'add':
                 debug::true(T_("Insert Successfully"));
                 $this->redirector()->set_url('permissions/' . $_permName);
                 break;
             case 'delete':
                 debug::true(T_("Delete Successfully"));
                 break;
             case 'edit':
                 debug::true(T_("Update Successfully"));
                 break;
             default:
                 break;
         }
     }, $_type, $newPerm);
     // if a query has error or any error occour in any part of codes, run roolback
     $this->rollback(function () {
         debug::title(T_("Transaction error") . ': ');
     });
 }
Esempio n. 14
0
 /**
  * get post variables and fill it in array for default condition
  * @return [array] contain list of all data entered
  */
 private function getDefault()
 {
     $myDefaults = ['general' => ['title' => 'Ermile', 'desc' => 'Powered by Saloss'], 'config' => ['config' => ['meta' => ['logVisitors' => 'on', 'defaultLang' => 'en_US', 'fakeSub' => 'on', 'account' => 'on']]], 'sms' => ['sms' => ['meta' => ['one' => 'on', 'signup' => 'on', 'verification' => 'on', 'recovery' => 'on', 'changepass' => 'on']]], 'account' => ['account' => ['status' => 'on', 'value' => utility::post('account-default'), 'meta' => ['redirect' => 'cp']]]];
     return $myDefaults;
 }
Esempio n. 15
0
 public function sp_savePoll($_post_new_id, $_onlyAns = false)
 {
     $answers = [];
     $max_ans = 10;
     for ($i = 1; $i <= $max_ans; $i++) {
         if (utility::post('ans' . $i)) {
             $answers[$i]['id'] = $i;
             $answers[$i]['point'] = utility::post('ans' . $i . '_point');
             $answers[$i]['txt'] = utility::post('ans' . $i);
         }
     }
     if ($_onlyAns === true) {
         return $answers;
     }
     $answers = json_encode($answers, JSON_UNESCAPED_UNICODE);
     $option_data = ['post' => $_post_new_id, 'cat' => 'meta_polls', 'key' => 'answers_' . $_post_new_id, 'value' => "", 'meta' => $answers, 'status' => 'enable'];
     // save in options table and if successful return session_id
     return \lib\utility\option::set($option_data, true);
 }
Esempio n. 16
0
 public function delete($_qry = null, $_id = null, $_table = null)
 {
     // if user pass the qry use it else use our automatic creator
     // $myqry = $_qry? $_qry: null;
     if (!$_qry) {
         $tmp_table = $_table ? $_table : 'table' . ucfirst($this->module());
         $tmp_id = $_id ? $_id : $this->childparam('delete');
         $tmp_id = $tmp_id ? $tmp_id : \lib\utility::post('id');
         $_qry = $this->sql()->{$tmp_table}()->whereId($tmp_id);
         // var_dump($_qry);
     }
     if (!$_qry->select()->num()) {
         debug::error(T_("id does not exist!"));
         return false;
     }
     return $this->delete_commit($_qry);
 }
Esempio n. 17
0
 /**
  * this function set custom operator for each custom module in cp
  * @param  [type] $_id [description]
  * @return [type]      [description]
  */
 function cp_create_query($_id = null)
 {
     if (!$_id) {
         $_id = $this->childparam('edit');
     }
     // if don't set title return error
     if (!utility::post('title')) {
         debug::error(T_("Please enter title!"));
         return false;
     }
     // remove this line!
     $mymodule = $this->cpModule('raw');
     // set useful variables
     $datarow = array();
     $cpModule = $this->cpModule();
     $qry = $this->sql()->table('posts');
     // set all variable get form all type of forms
     $datarow['language'] = utility::post('language');
     $datarow['title'] = utility::post('title');
     $datarow['slug'] = utility::post('slug', 'filter');
     $datarow['content'] = utility::post('desc');
     $datarow['type'] = $cpModule['type'];
     $datarow['url'] = null;
     $datarow['status'] = utility::post('status');
     $datarow['parent'] = utility::post('parent');
     $datarow['user_id'] = $this->login('id');
     $datarow['publishdate'] = date('Y-m-d H:i:s');
     // read post meta and rewrite it
     $datarow['meta'] = $this->sql()->table('posts')->where('id', $_id)->select()->assoc('post_meta');
     $datarow['meta'] = json_decode($datarow['meta'], true);
     // meta fields
     $datarow['meta']['thumbid'] = utility::post('thumbid');
     $datarow['meta']['slug'] = $datarow['slug'];
     $datarow['meta'] = json_encode($datarow['meta']);
     // set slug if is not set
     if (!$datarow['slug']) {
         $datarow['slug'] = utility\Filter::slug($datarow['title']);
     }
     switch ($cpModule['raw']) {
         case 'pages':
         case 'books':
             // calc and set url
             if ($datarow['parent']) {
                 $datarow['url'] = $this->sql()->table('posts')->where('post_type', $cpModule['type'])->and('id', $datarow['parent'])->select()->assoc('post_url') . '/' . $datarow['slug'];
             } else {
                 $datarow['parent'] = '#NULL';
                 $datarow['url'] = $datarow['slug'];
             }
             if ($cpModule['raw'] === 'books') {
                 $datarow['url'] = 'book/' . preg_replace("#^(book\\/)+#", "", $datarow['url']);
             }
             break;
             // only on edit
         // only on edit
         case 'attachments':
             // remove unuse fields like slug, url, data, status, ...
             // commented row not deleted and check
             unset($datarow['language']);
             // unset($datarow['title']);
             // unset($datarow['slug']);
             // unset($datarow['content']);
             unset($datarow['type']);
             unset($datarow['url']);
             // unset($datarow['status']);
             unset($datarow['parent']);
             // unset($datarow['user_id']);
             unset($datarow['publishdate']);
             if (utility::post('cat')) {
                 $cat = utility::post('cat');
             } else {
                 $cat = 'file';
             }
             $datarow['url'] = $cat . '/' . $datarow['slug'];
             $datarow['url'] = trim($datarow['url'], '/');
             // // read post meta and rewrite it
             // $datarow['meta'] = $this->sql()->table('posts')
             // 		->where('post_type', 'attachment')->and('id', $_id)
             // 		->select()->assoc('post_meta');
             // $datarow['meta'] = json_decode($datarow['meta'], true);
             // $datarow['meta']['slug'] = $datarow['slug'];
             // $datarow['meta'] = json_encode($datarow['meta']);
             unset($datarow['slug']);
             // var_dump(utility::post('cat'));
             // var_dump($datarow['meta']);
             // exit();
             break;
         case 'socialnetwork':
             $datarow['slug'] = 'social' . md5(time());
             $datarow['url'] = 'social/' . $datarow['slug'];
             $datarow['status'] = 'draft';
             // print_r($datarow);
             // exit();
             break;
             // all other type of post
         // all other type of post
         default:
             unset($datarow['parent']);
             $datarow['url'] = utility::post('cat');
             // create url with selected cat
             if ($cpModule['raw'] === 'books') {
                 $datarow['url'] = 'books';
             } elseif (!$datarow['url']) {
                 // calc and set url
                 $datarow['url'] = $this->sql()->table('terms')->where('id', 1)->select()->assoc('term_url');
             }
             if ($datarow['url']) {
                 $datarow['url'] = $datarow['url'] . '/';
             }
             $datarow['url'] = $datarow['url'] . $datarow['slug'];
             break;
     }
     // if in edit get this record data
     if ($_id) {
         $record = $this->sql()->table('posts')->where('id', $_id)->select()->assoc();
         $record_meta = $this->sql()->table('options')->where('post_id', $_id)->order('id', 'asc')->select()->allassoc();
         // fill options value like posts field
         foreach ($record_meta as $key => $value) {
             $record[$record_meta[$key]['option_key']] = $record_meta[$key]['option_value'];
         }
     }
     $changed = false;
     // set values if exist
     foreach ($datarow as $key => $value) {
         $key = $key === 'user_id' ? 'user_id' : 'post_' . $key;
         if ($_id) {
             // check with old data and if change then set it
             if ($record[$key] !== $value) {
                 $qry = $qry->set($key, $value);
                 $changed = true;
             }
         } elseif ($value) {
             $qry = $qry->set($key, $value);
         }
     }
     $post_new_id = $_id;
     if ($_id) {
         // on edit
         if ($changed) {
             $qry = $qry->where('id', $_id)->update();
         }
     } else {
         // on add
         $qry = $qry->insert();
         $post_new_id = $qry->LAST_INSERT_ID();
     }
     if ($post_new_id === 0 || !$post_new_id) {
         return;
     }
     // if publish post share it on twitter and save in options
     // before share check db for share before
     // if on add or in edit and staus exist and status !== 400
     // then if status == publish and changed from old position
     $post_status = isset($record['post_status']) ? $record['post_status'] : null;
     $post_type = isset($record['post_type']) ? $record['post_type'] : null;
     $post_type = $post_type ? $post_type : $cpModule['type'];
     if ($datarow['status'] === 'publish' && $datarow['status'] !== $post_status && $post_type === 'post') {
         $url_main = $this->url('MainProtocol') . '://' . $this->url('MainSite');
         if (!(isset($record['twitter']['status']) && $record['twitter']['status'] === 400)) {
             $mytwitte = $datarow['title'] . ' ' . $url_main . '/' . $datarow['url'];
             $twitte_result = \lib\utility\SocialNetwork::twitter($mytwitte);
             if (isset($twitte_result) && isset($twitte_result['status'])) {
                 $twitte_result = json_encode($twitte_result);
                 $qry_twitter = $this->sql()->table('options')->set('post_id', $post_new_id)->set('option_cat', 'post' . $post_new_id . '_SocialNetwork')->set('option_key', 'twitter')->set('option_value', $twitte_result);
                 // $qry_twitter = $qry_twitter->insertString();
                 // var_dump($qry_twitter);
                 $qry_twitter = $qry_twitter->insert();
             }
         }
         $telegram = \lib\utility\SocialNetwork::telegram($datarow['title'] . "\n" . $url_main . '/' . $datarow['url']);
         $facebook_content = html_entity_decode($datarow['content']);
         $facebook_content = preg_replace("/<\\/p>/", "\n", $facebook_content);
         $facebook_content = preg_replace("/<[^>]+>/", "", $facebook_content);
         $facebook_content = preg_replace("/^[\\s\n\r\t]+/", "", $facebook_content);
         $facebook_url = $url_main . '/' . $datarow['url'];
         $result_fb = \lib\utility\SocialNetwork::facebook($facebook_url, $facebook_content);
         if (isset($result_fb)) {
             // $result_fb = json_encode($result_fb);
             $qry_facebook = $this->sql()->table('options')->set('post_id', $post_new_id)->set('option_cat', 'post' . $post_new_id . '_SocialNetwork')->set('option_key', 'facebook')->set('option_value', $result_fb);
             // $qry_facebook = $qry_facebook->insertString();
             $qry_facebook = $qry_facebook->insert();
         }
     }
     // add tags to terms table
     $mycats = utility::post('categories');
     // if(!$mycats)
     // 	$mycats = [1];
     $mytags = utility::post('tags');
     $mytags = explode(',', $mytags);
     foreach ($mytags as $key => $value) {
         $value = trim($value, " ");
         $value = trim($value, "'");
         if ($value) {
             $mytags[$key] = $value;
         } else {
             unset($mytags[$key]);
         }
     }
     // --------------------------------------------------- check new tag and cats with old one on edit
     if ($_id) {
         $myterms_del = null;
         // get old tags and diff of it with new one by title of tags
         $old_tags = $this->sp_term_list('tag', false);
         $tags_diff = array_diff($old_tags, $mytags);
         if (count($tags_diff) > 0) {
             // get the list of tags id
             $tags_id = $this->cp_tag_id($tags_diff);
             $myterms_del = $tags_id;
         }
         // get old cats and diff of it with new one by id
         if ($cpModule['raw'] === 'attachments') {
             $old_cats = $this->sp_term_list('filecat', false);
             if (!is_array($mycats)) {
                 $mycats = null;
             }
         } elseif ($cpModule['raw'] === 'books') {
             $old_cats = $this->sp_term_list('bookcat', false);
             if (!is_array($mycats)) {
                 $mycats = null;
             }
         } else {
             $old_cats = $this->sp_term_list('cat', false);
             if (!is_array($mycats)) {
                 $mycats = [1];
             }
         }
         if (is_array($old_cats) && count($old_cats) && is_array($mycats) && count($mycats)) {
             $cats_diff = array_diff($old_cats, $mycats);
         } elseif (is_array($mycats) && count($mycats)) {
             $cats_diff = $mycats;
         } else {
             $cats_diff = $old_cats;
         }
         if (is_array($cats_diff) && count($cats_diff) > 0) {
             $cats_diff = implode(",", $cats_diff);
             if ($myterms_del) {
                 $myterms_del .= ',';
             }
             $myterms_del .= $cats_diff;
         }
         // var_dump($myterms_del);
         // exit();
         // delete deleted tags and cats together in one query
         if ($myterms_del) {
             $qry_term_del = $this->sql()->table('termusages')->where('termusage_id', $post_new_id);
             if (count(explode(',', $myterms_del)) === 1) {
                 $qry_term_del = $qry_term_del->and('term_id', '=', $myterms_del)->delete();
             } else {
                 $qry_term_del = $qry_term_del->and('term_id', 'in', "(" . $myterms_del . ")")->delete();
             }
         }
     }
     // ------------------------------------------------- if user enter new tag
     $tags_id = array();
     if (count($mytags) > 0) {
         $qry_tag = $this->sql()->table('terms');
         // add each tag to sql syntax
         foreach ($mytags as $value) {
             if ($value) {
                 $qry_tag = $qry_tag->set('term_type', 'tag')->set('term_title', $value)->set('term_slug', $value)->set('term_url', $value);
             }
         }
         // var_dump($qry_tag->insertString('IGNORE'));exit();
         $qry_tag->insert('IGNORE');
         // get the list of tags id
         $tags_id = $this->cp_tag_id($mytags, false);
         // var_dump($tags_id);
         if (!is_array($tags_id)) {
             $tags_id = array();
         }
     }
     // add selected tag to term usages table
     // on pages dont need cats and only add tags
     if ($mymodule === 'pages') {
         $myterms = $tags_id;
     } elseif (is_array($mycats) && count($mycats)) {
         $myterms = array_merge($tags_id, $mycats);
     } else {
         $myterms = $tags_id;
     }
     // ---------------------------------------------- set termusage table
     // if terms exist go to foreach
     if (isset($myterms) && count($myterms) > 0) {
         $qry_tagusages = $this->sql()->table('termusages');
         foreach ($myterms as $value) {
             $qry_tagusages = $qry_tagusages->set('term_id', $value)->set('termusage_id', $post_new_id)->set('termusage_foreign', 'posts');
         }
         // var_dump($qry_tagusages->insertString());exit();
         $qry_tagusages->insert('IGNORE');
     }
     // update post url
     // $post_url = utility::post('slug', 'filter');
     // $this->sql()->table('posts')->set('post_url', $post_url)
     // ->where('id', $post_new_id)->update();
     // ======================================================
     // you can manage next event with one of these variables,
     // commit for successfull and rollback for failed
     // if query run without error means commit
     if ($cpModule['raw'] == 'socialnetwork') {
         $twitte_result = \lib\utility\SocialNetwork::telegram($datarow['content']);
     }
     $this->commit(function ($_module, $_postId, $_edit = null) {
         if ($_edit) {
             debug::true(T_("Update Successfully"));
             $this->redirector()->set_url($_module . '/edit=' . $_postId);
         } else {
             debug::true(T_("Insert Successfully"));
             $this->redirector()->set_url($_module . '/edit=' . $_postId);
         }
     }, $mymodule, $post_new_id, $_id);
     // if a query has error or any error occour in any part of codes, run roolback
     $this->rollback(function () {
         debug::title(T_("Transaction error") . ': ');
     });
 }