Add PM\PMEdit page

This commit is contained in:
Visman 2021-04-02 00:04:37 +07:00
parent 73bfd6f39e
commit 2d4f52fe03

View file

@ -0,0 +1,174 @@
<?php
/**
* This file is part of the ForkBB <https://github.com/forkbb>.
*
* @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
* @license The MIT License (MIT)
*/
declare(strict_types=1);
namespace ForkBB\Models\Pages\PM;
use ForkBB\Core\Validator;
use ForkBB\Models\Page;
use ForkBB\Models\Pages\PM\AbstractPM;
use ForkBB\Models\Pages\PostFormTrait;
use ForkBB\Models\Pages\PostValidatorTrait;
use ForkBB\Models\PM\Cnst;
use ForkBB\Models\PM\PPost;
use ForkBB\Models\PM\PTopic;
use InvalidArgumentException;
use function \ForkBB\__;
class PMEdit extends AbstractPM
{
use PostFormTrait;
use PostValidatorTrait;
/**
* Редактирование сообщения
*/
public function edit(array $args, string $method): Page
{
if (isset($args['more2'])) {
return $this->c->Message->message('Bad request');
}
$post = $this->pms->load(Cnst::PPOST, $args['more1']);
if (
! $post instanceof PPost
|| ! $post->canEdit
) {
return $this->c->Message->message('Bad request');
}
$topic = $post->parent;
$firstPost = $post->id === $topic->first_post_id;
$this->c->Lang->load('post');
if ('POST' === $method) {
$v = $this->messageValidator(null, 'PMAction', $args, true, $firstPost);
if (
$v->validation($_POST)
&& null === $v->preview
&& null !== $v->submit
) {
return $this->endEdit($post, $v);
}
$this->fIswev = $v->getErrors();
$args['_vars'] = $v->getData();
if (
null !== $v->preview
&& ! $v->getErrors()
) {
$this->previewHtml = $this->c->censorship->censor(
$this->c->Parser->parseMessage(null, (bool) $v->hide_smilies)
);
}
} else {
$args['_vars'] = [
'message' => $post->message,
'subject' => $topic->subject,
'hide_smilies' => $post->hide_smilies,
];
}
$this->targetUser = $topic->ztUser;
$this->pms->area = $this->pms->inArea($topic);
$this->pmIndex = $this->pms->area;
$this->nameTpl = 'pm/post';
$this->formTitle = $firstPost ? 'Edit PT title' : 'Edit PM title';
$this->form = $this->messageFormPM(null, 'PMAction', $args, true, $firstPost, false);
$this->pmCrumbs[] = [
$this->c->Router->link('PMAction', $args),
__($firstPost ? 'Edit dialogue' : 'Edit message'),
];
$this->pmCrumbs[] = $topic;
return $this;
}
protected function messageFormPM(?Model $model, string $marker, array $args, bool $edit, bool $first, bool $quick): array
{
$form = $this->messageForm($model, $marker, $args, $edit, $first, $quick);
if (Cnst::ACTION_ARCHIVE === $this->pms->area) {
$form['btns']['submit']['value'] = __('Save');
}
return $form;
}
protected function messageValidatorPM(?Model $model, string $marker, array $args, bool $edit, bool $first): Validator
{
$v = $this->messageValidator($model, $marker, $args, $edit, $first)
->addRules([
'message' => 'required|string:trim|max:65535 bytes|check_message',
]);
return $v;
}
/**
* Сохранение сообщения
*/
protected function endEdit(PPost $post, Validator $v): Page
{
$now = \time();
$topic = $post->parent;
$firstPost = $post->id === $topic->first_post_id;
$calcPost = false;
$calcTopic = false;
// текст сообщения
if ($post->message !== $v->message) {
$post->message = $v->message;
$post->edited = $now;
$calcPost = true;
if ($post->id === $topic->last_post_id) {
$calcTopic = true;
}
}
// показ смайлов
if (
'1' == $this->c->config->o_smilies
&& (bool) $post->hide_smilies !== (bool) $v->hide_smilies
) {
$post->hide_smilies = $v->hide_smilies ? 1 : 0;
}
if ($firstPost) {
// заголовок темы
if ($topic->subject !== $v->subject) {
$topic->subject = $v->subject;
$post->edited = $now;
}
}
// обновление сообщения
$this->pms->update(Cnst::PPOST, $post);
// обновление темы
if ($calcTopic) {
$topic->calcStat();
}
$this->pms->update(Cnst::PTOPIC, $topic);
// антифлуд
if ($calcPost) {
$this->user->u_pm_last_post = $now;
$this->c->users->update($this->user);
}
return $this->c->Redirect->url($post->link)->message('Edit redirect');
}
}