View file visavi-rotorcms-63832fa/app/models/User.php

File size: 8.31Kb
<?php
class User extends BaseModel {

	static $table_name = 'users';

	public $captcha;
	public $token;
	public $old_password;
	public $new_password;

	/**
	 * Список статусов
	 * @var array список статусов
	 */
	public static $levelList = [
		'banned' => 'Забаненный',
		'guest' => 'Зарегистрированный',
		'user' => 'Пользователь',
		'moder' => 'Модератор',
		'admin' => 'Администратор',
	];

	static $validates_size_of = [
		['login', 'within' => [3, 20], 'too_short' => 'Слишком короткий логин, минимум %d симв.', 'too_long' => 'Слишком длинный логин, максимум %d симв.'],
		['new_password', 'minimum' => 6, 'allow_null' => true, 'too_short' => 'Слишком короткий пароль, минимум %d симв.'],
	];

	static $validates_uniqueness_of = array(
		['login', 'message' => 'Пользователь с данным логином уже зарегистрирован'],
		['email', 'message' => 'Пользователь с данным email уже зарегистрирован'],
	);

	static $validates_inclusion_of = [
		['level', 'in' => ['banned', 'guest', 'user', 'moder', 'admin'], 'message' => 'Неверно указан уровень пользователя'],
		['gender', 'in' => ['male', 'female'], 'message' => 'Неверно указан пол пользователя'],
	];

	static $validates_format_of = [
		['login', 'with' => '/^[a-z0-9_\-]+$/i', 'message' => 'Неверный формат логина (Разрешены символы [0-9a-z_-])'],
		['email', 'with' => '/^([a-z0-9_\-\.])+\@([a-z0-9_\-\.])+(\.([a-z0-9])+)+$/', 'message' => 'Неверный формат адреса email'],
		//['phone', 'with' => '/^\+[0-9]{11,12}$/', 'message' => 'Неверный формат номера телефона, пример +7 (900) 123-45-67'],
	];

	/**
	 * Валидация данных
	 */
	public function validate()
	{
		//if ($this->is_new_record()) {
		//  Проверка капчи
		if ($this->captcha && $this->captcha != $_SESSION['captcha']) {
			$this->errors->add('captcha', 'Неверный проверочный код');
		}
		//}
		//
		if ($this->token && $this->token != $_SESSION['token']) {
			$this->errors->add('token', 'Неверный идентификатор сессии, повторите действие!');
		}

		if ($this->old_password && !password_verify($this->old_password, $this->password)) {
			$this->errors->add('old_password', 'Старый пароль не совпадает');
		}
	}

	/**
	 * Метод вызываемый перед сохранением
	 */
	function before_save()
	{
		if ($this->new_password) {
			$this->password = password_hash($this->new_password, PASSWORD_BCRYPT);
		}
	}

	/**
	 * Данные пользователя
	 * @param  string $key название поля в таблице
	 * @return string|object данные пользователя
	 */
	public static function get($key = null)
	{
		if (Registry::has('user')) {
			$user = Registry::get('user');
			return $key ? $user->$key : $user;
		}
	}

	/**
	 * Проверка авторизован ли пользователь
	 * @return boolean авторизован ли пользователь
	 */
	public static function check()
	{
		return (self::get('id') !== null);
	}

	/**
	 * Проверяет является ли пользователь администатором
	 * @return boolean результат проверки
	 */
	public static function isAdmin()
	{
		return in_array(self::get('level'), ['moder', 'admin']);
	}

	/**
	 * Возвращает логин пользователя
	 * @return string логин пользователя
	 */
	public function getLogin()
	{
		return $this->login ? $this->login : 'Гость';
	}

	/**
	 * Возвращает пол пользователя
	 * @return string пол пользователя
	 */
	public function getGender()
	{
		return $this->gender == 'male' ? 'Мужской' : 'Женский';
	}

	/**
	 * Рейтинг пользователя
	 * @return string рейтинг
	 */
	public function getRating()
	{
		if ($this->rating > 0) {
			return '<span class="text-success strong">+'.$this->rating.'</span>';
		} elseif ($this->rating < 0) {
			return '<span class="text-danger strong">-'.$this->rating.'</span>';
		} else {
			return '<span class="strong">0</span>';
		}
	}

