2018-03-08

This commit is contained in:
Visman 2018-03-08 18:00:02 +07:00
parent fd7188cdd0
commit a89b78391f
16 changed files with 680 additions and 34 deletions

View file

@ -82,6 +82,10 @@ class Routing
// юзеры
$r->add('GET', '/user/{id:[1-9]\d*}/{name}', 'Profile:view', 'User'); //????
}
// пометка разделов прочитанными
if (! $user->isGuest) {
$r->add('GET', '/forum/{id:\d+}/markread/{token}', 'Misc:markread', 'MarkRead');
}
// разделы
$r->add('GET', '/forum/{id:[1-9]\d*}/{name}[/{page:[1-9]\d*}]', 'Forum:view', 'Forum' );

View file

@ -0,0 +1,67 @@
<?php
namespace ForkBB\Models\Forum;
use ForkBB\Models\Action;
use ForkBB\Models\Forum\Model as Forum;
use ForkBB\Models\User\Model as User;
use RuntimeException;
class Markread extends Action
{
/**
* Пометка всех тем/разделов прочитанными
*
* @param Forum $forum
*
* @throws RuntimeException
*
* @return Forum
*/
public function markread(Forum $forum, User $user)
{
if ($user->isGuest) {
throw new RuntimeException('Expected user, not guest');
}
if (0 === $forum->id) {
$user->u_mark_all_read = time();
$this->c->users->update($user);
$vars = [
':uid' => $user->id,
];
$sql = 'DELETE FROM ::mark_of_topic WHERE uid=?i:uid';
$this->c->DB->exec($sql, $vars);
$sql = 'DELETE FROM ::mark_of_forum WHERE uid=?i:uid';
$this->c->DB->exec($sql, $vars);
} elseif ($forum->id > 0) {
$vars = [
':uid' => $user->id,
':fid' => $forum->id,
':mark' => time(),
];
$sql = 'DELETE FROM ::mark_of_topic
WHERE uid=?i:uid AND tid IN (
SELECT id
FROM ::topics
WHERE forum_id=?i:fid
)';
$this->c->DB->exec($sql, $vars);
if ($user->mf_mark_all_read) { // ????
$sql = 'UPDATE ::mark_of_forum
SET mf_mark_all_read=?i:mark
WHERE uid=?i:uid AND fid=?i:fid';
} else { // ????
$sql = 'INSERT INTO ::mark_of_forum (uid, fid, mf_mark_all_read)
VALUES (?i:uid, ?i:fid, ?i:mark)';
}
$this->c->DB->exec($sql, $vars);
} else {
throw new RuntimeException('The model does not have ID');
}
}
}

View file

