Browse Source

Add PM\PMEdit page

Visman 4 năm trước cách đây
mục cha
commit
2d4f52fe03
1 tập tin đã thay đổi với 174 bổ sung0 xóa
  1. 174 0
      app/Models/Pages/PM/PMEdit.php

+ 174 - 0
app/Models/Pages/PM/PMEdit.php

@@ -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');
+    }
+}