	/**
	 * Возвращает аватар пользователя
	 * @return string аватар пользователя
	 */
	public function getAvatar()
	{
		if ($this->avatar) {
			return '<img src="/uploads/users/avatars/'.$this->avatar.'" alt="" class="img-rounded"> ';
		}

		return '<img src="/assets/img/avatars/noavatar.png" alt=""> ';
	}

	/**
	 * Возвращает фото пользователя
	 * @return string фото пользователя
	 */
	public function getPhoto()
	{
		if ($this->avatar) {
			return '<a href="/uploads/users/photos/'.$this->avatar.'" class="gallery"><img src="/uploads/users/thumbs/'.$this->avatar.'" alt=""></a>';
		}
	}

	/**
	 * Уровень пользователя
	 * @return string уровень
	 */
	public function getLevel()
	{
		return self::$levelList[$this->level];
	}

	/**
	 * Статус пользователя
	 * @return string статус
	 */
	public function getStatus()
	{
		if ($this->status) {
			return 'Статус';
		} else {
			return 'Новичок';
			//SELECT `users_login`, `users_status`, `status_name`, `status_color` FROM `users` LEFT JOIN `status` ON `users_point` BETWEEN `status_topoint` AND `status_point`
		}
	}

	/**
	 * Авторизация через социальные сети
	 * @param string $token идентификатор Ulogin
	 */
	public static function socialLogin($token)
	{
		$curl = new Curl();
		$network = $curl->get('http://ulogin.ru/token.php', [
			'token' => $token,
			'host' => $_SERVER['HTTP_HOST']
		]);

		if ($network && empty($network->error)) {
			$_SESSION['social'] = $network;

			$social = Social::find_by_network_and_uid($network->network, $network->uid);
			if ($social && $social->user()) {

				//$_SESSION['ip'] = Registry::get('ip');
				$_SESSION['id'] = $social->user()->id;
				$_SESSION['pass'] = md5(env('APP_KEY').$social->user()->password);

				App::setFlash('success', 'Добро пожаловать, '.e($social->user()->login).'!');
				App::redirect('/');
			}
		}
	}

	/**
	 * Авторизация пользователя
	 * @param  string  $login    Логин или email пользователя
	 * @param  string  $password Пароль пользователя
	 * @param  boolean $remember Чужой компьютер
	 * @return boolean           Результат авторизации
	 */
	public static function login($login, $password, $remember = true)
	{
		if (!empty($login) && !empty($password)) {
			$field = strpos($login, '@') ? 'email' : 'login';

			$user = User::first(array('conditions' => array("$field=?", $login)));

			if ($user && password_verify($password, $user->password)) {

				if ($remember) {
					setcookie('id', $user->id, time() + 3600 * 24 * 365, '/', $_SERVER['HTTP_HOST'], null, true);
					setcookie('pass', md5($user->password.env('APP_KEY')), time() + 3600 * 24 * 365, '/', $_SERVER['HTTP_HOST'], null, true);
				}

				$user->update_attribute('reset_code', null);

				$_SESSION['id'] = $user->id;
				$_SESSION['pass'] = md5(env('APP_KEY').$user->password);

				if (!empty($_SESSION['social'])) {
					$social = new Social;
					$social->user_id = $user->id;
					$social->network = $_SESSION['social']->network;
					$social->uid = $_SESSION['social']->uid;
					$social->save();
				}

				return $user;
			}
		}

		return false;
	}

	/**
	 * Удаление сохраненных изображений
	 * @return boolean результат выполнения
	 */
	public function deleteImages()
	{
		if ($this->avatar) {
			if (file_exists(HOME.'/uploads/users/photos/'.$this->avatar)){
				unlink(HOME.'/uploads/users/photos/'.$this->avatar);
			}

			if (file_exists(HOME.'/uploads/users/thumbs/'.$this->avatar)){
				unlink(HOME.'/uploads/users/thumbs/'.$this->avatar);
			}

			if (file_exists(HOME.'/uploads/users/avatars/'.$this->avatar)){
				unlink(HOME.'/uploads/users/avatars/'.$this->avatar);
			}
		}
		return true;
	}
}