@ -27,7 +27,7 @@ class Model extends DataModel
/**
* Статус возможности создания новой темы
*
*
* @return bool
*/
protected function getcanCreateTopic()
@ -39,6 +39,16 @@ class Model extends DataModel
|| $user->isModerator($this);
}
/**
* Статус возможности пометки всех тем прочтенными
*
* @return bool
*/
protected function getcanMarkRead()
{
return ! $this->c->user->isGuest; // ????
}
/**
* Получение массива подразделов
*
@ -78,7 +88,11 @@ class Model extends DataModel
*/
protected function getlink()
{
return $this->c->Router->link('Forum', ['id' => $this->id, 'name' => $this->forum_name]);
if (0 === $this->id) {
return $this->c->Router->link('Index');
} else {
return $this->c->Router->link('Forum', ['id' => $this->id, 'name' => $this->forum_name]);
}
}
/**
@ -97,7 +111,7 @@ class Model extends DataModel
/**
* Ссылка на создание новой темы
*
*
* @return string
*/
protected function getlinkCreateTopic()
@ -105,6 +119,19 @@ class Model extends DataModel
return $this->c->Router->link('NewTopic', ['id' => $this->id]);
}
/**
* Ссылка на пометку всех тем прочтенными
*
* @return string
*/
protected function getlinkMarkRead()
{
return $this->c->Router->link('MarkRead', [
'id' => $this->id,
'token' => $this->c->Csrf->create('MarkRead', ['id' => $this->id]),
]);
}
/**
* Получение массива модераторов
*

View file

@ -46,6 +46,13 @@ class Index extends Page
$this->online = $this->c->Online->calc($this)->info();
$this->categoryes = $ctgs;
if (! $this->user->isGuest) {
$this->linkMarkRead = $this->c->Router->link('MarkRead', [
'id' => 0,
'token' => $this->c->Csrf->create('MarkRead', ['id' => 0]),
]);
}
return $this;
}
}

39
app/Models/Pages/Misc.php Normal file
View file

@ -0,0 +1,39 @@
<?php
namespace ForkBB\Models\Pages;
use ForkBB\Models\Page;
class Misc extends Page
{
/**
* Пометка раздела прочитанным
*
* @param array $args
*
* @return Page
*/
public function markread(array $args)
{
$forum = $this->c->forums->loadTree($args['id']);
if (null === $forum) {
return $this->c->Message->message('Bad request');
}
if (! $this->c->Csrf->verify($args['token'], 'MarkRead', $args)) {
return $this->c->Redirect->url($forum->link)->message('Bad token');
}
$this->c->DB->beginTransaction();
$this->c->forums->markread($forum, $this->user); // ???? флуд интервал?
$this->c->DB->commit();
$this->c->Lang->load('misc');
$message = $forum->id ? 'Mark forum read redirect' : 'Mark read redirect';
return $this->c->Redirect->url($forum->link)->message($message);
}
}

View file

