2017-12-15

This commit is contained in:
Visman 2017-12-15 22:09:00 +07:00
parent d6e07a8f28
commit 8f6f0696ea
5 changed files with 101 additions and 129 deletions

View file

@ -88,7 +88,11 @@ class Router
&& ($route = $this->route('GET', rawurldecode(parse_url($url, PHP_URL_PATH))))
&& $route[0] === self::OK
) {
return $url;
if (isset($route[3])) {
return $this->link($route[3], $route[2]);
} else {
return $url;
}
} else {
return $this->link($defMarker, $defArgs);
}
@ -172,16 +176,18 @@ class Router
if (isset($this->statical[$uri])) {
if (isset($this->statical[$uri][$method])) {
return [self::OK, $this->statical[$uri][$method], []];
list($handler, $marker) = $this->statical[$uri][$method];
return [self::OK, $handler, [], $marker];
} elseif ($head && isset($this->statical[$uri]['GET'])) {
return [self::OK, $this->statical[$uri]['GET'], []];
list($handler, $marker) = $this->statical[$uri]['GET'];
return [self::OK, $handler, [], $marker];
} else {
$allowed = array_keys($this->statical[$uri]);
}
}
$pos = strpos(substr($uri, 1), '/');
$base = false === $pos ? $uri : substr($uri, 0, ++$pos);
$pos = strpos($uri, '/', 1);
$base = false === $pos ? $uri : substr($uri, 0, $pos);
if (isset($this->dynamic[$base])) {
foreach ($this->dynamic[$base] as $pattern => $data) {
@ -190,21 +196,21 @@ class Router
}
if (isset($data[$method])) {
$data = $data[$method];
list($handler, $keys, $marker) = $data[$method];
} elseif ($head && isset($data['GET'])) {
$data = $data['GET'];
list($handler, $keys, $marker) = $data['GET'];
} else {
$allowed += array_keys($data);
continue;
}
$args = [];
foreach ($data[1] as $key) {
foreach ($keys as $key) {
if (isset($matches[$key])) {
$args[$key] = $matches[$key];
}
}
return [self::OK, $data[0], $args];
return [self::OK, $handler, $args, $marker];
}
}
if (empty($allowed)) {
@ -243,22 +249,22 @@ class Router
$data = null;
if (is_array($method)) {
foreach ($method as $m) {
$this->statical[$route][$m] = $handler;
$this->statical[$route][$m] = [$handler, $marker];
}
} else {
$this->statical[$route][$method] = $handler;
$this->statical[$route][$method] = [$handler, $marker];
}
} else {
$data = $this->parse($route);
if (false === $data) {
throw new \Exception('Route is incorrect');
throw new InvalidArgumentException('Route is incorrect');
}
if (is_array($method)) {
foreach ($method as $m) {
$this->dynamic[$data[0]][$data[1]][$m] = [$handler, $data[2]];
$this->dynamic[$data[0]][$data[1]][$m] = [$handler, $data[2], $marker];
}
} else {
$this->dynamic[$data[0]][$data[1]][$method] = [$handler, $data[2]];
$this->dynamic[$data[0]][$data[1]][$method] = [$handler, $data[2], $marker];
}
}

View file

