|
@@ -11,6 +11,8 @@ use ForkBB\Models\Page;
|
|
class Post extends Page
|
|
class Post extends Page
|
|
{
|
|
{
|
|
use CrumbTrait;
|
|
use CrumbTrait;
|
|
|
|
+ use PostFormTrait;
|
|
|
|
+ use PostValidatorTrait;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Подготовка данных для шаблона создания темы
|
|
* Подготовка данных для шаблона создания темы
|
|
@@ -123,8 +125,7 @@ class Post extends Page
|
|
*/
|
|
*/
|
|
public function newReplyPost(array $args)
|
|
public function newReplyPost(array $args)
|
|
{
|
|
{
|
|
- $tid = (int) $args['id'];
|
|
|
|
- $topic = $this->c->ModelTopic->load($tid);
|
|
|
|
|
|
+ $topic = $this->c->ModelTopic->load((int) $args['id']);
|
|
|
|
|
|
if (empty($topic) || $topic->moved_to || ! $topic->canReply) {
|
|
if (empty($topic) || $topic->moved_to || ! $topic->canReply) {
|
|
return $this->c->Message->message('Bad request');
|
|
return $this->c->Message->message('Bad request');
|
|
@@ -264,333 +265,4 @@ class Post extends Page
|
|
->page('ViewPost', ['id' => $merge ? $lastPost->id : $post->id])
|
|
->page('ViewPost', ['id' => $merge ? $lastPost->id : $post->id])
|
|
->message(__('Post redirect'));
|
|
->message(__('Post redirect'));
|
|
}
|
|
}
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Дополнительная проверка email
|
|
|
|
- *
|
|
|
|
- * @param Validator $v
|
|
|
|
- * @param string $email
|
|
|
|
- *
|
|
|
|
- * @return string
|
|
|
|
- */
|
|
|
|
- public function vCheckEmail(Validator $v, $email)
|
|
|
|
- {
|
|
|
|
- $user = $this->c->ModelUser;
|
|
|
|
- $user->email = $email;
|
|
|
|
-
|
|
|
|
- // email забанен
|
|
|
|
- if ($this->c->bans->isBanned($user) > 0) {
|
|
|
|
- $v->addError('Banned email');
|
|
|
|
- }
|
|
|
|
- return $email;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Дополнительная проверка username
|
|
|
|
- *
|
|
|
|
- * @param Validator $v
|
|
|
|
- * @param string $username
|
|
|
|
- *
|
|
|
|
- * @return string
|
|
|
|
- */
|
|
|
|
- public function vCheckUsername(Validator $v, $username)
|
|
|
|
- {
|
|
|
|
- $user = $this->c->ModelUser;
|
|
|
|
- $user->username = $username;
|
|
|
|
-
|
|
|
|
- // username = Гость
|
|
|
|
- if (preg_match('%^(guest|' . preg_quote(__('Guest'), '%') . ')$%iu', $username)) {
|
|
|
|
- $v->addError('Username guest');
|
|
|
|
- // цензура
|
|
|
|
- } elseif ($user->cens()->username !== $username) {
|
|
|
|
- $v->addError('Username censor');
|
|
|
|
- // username забанен
|
|
|
|
- } elseif ($this->c->bans->isBanned($user) > 0) {
|
|
|
|
- $v->addError('Banned username');
|
|
|
|
- }
|
|
|
|
- return $username;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Дополнительная проверка subject
|
|
|
|
- *
|
|
|
|
- * @param Validator $v
|
|
|
|
- * @param string $subject
|
|
|
|
- *
|
|
|
|
- * @return string
|
|
|
|
- */
|
|
|
|
- public function vCheckSubject(Validator $v, $subject, $attr, $executive)
|
|
|
|
- {
|
|
|
|
- // после цензуры заголовок темы путой
|
|
|
|
- if ($this->c->censorship->censor($subject) == '') {
|
|
|
|
- $v->addError('No subject after censoring');
|
|
|
|
- // заголовок темы только заглавными буквами
|
|
|
|
- } elseif (! $executive
|
|
|
|
- && $this->c->config->p_subject_all_caps == '0'
|
|
|
|
- && preg_match('%\p{Lu}%u', $subject)
|
|
|
|
- && ! preg_match('%\p{Ll}%u', $subject)
|
|
|
|
- ) {
|
|
|
|
- $v->addError('All caps subject');
|
|
|
|
- }
|
|
|
|
- return $subject;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Дополнительная проверка message
|
|
|
|
- *
|
|
|
|
- * @param Validator $v
|
|
|
|
- * @param string $message
|
|
|
|
- *
|
|
|
|
- * @return string
|
|
|
|
- */
|
|
|
|
- public function vCheckMessage(Validator $v, $message, $attr, $executive)
|
|
|
|
- {
|
|
|
|
- // после цензуры текст сообщения пустой
|
|
|
|
- if ($this->c->censorship->censor($message) == '') {
|
|
|
|
- $v->addError('No message after censoring');
|
|
|
|
- // текст сообщения только заглавными буквами
|
|
|
|
- } elseif (! $executive
|
|
|
|
- && $this->c->config->p_message_all_caps == '0'
|
|
|
|
- && preg_match('%\p{Lu}%u', $message)
|
|
|
|
- && ! preg_match('%\p{Ll}%u', $message)
|
|
|
|
- ) {
|
|
|
|
- $v->addError('All caps message');
|
|
|
|
- // проверка парсером
|
|
|
|
- } else {
|
|
|
|
- $message = $this->c->Parser->prepare($message); //????
|
|
|
|
-
|
|
|
|
- foreach($this->c->Parser->getErrors() as $error) {
|
|
|
|
- $v->addError($error);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return $message;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Проверка времени ограничения флуда
|
|
|
|
- *
|
|
|
|
- * @param Validator $v
|
|
|
|
- * @param null|string $submit
|
|
|
|
- *
|
|
|
|
- * @return null|string
|
|
|
|
- */
|
|
|
|
- public function vCheckTimeout(Validator $v, $submit)
|
|
|
|
- {
|
|
|
|
- if (null === $submit) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- $user = $this->c->user;
|
|
|
|
- $time = time() - (int) $user->last_post;
|
|
|
|
-
|
|
|
|
- if ($time < $user->g_post_flood) {
|
|
|
|
- $v->addError(__('Flood start', $user->g_post_flood, $user->g_post_flood - $time), 'e');
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return $submit;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Подготовка валидатора к проверке данных из формы создания темы/сообщения
|
|
|
|
- *
|
|
|
|
- * @param Model $model
|
|
|
|
- * @param string $marker
|
|
|
|
- * @param array $args
|
|
|
|
- * @param bool $editSubject
|
|
|
|
- *
|
|
|
|
- * @return Validator
|
|
|
|
- */
|
|
|
|
- protected function messageValidator(Model $model, $marker, array $args, $editSubject = false)
|
|
|
|
- {
|
|
|
|
- if ($this->c->user->isGuest) {
|
|
|
|
- $ruleEmail = ($this->c->config->p_force_guest_email == '1' ? 'required|' : '') . 'string:trim,lower|email|check_email';
|
|
|
|
- $ruleUsername = 'required|string:trim,spaces|min:2|max:25|login|check_username';
|
|
|
|
- } else {
|
|
|
|
- $ruleEmail = 'absent';
|
|
|
|
- $ruleUsername = 'absent';
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ($editSubject) {
|
|
|
|
- $ruleSubject = 'required|string:trim,spaces|min:1|max:70|check_subject';
|
|
|
|
- } else {
|
|
|
|
- $ruleSubject = 'absent';
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ($this->c->user->isAdmin || $this->c->user->isModerator($model)) {
|
|
|
|
- if ($editSubject) {
|
|
|
|
- $ruleStickTopic = 'checkbox';
|
|
|
|
- $ruleStickFP = 'checkbox';
|
|
|
|
- $ruleMergePost = 'absent';
|
|
|
|
- } else {
|
|
|
|
- $ruleStickTopic = 'absent';
|
|
|
|
- $ruleStickFP = 'absent';
|
|
|
|
- $ruleMergePost = 'checkbox';
|
|
|
|
- }
|
|
|
|
- $executive = true;
|
|
|
|
- } else {
|
|
|
|
- $ruleStickTopic = 'absent';
|
|
|
|
- $ruleStickFP = 'absent';
|
|
|
|
- $ruleMergePost = 'absent:1';
|
|
|
|
- $executive = false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ($this->c->config->o_smilies == '1') {
|
|
|
|
- $ruleHideSmilies = 'checkbox';
|
|
|
|
- } else {
|
|
|
|
- $ruleHideSmilies = 'absent';
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- $v = $this->c->Validator->addValidators([
|
|
|
|
- 'check_email' => [$this, 'vCheckEmail'],
|
|
|
|
- 'check_username' => [$this, 'vCheckUsername'],
|
|
|
|
- 'check_subject' => [$this, 'vCheckSubject'],
|
|
|
|
- 'check_message' => [$this, 'vCheckMessage'],
|
|
|
|
- 'check_timeout' => [$this, 'vCheckTimeout'],
|
|
|
|
- ])->setRules([
|
|
|
|
- 'token' => 'token:' . $marker,
|
|
|
|
- 'email' => [$ruleEmail, __('Email')],
|
|
|
|
- 'username' => [$ruleUsername, __('Username')],
|
|
|
|
- 'subject' => [$ruleSubject, __('Subject')],
|
|
|
|
- 'stick_topic' => $ruleStickTopic,
|
|
|
|
- 'stick_fp' => $ruleStickFP,
|
|
|
|
- 'merge_post' => $ruleMergePost,
|
|
|
|
- 'hide_smilies' => $ruleHideSmilies,
|
|
|
|
- 'preview' => 'string', //????
|
|
|
|
- 'submit' => 'string|check_timeout', //????
|
|
|
|
- 'message' => 'required|string:trim|max:' . $this->c->MAX_POST_SIZE . '|check_message',
|
|
|
|
- ])->setArguments([
|
|
|
|
- 'token' => $args,
|
|
|
|
- 'subject.check_subject' => $executive,
|
|
|
|
- 'message.check_message' => $executive,
|
|
|
|
- ])->setMessages([
|
|
|
|
- 'username.login' => __('Login format'),
|
|
|
|
- ]);
|
|
|
|
-
|
|
|
|
- return $v;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Возвращает данные для построения формы создания темы/сообщения
|
|
|
|
- *
|
|
|
|
- * @param Model $model
|
|
|
|
- * @param string $marker
|
|
|
|
- * @param array $args
|
|
|
|
- * @param bool $editSubject
|
|
|
|
- *
|
|
|
|
- * @return array
|
|
|
|
- */
|
|
|
|
- protected function messageForm(Model $model, $marker, array $args, $editSubject = false)
|
|
|
|
- {
|
|
|
|
- $vars = isset($args['_vars']) ? $args['_vars'] : null;
|
|
|
|
- unset($args['_vars']);
|
|
|
|
-
|
|
|
|
- $autofocus = true;
|
|
|
|
- $form = [
|
|
|
|
- 'action' => $this->c->Router->link($marker, $args),
|
|
|
|
- 'hidden' => [
|
|
|
|
- 'token' => $this->c->Csrf->create($marker, $args),
|
|
|
|
- ],
|
|
|
|
- 'sets' => [],
|
|
|
|
- 'btns' => [
|
|
|
|
- 'submit' => ['submit', __('Submit'), 's'],
|
|
|
|
- 'preview' => ['submit', __('Preview'), 'p'],
|
|
|
|
- ],
|
|
|
|
- ];
|
|
|
|
-
|
|
|
|
- $fieldset = [];
|
|
|
|
- if ($this->c->user->isGuest) {
|
|
|
|
- $fieldset['username'] = [
|
|
|
|
- 'dl' => 't1',
|
|
|
|
- 'type' => 'text',
|
|
|
|
- 'maxlength' => 25,
|
|
|
|
- 'title' => __('Username'),
|
|
|
|
- 'required' => true,
|
|
|
|
- 'pattern' => '^.{2,25}$',
|
|
|
|
- 'value' => isset($vars['username']) ? $vars['username'] : null,
|
|
|
|
- 'autofocus' => $autofocus,
|
|
|
|
- ];
|
|
|
|
- $fieldset['email'] = [
|
|
|
|
- 'dl' => 't2',
|
|
|
|
- 'type' => 'text',
|
|
|
|
- 'maxlength' => 80,
|
|
|
|
- 'title' => __('Email'),
|
|
|
|
- 'required' => $this->c->config->p_force_guest_email == '1',
|
|
|
|
- 'pattern' => '.+@.+',
|
|
|
|
- 'value' => isset($vars['email']) ? $vars['email'] : null,
|
|
|
|
- ];
|
|
|
|
- $autofocus = null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ($editSubject) {
|
|
|
|
- $fieldset['subject'] = [
|
|
|
|
- 'type' => 'text',
|
|
|
|
- 'maxlength' => 70,
|
|
|
|
- 'title' => __('Subject'),
|
|
|
|
- 'required' => true,
|
|
|
|
- 'value' => isset($vars['subject']) ? $vars['subject'] : null,
|
|
|
|
- 'autofocus' => $autofocus,
|
|
|
|
- ];
|
|
|
|
- $autofocus = null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- $fieldset['message'] = [
|
|
|
|
- 'type' => 'textarea',
|
|
|
|
- 'title' => __('Message'),
|
|
|
|
- 'required' => true,
|
|
|
|
- 'value' => isset($vars['message']) ? $vars['message'] : null,
|
|
|
|
- 'bb' => [
|
|
|
|
- ['link', __('BBCode'), __($this->c->config->p_message_bbcode == '1' ? 'on' : 'off')],
|
|
|
|
- ['link', __('url tag'), __($this->c->config->p_message_bbcode == '1' && $this->c->user->g_post_links == '1' ? 'on' : 'off')],
|
|
|
|
- ['link', __('img tag'), __($this->c->config->p_message_bbcode == '1' && $this->c->config->p_message_img_tag == '1' ? 'on' : 'off')],
|
|
|
|
- ['link', __('Smilies'), __($this->c->config->o_smilies == '1' ? 'on' : 'off')],
|
|
|
|
- ],
|
|
|
|
- 'autofocus' => $autofocus,
|
|
|
|
- ];
|
|
|
|
- $form['sets'][] = [
|
|
|
|
- 'fields' => $fieldset,
|
|
|
|
- ];
|
|
|
|
- $autofocus = null;
|
|
|
|
-
|
|
|
|
- $fieldset = [];
|
|
|
|
- if ($this->c->user->isAdmin || $this->c->user->isModerator($model)) {
|
|
|
|
- if ($editSubject) {
|
|
|
|
- $fieldset['stick_topic'] = [
|
|
|
|
- 'type' => 'checkbox',
|
|
|
|
- 'label' => __('Stick topic'),
|
|
|
|
- 'value' => '1',
|
|
|
|
- 'checked' => isset($vars['stick_topic']) ? (bool) $vars['stick_topic'] : false,
|
|
|
|
- ];
|
|
|
|
- $fieldset['stick_fp'] = [
|
|
|
|
- 'type' => 'checkbox',
|
|
|
|
- 'label' => __('Stick first post'),
|
|
|
|
- 'value' => '1',
|
|
|
|
- 'checked' => isset($vars['stick_fp']) ? (bool) $vars['stick_fp'] : false,
|
|
|
|
- ];
|
|
|
|
- } else {
|
|
|
|
- $fieldset['merge_post'] = [
|
|
|
|
- 'type' => 'checkbox',
|
|
|
|
- 'label' => __('Merge posts'),
|
|
|
|
- 'value' => '1',
|
|
|
|
- 'checked' => isset($vars['merge_post']) ? (bool) $vars['merge_post'] : true,
|
|
|
|
- ];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if ($this->c->config->o_smilies == '1') {
|
|
|
|
- $fieldset['hide_smilies'] = [
|
|
|
|
- 'type' => 'checkbox',
|
|
|
|
- 'label' => __('Hide smilies'),
|
|
|
|
- 'value' => '1',
|
|
|
|
- 'checked' => isset($vars['hide_smilies']) ? (bool) $vars['hide_smilies'] : false,
|
|
|
|
- ];
|
|
|
|
- }
|
|
|
|
- if ($fieldset) {
|
|
|
|
- $form['sets'][] = [
|
|
|
|
- 'legend' => __('Options'),
|
|
|
|
- 'fields' => $fieldset,
|
|
|
|
- ];
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return $form;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|