Добавил возможность авторизоваться. При создании точки сохраняется время и автор. Точку может добавить только авторизованный пользователь.

This commit is contained in:
Krivchikov Dmitry 2014-05-01 20:03:07 +04:00
parent 97fab94994
commit 5a72857687
5 changed files with 138 additions and 3 deletions

View File

@ -30,6 +30,7 @@ class App
private static $config = array();
private static $urlParams = array();
public static $DB = null;
public static $user = null;
/**
* Разбивает урл на контроллер, метод и выбирает параметры.
@ -60,6 +61,7 @@ class App
public static function run($config = '')
{
ob_start();
session_start();
self::$config = $config ? include_once $config : array();
self::parseUrl();
@ -69,6 +71,9 @@ class App
{
$confDB = self::getConfig('DB');
self::$DB = new PDO('mysql:host=' . $confDB['host'] . ';dbname=' . $confDB['dbname'].';charset=utf8;', $confDB['user'], $confDB['password']);
// Работать с пользователями моно только при наличии БД
self::userInit();
}
catch (PDOException $e)
{
@ -94,7 +99,36 @@ class App
die($message ? $message : '404 - Not Found');
}
/**
// Пытаемся восстановить пользователя из сессии
public static function userInit()
{
if (isset($_SESSION['user_id']) && isset($_SESSION['user_key']) && $_SESSION['user_id'] && $_SESSION['user_key'] )
{
$user = new User();
$user = $user->getByPK((int)$_SESSION['user_id']);
if ( $user && md5($user->uid) == $_SESSION['user_key'] )
{
self::$user = $user;
}
}
}
public static function userLogin($user)
{
$_SESSION['user_id'] = $user->id;
$_SESSION['user_key'] = md5($user->uid);
return true;
}
public static function userLogout()
{
$_SESSION['user_id'] = null;
$_SESSION['user_key'] = null;
return true;
}
/**
* Перенаправление на другой URL
* @param type $url
* @param type $httpCode - по умолчанию 307, временный редирект

View File

@ -4,7 +4,7 @@ class IndexController extends Controller
{
/**
* Действие по умолчанию - вывоим каталог товаров.
* Действие по умолчанию
*/
static function actionIndex()
{
@ -16,6 +16,9 @@ class IndexController extends Controller
self::addStyle('/css/bootstrap.min.css');
self::addStyle('/css/bootstrap-theme.min.css');
if (!App::$user )
self::addScript('//ulogin.ru/js/ulogin.js');
$category = new Category();
$res = App::$DB->query("SELECT COUNT(`id`) pointsCount FROM `points`")->fetch(PDO::FETCH_ASSOC);
@ -23,7 +26,54 @@ class IndexController extends Controller
self::render('indexTemplate.php', array(
'categories' => $category->getAll('', 'ord'),
'user' => App::$user,
));
}
static function actionUser()
{
print $_SERVER['HTTP_HOST'];
var_dump(App::$user->id, App::$user->nick, App::$user->name, App::$user->network);
}
static function actionLogout()
{
App::userLogout();
App::redirect('/');
}
static function actionLogin()
{
$source = file_get_contents('http://ulogin.ru/token.php?token=' . $_POST['token'] . '&host=' . $_SERVER['HTTP_HOST']);
$uLoginUser = json_decode($source, true);
$uLoginUser['identity'] = md5($uLoginUser['uid'].$uLoginUser['network'].'=P');
$user = new User();
$user->getByUID($uLoginUser['identity']);
if( !$user->id )
{
$res = $user->add(array(
'uid' => $uLoginUser['identity'],
'nick' => $uLoginUser['nickname'],
'name' => $uLoginUser['first_name'],
'profile' => $uLoginUser['profile'],
'network' => $uLoginUser['network']
));
if ($res)
{
$user = new User();
$user = $user->getByPK($res);
}
else
{
return false;
}
}
App::userLogin($user);
App::redirect('/');
}
}

View File

@ -81,10 +81,14 @@ class JsonController extends Controller
if(!( isset($_POST['source']) )) $errors[5]='Не передано поле источкика информации. Допускается пустое значение.';
if(!( isset($_POST['lat']) && $_POST['lat'] )) $errors[6]='Ошибочное значение широты';
if(!( isset($_POST['lng']) && $_POST['lng'] )) $errors[7]='Ошибочное значение долготы';
if(!App::$user ) $errors[8]='Вы не авторизованы! Пожалуйста, войдите.';
if (empty($errors))
{
$point = new Point();
$_POST['author'] = App::$user->id;
$_POST['date'] = time();
$point->add($_POST);
if ( $point->id )

26
ground/models/User.php Normal file
View File

@ -0,0 +1,26 @@
<?php
class User extends Model
{
function __construct()
{
$this->_tableName_ = 'users';
parent::__construct();
}
function getByUID($uid)
{
$res = App::$DB->query('SELECT `id` FROM ' . $this->_tableName_ . ' WHERE `uid` = "' . $uid . '"');
if ($res)
{
$res = $res->fetch(PDO::FETCH_ASSOC);
return parent::getByPK((int)$res['id']);
}
else
{
return false;
}
}
}

View File

@ -25,11 +25,32 @@
<button class="btn btn-default" type="button" onclick="showMeOnTheMap()"><span class="glyphicon glyphicon-screenshot"></span> Я на карте</button>
</td>
<td class="text-right">
<button class="btn btn-default" type="button" id="addPointButton" onclick="activateAddPoint()"><span class="glyphicon glyphicon-plus-sign"></span> Добавить точку</button>
<?php if ($user): ?>
<button class="btn btn-default" type="button" id="addPointButton" onclick="activateAddPoint()"><span class="glyphicon glyphicon-plus-sign"></span> Добавить точку</button>
<a class="btn btn-default" type="button" href="/index/logout"><span class="glyphicon glyphicon-ban-circle"></span> Выйти</a>
<?php else:?>
<button class="btn btn-default" type="button" id="loginButton" onclick="$('#loginModal').modal('show');"><span class="glyphicon glyphicon-user"></span> Войти</button>
<?php endif;?>
</td>
</tr>
</table>
</div>
<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="Вход на сайт" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Вход на сайт</h4>
</div>
<div class="modal-body">
<div style="display: inline-block;" id="uLogin" data-ulogin="display=panel;fields=first_name,nickname;providers=vkontakte,twitter,facebook,foursquare,google,yandex,mailru;hidden=other;redirect_uri=http%3A%2F%2F<?= $_SERVER['HTTP_HOST'] ?>%2Findex%2Flogin"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Отмена</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="addPointModal" tabindex="-1" role="dialog" aria-labelledby="Добавление новой точки" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">