Compare commits

..

6 commits

Author SHA1 Message Date
themohooks
cfab1d2e96 update admin pages 2025-02-18 00:28:37 +03:00
themohooks
118968739c update contests 2025-02-18 00:08:13 +03:00
themohooks
04373e197c update contest pages 2025-02-17 23:10:16 +03:00
themohooks
847ebb32be Update VotingWaiting.php 2025-02-17 22:33:04 +03:00
themohooks
0275ff30c6 update send pretend 2025-02-17 22:19:26 +03:00
themohooks
b41ec07317 contests 2025-02-17 22:10:46 +03:00
22 changed files with 348 additions and 307 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

@ -12,12 +12,14 @@ class SendPretend
{
public function __construct()
{
DB::query('UPDATE photos SET on_contest=1, contest_id=:id WHERE id=:idd', array(':id'=>$_POST['cid'], ':idd'=>$_POST['photo_id']));
echo json_encode(
array(
'errorcode' => 0,
'error' => 0
)
);
if (DB::query('SELECT contest_id FROM photos WHERE user_id=:uid', array(':uid' => Auth::userid()))[0]['contest_id'] != $_POST['cid']) {
DB::query('UPDATE photos SET on_contest=1, contest_id=:id WHERE id=:idd', array(':id' => $_POST['cid'], ':idd' => $_POST['photo_id']));
echo json_encode(
array(
'errorcode' => 0,
'error' => 0
)
);
}
}
}

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,8 +135,8 @@ class ExecContests
{
$votes = DB::query(
'SELECT user_id, photo_id, COUNT(*) AS vote_count
FROM photos_rates_contest WHERE contest_id = :id
GROUP BY user_id ORDER BY vote_count DESC LIMIT 3',
FROM contests_rates WHERE contest_id = :id
GROUP BY user_id ORDER BY vote_count DESC LIMIT 10',
[':id' => $contest['id']]
);
@ -124,19 +152,27 @@ 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('INSERT INTO contests_winners VALUES (\'0\', :photo_id, :place, :contest_id, :date)', array(':photo_id'=>$vote['photo_id'], ':place'=>$place, ':contest_id'=>$contest['id'], ':date'=>time()));
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

@ -84,10 +84,10 @@ body {
<i class="bx bx-world nav__icon"></i>
<span class="nav__name">GeoDB<span class="badge text-bg-warning">BETA</span></span>
</a>
<a href="/admin?type=Pages" class="nav__link">
<!--a href="/admin?type=Pages" class="nav__link">
<i class="bx bx-file-blank nav__icon"></i>
<span class="nav__name">Страницы</span>
</a>
</!--a-->
<a href="/admin?type=Settings" class="nav__link">
<i class="bx bx-cog nav__icon"></i>
<span class="nav__name">Настройки<span class="badge text-bg-warning">BETA</span></span>

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

@ -39,10 +39,10 @@ use \App\Models\User;
<div class="v-header__tabs">
<div class="v-tabs">
<div class="v-tabs__scroll">
<div class="v-tabs__content"><a href="#" onclick="changeTab('full')" id="full" class="v-tab v-tab-b v-tab--active"><span class="v-tab__label">
<div class="v-tabs__content"><!--a href="#" onclick="changeTab('full')" id="full" class="v-tab v-tab-b"><span class="v-tab__label">
Полный список
</span></a><a href="#" onclick="changeTab('moderate')" id="moderate" class="v-tab v-tab-b"><span class="v-tab__label">
</span></!--a--><a href="#" onclick="changeTab('moderate')" id="moderate" class="v-tab v-tab-b v-tab--active"><span class="v-tab__label">
Ожидают модерации
</span></a>
@ -54,7 +54,7 @@ use \App\Models\User;
</div>
<script src="/js/diff.js"></script>
<script src="/js/pwrite-compare.js"></script>
<div style="display: none;" id="moderate__block">
<div id="moderate__block"class="active__block" >
<div class="p20w" style="display:block">
<table class="table">
<tbody>
@ -219,7 +219,7 @@ use \App\Models\User;
</tbody>
</table>
</div></div>
<div style="display: none;" class="active__block" id="full__block">
<div style="display: none;" id="full__block">
fgdfg
</div>

View file

@ -86,10 +86,10 @@ function renderInputs($data, $prefix = '')
<div class="v-header__tabs">
<div class="v-tabs">
<div class="v-tabs__scroll">
<div class="v-tabs__content"><a href="#" onclick="changeTab('config')" id="config" class="v-tab v-tab-b v-tab--active"><span class="v-tab__label">
<div class="v-tabs__content"><!--a href="#" onclick="changeTab('config')" id="config" class="v-tab v-tab-b v-tab--active"><span class="v-tab__label">
Конфиг сервера
</span></a><a href="#" onclick="changeTab('tasks')" id="tasks" class="v-tab v-tab-b"><span class="v-tab__label">
</span></!--a--><a href="#" onclick="changeTab('tasks')" id="tasks" class="v-tab v-tab-b v-tab--active"><span class="v-tab__label">
Задачи
</span></a>
@ -99,7 +99,7 @@ function renderInputs($data, $prefix = '')
</div>
</div>
</div>
<div class="active__block" id="config__block">
<div id="config__block" style="display: none;" >
<div class="alert alert-warning" role="alert">
Изменяйте только на свой страх и риск.
</div>
@ -118,7 +118,7 @@ function renderInputs($data, $prefix = '')
</div>
<div style="display: none;" id="tasks__block">
<div class="active__block"id="tasks__block">
<table class="table">
<tbody>
<tr>

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])
{
@ -89,11 +89,11 @@ $(document).ready(function()
<center>
<h1>Фотоконкурс</h1>
<p class="narrow" style="font-size:19px"><b>Голосование</b> &nbsp;&middot;&nbsp; <a href="results">Победители</a> &nbsp;&middot;&nbsp; <a href="/voting/rating">Рейтинг</a> &nbsp;&middot;&nbsp; <a href="/voting/waiting">Претенденты</a></p>
<p class="narrow" style="font-size:19px"><b>Голосование</b> &nbsp;&middot;&nbsp; <a href="/voting/results">Победители</a> &nbsp;&middot;&nbsp; <a href="/voting/rating">Рейтинг</a> &nbsp;&middot;&nbsp; <a href="/voting/waiting">Претенденты</a></p>
<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>
@ -103,181 +103,34 @@ $(document).ready(function()
} 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>
<br>Число проголосовавших: <b><?=DB::query('SELECT COUNT(DISTINCT user_id) AS unique_user_count FROM contests_rates WHERE contest_id=:id', array(':id'=>$contest['id']))[0]['unique_user_count']?></b><br>Число голосов: <b><?=DB::query('SELECT COUNT(*) FROM contests_rates WHERE contest_id=:id', array(':id'=>$contest['id']))[0]['COUNT(*)']?></b><br><br>
</center>

View file

@ -1,7 +1,7 @@
<?php
use \App\Services\{Auth, DB, Date};
use \App\Models\User;
use \App\Models\{User, Photo};
?>
<!DOCTYPE html>
@ -18,94 +18,57 @@ use \App\Models\User;
<div id="backgr"></div>
<table class="tmain">
<?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/Navbar.php'); ?>
<?php
?>
<tr>
<td class="main">
<center>
<h1>Победители фотоконкурса</h1>
<p class="narrow" style="font-size:19px"><a href="/voting">Голосование</a> &nbsp;&middot;&nbsp; <b>Победители</b> &nbsp;&middot;&nbsp; <a href="/voting/rating">Рейтинг</a> &nbsp;&middot;&nbsp; <a href="/voting/waiting">Претенденты</a></p>
<div style="margin:20px">Для вывода подробного отчёта о конкурсе нажмите на интересующую вас дату.</div>
<div class="pages"><span class="pg">&laquo;&laquo;</span><span class="ps">1</span><a href="?show=results&amp;st=10" class="pg">2</a><a href="?show=results&amp;st=20" class="pg">3</a><a href="?show=results&amp;st=30" class="pg">4</a> &middot;&middot;&middot; <a href="?show=results&amp;st=2090" class="pg">210</a><a href="?show=results&amp;st=10" class="pg" id="NextLink">&raquo;&raquo;</a></div>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-02-04" title="Подробный отчёт о конкурсе">04.02.2025</a></b></span><br><span class="sm">Линии и пейзажи</span></p>
<table>
<tr>
<a href="/photo/2066028/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/66/02/2066028_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2065380/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/65/38/2065380_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2064449/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/64/44/2064449_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-02-03" title="Подробный отчёт о конкурсе">03.02.2025</a></b></span><br><span class="sm">Линии и пейзажи</span></p>
<table>
<tr>
<a href="/photo/1894111/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/18/94/11/1894111_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2063989/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/63/98/2063989_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2061805/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/61/80/2061805_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-02-02" title="Подробный отчёт о конкурсе">02.02.2025</a></b></span><br><span class="sm">Фотографии транспорта</span></p>
<table>
<tr>
<a href="/photo/2065272/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/65/27/2065272_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2064912/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/64/91/2064912_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2026071/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/26/07/2026071_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-02-01" title="Подробный отчёт о конкурсе">01.02.2025</a></b></span><br><span class="sm">Фотографии транспорта</span></p>
<table>
<tr>
<a href="/photo/2064843/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/64/84/2064843_s.jpg?1" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2065143/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/65/14/2065143_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2063982/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/63/98/2063982_s.jpg?1" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-01-31" title="Подробный отчёт о конкурсе">31.01.2025</a></b></span><br><b class="sm">Итоговое голосование</b></p>
<table>
<tr>
<a href="/photo/2042060/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/42/06/2042060_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs5.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-01-30" title="Подробный отчёт о конкурсе">30.01.2025</a></b></span><br><span class="sm">Линии и пейзажи</span></p>
<table>
<tr>
<a href="/photo/2058534/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/58/53/2058534_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2057575/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/57/57/2057575_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2058630/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/58/63/2058630_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-01-29" title="Подробный отчёт о конкурсе">29.01.2025</a></b></span><br><span class="sm">Фотографии транспорта</span></p>
<table>
<tr>
<a href="/photo/2064029/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/64/02/2064029_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2065381/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/65/38/2065381_s.jpg?1" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2065050/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/65/05/2065050_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2065800/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/65/80/2065800_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-01-28" title="Подробный отчёт о конкурсе">28.01.2025</a></b></span><br><span class="sm">Фотографии транспорта</span></p>
<table>
<tr>
<a href="/photo/2062445/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/62/44/2062445_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2048251/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/48/25/2048251_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2062446/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/62/44/2062446_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-01-26" title="Подробный отчёт о конкурсе">26.01.2025</a></b></span><br><span class="sm">Фотографии транспорта</span></p>
<table>
<tr>
<a href="/photo/2061877/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/61/87/2061877_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs3.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2047310/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/47/31/2047310_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2060964/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/60/96/2060964_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-01-25" title="Подробный отчёт о конкурсе">25.01.2025</a></b></span><br><span class="sm">Фотографии транспорта</span></p>
<table>
<tr>
<a href="/photo/2061294/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/61/29/2061294_s.jpg?2" class="f" style="margin-bottom:7px"><br><img src="/img/vs4.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2061425/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/61/42/2061425_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs2.png" style="position:relative; top:-2px"> &nbsp;</a>
<a href="/photo/2048649/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="/img/prw-loader.gif" data-src="/photo/20/48/64/2048649_s.jpg" class="f" style="margin-bottom:7px"><br><img src="/img/vs1.png" style="position:relative; top:-2px"> &nbsp;</a>
</tr>
</table><br>
<div class="pages"><span class="pg">&laquo;&laquo;</span><span class="ps">1</span><a href="?show=results&amp;st=10" class="pg">2</a><a href="?show=results&amp;st=20" class="pg">3</a><a href="?show=results&amp;st=30" class="pg">4</a> &middot;&middot;&middot; <a href="?show=results&amp;st=2090" class="pg">210</a><a href="?show=results&amp;st=10" class="pg" id="NextLink">&raquo;&raquo;</a></div>
<p class="narrow" style="font-size:19px"><a href="/voting.php">Голосование</a> &nbsp;&middot;&nbsp; <b>Победители</b> &nbsp;&middot;&nbsp; <a href="?show=rating">Рейтинг</a> &nbsp;&middot;&nbsp; <a href="?show=waiting">Претенденты</a></p>
<?php
$photos = DB::query("SELECT * FROM contests_winners
WHERE place BETWEEN 1 AND 3
ORDER BY contest_id, place;
");
$grouped = [];
foreach ($photos as $row) {
$grouped[$row['contest_id']][] = $row;
}
$final_result = [];
foreach ($grouped as $contest_id => $rows) {
$chunks = array_chunk($rows, 3);
foreach ($chunks as $chunk) {
$final_result[] = $chunk;
}
}
foreach ($final_result as $fc) {
$themeid = DB::query('SELECT themeid FROM contests WHERE id=:id', array(':id'=>$fc[0]['contest_id']))[0]['themeid'];
$theme = DB::query('SELECT title FROM contests_themes WHERE id=:id', array(':id'=>$themeid))[0]['title'];
echo '<p><span class="narrow" style="font-size:21px"><b><a href="?show=table&amp;date=2025-02-04" title="Подробный отчёт о конкурсе">'.date('d.m.Y', $fc[0]['date']).'</a></b></span><br><span class="sm">'.$theme.'</span></p>
<table>
<tr>';
foreach ($fc as $f) {
$photo = new Photo($f['photo_id']);
if ($f['place'] === 1) {
$img = 'vs3';
} else if ($f['place'] === 2) {
$img = 'vs2';
} else if ($f['place'] === 3) {
$img = 'vs1';
}
echo '<a href="/photo/'.$f['photo_id'].'/" class="p20" style="display:table-cell; text-align:center; vertical-align:bottom; padding:20px 20px 10px; font-size:17px"><img src="'.$photo->i('photourl').'" class="f" style="margin-bottom:7px"><br><img src="/static/img/'.$img.'.png" style="position:relative; top:-2px"> &nbsp;</a>';
}
echo '
</tr>
</table><br>';
}
?>
<p class="narrow" style="font-size:19px"><a href="/voting">Голосование</a> &nbsp;&middot;&nbsp; <b>Победители</b> &nbsp;&middot;&nbsp; <a href="/voting/rating">Рейтинг</a> &nbsp;&middot;&nbsp; <a href="/voting/waiting">Претенденты</a></p>
</center>
</td>
</tr>

View file

@ -151,7 +151,9 @@ function convertUnixToRussianDateTime($unixTime)
data: $(this).serialize(),
success: function(response) {
var jsonData = JSON.parse(response);
if (jsonData.errorcode === 0) {
alert('Фотография успешно отправлена на претенденты на Фотоконкурс');
}
}
});

View file

@ -1,7 +1,7 @@
<?php
use \App\Services\{Auth, DB, Date};
use \App\Models\{User, VoteContest};
use \App\Models\{User, VoteContest, Vote};
?>
<!DOCTYPE html>
@ -31,25 +31,36 @@ 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']);
if (VoteContest::photo(Auth::userid(), $pc['id'], $contest['id']) === 1) {
$classp = 'voted';
} else if (VoteContest::photo(Auth::userid(), $pc['id'], $contest['id']) === 0) {
$classm = 'voted';
}
echo '<div class="p20p">
<table>
<tbody>
<tr>
<td class="pb_pre vote" style="padding-left:15px; padding-right:10px; display:table-cell" cid="'.$contest['id'].'" pid="'.$pc['id'].'">
<a href="#" vote="1" class="konk_btn"><span>Красиво, на&nbsp;конкурс!</span></a>
<a href="#" vote="1" class="konk_btn '.$classp.'"><span>Красиво, на&nbsp;конкурс!</span></a>
<table style="margin:5px 0 7px; width:100px">
<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>
</table>
<a href="#" vote="0" class="konk_btn"><span>Неконкурсное фото</span></a>
<a href="#" vote="0" class="konk_btn '.$classm.'"><span>Неконкурсное фото</span></a>
</td>
<td class="pb_photo" id="p2072294"><a href="/photo/'.$pc['id'].'" target="_blank" class="prw"><img class="f" src="/api/photo/compress?url='.$pc['photourl'].'" alt="597 КБ" style="display: inline;">
<div class="hpshade">
@ -76,7 +87,7 @@ use \App\Models\{User, VoteContest};
<br>
<p class="narrow" style="font-size:19px"><a href="/voting.php">Голосование</a> &nbsp;·&nbsp; <a href="?show=results">Победители</a> &nbsp;·&nbsp; <a href="?show=rating">Рейтинг</a> &nbsp;·&nbsp; <b>Претенденты</b></p>
<p class="narrow" style="font-size:19px"><a href="/voting">Голосование</a> &nbsp;·&nbsp; <a href="/voting/results">Победители</a> &nbsp;·&nbsp; <a href="/voting/rating">Рейтинг</a> &nbsp;·&nbsp; <b>Претенденты</b></p>
</center>
</td>
</tr>

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 } ?>

View file

@ -425,10 +425,10 @@ $(document).ready(function()
</div>
</td>
</tr>
<tr>
<!--tr>
<td class="lcol">Модель камеры:</td>
<td style="padding-bottom:17px"><input type="text" name="cammod" style="width:300px" value=""></td>
</tr>
</!--tr>
<tr>
<td class="lcol">Пользователь:</td>
<td>
@ -501,7 +501,7 @@ $(document).ready(function()
<tr>
<td></td>
<td><br><input type="submit" value="&nbsp; &nbsp; &nbsp; Искать &nbsp; &nbsp; &nbsp;"></td>
</tr>
</tr-->
</tbody></table>
</form>
</tbody>