Ver Fonte

Add poll 6

Add poll duration setting.
Visman há 4 anos atrás
pai
commit
54b228ccf1

+ 3 - 2
app/Models/Pages/Edit.php

@@ -96,6 +96,7 @@ class Edit extends Page
                     'pollNoEdit'   => ! $poll->canEdit,
                     'pollNoEdit'   => ! $poll->canEdit,
                     'poll_enable'  => $topic->poll_type > 0,
                     'poll_enable'  => $topic->poll_type > 0,
                     'poll'         => [
                     'poll'         => [
+                        'duration'    => $topic->poll_type > 1000 ? $topic->poll_type - 1000 : 0, // ???? перенести в модель poll?
                         'hide_result' => $topic->poll_term > 0,
                         'hide_result' => $topic->poll_term > 0,
                         'question'    => $poll->question,
                         'question'    => $poll->question,
                         'type'        => $poll->type,
                         'type'        => $poll->type,
@@ -236,7 +237,7 @@ class Edit extends Page
 
 
             // редактирование
             // редактирование
             if ($v->poll_enable) {
             if ($v->poll_enable) {
-#                $topic->poll_type  = 0;
+                $topic->poll_type  = $v->poll['duration'] > 0 ? 1000 + $v->poll['duration'] : 1; // ???? перенести в модель poll?
 #                $topic->poll_time  = 0;
 #                $topic->poll_time  = 0;
                 $topic->poll_term  = $v->poll['hide_result']
                 $topic->poll_term  = $v->poll['hide_result']
                     ? ($topic->poll_term ?: $this->c->config->i_poll_term)
                     ? ($topic->poll_term ?: $this->c->config->i_poll_term)
@@ -259,7 +260,7 @@ class Edit extends Page
             }
             }
         // добавление
         // добавление
         } elseif ($v->poll_enable) {
         } elseif ($v->poll_enable) {
-            $topic->poll_type  = 1;
+            $topic->poll_type  = $v->poll['duration'] > 0 ? 1000 + $v->poll['duration'] : 1; // ???? перенести в модель poll?
             $topic->poll_time  = \time();
             $topic->poll_time  = \time();
             $topic->poll_term  = $v->poll['hide_result'] ? $this->c->config->i_poll_term : 0;
             $topic->poll_term  = $v->poll['hide_result'] ? $this->c->config->i_poll_term : 0;
             $topic->poll_votes = 0;
             $topic->poll_votes = 0;

+ 2 - 2
app/Models/Pages/Post.php

@@ -54,7 +54,7 @@ class Post extends Page
             }
             }
 
 
             $this->fIswev  = $v->getErrors();
             $this->fIswev  = $v->getErrors();
-            $args['_vars'] = $v->getData(); //????
+            $args['_vars'] = $v->getData();
 
 
             if (
             if (
                 null !== $v->preview
                 null !== $v->preview
@@ -257,7 +257,7 @@ class Post extends Page
                 $this->user->usePoll
                 $this->user->usePoll
                 && $v->poll_enable
                 && $v->poll_enable
             ) {
             ) {
-                $topic->poll_type  = 1;
+                $topic->poll_type  = $v->poll['duration'] > 0 ? 1000 + $v->poll['duration'] : 1; // ???? перенести в модель poll?
                 $topic->poll_time  = $now;
                 $topic->poll_time  = $now;
                 $topic->poll_term  = $v->poll['hide_result'] ? $this->c->config->i_poll_term : 0;
                 $topic->poll_term  = $v->poll['hide_result'] ? $this->c->config->i_poll_term : 0;
 #                $topic->poll_votes = ;
 #                $topic->poll_votes = ;

+ 9 - 0
app/Models/Pages/PostFormTrait.php

@@ -204,6 +204,15 @@ trait PostFormTrait
                 'checked'  => (bool) ($vars['poll_enable'] ?? false),
                 'checked'  => (bool) ($vars['poll_enable'] ?? false),
                 'disabled' => $vars['pollNoEdit'] ?? null,
                 'disabled' => $vars['pollNoEdit'] ?? null,
             ];
             ];
+            $fieldset["poll[duration]"] = [
+                'type'     => 'number',
+                'min'      => '0',
+                'max'      => '366',
+                'value'    => $vars['poll']['duration'] ?? 0,
+                'caption'  => __('Poll duration label'),
+                'info'     => __('Poll duration help'),
+                'disabled' => $vars['pollNoEdit'] ?? null,
+            ];
             $fieldset['poll[hide_result]'] = [
             $fieldset['poll[hide_result]'] = [
                 'type'     => 'checkbox',
                 'type'     => 'checkbox',
                 'label'    => __('Hide poll results up to %s voters', $term),
                 'label'    => __('Hide poll results up to %s voters', $term),

+ 1 - 0
app/Models/Pages/PostValidatorTrait.php

@@ -203,6 +203,7 @@ trait PostValidatorTrait
                 'check_poll'  => [$this, 'vCheckPoll'],
                 'check_poll'  => [$this, 'vCheckPoll'],
             ])->addRules([
             ])->addRules([
                 'poll_enable'      => 'checkbox|check_poll',
                 'poll_enable'      => 'checkbox|check_poll',
+                'poll.duration'    => 'integer|min:0|max:366',
                 'poll.hide_result' => 'checkbox',
                 'poll.hide_result' => 'checkbox',
                 'poll.question.*'  => 'string:trim|max:255',
                 'poll.question.*'  => 'string:trim|max:255',
                 'poll.type.*'      => 'integer|min:1|max:' . $this->c->config->i_poll_max_fields,
                 'poll.type.*'      => 'integer|min:1|max:' . $this->c->config->i_poll_max_fields,

+ 29 - 4
app/Models/Poll/Model.php

@@ -73,6 +73,25 @@ class Model extends DataModel
         return ! empty($this->c->DB->query($query, $vars)->fetch());
         return ! empty($this->c->DB->query($query, $vars)->fetch());
     }
     }
 
 