@ -100,110 +100,76 @@ class Edit extends Page
*/
protected function endEdit(Post $post, Validator $v)
{
$now = time();
$user = $this->c->user;
$username = $user->isGuest ? $v->username : $user->username;
$merge = false;
$executive = $user->isAdmin || $user->isModerator($model);
// подготовка к объединению/сохранению сообщения
if (null === $v->subject) {
$createTopic = false;
$forum = $model->parent;
$topic = $model;
if (! $user->isGuest && $topic->last_poster === $username) {
if ($executive) {
if ($v->merge_post) {
$merge = true;
}
} else {
if ($this->c->config->o_merge_timeout > 0 // ???? стоит завязать на время редактирование сообщений?
&& $now - $topic->last_post < $this->c->config->o_merge_timeout
) {
$merge = true;
}
}
}
// создание темы
} else {
$createTopic = true;
$forum = $model;
$topic = $this->c->ModelTopic;
$now = time();
$user = $this->c->user;
$executive = $user->isAdmin || $user->isModerator($post);
$topic = $post->parent;
$editSubject = $post->id === $topic->first_post_id;
$calcPost = false;
$calcTopic = false;
$calcForum = false;
$topic->subject = $v->subject;
$topic->poster = $username;
$topic->last_poster = $username;
$topic->posted = $now;
$topic->last_post = $now;
$topic->sticky = $v->stick_topic ? 1 : 0;
$topic->stick_fp = $v->stick_fp ? 1 : 0;
# $topic->poll_type = ;
# $topic->poll_time = ;
# $topic->poll_term = ;
# $topic->poll_kol = ;
$topic->insert();
}
// попытка объеденить новое сообщение с крайним в теме
if ($merge) {
$lastPost = $this->c->ModelPost->load($topic->last_post_id);
$newLength = mb_strlen($lastPost->message . $v->message, 'UTF-8');
if ($newLength < $this->c->MAX_POST_SIZE - 100) {
$lastPost->message = $lastPost->message . "\n[after=" . ($now - $topic->last_post) . "]\n" . $v->message; //????
$lastPost->edited = $now;
$lastPost->edited_by = $username;
$lastPost->update();
} else {
$merge = false;
// текст сообщения
if ($post->message !== $v->message) {
$post->message = $v->message;
$post->edited = $now;
$post->edited_by = $user->username;
$calcPost = true;
if ($post->id === $topic->last_post_id) {
$calcTopic = true;
$calcForum = true;
}
}
// создание нового сообщения
if (! $merge) {
$post = $this->c->ModelPost;
$post->poster = $username;
$post->poster_id = $this->c->user->id;
$post->poster_ip = $this->c->user->ip;
$post->poster_email = $v->email;
$post->message = $v->message; //?????
$post->hide_smilies = $v->hide_smilies ? 1 : 0;
# $post->edit_post =
$post->posted = $now;
# $post->edited =
# $post->edited_by =
$post->user_agent = $this->c->user->userAgent;
$post->topic_id = $topic->id;
$post->insert();
// показ смайлов
if ($this->c->config->o_smilies == '1' && (bool) $post->hide_smilies !== (bool) $v->hide_smilies ) {
$post->hide_smilies = $v->hide_smilies ? 1 : 0;
}
// редактирование без ограничений
if ($executive && (bool) $post->edit_post !== (bool) $v->edit_post) {
$post->edit_post = $v->edit_post ? 1 : 0;
}
if ($createTopic) {
$topic->forum_id = $forum->id;
$topic->first_post_id = $post->id;
}
// обновление данных в теме и разделе
$topic->calcStat()->update();
$forum->calcStat()->update();
// обновление данных текущего пользователя
if (! $merge && ! $user->isGuest && $forum->no_sum_mess != '1') {
$user->num_posts = $user->num_posts + 1;
if ($user->g_promote_next_group != '0' && $user->num_posts >= $user->g_promote_min_posts) {
$user->group_id = $user->g_promote_next_group;
if ($editSubject) {
// заголовок темы
if ($topic->subject !== $v->subject) {
$topic->subject = $v->subject;
$post->edited = $now;
$post->edited_by = $user->username;
$calcForum = true;
}
// выделение темы
if ($executive && (bool) $topic->sticky !== (bool) $v->stick_topic) {
$topic->sticky = $v->stick_topic ? 1 : 0;
}
// закрепление первого сообшения
if ($executive && (bool) $topic->stick_fp !== (bool) $v->stick_fp) {
$topic->stick_fp = $v->stick_fp ? 1 : 0;
}
}
$user->last_post = $now;
$user->update();
// обновление сообщения
$post->update();
// обновление темы
if ($calcTopic) {
$topic->calcStat();
}
$topic->update();
// обновление раздела
if ($calcForum) {
$topic->parent->calcStat();
}
$topic->parent->update();
// антифлуд
if ($calcPost || $calcForum) {
$user->last_post = $now; //????
$user->update();
}
return $this->c->Redirect
->page('ViewPost', ['id' => $merge ? $lastPost->id : $post->id])
->message(\ForkBB\__('Post redirect'));
->page('ViewPost', ['id' => $post->id])
->message(\ForkBB\__('Edit redirect'));
}
}

View file

@ -48,9 +48,9 @@ function __($arg, ...$args)
if (empty($args)) {
return $tr;
} elseif (is_array($args[0])) {
return strtr($tr, array_map('\ForkBB\_e', $args[0]));
return strtr($tr, array_map('\ForkBB\e', $args[0]));
} else {
$args = array_map('\ForkBB\_e', $args);
$args = array_map('\ForkBB\e', $args);
return sprintf($tr, ...$args);
}
}
@ -62,7 +62,7 @@ function __($arg, ...$args)
*
* @return string
*/
function _e($arg)
function e($arg)
{
return htmlspecialchars($arg, ENT_HTML5 | ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
@ -184,5 +184,5 @@ function size($size)
$size /= 1024;
}
return __('Size unit '.$units[$i], round($size, 2));
return __('%s ' . $units[$i], round($size, 2));
}

View file

@ -459,25 +459,25 @@ msgid "New reports"
msgstr "There are new reports"
msgid "Maintenance mode enabled"
msgstr "<a href=\"%s\"Maintenance mode is enabled!</a>"
msgstr "<a href=\"%s\">Maintenance mode is enabled!</a>"
msgid "Size unit B"
msgid "%s B"
msgstr "%s B"
msgid "Size unit KiB"
msgid "%s KiB"
msgstr "%s KiB"
msgid "Size unit MiB"
msgid "%s MiB"
msgstr "%s MiB"
msgid "Size unit GiB"
msgid "%s GiB"
msgstr "%s GiB"
msgid "Size unit TiB"
msgid "%s TiB"
msgstr "%s TiB"
msgid "Size unit PiB"
msgid "%s PiB"
msgstr "%s PiB"
msgid "Size unit EiB"
msgid "%s EiB"
msgstr "%s EiB"

View file

@ -462,23 +462,23 @@ msgstr "Есть новые сигналы"
msgid "Maintenance mode enabled"
msgstr "<a href=\"%s\">Включен режим обслуживания!</a>"
msgid "Size unit B"
msgid "%s B"
msgstr "%s байт"
msgid "Size unit KiB"
msgid "%s KiB"
msgstr "%s Кбайт"
msgid "Size unit MiB"
msgid "%s MiB"
msgstr "%s Мбайт"
msgid "Size unit GiB"
msgid "%s GiB"
msgstr "%s Гбайт"
msgid "Size unit TiB"
msgid "%s TiB"
msgstr "%s Тбайт"
msgid "Size unit PiB"
msgid "%s PiB"
msgstr "%s Пбайт"
msgid "Size unit EiB"
msgid "%s EiB"
msgstr "%s Эбайт"