From 226509fb7a6c3e048a633535f8dfafef6796dcaa Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Fri, 4 Dec 2015 17:04:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=81=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BA=D0=B8=20-=20=D0=BE=D1=82=D0=BA=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/FeedController.php | 2 +- controllers/JsonController.php | 27 +++-- controllers/PageController.php | 10 +- controllers/PointController.php | 200 ++++++++++++++++---------------- models/Notifications.php | 1 + models/Point.php | 33 ++++-- public/js/app.js | 4 +- public/js/map.js | 6 +- views/modals/addPoint.php | 155 +++++++++++++------------ views/point.php | 3 + views/user/notification.php | 3 + 11 files changed, 243 insertions(+), 201 deletions(-) diff --git a/controllers/FeedController.php b/controllers/FeedController.php index 2275e2e..d860fa0 100644 --- a/controllers/FeedController.php +++ b/controllers/FeedController.php @@ -22,7 +22,7 @@ class FeedController extends Controller // --------- POINTS $points = Point::model()->getAll(array( - 'where' => '`moderate` = 1', + 'where' => '`status` = "published"', 'order' => '`ord` DESC', 'limit' => 5, )); diff --git a/controllers/JsonController.php b/controllers/JsonController.php index 8381497..83a08ef 100644 --- a/controllers/JsonController.php +++ b/controllers/JsonController.php @@ -9,7 +9,7 @@ class JsonController extends Controller static function actionPoints() { if (App::$user && App::$user->isAdmin == 1) { - $points = Point::model()->getAll(); + $points = Point::model()->getAll(array('where' => '`status` != "del"')); } else { $minEditDate = isset($_GET['time']) ? (int) $_GET['time'] : 0; if (!isset($_GET['bounds']) || !isset($_GET['bounds'][0]) || !isset($_GET['bounds'][1]) || !isset($_GET['bounds'][2]) || !isset($_GET['bounds'][3])) { @@ -34,7 +34,7 @@ class JsonController extends Controller $tempPoint['lat'] = $point->lat; $tempPoint['lng'] = $point->lng; $tempPoint['categoryId'] = $point->categoryId; - $tempPoint['moderate'] = $point->moderate ? 'show' : 'hide'; + $tempPoint['status'] = $point->status; $result[] = $tempPoint; } @@ -56,7 +56,6 @@ class JsonController extends Controller $point->descriptionHtml = nl2br($point->description); $point->descriptionHtml = Helper::replaceLinks($point->descriptionHtml, 'js'); $point->name = htmlspecialchars($point->name); - $point->moderate = $point->moderate ? 'show' : 'hide'; $imgs = $point->photos; $photosCount = 1; @@ -117,7 +116,7 @@ class JsonController extends Controller { $logName = isset($_POST['id']) && $_POST['id'] ? 'point_'.intval($_POST['id']) : 'point_0_NEW'; App::log('points/'.$logName, array( - 'user' => App::$user->getValues(), + 'user' => App::$user ? App::$user->getValues() : NULL, 'POST' => $_POST, )); $errors = array(); @@ -131,7 +130,7 @@ class JsonController extends Controller $id = (int) $_POST['id']; $point = $point->getByPK($id); - if ($point->author != App::$user->id || $point->moderate == 1) { + if ($point->author != App::$user->id || $point->status == Point::statusPublished) { $errors[9] = 'Редактирование точек достурно только администратору или автору!'; } } @@ -265,16 +264,16 @@ class JsonController extends Controller if (App::$request['ajax']) { $point = new Point(); unset($_POST['img']); - if (isset($_POST['id']) && $_POST['id']) { // Редактирование существующей точки $id = (int) $_POST['id']; $_POST['dateEdit'] = time(); - $_POST['moderate'] = (App::$user && App::$user->isAdmin == 1) ? $_POST['moderate'] : 0; + $_POST['status'] = (App::$user && App::$user->isAdmin == 1) ? Point::getStatusByString($_POST['status']) : Point::statusModeration; $point = $point->getByPK($id); - if ($point->moderate == 0 AND $_POST['moderate'] == 1) { + // Публикация ранее неопубликованной точки + if ($point->status == Point::statusModeration AND Point::getStatusByString($_POST['status']) == Point::statusPublished) { Notifications::model()->add(array( 'userId' => $point->author, 'objectId' => $id, @@ -284,13 +283,23 @@ class JsonController extends Controller $_POST['ord'] = time(); } + if (Point::getStatusByString($_POST['status']) == Point::statusDel) { + Notifications::model()->add(array( + 'userId' => $point->author, + 'objectId' => $id, + 'type' => Notifications::typePointDeleted, + 'date' => time(), + )); + $_POST['ord'] = time(); + } + $point->setValues($_POST); $point->save(); } else { $_POST['author'] = App::$user->id; $_POST['date'] = time(); $_POST['dateEdit'] = time(); - $_POST['moderate'] = (App::$user && App::$user->isAdmin == 1) ? $_POST['moderate'] : 0; + $_POST['status'] = (App::$user && App::$user->isAdmin == 1) ? Point::getStatusByString($_POST['status']) : Point::statusModeration; $_POST['ord'] = (App::$user && App::$user->isAdmin == 1) ? time() : 0; $point->add($_POST); diff --git a/controllers/PageController.php b/controllers/PageController.php index 5c95b62..e9e0ae6 100644 --- a/controllers/PageController.php +++ b/controllers/PageController.php @@ -25,7 +25,7 @@ class PageController extends Controller // On moderation if (App::$user && App::$user->isAdmin) { $param['order'] = 'id DESC'; - $param['where'] = '`moderate` = 0'; + $param['where'] = '`status` = "moderation"'; $points = Point::model()->getAll($param); $categories = Category::model()->getAll(array('order' => 'ord ASC')); @@ -44,7 +44,7 @@ class PageController extends Controller // ------------------------------------------ $param = array(); - $param['where'] = '`moderate` = 1'; + $param['where'] = '`status` = "published"'; $pointsCount = Point::model()->getCount($param); $pagesCount = intval(ceil($pointsCount/self::elementsByPage)); $page = isset($_GET['page']) ? abs((int)$_GET['page']) : $pagesCount; @@ -77,11 +77,11 @@ class PageController extends Controller $param = array(); $param['order'] = '`ord` DESC'; if (App::getParam('category')) { - $param['where'] = 'categoryId = ' . (int) App::getParam('category') . ' AND `moderate` = 1'; + $param['where'] = 'categoryId = ' . (int) App::getParam('category') . ' AND `status` = "published"'; } else if (App::getParam('user')) { - $param['where'] = '`author` = ' . (int) App::getParam('user') . ' AND `moderate` = 1'; + $param['where'] = '`author` = ' . (int) App::getParam('user') . ' AND `status` = "published"'; } else { - $param['where'] = '`moderate` = 1'; + $param['where'] = '`status` = "published"'; $param['limit'] = self::elementsByPage; if($page) { $param['offset'] = self::elementsByPage * ($pagesCount - $page); diff --git a/controllers/PointController.php b/controllers/PointController.php index 8ed92f6..f7b8de1 100644 --- a/controllers/PointController.php +++ b/controllers/PointController.php @@ -2,109 +2,115 @@ class PointController extends Controller { + static function actionIndex() { self::$layout = 'layouts/page.php'; $pointId = (int) App::getParam('id'); - if ($pointId) { - self::addScript('/js/jquery-2.1.0.min.js'); - self::addScript('/js/jquery-ui-1.10.4.custom.min.js'); - self::addScript('/js/bootstrap.min.js'); - self::addScript('/js/leaflet-0.7.3.js'); - self::addScript('http://api-maps.yandex.ru/2.0/?load=package.map&lang=ru-RU'); - self::addScript('/js/leaflet.markercluster.js'); - - self::addScript('/js/app.js?ver=' . App::getConfig('version')); - self::addScript('/js/mapPoint.js?ver=' . App::getConfig('version')); - self::addScript('http://cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.3/fotorama.js'); - - self::addStyle('/css/style.css?ver=' . App::getConfig('version')); - self::addStyle('/css/pageStyle.css?ver=' . App::getConfig('version')); - self::addStyle('/css/bootstrap.min.css'); - self::addStyle('/css/bootstrap-theme.min.css'); - self::addStyle('http://cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.3/fotorama.css'); - self::addStyle('/css/leaflet-0.7.3.css'); - self::addStyle('/css/MarkerCluster.css'); - self::addStyle('/css/MarkerCluster.Default.css'); - - if (App::$user && App::$user->id) { - self::addVar('user', App::$user->id); - } else { - self::addVar('user', '0'); - self::addScript('//ulogin.ru/js/ulogin.js'); - } - - $point = Point::model()->getByPK($pointId); - - if ($point->id == NULL) { - App::error404(); - } - - $point->descriptionHtml = nl2br($point->description); - $point->name = htmlspecialchars($point->name); - App::setConfig('title', $point->name . ' – wikipoints.ru'); - self::addVar('pointLat', $point->lat); - self::addVar('pointLng', $point->lng); - self::addVar('pointId', $point->id); - - $categories = Category::model()->getAll(array('order' => 'ord ASC', 'asArray' => true)); - - $point->categoryIcon = $categories[$point->categoryId]['icon']; - $point->categoryName = $categories[$point->categoryId]['name']; - $point->descriptionHtml = Helper::replaceLinks($point->descriptionHtml, 'html'); - - preg_match_all("/.*?((([^.?!\s]{3,}?)[.?!](?:\s|$))|$)/s", $point->descriptionHtml, $items); // Разбиваем текст на предложения. - $point->inFavorites = Favorite::model()->checkIsMy($pointId); - $point->iLike = Like::model()->checkIsMy($pointId); - - - $photoLinks = PhotoLinks::model()->getAll(array('where' => '`pointId` = ' . $pointId)); - $photoLinksRes = array(); - if ($photoLinks) { - foreach ($photoLinks as $photoLink) { - if ($photoLink->host) { - $photoLinksRes[strtolower($photoLink->host)] = 1; - } - } - } - $photoLinksRes = implode('; ', array_keys($photoLinksRes)); - - $similarPoints = Point::model()->getAll(array('where' => '`moderate` = 1 AND categoryId = ' . $point->categoryId . ' AND `id` <> ' . $point->id . ' ORDER BY RAND() LIMIT 6;')); - $closestPoints = Point::model()->getClosestPoints($pointId); - $randomPoint = Point::model()->getRandom(); - $randomPoint->description = mb_substr($randomPoint->description, 0, 400, 'UTF-8'); - $randomPoint->description = Helper::replaceLinks($randomPoint->description); - - $articlePoints = ArticlePoints::model()->getAll(array('where'=>'`pointId` = '.$pointId)); - $articleIds = array(); - $articles = array(); - if ($articlePoints) { - foreach ($articlePoints as $articlePoint) { - $articleIds[] = (int)$articlePoint->articleId; - } - $articles = Article::model()->getAll(array('where'=>'`id` IN ('. implode(',', $articleIds).')')); - } - - self::render('point.php', array( - 'point' => $point, - 'text' => $items[0], - 'randomPoint' => $randomPoint, - 'similarPoints' => $similarPoints, - 'closestPoints' => $closestPoints, - 'categories' => $categories, - 'photos' => $point->photos, - 'countInFavs' => Favorite::model()->countInFavs($pointId), - 'countLikes' => Like::model()->countLikes($pointId), - 'og' => Helper::buildOG($point), - 'user' => App::$user, - 'photoLinks' => $photoLinksRes, - 'articles' => $articles, - 'extraParams' => $point->getExtraParams(), - 'goods' => Goods::model()->getRandom(6), - )); - } else { + if (!$pointId) { App::error404(); } + + $point = Point::model()->getByPK($pointId); + if (!$point->id) { + App::error404(); + } + + self::addScript('/js/jquery-2.1.0.min.js'); + self::addScript('/js/jquery-ui-1.10.4.custom.min.js'); + self::addScript('/js/bootstrap.min.js'); + self::addScript('/js/leaflet-0.7.3.js'); + self::addScript('http://api-maps.yandex.ru/2.0/?load=package.map&lang=ru-RU'); + self::addScript('/js/leaflet.markercluster.js'); + + self::addScript('/js/app.js?ver=' . App::getConfig('version')); + self::addScript('/js/mapPoint.js?ver=' . App::getConfig('version')); + self::addScript('http://cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.3/fotorama.js'); + + self::addStyle('/css/style.css?ver=' . App::getConfig('version')); + self::addStyle('/css/pageStyle.css?ver=' . App::getConfig('version')); + self::addStyle('/css/bootstrap.min.css'); + self::addStyle('/css/bootstrap-theme.min.css'); + self::addStyle('http://cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.3/fotorama.css'); + self::addStyle('/css/leaflet-0.7.3.css'); + self::addStyle('/css/MarkerCluster.css'); + self::addStyle('/css/MarkerCluster.Default.css'); + + if (App::$user && App::$user->id) { + self::addVar('user', App::$user->id); + } else { + self::addVar('user', '0'); + self::addScript('//ulogin.ru/js/ulogin.js'); + } + + if ($point->status != Point::statusPublished && !App::$user->isAdmin && $point->author != App::$user->id) { + App::error404(); + } + + + $point->descriptionHtml = nl2br($point->description); + $point->name = htmlspecialchars($point->name); + App::setConfig('title', $point->name . ' – wikipoints.ru'); + self::addVar('pointLat', $point->lat); + self::addVar('pointLng', $point->lng); + self::addVar('pointId', $point->id); + + $categories = Category::model()->getAll(array('order' => 'ord ASC', 'asArray' => true)); + + $point->categoryIcon = $categories[$point->categoryId]['icon']; + $point->categoryName = $categories[$point->categoryId]['name']; + $point->descriptionHtml = Helper::replaceLinks($point->descriptionHtml, 'html'); + + preg_match_all("/.*?((([^.?!\s]{3,}?)[.?!](?:\s|$))|$)/s", $point->descriptionHtml, $items); // Разбиваем текст на предложения. + $point->inFavorites = Favorite::model()->checkIsMy($pointId); + $point->iLike = Like::model()->checkIsMy($pointId); + + + $photoLinks = PhotoLinks::model()->getAll(array('where' => '`pointId` = ' . $pointId)); + $photoLinksRes = array(); + if ($photoLinks) { + foreach ($photoLinks as $photoLink) { + if ($photoLink->host) { + $photoLinksRes[strtolower($photoLink->host)] = 1; + } + } + } + $photoLinksRes = implode('; ', array_keys($photoLinksRes)); + + $similarPoints = Point::model()->getAll(array('where' => '`status` = "published" AND categoryId = ' . $point->categoryId . ' AND `id` <> ' . $point->id . ' ORDER BY RAND() LIMIT 6;')); + $closestPoints = Point::model()->getClosestPoints($pointId); + $randomPoint = Point::model()->getRandom(); + $randomPoint->description = mb_substr($randomPoint->description, 0, 400, 'UTF-8'); + $randomPoint->description = Helper::replaceLinks($randomPoint->description); + + $articlePoints = ArticlePoints::model()->getAll(array('where' => '`pointId` = ' . $pointId)); + $articleIds = array(); + $articles = array(); + if ($articlePoints) { + foreach ($articlePoints as $articlePoint) { + $articleIds[] = (int) $articlePoint->articleId; + } + $articles = Article::model()->getAll(array('where' => '`id` IN (' . implode(',', $articleIds) . ')')); + } + + self::render('point.php', array( + 'point' => $point, + 'text' => $items[0], + 'randomPoint' => $randomPoint, + 'similarPoints' => $similarPoints, + 'closestPoints' => $closestPoints, + 'categories' => $categories, + 'photos' => $point->photos, + 'countInFavs' => Favorite::model()->countInFavs($pointId), + 'countLikes' => Like::model()->countLikes($pointId), + 'og' => Helper::buildOG($point), + 'user' => App::$user, + 'photoLinks' => $photoLinksRes, + 'articles' => $articles, + 'extraParams' => $point->getExtraParams(), + 'goods' => Goods::model()->getRandom(6), + )); } + } diff --git a/models/Notifications.php b/models/Notifications.php index 8ede5e9..9968100 100644 --- a/models/Notifications.php +++ b/models/Notifications.php @@ -5,6 +5,7 @@ class Notifications extends Model private static $count = NULL; const typePointConfirmed = 'pointConfirmed'; + const typePointDeleted = 'pointDeleted'; const typeReply = 'reply'; const typeNewCommentPoint = 'newCommentPoint'; const typeNewCommentArticle = 'newCommentArticle'; diff --git a/models/Point.php b/models/Point.php index dfae86a..b75e5b9 100644 --- a/models/Point.php +++ b/models/Point.php @@ -2,6 +2,9 @@ class Point extends Model { + const statusModeration = 'moderation'; + const statusPublished = 'published'; + const statusDel = 'del'; function __construct($fromArray = array()) { @@ -35,10 +38,10 @@ class Point extends Model public function getRandom() { - $res = App::DB()->query("SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `" . $this->_tableName_ . "` WHERE `moderate` = 1")->fetch(PDO::FETCH_ASSOC); + $res = App::DB()->query("SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `" . $this->_tableName_ . '` WHERE `status` = "published"')->fetch(PDO::FETCH_ASSOC); $offset = $res['offset']; - $res = App::DB()->query('SELECT `id` FROM ' . $this->_tableName_ . ' WHERE `moderate` = 1 LIMIT ' . $offset . ',1;')->fetch(PDO::FETCH_ASSOC); + $res = App::DB()->query('SELECT `id` FROM ' . $this->_tableName_ . ' WHERE `status` = "published" LIMIT ' . $offset . ',1;')->fetch(PDO::FETCH_ASSOC); $pointId = $res['id']; return $this->getByPK($pointId); @@ -52,10 +55,10 @@ class Point extends Model $query = ' SELECT *, ( - SQRT(POW(`lat`-:lat,2)+POW(`lng`-:lng,2)) + (POW(`lat`-:lat,2)+POW(`lng`-:lng,2)) ) AS `dist` FROM `' . $this->_tableName_ . '` WHERE - `moderate` = 1 + `status` = "published" AND `lat` BETWEEN :minLat AND :maxLat AND @@ -81,7 +84,7 @@ class Point extends Model public function getCountByUser($userId) { - $res = App::DB()->query('SELECT count(`id`) AS `cnt` FROM ' . $this->_tableName_ . ' WHERE `author` = ' . $userId . ' AND `moderate` = 1 ;')->fetch(PDO::FETCH_ASSOC); + $res = App::DB()->query('SELECT count(`id`) AS `cnt` FROM ' . $this->_tableName_ . ' WHERE `author` = ' . $userId . ' AND `status` = "published";')->fetch(PDO::FETCH_ASSOC); return $res['cnt']; } @@ -92,7 +95,7 @@ class Point extends Model public function getAllPublished($bounds = false, $minEditDate = 0) { - $userId = App::$user ? App::$user->id : 0; + $userId = App::$user ? intval(App::$user->id) : 0; $minEditDate = intval($minEditDate); if ($bounds) { $b0 = $bounds[0] < $bounds[2] ? $bounds[0] : $bounds[2]; @@ -100,9 +103,9 @@ class Point extends Model $b1 = $bounds[1] < $bounds[3] ? $bounds[1] : $bounds[3]; $b3 = $bounds[1] < $bounds[3] ? $bounds[3] : $bounds[1]; - return $this->getAll(array('where' => "(`moderate` = 1 OR `author` = $userId) AND (`dateEdit` >= $minEditDate) AND (`lat` BETWEEN '$b0' AND '$b2') AND(`lng` BETWEEN '$b1' AND '$b3')")); + return $this->getAll(array('where' => "((`status` = '" . Point::statusPublished . "') OR (`status` = '" . Point::statusModeration . "' AND `author` = $userId)) AND (`dateEdit` >= $minEditDate) AND (`lat` BETWEEN '$b0' AND '$b2') AND(`lng` BETWEEN '$b1' AND '$b3')")); } else { - return $this->getAll(array('where' => "(`moderate` = 1 OR `author` = " . $userId . ") AND (`dateEdit` >= $minEditDate)")); + return $this->getAll(array('where' => "((`status` = '" . Point::statusPublished . "') OR (`status` = '" . Point::statusModeration . "' AND `author` = $userId)) AND (`dateEdit` >= $minEditDate)")); } } @@ -125,4 +128,18 @@ class Point extends Model $res = App::DB()->query('SELECT count(`id`) AS `cnt` FROM ' . $this->_tableName_ . ' WHERE `author` = ' . $userId . ' AND `date` >= ' . $time . ';')->fetch(PDO::FETCH_ASSOC); return (int)$res['cnt']; } + + public static function getStatusByString($status) + { + switch (strtolower($status)) { + case 'del': + return self::statusDel; + break; + case 'published': + return self::statusPublished; + break; + default: + return self::statusModeration; + } + } } diff --git a/public/js/app.js b/public/js/app.js index a063edf..a0e703c 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -283,7 +283,7 @@ function addPoint() source: $('#addPointSource').val(), lat: $('#addPointLat').val(), lng: $('#addPointLng').val(), - moderate: $('#moderate').val() == 'show' ? 1:0, + status: $('#moderate').val(), id: id }, success: function (data) { @@ -384,7 +384,7 @@ function editPoint(id) $('#addPointSource').val(pointsSources[id].source); $('#addPointLat').val(pointsSources[id].lat); $('#addPointLng').val(pointsSources[id].lng); - $('#moderate').val(pointsSources[id].moderate); + $('#moderate').val(pointsSources[id].status); $('.extraImage', '#imgsContainer').remove(); $('.extraParam', '#extraParamsContainer').remove(); diff --git a/public/js/map.js b/public/js/map.js index 8fec5f6..7621f1f 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -152,7 +152,7 @@ function constructPoint(data) id = data['id']; icon = categories[data['categoryId']]; - if (data['moderate'] != 'show') { + if (data['status'] != 'published') { icon = categories.lock; data['name'] = 'На модерации: ' + data['name']; } @@ -272,7 +272,7 @@ function drawInfoPopup(id, showPopup, doNotPushToHistory) { } onModerate = ''; - if (data.moderate != 'show') { + if (data.status != 'published') { onModerate = 'На модерации: '; } @@ -285,7 +285,7 @@ function drawInfoPopup(id, showPopup, doNotPushToHistory) { description += ''; description += ''; - if (isAdmin == '1' || data.moderate == "hide") + if (isAdmin == '1' || data.status == "moderation") { description += ''; if (getURLParameter('edit') == 'true') diff --git a/views/modals/addPoint.php b/views/modals/addPoint.php index c505cb2..4980676 100644 --- a/views/modals/addPoint.php +++ b/views/modals/addPoint.php @@ -5,91 +5,94 @@ -