+    /**
+     * Статус открытости
+     */
+    protected function getisOpen(): bool
+    {
+        return $this->tid < 1
+            || (
+                0 === $this->parent->closed
+                && ($type = $this->parent->poll_type) > 0
+                && (
+                    1 === $type
+                    || (
+                        $type > 1000
+                        && ($type - 1000) * 86400 > \time() - $this->parent->poll_time
+                    )
+                )
+            );
+    }
+
     /**
     /**
      * Статус возможности голосовать
      * Статус возможности голосовать
      */
      */
@@ -80,8 +99,7 @@ class Model extends DataModel
     {
     {
         return $this->tid > 0
         return $this->tid > 0
             && $this->c->user->usePoll
             && $this->c->user->usePoll
-            && 0 === $this->parent->closed
-            && 1 === $this->parent->poll_type // ???? добавить ограничение по времени?
+            && $this->isOpen
             && ! $this->userVoted;
             && ! $this->userVoted;
     }
     }
 
 
@@ -90,8 +108,15 @@ class Model extends DataModel
      */
      */
     protected function getcanSeeResult(): bool
     protected function getcanSeeResult(): bool
     {
     {
-        return ($this->c->user->usePoll || '1' == $this->c->config->b_poll_guest)
-            && (0 === $this->parent->poll_term || $this->parent->poll_term < $this->parent->poll_votes);
+        return (
+                $this->c->user->usePoll
+                || '1' == $this->c->config->b_poll_guest
+            )
+            && (
+                0 === $this->parent->poll_term
+                || $this->parent->poll_term < $this->parent->poll_votes
+                || ! $this->isOpen
+            );
     }
     }
 
 
     /**
     /**

+ 2 - 2
app/lang/en/admin_options.po

@@ -433,13 +433,13 @@ msgid "Poll edit time label"
 msgstr "Edit time"
 msgstr "Edit time"
 
 
 msgid "Poll edit time help"
 msgid "Poll edit time help"
-msgstr "Poll editing time (in minutes). <b>0 removes restrictions.</b>"
+msgstr "Poll editing time (in minutes). Set to 0 to disable."
 
 
 msgid "Hidden voices label"
 msgid "Hidden voices label"
 msgstr "Hidden voices"
 msgstr "Hidden voices"
 
 
 msgid "Hidden voices help"
 msgid "Hidden voices help"
-msgstr "The number of votes before which you can hide the poll results. <b>Set in the poll.</b>"
+msgstr "The number of votes before which you can hide the poll results. Set in the poll."
 
 
 msgid "Result for guest label"
 msgid "Result for guest label"
 msgstr "Result for guest"
 msgstr "Result for guest"

+ 6 - 0
app/lang/en/poll.po

@@ -62,3 +62,9 @@ msgstr "You can choose up to %s answers."
 
 
 msgid "In total voted: %s"
 msgid "In total voted: %s"
 msgstr "In total voted: %s"
 msgstr "In total voted: %s"
+
+msgid "Poll duration label"
+msgstr "Duration"
+
+msgid "Poll duration help"
+msgstr "Duration of the poll (in days). Set to 0 to disable."

+ 2 - 2
app/lang/ru/admin_options.po

@@ -433,13 +433,13 @@ msgid "Poll edit time label"
 msgstr "Время редактирования"
 msgstr "Время редактирования"
 
 
 msgid "Poll edit time help"
 msgid "Poll edit time help"
-msgstr "Время редактирования опроса (в минутах). <b>0 снимает ограничения.</b>"
+msgstr "Время редактирования опроса (в минутах). 0 снимает ограничения."
 
 
 msgid "Hidden voices label"
 msgid "Hidden voices label"
 msgstr "Скрытые голоса"
 msgstr "Скрытые голоса"
 
 
 msgid "Hidden voices help"
 msgid "Hidden voices help"
-msgstr "Число голосов, до набора которых можно скрыть результаты опроса. <b>Включается в опросе.</b>"
+msgstr "Число голосов, до набора которых можно скрыть результаты опроса. Включается в опросе."
 
 
 msgid "Result for guest label"
 msgid "Result for guest label"
 msgstr "Результат для гостя"
 msgstr "Результат для гостя"

+ 6 - 0
app/lang/ru/poll.po

@@ -62,3 +62,9 @@ msgstr "Можете выбрать до %s ответов."
 
 
 msgid "In total voted: %s"
 msgid "In total voted: %s"
 msgstr "Проголосовало: %s"
 msgstr "Проголосовало: %s"
+
+msgid "Poll duration label"
+msgstr "Длительность"
+
+msgid "Poll duration help"
+msgstr "Продолжительность опроса (в днях). 0 снимает ограничения."