View file visavi-rotorcms-63832fa/app/controllers/UserController.php

File size: 9.76Kb
<?php

Class UserController Extends BaseController {

	/**
	 * Список пользователей
	 */
	public function index()
	{
		$list = Request::input('list', 'all');
		$login = Request::input('login');

		if (Request::isMethod('post')) {
			$users = User::all(array('select' => 'login', 'order' => 'point DESC, login ASC'));
			foreach ($users as $key => $val) {
				if (strtolower($login) == strtolower($val->login)) {
					$position = $key + 1;
				}
			}

			if (isset($position)) {
				$page = ceil($position / Setting::get('users_per_page'));

				App::setFlash('success', 'Позиция в рейтинге: '.$position);
				App::redirect("/users?page=$page&login=$login");
			} else {
				App::setFlash('danger', 'Пользователь с данным логином не найден!');
			}
		}

		$count['users'] = $total = User::count();
		$count['admins'] = User::count(['conditions' => ['level in (?)', ['moder', 'admin']]]);

		$condition = [];

		if ($list == 'admins') {
			$total = $count['admins'];
			$condition = ['level IN(?)', ['moder', 'admin']];
		}

		$page = App::paginate(Setting::get('users_per_page'), $total);

		$users = User::all(array(
			'conditions' => $condition,
			'offset' => $page['offset'],
			'limit' => $page['limit'],
			'order' => 'point DESC, login ASC',
		));

		App::view('users.index', compact('users', 'page', 'count', 'list', 'login'));
	}

	/**
	 * Профиль пользователя
	 */
	public function view($login)
	{
		//$field =  is_numeric($id['id']) ? 'id' : 'login';

		//if (!$user = User::first(['conditions' => ["$field=?", $id]])) App::abort('default', 'Пользователь не найден!');

		if (!$user = User::find_by_login($login)) App::abort('default', 'Пользователь не найден!');

		App::view('users.profile', compact('user'));
	}

	/**
	 * Редактирование профиля
	 */
	public function edit()
	{
		if (!User::check()) App::abort(403);

		$user = User::get();

		if (Request::isMethod('post')) {

			$user->token = Request::input('token', true);
			$user->email = Request::input('email');
			$user->gender = Request::input('gender');

			if ($user->save()) {
				App::setFlash('success', 'Данные успешно сохранены!');

			} else {
				App::setFlash('danger', $user->getErrors());
				App::setInput($_POST);
			}

			App::redirect('/user/edit');
		}

		App::view('users.edit', compact('user'));
	}

	/**
	 * Изменение пароля
	 */
	public function password()
	{
		if (!User::check()) App::abort(403);

		$user = User::get();

		if (Request::isMethod('post')) {

			$old_password = Request::input('old_password');
			$new_password = Request::input('new_password');

			$user->old_password = $old_password;
			$user->new_password = $new_password;
			$user->updated_at = new Datetime;

			if ($user->save()) {

				User::login($user->email, $new_password);
				App::setFlash('success', 'Пароль успешно изменен!');

			} else {
				App::setFlash('danger', $user->getErrors());
				App::setInput($_POST);
			}

			App::redirect('/user/password');
		}

		App::view('users.password', compact('user'));
	}

	/**
	 * Регистрация
	 */
	public function register()
	{
		if (User::check()) App::redirect('/');

		if (Request::isMethod('post') && !Request::has('token')) {

			$captcha = Request::input('captcha');
			$login = Request::input('login');
			$email = Request::input('email');
			$password = Request::input('password');
			$gender = Request::input('gender');

			$user = new User;
			$user->captcha = $captcha;
			$user->login = $login;
			$user->new_password = $password;
			$user->email = $email;
			$user->gender = $gender;

			if ($user->save()) {

				$message = 'Добро пожаловать, '.e($login).'<br>Теперь вы зарегистрированный пользователь сайта '.Setting::get('sitelink').' , сохраните ваш пароль в надежном месте<br>Ваши данные для входа на сайт<br>Email: '.e($email).'<br>Пароль: '.e($password).'<br>Если это письмо попало к вам по ошибке, то просто проигнорируйте его';

				$to = [$email => $login];
				$subject = 'Регистрация на сайте';
				$body = App::view('mailer.register', compact('subject', 'message'), true);

				// Отправка письма
				App::sendMail($to, $subject, $body);

				// Авторизация
				User::login($email, $password);

				App::setFlash('success', 'Добро пожаловать, '.e($user->login).'! Вы успешно зарегистрированы!');
				App::redirect('/');

			} else {
				App::setFlash('danger', $user->getErrors());
				App::setInput($_POST);
				App::redirect('/register');
			}
		}

		if (Request::has('token')) {
			User::socialLogin(Request::input('token'));
		}

		App::view('users.register');
	}

	/**
	 * Авторизация
	 */
	public function login()
	{
		$return = Request::input('return', '');

		if (User::check()) App::redirect('/');

		if (Request::has('login') && Request::has('password')) {

			$login = Request::input('login');
			$password = Request::input('password');
			$remember = Request::has('remember') ? 1 : 0;

			if ($user = User::login($login, $password, $remember)) {
				App::setFlash('success', 'Добро пожаловать, '.e($user->login).'!');
				if ($return) { App::redirect($return); } else { App::redirect('/'); }
			}

			App::setInput($_POST);
			App::setFlash('danger', 'Ошибка авторизации. Неправильный логин или пароль!');
			App::redirect('/login');
		}

		if (Request::has('token')) {
			User::socialLogin(Request::input('token'));
		}

		App::view('users.login');
	}

	/**
	 * Выход
	 */
	public function logout()
	{
		$_SESSION = array();
		setcookie('pass', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], null, true);
		setcookie(session_name(), '', time() - 3600, '/', '');
		session_destroy();

		App::redirect('/');
	}

	/**
	 * Восстановление пароля
	 */
	public function recovery()
	{
		if (User::check()) App::abort(403);

		if (Request::isMethod('post')) {

			$email = Request::input('email');
			$captcha = Request::input('captcha');

			$errors = [];
			if (!App::isMail($email)) $errors['email'] = 'Неверный формат адреса email';
			if ($captcha != $_SESSION['captcha']) $errors['captcha'] = 'Неверный проверочный код';

			if (!$errors && !$user = User::find_by_email($email)) $errors['email'] = 'Пользователь не найден';

			if (!$errors) {

				$user->reset_code = str_random(mt_rand(35, 40));
				$user->save();

				$reset_link = 'http://'.Setting::get('sitelink').'/reset?key='.$user->reset_code;

				$message = 'Здравствуйте, '.e($user->login).'<br />Вами была произведена операция по восстановлению пароля на сайте '.Setting::get('sitelink').'<br />Для того, чтобы восстановить пароль, необходимо нажать на кнопку восстановления<br /><br />Если это письмо попало к вам по ошибке или вы не собираетесь восстанавливать пароль, то просто проигнорируйте его';

				$to = [$user->email => $user->login];
				$subject = 'Восстановление пароля';
				$body = App::view('mailer.recovery', compact('subject', 'message', 'reset_link'), true);

				// Отправка письма
				App::sendMail($to, $subject, $body);

				App::setFlash('success', 'Письмо с инструкцией выслано вам на email!');

			} else {
				App::setFlash('danger', $errors);
				App::setInput($_POST);
			}

			App::redirect('/recovery');
		}

		App::view('users.recovery');
	}

	/**
	 * Сброс пароля
	 */
	public function reset()
	{
		if (User::check()) App::abort(403);

		$key = Request::input('key');

		$errors = [];
		if (!$key) $errors['key'] = 'Отсутствует ключ для сброса пароля';
		if (!$errors && !$user = User::find_by_reset_code($key)) $errors['email'] = 'Пользователь с данным ключем не найден';

		if (!$errors) {

			if (Request::isMethod('post')) {

				$new_password = Request::input('password');

				$user->new_password = $new_password;
				$user->updated_at = new Datetime;

				if ($user->save()) {

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

					App::setFlash('success', 'Новый пароль успешно сохранен!');
					App::redirect('/');

				} else {
					App::setFlash('danger', $errors);
					App::setInput($_POST);
				}

				App::redirect('/reset');
			}

			App::view('users.reset');

		} else {
			App::setFlash('danger', $errors);
			App::redirect('/');
		}
	}

	/**
	 * Загрузка фото в профиль
	 */
	public function image()
	{
		if (!Request::ajax() || !User::check()) App::redirect('/');
		// Удаление и размер
		$image = Request::file('image');

		if ($image->isValid()) {

			$ext = $image->getClientOriginalExtension();
			$filename = uniqid(mt_rand()).'.'.$ext;

			if (in_array($ext, ['jpeg', 'jpg', 'png', 'gif'])) {

				$user = User::get();
				$user->deleteImages();

				$img = new SimpleImage($image->getPathName());
				$img->best_fit(1280, 1280)->save('uploads/users/photos/'.$filename);
				$img->best_fit(200, 200)->save('uploads/users/thumbs/'.$filename);
				$img->thumbnail(48, 48)->save('uploads/users/avatars/'.$filename);

				$user->avatar = $filename;
				if ($user->save())
					exit(json_encode(['status' => 'uploaded']));
				else
					exit(json_encode(['status' => 'nosave']));
			} else {
				exit(json_encode(['status' => 'invalid']));
			}
		}
	}

}