This commit is contained in:
themohooks 2025-02-17 22:10:46 +03:00
parent e9655f6463
commit b41ec07317
15 changed files with 262 additions and 195 deletions

View 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,
]
));
}
}

View 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 . '"]';
}
}

View file

@ -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();
}
}

View file

@ -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

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

BIN
static/img/vs1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

BIN
static/img/vs2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 B

BIN
static/img/vs3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

View file

@ -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) {

View file

@ -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>, &nbsp;Schindler/Siemens Be 4/8 &nbsp;<span class="nw"> <span class="nf"><a href="/vehicle/97221/#n586477" target="_blank">222</a></span></span> &nbsp;&nbsp; маршрут <a href="/search.php?cid=237&amp;type=1&amp;route=4" class="route">4</a></span></span><br><a href="/city/237/" target="_blank">Гота</a> &mdash; <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">&nbsp;ЛВС-86К &nbsp;<span class="nw"> <span class="nf"><a href="/vehicle/4653/#n4758" target="_blank">8200</a></span></span>&nbsp;</span> &nbsp;&nbsp; маршрут <a href="/search.php?cid=2&amp;type=1&amp;route=52" class="route">52</a></span></span><br><a href="/city/2/" target="_blank">Санкт-Петербург</a> &mdash; <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>, &nbsp;71-931М «Витязь-М» &nbsp;<span class="nw"> <span class="nf"><a href="/vehicle/562421/#n745611" target="_blank">7903</a></span></span> &nbsp;&nbsp; перегонка</span></span><br><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, &nbsp;ПР (18М) &nbsp;<span class="nw"> <b><a href="/vehicle/5073/#n5182" target="_blank">С-7116</a></b></span> &nbsp;&nbsp; перегонка</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">&nbsp;71-134А (ЛМ-99АВ) &nbsp;<span class="nw"> <b><a href="/vehicle/5784/#n5890" target="_blank">8318</a></b></span>&nbsp;</span> &nbsp;&nbsp; маршрут <b><a href="/search.php?cid=2&amp;type=1&amp;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>, &nbsp;T3-ВПСт &nbsp;<span class="nw"> <span class="nf"><a href="/vehicle/452625/#n558420" target="_blank">3011</a></span></span> &nbsp;&nbsp; маршрут <a href="/search.php?cid=101&amp;type=1&amp;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>, &nbsp;T3-ВПСт &nbsp;<span class="nw"> <span class="nf"><a href="/vehicle/452626/#n558421" target="_blank">3012</a></span></span> &nbsp;&nbsp; маршрут <a href="/search.php?cid=101&amp;type=1&amp;route=3" class="route">3</a>, СМЕ 3011+3012</span></span><br><a href="/city/101/" target="_blank">Харьков</a> &mdash; <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>, &nbsp;ЛВС-86К &nbsp;<span class="nw"> <b><a href="/vehicle/135069/#n130294" target="_blank">5117</a></b></span> &nbsp;&nbsp; маршрут <b><a href="/search.php?cid=2&amp;type=1&amp;route=19" class="route">19</a></b></span><br><span style="word-spacing:-1px"><b><a href="/city/2/" target="_blank">Санкт-Петербург</a></b>, &nbsp;71-638-02 «Поларис» &nbsp;<span class="nw"> <b><a href="/vehicle/604225/#n803377" target="_blank">5810</a></b></span></span></p>
<p><b class="pw-place">К/ст &quot;Лахтинский разлив&quot;</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">&nbsp;81-717 (ЛВЗ) &nbsp;<span class="nw"> <b><a href="/vehicle/258072/#n614988" target="_blank">8451</a></b></span>&nbsp;</span></span></p>
<p><b class="pw-place">Электродепо &quot;Московское&quot; (ТЧ-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>, &nbsp;МАЗ-ЭТОН Т103 &nbsp;<span class="nw"> <b><a href="/vehicle/54899/#n53610" target="_blank">118</a></b></span> &nbsp;&nbsp; маршрут <b><a href="/search.php?cid=89&amp;type=2&amp;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>, &nbsp;Tatra T3MR (T6B5-R) &nbsp;<span class="nw"> <span class="nf"><a href="/vehicle/53599/#n101864" target="_blank">35098</a></span></span> &nbsp;&nbsp; 35098+35108</span></span><br><a href="/city/35/" target="_blank">Рига</a> &mdash; <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>

View file

@ -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>

View file

@ -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>';
}

View file

@ -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"> &nbsp;Фотография участвует в голосовании</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&amp;type=d"><img style="margin-top:-4px" src="/static/img/vs'.$img.'.png"> &nbsp;'.$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>&ensp;<b class="dot">Условная публикация</b></div>
<?php } else if ($photo->i('priority') === 2) { ?>
@ -259,14 +278,14 @@ if ($photo->i('id') !== null) {
echo 'voted';
} ?>"><span>Мне не&nbsp;нравится</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>Красиво, на&nbsp;конкурс!</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>Выставить на&nbsp;конкурс</span></a><a href="#" vote="0" class="konk_btn"><span>Не участвовать в&nbsp;конкурсе</span></a></div>
<?php } ?>