self::hash($C) ] ); } } public static function installUniques() { \DB::addIndex(self::$table_name,self::$EMAIL); \DB::addIndex(self::$table_name,self::$LOGIN); \DB::addIndex(self::$table_name,self::$PORTAL); \DB::addIndex(self::$table_name,self::$NICKNAME); \DB::addIndexManyColumns(self::$table_name,[self::$PORTAL,self::$LOGIN]); \DB::addIndexManyColumns(self::$table_name,[self::$PORTAL,self::$EMAIL]); \DB::addIndexManyColumns(self::$table_name,[self::$PORTAL,self::$NICKNAME]); } static function exit(){ Core::setCookie(self::$cookieIDKey,'-'); Core::setCookie(self::$cookieHashKey,'-'); } static function formatPublic($v){ return [ 'id'=>$v[self::$ID], 'name'=>$v[self::$NAME], 'avatar'=>Image::format($v[self::$IMAGE]) ]; } static function AuthByULogin($ulogin_token) { // $_SERVER['HTTP_HOST'] = 'update.msto.me'; $s = file_get_contents($x = 'http://ulogin.ru/token.php?token=' . $ulogin_token .'&host=' . $_SERVER['HTTP_HOST']); $user = json_decode($s, true); $res = new stdClass(); $res->e = 0; $login = $user['email']; $network = $user['network']; $network_id = $user['uid']; $token = $ulogin_token.'_'.$network.$network_id; $r = Token::select($q = [ \Query::LEFT_JOINS => [ [self::$table_name,self::$ID,Token::$PROFILE] ], \Query::WHERE => new \Where(\Where::_and( $x=[ \Where::_operator(Token::$NETWORK,'=',$network), \Where::_operator(Token::$NETWORK_ID,'=',$network_id), \Where::_operator(self::$PORTAL,'=',\Site::$portal_id), ])), \Query::COUNT => 1 ]); // если есть, то авторизовываемся по токену.. if(\DB::numRows($r)){ $l = \DB::fetch($r); $r = self::loginByToken($l[Token::$HASH]); if($r){ $res->e = 0; $res->id = \Profile::$data[\Profile::$ID]; } else { $res->e = 1; } // если такого пользователя нет, то пытаемся зарегистрироваться } else { $password = \Core::randomPassword(); $data = [ 'login' =>$login, 'pass' =>$password, 'sname' =>$user['last_name'], 'name' =>$user['first_name'], 'img_url' =>$user['photo_big'], ]; $res = self::reg($data,\Site::$portal_id); if($res->e==0){ Token::insert([ Token::$NETWORK => $network, Token::$NETWORK_ID => $network_id, Token::$PROFILE => $res->id, Token::$HASH => $token, Token::$DATA => je($user), ]); } } return $res; } static function getMyOrders($options = [],$isAssoc = true){ $options[\Query::WHERE] = new \Where(\Where::_and([ Where::_operator(Order::$PROFILE,'=',PID), ]) ); $options[\Query::LEFT_JOINS] = [ [Delivery::$table_name, Delivery::$ID, Order::$DELIVERY_ID], [Payment::$table_name, Payment::$ID, Order::$PAYMENT_ID ], [OrderStatus::$table_name, OrderStatus::$ID, Order::$STATUS ], ]; return Order::select($options,$isAssoc); } static function getMyFullName(): string { return self::getFullName(\Profile::$data); } static function getFullName($data): string { $x = []; if($c = trim($data[self::$SNAME])) $x[] = $c; if($c = trim($data[self::$NAME])) $x[] = $c; if($c = trim($data[self::$FNAME])) $x[] = $c; return implode(" ",$x); } static function getName($v, array $options = []): string { $x = []; if($c = trim($v[self::$SNAME])) $x[] = $c; if($c = trim($v[self::$NAME])) $x[] = $c; if($c = trim($v[self::$FNAME])) $x[] = $c; return implode(" ",$x); } static function reg($data,$portal_id){ $res = new stdClass(); $res->e = 0; $res->m = ''; $login = self::prepareLogin($data['login']); $pass = self::preparePass($data['pass']); $googleCaptcha = \Site::$theme::checkGoogleCaptcha($data['google_captcha']); $isGoogleCaptcha = $googleCaptcha['e']==0; if(!$isGoogleCaptcha) { $res->e = 1; $res->m = $googleCaptcha['m']; } if($res->e==0) { $acc = self::getByLogin($login, $portal_id); if (!$acc) { $r = self::add($d = [ self::$PORTAL => self::$portal_id, self::$PASSWORD => $pass, self::$SNAME => $data['sname'], self::$NAME => $data['name'], self::$FNAME => $data['fname'], self::$PHONE => $data['phone'], self::$NICKNAME => $data['nickname'], self::$LOGIN => $login, self::$PORTAL => $portal_id, ]); $acc = self::getByID($r->id); $hash = $acc[self::$PASSWORD]; Core::setCookie(self::$cookieIDKey, $acc[self::$ID]); Core::setCookie(self::$cookieHashKey, $hash); $res->id = $r->id; $res->h = $hash; if (Core::$IS_APP) { $hash = Token::getHash(0, $acc[self::$ID], \Site::$portal_id); Token::insert([ Token::$PROFILE => $acc[self::$ID], Token::$HASH => $hash, ]); $res->token = $hash; } \ms\MS::prepareNewUser($r->id); shop::prepareProfile($r->id); if ($img_url = $data['img_url']) { $name = time() . '.jpg'; $to_base = '/upload/images/acc' . \Site::$owner_id . '/profile/' . $res->id . '/' . $name; $img_path = \Core::$FOLDER . $to_base; mkdir(dirname($img_path), 0755, true); $copied = copy($img_url, $img_path); if ($copied) { $r = Image::insert([ Image::$URL => $to_base, Image::$ORIGINAL => $to_base, Image::$PROFILE => $res->id, ]); $pid = $r->id; Profile::updateById($res->id, [ \Profile::$IMAGE => $r->id, ]); \Profile::remathCashback($pid); } } \Site::$theme::afterRegProfile($r->id,$data); } else { $res->e = 1; $res->m = V::get(Vars::$ACCOUNT_BUSY); } } return $res; } static function if_auth(){ if($uid = intval($_COOKIE[ self::$cookieIDKey ]) and $hash = $_COOKIE[ self::$cookieHashKey ]) { $acc = self::getByID($uid); $res = strcmp($acc[self::$PASSWORD],$hash)==0; if($res) self::$data = $acc; return $res; } else if( \Core::$TOKEN ){ $token = Token::getByHash(\Core::$TOKEN); if($token[Token::$PROFILE]){ self::$data = self::getByID( $token[Token::$PROFILE] ); return true; } else return false; } else return false; /* if($uid = intval($_COOKIE[ self::$cookieIDKey ]) and $hash = $_COOKIE[ self::$cookieHashKey ]) { $acc = self::getByID($uid); $res = strcmp($acc[self::$PASSWORD],$hash)==0; if($res) self::$data = $acc; return $res; } else return false; /**/ } static function prepareLogin($login) {return trim(strtolower((string)$login));} static function preparePass($pass) {return trim((string)$pass);} static function updatePass($acc,$pass){ $acc[self::$PASSWORD] = $pass; $c = [self::$PASSWORD => self::hash($acc) ]; self::updateById($acc[self::$ID], $c); } static function updateMyPass($acc,$pass){ $acc[self::$PASSWORD] = $pass; $c = [self::$PASSWORD => self::hash($acc) ]; self::updateById($acc[self::$ID], $c); Core::setCookie(self::$cookieIDKey,$acc[self::$ID]); Core::setCookie(self::$cookieHashKey,$c[self::$PASSWORD]); } static function loginByToken($hash){ $token = Token::getByHash($hash); if(!$token) return false; $profile = self::getByID($token[Token::$PROFILE]); self::$data = $profile; Core::setCookie(self::$cookieIDKey, $profile[self::$ID]); Core::setCookie(self::$cookieHashKey,$profile[self::$PASSWORD]); return true; } static function login($login,$pass,$portal_id){ $res = new stdClass(); $portal_id = intval($portal_id); $res->e = 0; $res->m = ''; $login = self::prepareLogin($login); $pass = self::preparePass($pass); $acc = null; if(!$login){ $res->e = 1; $res->m = 'Введите логин'; } else { if(!$pass){ $res->e = 1; $res->m = 'Введите пароль'; } else { $acc = self::getByLogin($login, $portal_id); if($acc) { if(self::checkPassword($acc,$pass)){ Core::setCookie(self::$cookieIDKey, $acc[self::$ID]); Core::setCookie(self::$cookieHashKey,$acc[self::$PASSWORD]); if(Core::$IS_APP) { $hash = Token::getHash(0,$acc[self::$ID],\Site::$portal_id); $res->r = Token::insert([ Token::$PROFILE => $acc[self::$ID], Token::$HASH => $hash, ]); $res->token = $hash; } shop::prepareProfile($acc[self::$ID]); $res->id = $acc[self::$ID]; } else { $res->e = 1; $res->m = V::get(Vars::$WRONG_PASSWORD); } } else { $res->e = 1; $res->m = V::get(Vars::$ACCOUNT_NOT_FOUND); } } } return $res; } static function add($values){ $res = new stdClass(); $res->e = 0; $res->m = ''; $admin = self::getByLogin($values[ self::$LOGIN ],\site::$portal_id); if(!$admin) { $r = self::insert($values); $a = self::getByID($r->id); $c[self::$PASSWORD] = self::hash($a); self::updateById($r->id, $c); $res->id = $r->id; } else { $res->e = 1; $res->m = V::get(Vars::$ACCOUNT_BUSY); } return $res; } static function hash($acc){ if(\site::$theme){ $hash = \Site::$theme::getProfileAuthHash($acc); if($hash!=null) return $hash; } return md5(\Config::$SALT.\Config::$SALT.$acc[self::$ID].self::$CREATED.\Config::$SALT.$acc[self::$PASSWORD]); } static function checkPassword($acc,$pass):bool{ $hash = $acc[self::$PASSWORD]; $acc[self::$PASSWORD] = $pass; return strcmp($hash, self::hash($acc) )===0; } static function getByLogin(string $account,$portal_id = null){ return DB::fetch(self::select( [Query::WHERE => new Where (Where::_and([ Where::_operator(self::$LOGIN,'=',$account), $portal_id ? Where::_operator(self::$PORTAL,'=',$portal_id) : null, ]))] )); } static function getByNickname(string $nickname,$portal_id){ return DB::fetch(self::select( [Query::WHERE => new Where (Where::_and([ Where::_operator(self::$NICKNAME,'=',$nickname), Where::_operator(self::$PORTAL,'=',$portal_id), ]))] )); } static function remath($id){ self::remathCashback($id); } static function remathCashback($id){ $id = intval($id); // Сначала посчитаем списания $r = Cashback::select([ \Query::SELECT => 'SUM('.Cashback::$VALUE.') as cc', \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Cashback::$PROFILE,'=',$id), \Where::_operator(Cashback::$VALUE,'<',0), ])) ],false); $minus = \DB::fetch($r); $minus = floatval($minus['cc']); // Теперь посчитаем поступления, но только от оплаченных заказов $r = Cashback::select([ \Query::LEFT_JOINS => [ [Order::$table_name,Order::$ID,Cashback::$ORDER] ], \Query::SELECT => 'SUM('.Cashback::$VALUE.') as cc', \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Cashback::$PROFILE,'=',$id), \Where::_operator(Cashback::$VALUE,'>',0), \Where::_operator(Cashback::$ORDER,'<>',0), \Where::_operator(Order::$PAID,'=',1), ])) ],false); $plus = \DB::fetch($r); $plus = floatval($plus['cc']); // Теперь посчитаем поступления, которые не связаны с заказом $r = Cashback::select([ \Query::SELECT => 'SUM('.Cashback::$VALUE.') as cc', \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Cashback::$PROFILE,'=',$id), \Where::_operator(Cashback::$ORDER,'=',0), \Where::_operator(Cashback::$VALUE,'>',0), ])) ],false); $plus2 = \DB::fetch($r); $plus2 = floatval($plus2['cc']); $r = Order::select([ \Query::LEFT_JOINS => [ [Shop::$table_name,Shop::$ID,Order::$OID], ], \Query::SELECT => [ 'SUM('.Order::$TOTAL.') as cc', Shop::$CASHBACK_GROUP, Order::$PAID, ], \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(Order::$PROFILE,'=',$id), // \Where::_operator(Order::$PAID,'=',1), ])), \Query::GROUP_BY => [Shop::$CASHBACK_GROUP,Order::$PAID] ]); while($l = \DB::fetch($r)){ $group_id = $l[Shop::$CASHBACK_GROUP]; if($group_id){ CashbackProfile::setProfileGroupValue($id,$group_id,$l[Order::$PAID] ? $l['cc'] : 0); } } $cashback = floatval($minus) + floatval($plus) + floatval($plus2) ; self::updateById($id,[ self::$CASHBACK=>$cashback ]); } static function getTitle(){return V::get(Vars::$MODULE_NAME);} static function getSystemLangValues():array{return Vars::getArray(); } public function _update(\Where $w, array $values) { $values[self::$UPDATED] = time(); return parent::_update($w, $values); } public static function isMy($id){ $res = false; $C = $id?static::getById($id):null; if($C){ $res = boolval(\ms\Portal::isMy($C[self::$PORTAL])); } return $res?$C:false; } public static function getEditTabs($values=[]) { $id = $values[self::$ID]; return [ [ eTab::NAME => 'Редактировать', eTab::TYPE => eTabType::FORM, eTab::CONTENT => function ($values = []) { return self::_getForm($values, static::getFormOptions($values)); }, ], [ eTab::NAME=>'Кэшбек', eTab::TYPE=>eTabType::TABLE, eTab::CONTENT=>function($values=[]){ $id = $values[self::$ID]; $o = [ \Query::WHERE=>new \Where(\Where::_operator(Cashback::$PROFILE,'=',$id)), \ModuleTable::TABLE_ID => self::$table_name.'_'.Cashback::$table_name.'_'.$id, \ModuleTable::ROW_CLICK=>eRowClick::CARD, \ModuleTable::FORM_INIT_DATA=>[ Cashback::$PROFILE => $id, Cashback::$ORDER => 0, ], //\ModuleTable::NO_CHECKBOX=>true, //\ModuleTable::HIDE_TITLE=>true, ]; return boolval($values['justData']) ? Cashback::getTableData( $o ) : Cashback::drawTable( $o ); }, ], ]; } static function getForm($values = [], $options = []) :array { $isNew = !boolval($values[self::$ID]); return [ self::getCommonFormInputs(), $isNew?[ Form::VIEW =>Form::INPUT, Form::KEY_VALUE =>self::$PORTAL, Form::TYPE =>eInputType::HIDDEN, ]:null, [ Form::VIEW=>Form::ROW, Form::COLS => [ [ Form::VIEW => Form::INPUT, Form::COL_CLASSES => 'c', Form::KEY_VALUE => self::$IMAGE, Form::TYPE => eInputType::IMAGE, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$IMAGE), Input::LABEL => $c, Input::SRC => ($c = $values[self::$IMAGE]) ? Image::imageResize(Image::getByID($c)[Image::$URL],600,0,100) : '', ], ], ] ], [ Form::VIEW=>Form::TITLE, Form::TITLE_TEXT => 'Данные для авторизации
При смене этих данных пользователю понадобится авторизовываться заново', ], [ Form::VIEW=>Form::ROW, Form::COLS => [ [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-50', Form::KEY_VALUE =>self::$LOGIN, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$LOGIN), Input::LABEL => $c.($isNew?'':'
При смене логина, указывайте и новый пароль'), ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-50', Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$PASSWORD), Input::LABEL => $c.($isNew?'':'
Вводить, только если надо поменять пароль, или меняется логин'), Input::VALUE => '', Input::NAME => 'password', ], ], ], ], [ Form::VIEW=>Form::TITLE, Form::TITLE_TEXT => 'Личные данные', ], [ Form::VIEW=>Form::ROW, Form::COLS => [ [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-3', Form::KEY_VALUE =>self::$EMAIL, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$EMAIL), Input::LABEL => $c, ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-3', Form::KEY_VALUE =>self::$PHONE, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$PHONE), Input::LABEL => $c, ], ], ], ], [ Form::VIEW=>Form::ROW, Form::COLS => [ [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-3', Form::KEY_VALUE =>self::$SNAME, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$SNAME), Input::LABEL => $c, ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-3', Form::KEY_VALUE =>self::$NAME, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$NAME), Input::LABEL => $c, ], ], [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-3', Form::KEY_VALUE =>self::$FNAME, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$FNAME), Input::LABEL => $c, ], ], ] ], [ Form::VIEW=>Form::ROW, Form::COLS => [ [ Form::VIEW =>Form::INPUT, Form::COL_CLASSES =>'c c-1-3', Form::KEY_VALUE =>self::$SALE_PERCENT, Form::TYPE =>eInputType::TEXT, Form::INPUT_OPT => [ Input::PLACEHOLDER => $c = V::get(Vars::$SALE_PERCENT), Input::LABEL => $c, ], ], ] ], self::getCommonFormSubmits($values), ]; } static function columnInfo() : array { return [ new C([ C::VAR_NAME =>&self::$ID, C::TYPE =>eColumnType::INT, C::AUTO_INCREMENT =>true, C::PRIMARY =>true, C::DEFAULT =>0, // C::HIDDEN =>true, C::FILTER_TYPE => eFilterType::NUMBER, C::TH =>function(){return V::get(Vars::$ID);}, ]), new C([ C::VAR_NAME => &self::$CART, C::TYPE => eColumnType::INT, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$IMAGE, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::DEFAULT => 0, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$NAME, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 255, C::TH => function(){return V::get(Vars::$NAME);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$SNAME, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 255, C::TH => function(){return V::get(Vars::$SNAME);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$FNAME, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 255, C::TH => function(){return V::get(Vars::$FNAME);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$PHONE, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 255, C::TH => function(){return V::get(Vars::$PHONE);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$LOGIN, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 63, C::TH => function(){return V::get(Vars::$LOGIN);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$EMAIL, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 255, C::TH => function(){return V::get(Vars::$EMAIL);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$CITY, C::TYPE => eColumnType::TEXT, C::DEFAULT => '', C::HIDDEN => true, C::TH => function(){return V::get(Vars::$CITY);}, ]), new C([ C::VAR_NAME => &self::$NICKNAME, C::TYPE => eColumnType::TEXT, C::DEFAULT => '', C::HIDDEN => true, C::TH => function(){return V::get(Vars::$NICKNAME);}, C::FILTER_TYPE => eFilterType::TEXT, ]), new C([ C::VAR_NAME => &self::$PASSWORD, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 63, C::TH => function(){return V::get(Vars::$PASSWORD);}, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$BDATE, C::TYPE => eColumnType::DATE, C::HIDDEN => true, C::NULL => true, //C::DEFAULT => '0000-00-00', ]), new C([ C::VAR_NAME => &self::$CASHBACK, C::TYPE => eColumnType::DOUBLE, C::TH => function(){return V::get(Vars::$CASHBACK);}, //C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$SALE_PERCENT, C::TYPE => eColumnType::DOUBLE, C::DEFAULT => 0, C::TH => function(){return V::get(Vars::$SALE_PERCENT);}, //C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$PORTAL, C::TYPE => eColumnType::INT, C::TH => function(){return V::get(Vars::$PORTAL);}, C::HIDDEN => true, ]), new C([ C::VAR_NAME => &self::$CREATED, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => function(){return V::get(Vars::$CREATED);}, C::DEFAULT => time(), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$CREATED]);}, c::HIDDEN=>true, ]), new C([ C::VAR_NAME => &self::$UPDATED, C::TYPE => eColumnType::INT, C::DEFAULT => time(), C::TH => function(){return V::get(Vars::$UPDATED);}, c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);}, c::HIDDEN=>true, ]), ]; } } new Profile();