@ -8,20 +8,20 @@ class Redirect extends Page
{
/**
* Перенаправление на главную страницу форума
*
*
* @return Page
*/
public function toIndex()
{
return $this->page('Index')->message(\ForkBB\__('Redirecting to index'));
return $this->page('Index')->message('Redirecting to index');
}
/**
* Задает адрес перехода
*
*
* @param string $marker
* @param array $args
*
*
* @return Page
*/
public function page($marker, array $args = [])
@ -32,9 +32,9 @@ class Redirect extends Page
/**
* Задает ссылку для перехода
*
*
* @param string $url
*
*
* @return Page
*/
public function url($url)
@ -45,9 +45,9 @@ class Redirect extends Page
/**
* Задает сообщение
*
*
* @param string $message
*
*
* @return Page
*/
public function message($message)
@ -69,7 +69,7 @@ class Redirect extends Page
/**
* Возвращает HTTP заголовки страницы
* $this->httpHeaders
*
*
* @return array
*/
protected function getHttpHeaders()

View file

@ -135,6 +135,7 @@ return [
'Maintenance' => \ForkBB\Models\Pages\Maintenance::class,
'Ban' => \ForkBB\Models\Pages\Ban::class,
'Debug' => \ForkBB\Models\Pages\Debug::class,
'Misc' => \ForkBB\Models\Pages\Misc::class,
'AdminIndex' => \ForkBB\Models\Pages\Admin\Index::class,
'AdminStatistics' => \ForkBB\Models\Pages\Admin\Statistics::class,
'AdminOptions' => \ForkBB\Models\Pages\Admin\Options::class,
@ -193,6 +194,7 @@ return [
'ForumManagerLoadTree' => \ForkBB\Models\Forum\LoadTree::class,
'ForumManagerSave' => \ForkBB\Models\Forum\Save::class,
'ForumManagerDelete' => \ForkBB\Models\Forum\Delete::class,
'ForumManagerMarkread' => \ForkBB\Models\Forum\Markread::class,
'TopicModel' => \ForkBB\Models\Topic\Model::class,
'TopicModelCalcStat' => \ForkBB\Models\Topic\CalcStat::class,

View file

@ -346,12 +346,6 @@ msgstr "Find topics with no replies."
msgid "Show posted topics"
msgstr "Find topics you have posted to."
msgid "Mark all as read"
msgstr "Mark all topics as read"
msgid "Mark forum read"
msgstr "Mark this forum as read"
msgid "Title separator"
msgstr " - "

235
app/lang/English/misc.po Normal file
View file

@ -0,0 +1,235 @@
#
msgid ""
msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Project-Id-Version: ForkBB\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: ForkBB <mio.visman@yandex.ru>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en\n"
msgid "Mark read redirect"
msgstr "All topics and forums have been marked as read. Redirecting …"
msgid "Mark forum read redirect"
msgstr "All topics in the specified forum have been marked as read. Redirecting …"
msgid "Form email disabled"
msgstr "The user you are trying to send an email to has disabled form email."
msgid "No email subject"
msgstr "You must enter a subject."
msgid "No email message"
msgstr "You must enter a message."
msgid "Too long email message"
msgstr "Messages cannot be longer than 65535 characters (64 KB)."
msgid "Email flood"
msgstr "At least %s seconds have to pass between sent emails. Please wait %s seconds and try sending again."
msgid "Email sent redirect"
msgstr "Email sent. Redirecting …"
msgid "Send email to"
msgstr "Send email to"
msgid "Email subject"
msgstr "Subject"
msgid "Email message"
msgstr "Message"
msgid "Email disclosure note"
msgstr "Please note that by using this form, your email address will be disclosed to the recipient."
msgid "Write email"
msgstr "Write and submit your email message"
msgid "No reason"
msgstr "You must enter a reason."
msgid "Reason too long"
msgstr "Your message must be under 65535 bytes (~64kb)."
msgid "Report flood"
msgstr "At least %s seconds have to pass between reports. Please wait %s seconds and try sending again."
msgid "Report redirect"
msgstr "Post reported. Redirecting …"
msgid "Report post"
msgstr "Report post"
msgid "Reason"
msgstr "Reason"
msgid "Reason desc"
msgstr "Please enter a short reason why you are reporting this post"
msgid "Already subscribed topic"
msgstr "You are already subscribed to this topic."
msgid "Already subscribed forum"
msgstr "You are already subscribed to this forum."
msgid "Subscribe redirect"
msgstr "Your subscription has been added. Redirecting …"
msgid "Not subscribed topic"
msgstr "You are not subscribed to this topic."
msgid "Not subscribed forum"
msgstr "You are not subscribed to this forum."
msgid "Unsubscribe redirect"
msgstr "Your subscription has been removed. Redirecting …"
msgid "Moderate"
msgstr "Moderate"
msgid "Select"
msgstr "Select"
msgid "Move"
msgstr "Move"
msgid "Split"
msgstr "Split"
msgid "Delete"
msgstr "Delete"
msgid "Merge"
msgstr "Merge"
msgid "Lang changed"
msgstr "Language is changed. Redirecting &hellip;"
msgid "Open"
msgstr "Open"
msgid "Close"
msgstr "Close"
msgid "Move topic"
msgstr "Move topic"
msgid "Move topics"
msgstr "Move topics"
msgid "Move legend"
msgstr "Select destination of move"
msgid "Move to"
msgstr "Move to"
msgid "Nowhere to move"
msgstr "There are no forums into which you can move topics."
msgid "Leave redirect"
msgstr "Leave redirect topic(s)"
msgid "Move topic redirect"
msgstr "Topic moved. Redirecting …"
msgid "Move topics redirect"
msgstr "Topics moved. Redirecting …"
msgid "Confirm delete legend"
msgstr "Please confirm deletion"
msgid "Delete topics"
msgstr "Delete topics"
msgid "Delete topics comply"
msgstr "Are you sure you want to delete the selected topics?"
msgid "Delete topics redirect"
msgstr "Topics deleted. Redirecting …"
msgid "Open topic redirect"
msgstr "Topic opened. Redirecting …"
msgid "Open topics redirect"
msgstr "Topics opened. Redirecting …"
msgid "Close topic redirect"
msgstr "Topic closed. Redirecting …"
msgid "Close topics redirect"
msgstr "Topics closed. Redirecting …"
msgid "No topics selected"
msgstr "You must select at least one topic for move/delete/open/close."
msgid "Not enough topics selected"
msgstr "You must select at least two topics for merge."
msgid "Stick topic redirect"
msgstr "Topic sticked. Redirecting …"
msgid "Unstick topic redirect"
msgstr "Topic unsticked. Redirecting …"
msgid "Merge topics"
msgstr "Merge topics"
msgid "Merge topics redirect"
msgstr "Topics merged. Redirecting …"
msgid "Confirm merge legend"
msgstr "Please confirm merge"
msgid "New subject"
msgstr "New subject"
msgid "Confirm split legend"
msgstr "Please confirm split of selected posts and select destination of move."
msgid "Split posts"
msgstr "Split posts"
msgid "Split posts comply"
msgstr "Are you sure you want to split the selected posts?"
msgid "Split posts redirect"
msgstr "Posts have been split. Redirecting …"
msgid "Delete posts"
msgstr "Delete posts"
msgid "Cannot select first"
msgstr "First post cannot be selected for split/delete."
msgid "Delete posts comply"
msgstr "Are you sure you want to delete the selected posts?"
msgid "Delete posts redirect"
msgstr "Posts deleted. Redirecting …"
msgid "No posts selected"
msgstr "You must select at least one post for split/delete."
msgid "Host info 1"
msgstr "The IP address is: %s"
msgid "Host info 2"
msgstr "The host name is: %s"
msgid "Show more users"
msgstr "Show more users for this IP"
msgid "Move posts"
msgstr "Move posts"
msgid "Move posts redirect"
msgstr "Posts moved. Redirecting …"
msgid "Post from topic"
msgstr "This post is moved from topic"

View file

@ -35,3 +35,12 @@ msgstr[1] "<strong>%s</strong> Posts"
msgid "Moderated by"
msgstr "Moderated by"
msgid "Mark all as read"
msgstr "Mark all topics as read"
msgid "Mark forum read"
msgstr "Mark this forum as read"
msgid "All is read"
msgstr "All is read"

View file

@ -348,12 +348,6 @@ msgstr "Найти темы без ответов."
msgid "Show posted topics"
msgstr "Найти темы с вашим участием."
msgid "Mark all as read"
msgstr "Отметить всё как прочтённое"
msgid "Mark forum read"
msgstr "Отметить раздел как прочтённый"
msgid "Title separator"
msgstr " - "

235
app/lang/Russian/misc.po Normal file
View file

@ -0,0 +1,235 @@
#
msgid ""
msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Project-Id-Version: ForkBB\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: ForkBB <mio.visman@yandex.ru>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
msgid "Mark read redirect"
msgstr "Все темы и разделы помечены прочитанными. Переадресация &hellip;"
msgid "Mark forum read redirect"
msgstr "Все темы выбранного раздела помечены прочитанными. Переадресация &hellip;"
msgid "Form email disabled"
msgstr "Пользователь, которому вы пытаетесь отправить письмо, отключил такую возможность."
msgid "No email subject"
msgstr "Вы должны ввести заголовок."
msgid "No email message"
msgstr "Вы должны ввести текст письма."
msgid "Too long email message"
msgstr "Сообщение должно быть не длиннее 65535 символов (64 KB)."
msgid "Email flood"
msgstr "По крайней мере %s секунд должно пройти между отправками писем. Пожалуйста, подождите %s секунд и попробуйте снова."
msgid "Email sent redirect"
msgstr "Письмо отправлено. Переадресация &hellip;"
msgid "Send email to"
msgstr "Отправить сообщение для"
msgid "Email subject"
msgstr "Заголовок"
msgid "Email message"
msgstr "Сообщение"
msgid "Email disclosure note"
msgstr "Имейте в виду, что ваш почтовый адрес будет виден получателю письма."
msgid "Write email"
msgstr "Форма для составления и отправки письма"
msgid "No reason"
msgstr "Пожалуйста, введите причину."
msgid "Reason too long"
msgstr "Ваше сообщение не должно превышать 65535 байт (~64Кб)."
msgid "Report flood"
msgstr "По крайней мере %s секунд должно пройти между сигналами. Пожалуйста, подождите %s секунд и попробуйте снова."
msgid "Report redirect"
msgstr "Сигнал отправлен. Переадресация &hellip;"
msgid "Report post"
msgstr "Сигнал модератору"
msgid "Reason"
msgstr "Причина обращения"
msgid "Reason desc"
msgstr "Пожалуйста, кратко опишите причину создания этого сигнала (жалобы)"
msgid "Already subscribed topic"
msgstr "Вы уже подписаны на эту тему."
msgid "Already subscribed forum"
msgstr "Вы уже подписаны на этот раздел."
msgid "Subscribe redirect"
msgstr "Подписка добавлена. Переадресация &hellip;"
msgid "Not subscribed topic"
msgstr "Вы не подписаны на эту тему."
msgid "Not subscribed forum"
msgstr "Вы не подписаны на этот раздел."
msgid "Unsubscribe redirect"
msgstr "Подписка удалена. Переадресация &hellip;"
msgid "Moderate"
msgstr "Модерирование"
msgid "Select"
msgstr "Выбрать"
msgid "Move"
msgstr "Перенести"
msgid "Split"
msgstr "Разделить"
msgid "Delete"
msgstr "Удалить"
msgid "Merge"
msgstr "Объединить"
msgid "Lang changed"
msgstr "Язык изменен. Переадресация &hellip;"
msgid "Open"
msgstr "Открыть"
msgid "Close"
msgstr "Закрыть"
msgid "Move topic"
msgstr "Перенос темы"
msgid "Move topics"
msgstr "Перенос тем"
msgid "Move legend"
msgstr "Выберите раздел-получатель"
msgid "Move to"
msgstr "Перенести в"
msgid "Nowhere to move"
msgstr "Нет раздела, куда бы вы могли перенести тему(ы)."
msgid "Leave redirect"
msgstr "Оставить тему(ы) переадресации"
msgid "Move topic redirect"
msgstr "Тема перенесена. Переадресация &hellip;"
msgid "Move topics redirect"
msgstr "Темы перенесены. Переадресация &hellip;"
msgid "Confirm delete legend"
msgstr "Пожалуйста, подтвердите удаление"
msgid "Delete topics"
msgstr "Удаление тем"
msgid "Delete topics comply"
msgstr "Вы уверены, что хотите удалить отмеченные темы?"
msgid "Delete topics redirect"
msgstr "Темы удалены. Переадресация &hellip;"
msgid "Open topic redirect"
msgstr "Тема открыта. Переадресация &hellip;"
msgid "Open topics redirect"
msgstr "Темы открыты. Переадресация &hellip;"
msgid "Close topic redirect"
msgstr "Тема закрыта. Переадресация &hellip;"
msgid "Close topics redirect"
msgstr "Темы закрыты. Переадресация &hellip;"
msgid "No topics selected"
msgstr "Вы должны выбрать хотя бы одну тему для переноса/удаления/открытия/закрытия."
msgid "Not enough topics selected"
msgstr "Вы должны выбрать хотя бы две темы для объединения."
msgid "Stick topic redirect"
msgstr "Тема выделена. Переадресация &hellip;"
msgid "Unstick topic redirect"
msgstr "Выделение темы снято. Переадресация &hellip;"
msgid "Merge topics"
msgstr "Объединение тем"
msgid "Merge topics redirect"
msgstr "Темы объединены. Переадресация &hellip;"
msgid "Confirm merge legend"
msgstr "Пожалуйста, подтвердите объединение"
msgid "New subject"
msgstr "Название новой темы"
msgid "Confirm split legend"
msgstr "Пожалуйста, подтвердите разделение выбранных сообщений и укажите место переноса."
msgid "Split posts"
msgstr "Разделение сообщений"
msgid "Split posts comply"
msgstr "Вы уверены, что хотите разделить выбранные сообщения?"
msgid "Split posts redirect"
msgstr "Сообщения разделены. Переадресация &hellip;"
msgid "Delete posts"
msgstr "Удаление сообщений"
msgid "Cannot select first"
msgstr "Первое сообщение не может быть выбрано."
msgid "Delete posts comply"
msgstr "Вы уверены, что хотите удалить выбранные сообщения?"
msgid "Delete posts redirect"
msgstr "Сообщения удалены. Переадресация &hellip;"
msgid "No posts selected"
msgstr "Вы должны выбрать хотя бы одно сообщение для данного действия."
msgid "Host info 1"
msgstr "IP адрес: %s"
msgid "Host info 2"
msgstr "Имя хоста: %s"
msgid "Show more users"
msgstr "Показать еще информацию по IP"
msgid "Move posts"
msgstr "Перенос сообщений"
msgid "Move posts redirect"
msgstr "Сообщения перенесены. Переадресация &hellip;"
msgid "Post from topic"
msgstr "Это сообщение перенесено из темы"

View file

@ -41,3 +41,12 @@ msgid_plural "Moderated by"
msgstr[0] "Модератор:"
msgstr[1] "Модераторы:"
msgstr[2] "Модераторы:"
msgid "Mark all as read"
msgstr "Отметить все разделы прочитанными"
msgid "Mark forum read"
msgstr "Отметить все темы в этом раздел прочитанными"
msgid "All is read"
msgstr "Всё прочитано"

View file

@ -11,13 +11,6 @@
@endforeach
</ul>
@endsection
@section ('linknewtopic')
@if ($p->model->canCreateTopic)
<div class="f-actions-links">
<a class="f-btn f-btn-create-topic" href="{!! $p->model->linkCreateTopic !!}">{!! __('Post topic') !!}</a>
</div>
@endif
@endsection
@section ('pagination')
@if ($p->model->pagination)
<nav class="f-pages">
@ -65,7 +58,11 @@
@if ($p->model->canCreateTopic || $p->model->pagination)
<div class="f-nlinks-b clearfix">
@yield ('pagination')
@yield ('linknewtopic')
@if ($p->model->canCreateTopic)
<div class="f-actions-links">
<a class="f-btn f-btn-create-topic" href="{!! $p->model->linkCreateTopic !!}">{!! __('Post topic') !!}</a>
</div>
@endif
</div>
@endif
</div>
@ -154,9 +151,18 @@
</div>
</section>
<div class="f-nav-links">
@if ($p->model->canCreateTopic || $p->model->pagination)
@if ($p->model->canCreateTopic || $p->model->pagination || $p->model->canMarkRead)
<div class="f-nlinks-a clearfix">
@yield ('linknewtopic')
@if ($p->model->canCreateTopic || $p->model->canMarkRead)
<div class="f-actions-links">
@if ($p->model->canMarkRead)
<a class="f-btn f-btn-markread" title="{!! __('Mark forum read') !!}" href="{!! $p->model->linkMarkRead !!}">{!! __('All is read') !!}</a>
@endif
@if ($p->model->canCreateTopic)
<a class="f-btn f-btn-create-topic" href="{!! $p->model->linkCreateTopic !!}">{!! __('Post topic') !!}</a>
</div>
@endif
@endif
@yield ('pagination')
</div>
@endif

View file

@ -17,5 +17,14 @@
@endforeach
</ol>
</section>
@if ($p->linkMarkRead)
<div class="f-nav-links">
<div class="f-nlinks clearfix">
<div class="f-actions-links">
<a class="f-btn f-btn-markread" title="{!! __('Mark all as read') !!}" href="{!! $p->linkMarkRead !!}">{!! __('All is read') !!}</a>
</div>
</div>
</div>
@endif
@endif
@include ('layouts/stats')

View file

@ -1167,6 +1167,15 @@ select {
content: " ]";
}
.f-btn-markread {
opacity: 0.5;
}
.f-btn-markread:focus,
.f-btn-markread:hover {
opacity: 1;
}
/*
.icon-document:before {
content: "\e900";