Add PM\PMEdit page
This commit is contained in:
parent
73bfd6f39e
commit
2d4f52fe03
1 changed files with 174 additions and 0 deletions
174
app/Models/Pages/PM/PMEdit.php
Normal file
174
app/Models/Pages/PM/PMEdit.php
Normal 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');
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue