mirror of
https://github.com/claradex/nativegallery.git
synced 2025-03-25 18:58:16 +03:00
contests
This commit is contained in:
parent
e9655f6463
commit
b41ec07317
15 changed files with 262 additions and 195 deletions
59
app/Controllers/Api/Contests/GetInfo.php
Normal file
59
app/Controllers/Api/Contests/GetInfo.php
Normal file
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace App\Controllers\Api\Contests;
|
||||
|
||||
use App\Services\{DB, Json};
|
||||
|
||||
class GetInfo
|
||||
{
|
||||
private array $contest;
|
||||
private string $pretendsStatus;
|
||||
private string $publicStatus;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->fetchContest();
|
||||
$this->setStatuses();
|
||||
$this->outputJson();
|
||||
}
|
||||
|
||||
private function fetchContest(): void
|
||||
{
|
||||
$statuses = [0, 1, 2];
|
||||
foreach ($statuses as $status) {
|
||||
$contest = DB::query('SELECT * FROM contests WHERE status = :status', [':status' => $status]);
|
||||
if (!empty($contest)) {
|
||||
$this->contest = $contest[0];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function setStatuses(): void
|
||||
{
|
||||
$time = time();
|
||||
$status = $this->contest['status'] ?? null;
|
||||
|
||||
if ($status === 0) {
|
||||
$this->pretendsStatus = ($this->contest['openpretendsdate'] > $time) ? 'waiting' : 'waitingforserver';
|
||||
$this->publicStatus = 'closed';
|
||||
} elseif ($status === 1) {
|
||||
$this->pretendsStatus = ($this->contest['closepretendsdate'] > $time) ? 'opened' : 'waitingforserver';
|
||||
$this->publicStatus = 'closed';
|
||||
} elseif ($status === 2) {
|
||||
$this->pretendsStatus = 'closed';
|
||||
$this->publicStatus = ($this->contest['closedate'] <= $time) ? 'waitingforserver' : 'opened';
|
||||
}
|
||||
}
|
||||
|
||||
private function outputJson(): void
|
||||
{
|
||||
echo json_encode(array(
|
||||
'contest' => $this->contest,
|
||||
'statuses' => [
|
||||
'pretends' => $this->pretendsStatus,
|
||||
'public' => $this->publicStatus,
|
||||
]
|
||||
));
|
||||
}
|
||||
}
|
46
app/Controllers/Api/Images/Contests/Rate.php
Normal file
46
app/Controllers/Api/Images/Contests/Rate.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
namespace App\Controllers\Api\Images\Contests;
|
||||
|
||||
|
||||
|
||||
use App\Services\{Auth, Router, GenerateRandomStr, DB, Json, EXIF};
|
||||
use App\Models\{User, Vote, Photo};
|
||||
|
||||
|
||||
class Rate
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$count = 3;
|
||||
$uservotes = DB::query('SELECT COUNT(*) FROM contests_rates WHERE user_id=:uid AND contest_id=:cid', array(':uid' => Auth::userid(), ':cid' => $_GET['kid']))[0]['COUNT(*)'];
|
||||
$countvotes = $count - $uservotes;
|
||||
$contest = DB::query('SELECT * FROM contests WHERE id=:id', array(":id" => $_GET['kid']))[0];
|
||||
$photo = new Photo($_GET['pid']);
|
||||
if ($contest['status'] != 2) {
|
||||
exit;
|
||||
}
|
||||
if ($photo->i('on_contest') != 1 && $photo->i('contest_id') != $_GET['kid']) {
|
||||
exit;
|
||||
}
|
||||
if ((int)DB::query('SELECT photo_id FROM contests_rates WHERE photo_id=:pid AND user_id=:uid AND contest_id=:cid', array(':uid' => Auth::userid(), ':pid' => $_GET['pid'], ':cid' => $_GET['kid']))[0]['photo_id'] === (int)$_GET['pid']) {
|
||||
DB::query('DELETE FROM contests_rates WHERE user_id=:uid AND photo_id=:pid AND contest_id=:cid', array(':pid' => $_GET['pid'], ':uid' => Auth::userid(), ':cid' => $_GET['kid']));
|
||||
$status = 0;
|
||||
$newval = $countvotes + 1;
|
||||
} else {
|
||||
$newval = $countvotes - 1;
|
||||
if ($newval >= 0) {
|
||||
DB::query('INSERT INTO contests_rates VALUES (\'0\', :pid, :uid, :cid)', array(':pid' => $_GET['pid'], ':uid' => Auth::userid(), ':cid' => $_GET['kid']));
|
||||
$status = 1;
|
||||
}
|
||||
}
|
||||
if ($newval < 0) {
|
||||
$text = 'Вы можете выбрать максимум 3 фотографии.';
|
||||
} else if ($newval === 0) {
|
||||
$text = 'Вы выбрали 3 фотографии. Спасибо за голосование!';
|
||||
} else {
|
||||
$text = "Вы можете выбрать ещё {$newval} фото.";
|
||||
}
|
||||
echo '[{"' . $_GET['pid'] . '":'.$status.'},"' . $text . '"]';
|
||||
}
|
||||
}
|
|
@ -8,7 +8,6 @@ use \App\Controllers\Api\{Login, Register};
|
|||
use \App\Controllers\Api\Subscribe as SubscribeUser;
|
||||
use \App\Controllers\Api\Images\{Upload};
|
||||
use \App\Controllers\Api\Images\Rate as PhotoVote;
|
||||
use \App\Controllers\Api\Images\RateContest as PhotoVoteContest;
|
||||
use \App\Controllers\Api\Images\Compress as PhotoCompress;
|
||||
use \App\Controllers\Api\Images\CheckAll as PhotoCheckAll;
|
||||
use \App\Controllers\Api\Images\LoadRecent as PhotoLoadRecent;
|
||||
|
@ -21,6 +20,8 @@ use \App\Controllers\Api\Images\Comments\Pin as PhotoCommentPin;
|
|||
use \App\Controllers\Api\Images\Comments\Load as PhotoCommentLoad;
|
||||
use \App\Controllers\Api\Images\Comments\Rate as PhotoCommentVote;
|
||||
use \App\Controllers\Api\Images\Contests\SendPretend as PhotoContestsSendPretend;
|
||||
use \App\Controllers\Api\Images\Contests\Rate as PhotoContestsRate;
|
||||
use \App\Controllers\Api\Contests\GetInfo as ContestsGetInfo;
|
||||
use \App\Controllers\Api\GeoDB\Search as GeoDBSearch;
|
||||
use \App\Controllers\Api\Vehicles\Load as VehiclesLoad;
|
||||
use \App\Controllers\Api\Profile\Update as ProfileUpdate;
|
||||
|
@ -57,7 +58,7 @@ class ApiController
|
|||
return new PhotoVote();
|
||||
}
|
||||
public static function photovotecontest() {
|
||||
return new PhotoVoteContest();
|
||||
return new PhotoContestsRate();
|
||||
}
|
||||
public static function photofavorite() {
|
||||
return new PhotoFavorite();
|
||||
|
@ -140,6 +141,9 @@ class ApiController
|
|||
public static function vehiclesload() {
|
||||
return new VehiclesLoad();
|
||||
}
|
||||
public static function contestsgetinfo() {
|
||||
return new ContestsGetInfo();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -36,6 +36,9 @@ class ExecContests
|
|||
case 2:
|
||||
self::handleClosingContest($contest);
|
||||
break;
|
||||
case 02:
|
||||
self::handleClosePretendsByTime($contest);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,20 +59,38 @@ class ExecContests
|
|||
|
||||
private static function handleClosePretends(array $contest)
|
||||
{
|
||||
if (self::isAnotherContestInStatus(2)) {
|
||||
if (self::isAnotherContestInStatus(2) || self::isAnotherContestInStatus(02)) {
|
||||
echo "[{$contest['id']}] Waiting for another contest to end. Skip...\n";
|
||||
return;
|
||||
}
|
||||
|
||||
if ($contest['closepretendsdate'] <= time() && $contest['opendate'] <= time()) {
|
||||
if ($contest['closepretendsdate'] <= time()) {
|
||||
DB::query('UPDATE photos SET on_contest=2 WHERE on_contest=1 AND contest_id=:id', array(':id'=>$contest['id']));
|
||||
DB::query('UPDATE contests SET status = 2 WHERE id = :id', [':id' => $contest['id']]);
|
||||
if ($contest['opendate'] <= time()) {
|
||||
DB::query('UPDATE contests SET status = 2 WHERE id = :id', [':id' => $contest['id']]);
|
||||
echo "[{$contest['id']}] Opened.\n";
|
||||
} else {
|
||||
DB::query('UPDATE contests SET status = 02 WHERE id = :id', [':id' => $contest['id']]);
|
||||
}
|
||||
echo "[{$contest['id']}] Closed for pretends.\n";
|
||||
} else {
|
||||
echo "[{$contest['id']}] Not closed for pretends. Skip...\n";
|
||||
}
|
||||
}
|
||||
|
||||
private static function handleClosePretendsByTime(array $contest)
|
||||
{
|
||||
echo "[{$contest['id']}] Cheking for Open by time...\n";
|
||||
if ($contest['opendate'] <= time()) {
|
||||
DB::query('UPDATE contests SET status = 2 WHERE id = :id', [':id' => $contest['id']]);
|
||||
echo "[{$contest['id']}] .\n";
|
||||
} else {
|
||||
echo "[{$contest['id']}] not opened by time. Skip...\n";
|
||||
}
|
||||
echo "[{$contest['id']}] Opened.\n";
|
||||
|
||||
}
|
||||
|
||||
private static function handleClosingContest(array $contest)
|
||||
{
|
||||
if ($contest['closedate'] > time()) {
|
||||
|
@ -80,25 +101,32 @@ class ExecContests
|
|||
echo "[{$contest['id']}] Ready for closing!\n";
|
||||
self::processVotes($contest);
|
||||
DB::query('UPDATE contests SET status = 3 WHERE id = :id', [':id' => $contest['id']]);
|
||||
DB::query('UPDATE photos SET contest_id = 0, on_contest = 0 WHERE contest_id = :id', [':id' => $contest['id']]);
|
||||
echo "[{$contest['id']}] Closed.\n";
|
||||
if (NGALLERY['root']['contests']['autonew']['enabled'] === true) {
|
||||
echo "Creating new contest...";
|
||||
$theme = DB::query('SELECT * FROM contests_themes WHERE status=1 ORDER BY RAND() LIMIT 1')[0];
|
||||
if (count($theme) <= 0) {
|
||||
echo "Not found themes for autocreating Contest. Skip...\n";
|
||||
return;
|
||||
}
|
||||
$time = time();
|
||||
if (NGALLERY['root']['contests']['autonew']['pretendsopen'] === 'now') {
|
||||
if (NGALLERY['root']['contests']['autonew']['times']['pretendsopen'] === 'now') {
|
||||
$pretendsopen = $time;
|
||||
$status = 1;
|
||||
} else {
|
||||
$pretendsopen = Date::addTime(NGALLERY['root']['contests']['autonew']['pretendsopen']);
|
||||
$status = 0;
|
||||
$pretendsopen = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['pretendsopen']);
|
||||
}
|
||||
|
||||
$pretendsclose = Date::addTime(NGALLERY['root']['contests']['autonew']['pretendsclose']);
|
||||
if (NGALLERY['root']['contests']['autonew']['open'] === 'now') {
|
||||
$pretendsclose = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['pretendsclose']);
|
||||
if (NGALLERY['root']['contests']['autonew']['times']['open'] === 'now') {
|
||||
$contestopen = $pretendsclose;
|
||||
} else {
|
||||
$contestopen = Date::addTime(NGALLERY['root']['contests']['autonew']['open']);
|
||||
$contestopen = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['open']);
|
||||
}
|
||||
$contestclose = Date::addTime(NGALLERY['root']['contests']['autonew']['close']);
|
||||
DB::query('INSERT INTO contests VALUES (\'0\', :themeid, :openprdate, :closeprdate, :opendate, :closedate, 0)', array(':themeid'=>$theme['id'], ':openprdate'=>$pretendsopen, ':closeprdate'=>$pretendsclose, ':opendate'=>$contestopen, ':closedate'=>$contestclose));
|
||||
$contestclose = Date::addTime(NGALLERY['root']['contests']['autonew']['times']['close']);
|
||||
DB::query('INSERT INTO contests VALUES (\'0\', :themeid, :openprdate, :closeprdate, :opendate, :closedate, :status)', array(':themeid'=>$theme['id'], ':openprdate'=>$pretendsopen, ':closeprdate'=>$pretendsclose, ':opendate'=>$contestopen, ':closedate'=>$contestclose, ':status'=>$status));
|
||||
echo "Contest created! Continue...";
|
||||
}
|
||||
}
|
||||
|
@ -107,7 +135,7 @@ class ExecContests
|
|||
{
|
||||
$votes = DB::query(
|
||||
'SELECT user_id, photo_id, COUNT(*) AS vote_count
|
||||
FROM photos_rates_contest WHERE contest_id = :id
|
||||
FROM contests_rates WHERE contest_id = :id
|
||||
GROUP BY user_id ORDER BY vote_count DESC LIMIT 3',
|
||||
[':id' => $contest['id']]
|
||||
);
|
||||
|
@ -123,20 +151,25 @@ class ExecContests
|
|||
{
|
||||
$photo = DB::query('SELECT * FROM photos WHERE id = :id', [':id' => $vote['photo_id']])[0];
|
||||
$photoData = json_decode($photo['content'], true);
|
||||
|
||||
|
||||
if (!isset($photoData['contests']) || !is_array($photoData['contests'])) {
|
||||
$photoData['contests'] = [];
|
||||
}
|
||||
|
||||
$theme = DB::query('SELECT title FROM contests_themes WHERE id = :id', [':id' => $contest['themeid']])[0]['title'];
|
||||
|
||||
$photoData['contests'] = [
|
||||
|
||||
$photoData['contests'][] = [
|
||||
'id' => $contest['id'],
|
||||
'contesttheme' => $theme,
|
||||
'votenum' => $vote['vote_count'],
|
||||
'place' => $place
|
||||
];
|
||||
|
||||
|
||||
DB::query('UPDATE photos SET content = :content, on_contest=0, contest_id=0 WHERE id = :id', [
|
||||
':id' => $vote['photo_id'],
|
||||
':content' => json_encode($photoData)
|
||||
':content' => json_encode($photoData, JSON_UNESCAPED_UNICODE)
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
private static function isAnotherContestInStatus(int $status): bool
|
||||
|
|
|
@ -69,7 +69,9 @@ class Routes
|
|||
Router::post('/api/photo/comment/$id/edit', 'ApiController@photocommentedit');
|
||||
Router::post('/api/photo/comment/$id/delete', 'ApiController@photocommentdelete');
|
||||
Router::post('/api/photo/comment/$id/pin', 'ApiController@photocommentpin');
|
||||
Router::post('/api/photo/contests/sendpretend', 'ApiController@sendpretendphoto()');
|
||||
Router::post('/api/photo/contests/sendpretend', 'ApiController@sendpretendphoto');
|
||||
Router::get('/api/photo/contests/rate', 'ApiController@photovotecontest');
|
||||
Router::get('/api/contests/getinfo', 'ApiController@contestsgetinfo');
|
||||
Router::get('/api/vehicles/load', 'ApiController@vehiclesload');
|
||||
Router::get('/api/geodb/search', 'ApiController@geodbsearch');
|
||||
if ($user->i('admin') > 0) {
|
||||
|
|
BIN
static/img/star_people.png
Normal file
BIN
static/img/star_people.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 528 B |
BIN
static/img/vs1.png
Normal file
BIN
static/img/vs1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 542 B |
BIN
static/img/vs2.png
Normal file
BIN
static/img/vs2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 494 B |
BIN
static/img/vs3.png
Normal file
BIN
static/img/vs3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 544 B |
|
@ -60,6 +60,8 @@ if (!$task->isTaskExists("ExecContests", "php ".$_SERVER['DOCUMENT_ROOT'].$task-
|
|||
$status = 'Ещё не проведён';
|
||||
} else if ($t['status'] === 1) {
|
||||
$status = 'Отбор кандидатов';
|
||||
} else if ($t['status'] === 02) {
|
||||
$status = 'Ещё не открыт для отбора победителей';
|
||||
} else if ($t['status'] === 2) {
|
||||
$status = 'Отбор победителей';
|
||||
} else if ($t['status'] === 3) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
use \App\Services\{Auth, DB, Date};
|
||||
use \App\Models\User;
|
||||
use \App\Models\{User};
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
|
@ -20,7 +20,7 @@ use \App\Models\User;
|
|||
<?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/Navbar.php'); ?>
|
||||
<script>
|
||||
|
||||
var kid = 2119;
|
||||
var kid = <?=DB::query('SELECT id FROM contests WHERE status=2')[0]['id']?>;
|
||||
var tipTimeout = null;
|
||||
|
||||
|
||||
|
@ -42,7 +42,7 @@ $(document).ready(function()
|
|||
var savedClass = $(this).attr('class');
|
||||
$(this).addClass('loading');
|
||||
|
||||
$.getJSON('/api.php', { action: 'vote-contest', kid: kid, pid: pid }, function (data)
|
||||
$.getJSON('/api/photo/contests/rate', { action: 'vote-contest', kid: kid, pid: pid }, function (data)
|
||||
{
|
||||
if (data[0])
|
||||
{
|
||||
|
@ -93,190 +93,44 @@ $(document).ready(function()
|
|||
<div style="margin-top:20px">Чтобы проголосовать, отметьте одну, две или три фотографии, которые Вам понравились</div><br><br>
|
||||
<?php
|
||||
if (DB::query('SELECT status FROM contests WHERE status=2')[0]['status'] != 2) {
|
||||
$contest = DB::query('SELECT * FROM contests WHERE status=0')[0];
|
||||
$contest = DB::query('SELECT * FROM contests WHERE status=1')[0];
|
||||
echo '<div class="p20">
|
||||
<h4>Сейчас конкурс не проводится. Пожалуйста, заходите позже.</h4>
|
||||
</div>
|
||||
</div>
|
||||
<script>startCountdown(' . $contest['openpretendsdate'] . ');</script>
|
||||
<h2>Следующий Фотоконкурс будет через:</h2>
|
||||
<h1 id="countdown"></h1>';
|
||||
} else { ?>
|
||||
<div id="tip" lock="0"><span id="img"></span></div>
|
||||
<?php
|
||||
$photos_contest = DB::query('SELECT * FROM photos WHERE on_contest=1');
|
||||
$contest = DB::query('SELECT * FROM contests WHERE status=2')[0];
|
||||
$photos_contest = DB::query('SELECT * FROM photos WHERE on_contest=2 AND contest_id=:id', array(':id'=>$contest['id']));
|
||||
foreach ($photos_contest as $pc) {
|
||||
echo '<img pid="2068176" src="/photo/20/68/17/2068176.jpg" style="display:none">
|
||||
$class = '';
|
||||
if ((int)DB::query('SELECT photo_id FROM contests_rates WHERE photo_id=:pid AND user_id=:uid AND contest_id=:cid', array(':uid' => Auth::userid(), ':pid' => $pc['id'], ':cid' => $contest['id']))[0]['photo_id'] === (int)$pc['id']) {
|
||||
$class = ' voted';
|
||||
}
|
||||
echo '<img pid="'.$pc['id'].'" src="'.$pc['photourl'].'" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2068176" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2068176"><a href="/photo/2068176/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/68/17/2068176_s.jpg" alt="630 КБ">
|
||||
<td><a href="#" pid="'.$pc['id'].'" class="contestBtn'.$class.'"></a></td>
|
||||
<td class="pb_photo" id="p2068176"><a href="/photo/'.$pc['id'].'/" target="_blank" class="prw"><img class="f" src="/api/photo/compress?url='.$pc['photourl'].'" data-src="/api/photo/compress?url='.$pc['photourl'].'" alt="630 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="com-icon">2</div>
|
||||
<div class="eye-icon">182</div>
|
||||
<div class="eye-icon">'.DB::query('SELECT COUNT(*) FROM photos_views WHERE photo_id=:id', array(':id'=>$p['id']))[0]['COUNT(*)'].'</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><span class="sec"><span class="nf"><a href="/city/237/" target="_blank">Гота</a></span>, Schindler/Siemens Be 4/8 <span class="nw">№ <span class="nf"><a href="/vehicle/97221/#n586477" target="_blank">222</a></span></span> — маршрут <a href="/search.php?cid=237&type=1&route=4" class="route">4</a></span></span><br><a href="/city/237/" target="_blank">Гота</a> — <a href="/articles/166/" target="_blank">Разные фотографии</a></p>
|
||||
<p><b class="pw-place">Boxberg <img src="/img/place_arrow.gif" alt="/" width="15" height="11" style="position:relative; top:-1px; margin:0 3px"> Leina</b><br><br><span class="pw-descr">Настоящий немецкий Сайлент Хилл!<br />
|
||||
<br />
|
||||
Echtes deutsches Silent Hill!</span></p>
|
||||
<p class="sm"><b>26 декабря 2024 г., четверг</b><br>Автор: <a href="/author/24525/">KIA-Trainz</a></p>
|
||||
</td>
|
||||
<p>'.htmlspecialchars($pc['postbody']).'</p>
|
||||
<p><b class="pw-place">'.htmlspecialchars($pc['place']).'</b></p>
|
||||
<p class="sm"><b>'.Date::zmdate($pc['posted_at']).'</b><br>Автор: <a href="/author/'.$pc['user_id'].'/">'.$user->i('username').'</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>';
|
||||
}
|
||||
?>
|
||||
<img pid="2073198" src="/photo/20/73/19/2073198.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2073198" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2073198"><a href="/photo/2073198/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/73/19/2073198_s.jpg" alt="526 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="eye-icon">246</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><span class="sec"><span class="nf"><a href="/city/2/" target="_blank">Санкт-Петербург</a></span>, <span class="s5"> ЛВС-86К <span class="nw">№ <span class="nf"><a href="/vehicle/4653/#n4758" target="_blank">8200</a></span></span> </span> — маршрут <a href="/search.php?cid=2&type=1&route=52" class="route">52</a></span></span><br><a href="/city/2/" target="_blank">Санкт-Петербург</a> — <a href="/articles/1129/" target="_blank">Трамвайные линии и инфраструктура</a></p>
|
||||
<p><b class="pw-place">Проспект Маршала Жукова</b></p>
|
||||
<p class="sm"><b>18 ноября 2023 г., суббота</b><br>Автор: <a href="/author/19181/">Матвей Батуро</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="2069925" src="/photo/20/69/92/2069925.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2069925" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2069925"><a href="/photo/2069925/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/69/92/2069925_s.jpg" alt="797 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="com-icon">5</div>
|
||||
<div class="eye-icon">251</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><span class="sec"><span class="nf"><a href="/city/2/" target="_blank">Санкт-Петербург</a></span>, 71-931М «Витязь-М» <span class="nw">№ <span class="nf"><a href="/vehicle/562421/#n745611" target="_blank">7903</a></span></span> — перегонка</span></span><br><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, ПР (18М) <span class="nw">№ <b><a href="/vehicle/5073/#n5182" target="_blank">С-7116</a></b></span> — перегонка</span></p>
|
||||
<p><b class="pw-place">Улица Куйбышева</b></p>
|
||||
<p class="sm"><b>18 января 2025 г., суббота</b><br>Автор: <a href="/author/36016/">bo1ng10</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="2070488" src="/photo/20/70/48/2070488.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2070488" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2070488"><a href="/photo/2070488/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/70/48/2070488_s.jpg" alt="656 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="com-icon">5</div>
|
||||
<div class="eye-icon">328</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, <span class="s5"> 71-134А (ЛМ-99АВ) <span class="nw">№ <b><a href="/vehicle/5784/#n5890" target="_blank">8318</a></b></span> </span> — маршрут <b><a href="/search.php?cid=2&type=1&route=41" class="route">41</a></b></span></p>
|
||||
<p><b class="pw-place">Садовая улица</b></p>
|
||||
<p class="sm"><b>31 января 2025 г., пятница</b><br>Автор: <a href="/author/31083/">Yastrebov Nikolay</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="1456406" src="/photo/14/56/40/1456406.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="1456406" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p1456406"><a href="/photo/1456406/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/14/56/40/1456406_s.jpg" alt="481 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="com-icon">1</div>
|
||||
<div class="eye-icon">582</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><span class="sec"><span class="nf"><a href="/city/101/" target="_blank">Харьков</a></span>, T3-ВПСт <span class="nw">№ <span class="nf"><a href="/vehicle/452625/#n558420" target="_blank">3011</a></span></span> — маршрут <a href="/search.php?cid=101&type=1&route=3" class="route">3</a>, СМЕ 3011+3012</span></span><br><span style="word-spacing:-1px"><span class="sec"><span class="nf"><a href="/city/101/" target="_blank">Харьков</a></span>, T3-ВПСт <span class="nw">№ <span class="nf"><a href="/vehicle/452626/#n558421" target="_blank">3012</a></span></span> — маршрут <a href="/search.php?cid=101&type=1&route=3" class="route">3</a>, СМЕ 3011+3012</span></span><br><a href="/city/101/" target="_blank">Харьков</a> — <a href="/articles/5380/" target="_blank">Трамвайные линии</a></p>
|
||||
<p><b class="pw-place">Сергіївський майдан <img src="/img/place_arrow.gif" alt="/" width="15" height="11" style="position:relative; top:-1px; margin:0 3px"> Павлівська площа</b> | Сергиевская площадь <img src="/img/place_arrow.gif" alt="/" width="15" height="11" style="position:relative; top:-1px; margin:0 3px"> Павловская площадь</p>
|
||||
<p class="sm"><b>6 марта 2021 г., суббота</b><br>Автор: <a href="/author/21015/">Moon_Expedition</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="2074014" src="/photo/20/74/01/2074014.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2074014" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2074014"><a href="/photo/2074014/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/74/01/2074014_s.jpg" alt="555 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="com-icon">16</div>
|
||||
<div class="eye-icon">1286</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, ЛВС-86К <span class="nw">№ <b><a href="/vehicle/135069/#n130294" target="_blank">5117</a></b></span> — маршрут <b><a href="/search.php?cid=2&type=1&route=19" class="route">19</a></b></span><br><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, 71-638-02 «Поларис» <span class="nw">№ <b><a href="/vehicle/604225/#n803377" target="_blank">5810</a></b></span></span></p>
|
||||
<p><b class="pw-place">К/ст "Лахтинский разлив"</b></p>
|
||||
<p class="sm"><b>10 февраля 2025 г., понедельник</b><br>Автор: <a href="/author/26699/">Qwerty_qwertovich</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="2072063" src="/photo/20/72/06/2072063.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2072063" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2072063"><a href="/photo/2072063/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/72/06/2072063_s.jpg" alt="674 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="eye-icon">224</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, <span class="s3"> 81-717 (ЛВЗ) <span class="nw">№ <b><a href="/vehicle/258072/#n614988" target="_blank">8451</a></b></span> </span></span></p>
|
||||
<p><b class="pw-place">Электродепо "Московское" (ТЧ-3)</b><br><br><span class="pw-descr">Маневровые передвижения</span></p>
|
||||
<p class="sm"><b>7 февраля 2025 г., пятница</b><br>Автор: <a href="/author/20006/">frunzenecc</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="2068816" src="/photo/20/68/81/2068816.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2068816" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2068816"><a href="/photo/2068816/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/68/81/2068816_s.jpg" alt="675 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="com-icon">3</div>
|
||||
<div class="eye-icon">322</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><b><a href="/city/89/" target="_blank">Брест</a></b>, МАЗ-ЭТОН Т103 <span class="nw">№ <b><a href="/vehicle/54899/#n53610" target="_blank">118</a></b></span> — маршрут <b><a href="/search.php?cid=89&type=2&route=102" class="route">102</a></b></span></p>
|
||||
<p><b class="pw-place">Вуліца Гаўрылава</b> | Улица Гаврилова</p>
|
||||
<p class="sm"><b>29 января 2025 г., среда</b><br>Автор: <a href="/author/28158/">Ivan Tkachenko</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<img pid="2060153" src="/photo/20/60/15/2060153.jpg" style="display:none">
|
||||
<div class="p20p">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a href="#" pid="2060153" class="contestBtn"></a></td>
|
||||
<td class="pb_photo" id="p2060153"><a href="/photo/2060153/" target="_blank" class="prw"><img class="f" src="/img/prw-loader.gif" data-src="/photo/20/60/15/2060153_s.jpg" alt="486 КБ">
|
||||
<div class="hpshade">
|
||||
<div class="eye-icon">204</div>
|
||||
</div>
|
||||
</a></td>
|
||||
<td class="pb_descr">
|
||||
<p><span style="word-spacing:-1px"><span class="sec"><span class="nf"><a href="/city/35/" target="_blank">Рига</a></span>, Tatra T3MR (T6B5-R) <span class="nw">№ <span class="nf"><a href="/vehicle/53599/#n101864" target="_blank">35098</a></span></span> — 35098+35108</span></span><br><a href="/city/35/" target="_blank">Рига</a> — <a href="/articles/7271/" target="_blank">Мосты</a></p>
|
||||
<p><b class="pw-place">Slokas iela</b> | Улица Слокас</p>
|
||||
<p class="sm"><b>28 октября 2024 г., понедельник</b><br>Автор: <a href="/author/18598/">Tučňák</a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<br>Число проголосовавших: <b>3</b><br>Число голосов: <b>6</b><br><br>
|
||||
|
||||
</center>
|
||||
|
|
|
@ -31,7 +31,13 @@ use \App\Models\{User, VoteContest};
|
|||
<?php
|
||||
if (DB::query('SELECT status FROM contests WHERE status=1')[0]['status'] === 1) {
|
||||
$contest = DB::query('SELECT * FROM contests WHERE status=1')[0];
|
||||
$photos_contest = DB::query('SELECT * FROM photos WHERE on_contest=1');
|
||||
$photos_contest = DB::query('SELECT p.*, COUNT(prc.photo_id) AS rates_count
|
||||
FROM photos p
|
||||
LEFT JOIN photos_rates_contest prc ON p.id = prc.photo_id
|
||||
WHERE p.on_contest = 1 AND p.contest_id = :id
|
||||
GROUP BY p.id
|
||||
ORDER BY rates_count DESC;
|
||||
', array(':id'=>$contest['id']));
|
||||
foreach ($photos_contest as $pc) {
|
||||
$user = new User($pc['user_id']);
|
||||
echo '<div class="p20p">
|
||||
|
@ -44,7 +50,7 @@ use \App\Models\{User, VoteContest};
|
|||
<tbody>
|
||||
<tr>
|
||||
<td style="width:20px"><img class="loader" pid="2072294" src="/img/loader.gif"></td>
|
||||
<td align="center" style="padding:2px"><b class="s_rating" pid="2072294">'.VoteContest::count($pc['id'], $contest['id']).'</b></td>
|
||||
<td align="center" style="padding:2px"><b class="s_rating" pid="'.$pc['id'].'">'.VoteContest::count($pc['id'], $contest['id']).'</b></td>
|
||||
<td style="width:20px; display:table-cell" class="star" pid="2072294"><img src="/img/star_people.png" alt=""></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
|
|
@ -134,20 +134,62 @@ LIMIT 10;');
|
|||
$contest = DB::query('SELECT * FROM contests WHERE status=2')[0];
|
||||
$theme = DB::query('SELECT * FROM contests_themes WHERE id=:id', array(':id' => $contest['themeid']))[0];
|
||||
echo ' <div id="contestNotify" style="float:left; border:solid 1px #171022; padding:6px 10px 7px; margin-bottom:13px; background-color:#E5D6FF"><h4>Фотоконкурс!</h4>
|
||||
Закончится через: <b id="countdown"></b><br>
|
||||
<span id="timett">Закончится через:</span> <b id="countdown"></b><br>
|
||||
Тематика: <b>' . $theme['title'] . '</b><br>
|
||||
<b style="color: #412378;">Голосуйте за лучшие фотографии, которые должны стать победителями сегодняшнего конкурса!</b><br><br>
|
||||
<a href="/voting" style="background-color: #37009D; color: #fff;" type="button">Голосовать!</a>
|
||||
<div id="contestBtns"><a href="/voting" style="background-color: #37009D; color: #fff;" type="button">Голосовать!</a></div>
|
||||
<script>startCountdown(' . $contest['closedate'] . ');</script>';
|
||||
} else if (DB::query('SELECT status FROM contests WHERE status=1')[0]['status'] === 1) {
|
||||
$contest = DB::query('SELECT * FROM contests WHERE status=1')[0];
|
||||
$theme = DB::query('SELECT * FROM contests_themes WHERE id=:id', array(':id' => $contest['themeid']))[0];
|
||||
echo ' <div id="contestNotify" style="float:left; border:solid 1px #171022; padding:6px 10px 7px; margin-bottom:13px; background-color:#E5D6FF"><h4>Фотоконкурс!</h4>
|
||||
Начнётся через: <b id="countdown"></b><br>
|
||||
<span id="timett">Начнётся через:</span> <b id="countdown"></b><br>
|
||||
Тематика: <b>' . $theme['title'] . '</b><br>
|
||||
<b style="color: #412378;">Лучшие фотографии по мнению сообщества ' . NGALLERY['root']['title'] . ' будут отмечены</b><br><br>
|
||||
<a href="/voting/sendpretend" style="background-color: #37009D; color: #fff;" type="button">Участвовать!</a> <a href="/voting/waiting" style="background-color: #37009D; color: #fff;" type="button">Голосовать за претендентов</a>
|
||||
<script>startCountdown(' . $contest['closepretendsdate'] . ');</script>';
|
||||
<b id="textContest" style="color: #412378;">Лучшие фотографии по мнению сообщества ' . NGALLERY['root']['title'] . ' будут отмечены</b><br><br>
|
||||
<div id="contestBtns"><a href="/voting/sendpretend" style="background-color: #37009D; color: #fff;" type="button">Участвовать!</a> <a href="/voting/waiting" style="background-color: #37009D; color: #fff;" type="button">Голосовать за претендентов</a></div>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
let unixThreshold = '.$contest['closepretendsdate'].'; // Задайте нужное значение UNIX
|
||||
let checkInterval = 1000; // Интервал проверки в миллисекундах (1 секунда)
|
||||
let isRequestSent = false;
|
||||
|
||||
function checkUnixTime() {
|
||||
let currentUnixTime = Math.floor(Date.now() / 1000);
|
||||
|
||||
if (currentUnixTime > unixThreshold) {
|
||||
$("#countdown").text("Ожидаем ответ от сервера...");
|
||||
|
||||
$.ajax({
|
||||
url: "/api/contests/getinfo", // Укажите свой URL
|
||||
method: "GET",
|
||||
success: function (response) {
|
||||
|
||||
let data = typeof response === "string" ? JSON.parse(response) : response;
|
||||
if (data.statuses.pretends === "closed" && data.statuses.public === "opened") {
|
||||
clearInterval(pingInterval); // Останавливаем старый пинг
|
||||
$("#textContest").text("Голосуйте за лучшие фотографии, которые должны стать победителями сегодняшнего конкурса!");
|
||||
$("#timett").text("Закончится через:");
|
||||
$("#contestBtns").html(`<a href="/voting" style="background-color: #37009D; color: #fff;" type="button">Голосовать!</a>`)
|
||||
unixThreshold = data.contest.closedate;
|
||||
startCountdown(data.contest.closedate);
|
||||
pingInterval = setInterval(checkUnixTime, checkInterval);
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
console.error("Ошибка запроса:", error);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log(currentUnixTime);
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем периодический пинг
|
||||
let pingInterval = setInterval(checkUnixTime, checkInterval);
|
||||
});
|
||||
|
||||
|
||||
</script>';
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -125,6 +125,25 @@ if ($photo->i('id') !== null) {
|
|||
<img onerror="errimg(); this.onerror = null;" id="ph" src="<?= $photo->i('photourl') ?>" alt="" title="Фотография">
|
||||
<?php
|
||||
}
|
||||
if ($photo->i('on_contest') === 2) { ?>
|
||||
<a class="underphoto" href="/voting"><img style="margin-top:-4px" src="/static/img/star_people.png"> Фотография участвует в голосовании</a>
|
||||
|
||||
<?php }
|
||||
|
||||
foreach ($photo->content('contests') as $c) {
|
||||
if ($c['place'] === 1) {
|
||||
$img = '3';
|
||||
}
|
||||
if ($c['place'] === 2) {
|
||||
$img = '2';
|
||||
}
|
||||
if ($c['place'] === 3) {
|
||||
$img = '1';
|
||||
}
|
||||
echo '<a class="underphoto" style="font-weight:bold" href="/pk.php?pid=2068816&type=d"><img style="margin-top:-4px" src="/static/img/vs'.$img.'.png"> '.$c['place'].'-е место на фотоконкурсе</a>';
|
||||
}
|
||||
|
||||
|
||||
if ($photo->i('priority') === 1) { ?>
|
||||
<div class="underphoto s17" style="cursor:help" title="Фотография не удовлетворяет действующим на момент публикации критериям качества снимков."><i style="position:relative; top:1px" class="fas fa-info-circle"></i> <b class="dot">Условная публикация</b></div>
|
||||
<?php } else if ($photo->i('priority') === 2) { ?>
|
||||
|
@ -259,14 +278,14 @@ if ($photo->i('id') !== null) {
|
|||
echo 'voted';
|
||||
} ?>"><span>Мне не нравится</span></a>
|
||||
<?php
|
||||
if ($photo->content('video') === null && $photo->i('user_id') != Auth::userid()) { ?>
|
||||
if (($photo->content('video') === null && $photo->i('user_id') != Auth::userid()) || $photo->i('on_contest') != 2) { ?>
|
||||
<a class="konk_btn <?php if (Vote::photoContest(Auth::userid(), $id) === 1) {
|
||||
echo 'voted';
|
||||
} ?>" vote="1" href="#"><span>Красиво, на конкурс!</span></a>
|
||||
<a href="#" vote="0" class="konk_btn <?php if (Vote::photoContest(Auth::userid(), $id) === 0) {
|
||||
echo 'voted';
|
||||
} ?>"><span>Неконкурсное фото</span></a>
|
||||
<?php } else if ($photo->i('user_id') === Auth::userid()) { ?>
|
||||
<?php } else if ($photo->i('user_id') === Auth::userid() && $photo->i('on_contest') != 2) { ?>
|
||||
|
||||
<a href="#" vote="1" class="konk_btn"><span>Выставить на конкурс</span></a><a href="#" vote="0" class="konk_btn"><span>Не участвовать в конкурсе</span></a></div>
|
||||
<?php } ?>
|
||||
|
|
Loading…
Reference in a new issue