diff --git a/app/Models/Pages/Admin/Install.php b/app/Models/Pages/Admin/Install.php index a183bdb9..b3ea4568 100644 --- a/app/Models/Pages/Admin/Install.php +++ b/app/Models/Pages/Admin/Install.php @@ -803,7 +803,6 @@ class Install extends Admin 'poll_type' => ['SMALLINT UNSIGNED', false, 0], 'poll_time' => ['INT(10) UNSIGNED', false, 0], 'poll_term' => ['TINYINT', false, 0], - 'poll_votes' => ['INT(10) UNSIGNED', false, 0], ], 'PRIMARY KEY' => ['id'], 'INDEXES' => [ diff --git a/app/Models/Pages/Admin/Update.php b/app/Models/Pages/Admin/Update.php index f9320df2..80c7dcd4 100644 --- a/app/Models/Pages/Admin/Update.php +++ b/app/Models/Pages/Admin/Update.php @@ -19,7 +19,7 @@ class Update extends Admin { const PHP_MIN = '7.3.0'; - const LATEST_REV_WITH_DB_CHANGES = 28; + const LATEST_REV_WITH_DB_CHANGES = 29; const LOCK_NAME = 'lock_update'; const LOCk_TTL = 1800; @@ -1153,4 +1153,26 @@ class Update extends Admin return null; } + + /** + * rev.28 to rev.29 + */ + protected function stageNumber28(array $args): ?int + { + $query = 'UPDATE ::poll AS pl + SET pl.qna_text=CONCAT(pl.votes, \'|\', pl.qna_text) + WHERE pl.field_id=0'; + + $this->c->DB->query($query); + + $query = 'UPDATE ::poll AS pl, ::topics AS t + SET pl.votes=t.poll_votes + WHERE pl.field_id=0 AND pl.tid=t.id'; + + $this->c->DB->query($query); + + $this->c->DB->dropField('topics', 'poll_votes'); + + return null; + } } diff --git a/app/Models/Pages/Edit.php b/app/Models/Pages/Edit.php index 2f7c2fab..0fd4fb58 100644 --- a/app/Models/Pages/Edit.php +++ b/app/Models/Pages/Edit.php @@ -242,7 +242,6 @@ class Edit extends Page $topic->poll_term = $v->poll['hide_result'] ? ($topic->poll_term ?: $this->c->config->i_poll_term) : 0; -# $topic->poll_votes = 0; $poll->__question = $v->poll['question']; $poll->__answer = $v->poll['answer']; @@ -254,7 +253,6 @@ class Edit extends Page $topic->poll_type = 0; $topic->poll_time = 0; $topic->poll_term = 0; - $topic->poll_votes = 0; $this->c->polls->delete($poll); } @@ -263,7 +261,6 @@ class Edit extends Page $topic->poll_type = $v->poll['duration'] > 0 ? 1000 + $v->poll['duration'] : 1; // ???? перенести в модель poll? $topic->poll_time = \time(); $topic->poll_term = $v->poll['hide_result'] ? $this->c->config->i_poll_term : 0; - $topic->poll_votes = 0; $poll = $this->c->polls->create([ 'tid' => $topic->id, diff --git a/app/Models/Pages/Post.php b/app/Models/Pages/Post.php index c29d8b2b..4d64cca2 100644 --- a/app/Models/Pages/Post.php +++ b/app/Models/Pages/Post.php @@ -260,7 +260,6 @@ class Post extends Page $topic->poll_type = $v->poll['duration'] > 0 ? 1000 + $v->poll['duration'] : 1; // ???? перенести в модель poll? $topic->poll_time = $now; $topic->poll_term = $v->poll['hide_result'] ? $this->c->config->i_poll_term : 0; -# $topic->poll_votes = ; $poll = $this->c->polls->create([ 'tid' => $topic->id, diff --git a/app/Models/Pages/PostFormTrait.php b/app/Models/Pages/PostFormTrait.php index f92ca812..e4a98066 100644 --- a/app/Models/Pages/PostFormTrait.php +++ b/app/Models/Pages/PostFormTrait.php @@ -231,7 +231,7 @@ trait PostFormTrait $fieldset["poll[question][{$qid}]"] = [ 'type' => 'text', - 'maxlength' => '255', + 'maxlength' => '240', 'caption' => __('Question text label'), 'value' => $vars['poll']['question'][$qid] ?? null, 'disabled' => $vars['pollNoEdit'] ?? null, @@ -249,7 +249,7 @@ trait PostFormTrait for ($fid = 1; $fid <= $this->c->config->i_poll_max_fields; $fid++) { $fieldset["poll[answer][{$qid}][{$fid}]"] = [ 'type' => 'text', - 'maxlength' => '255', + 'maxlength' => '240', 'caption' => __('Answer %s label', $fid), 'value' => $vars['poll']['answer'][$qid][$fid] ?? null, 'disabled' => $vars['pollNoEdit'] ?? null, diff --git a/app/Models/Pages/PostValidatorTrait.php b/app/Models/Pages/PostValidatorTrait.php index 6676baf2..1029164b 100644 --- a/app/Models/Pages/PostValidatorTrait.php +++ b/app/Models/Pages/PostValidatorTrait.php @@ -205,9 +205,9 @@ trait PostValidatorTrait 'poll_enable' => 'checkbox|check_poll', 'poll.duration' => 'integer|min:0|max:366', 'poll.hide_result' => 'checkbox', - 'poll.question.*' => 'string:trim|max:255', + 'poll.question.*' => 'string:trim|max:240', 'poll.type.*' => 'integer|min:1|max:' . $this->c->config->i_poll_max_fields, - 'poll.answer.*.*' => 'string:trim|max:255', + 'poll.answer.*.*' => 'string:trim|max:240', ]); } diff --git a/app/Models/Poll/Load.php b/app/Models/Poll/Load.php index 7b36ef63..0bd3ab68 100644 --- a/app/Models/Poll/Load.php +++ b/app/Models/Poll/Load.php @@ -36,6 +36,7 @@ class Load extends Action 'answer' => [], 'vote' => [], 'type' => [], + 'total' => [], ]; while ($row = $stmt->fetch()) { @@ -43,8 +44,10 @@ class Load extends Action $fid = $row['field_id']; if (0 === $fid) { - $data['question'][$qid] = $row['qna_text']; - $data['type'][$qid] = $row['votes']; + list($type, $question) = \explode('|', $row['qna_text'], 2); + $data['question'][$qid] = $question; + $data['type'][$qid] = (int) $type; + $data['total'][$qid] = $row['votes']; } else { $data['answer'][$qid][$fid] = $row['qna_text']; $data['vote'][$qid][$fid] = $row['votes']; diff --git a/app/Models/Poll/Model.php b/app/Models/Poll/Model.php index 38612870..efe01d02 100644 --- a/app/Models/Poll/Model.php +++ b/app/Models/Poll/Model.php @@ -114,7 +114,7 @@ class Model extends DataModel ) && ( 0 === $this->parent->poll_term - || $this->parent->poll_term < $this->parent->poll_votes + || $this->parent->poll_term < \max($this->total) || ! $this->isOpen ); } diff --git a/app/Models/Poll/Save.php b/app/Models/Poll/Save.php index 29bb71bf..9c68b8ec 100644 --- a/app/Models/Poll/Save.php +++ b/app/Models/Poll/Save.php @@ -31,17 +31,14 @@ class Save extends Action $vars = [ ':tid' => $poll->tid, ]; - $queryIn = 'INSERT INTO ::poll (tid, question_id, field_id, qna_text, votes) - VALUES (?i:tid, ?i:qid, ?i:fid, ?s:qna, ?i:votes)'; - $queryU1 = 'UPDATE :poll - SET qna_text=?s:qna, votes=?i:votes - WHERE tid=?i:tid AND question_id=?i:qid AND field_id=?i:fid'; - $queryU1 = 'UPDATE :poll + $queryIn = 'INSERT INTO ::poll (tid, question_id, field_id, qna_text) + VALUES (?i:tid, ?i:qid, ?i:fid, ?s:qna)'; + $queryU1 = 'UPDATE ::poll SET qna_text=?s:qna WHERE tid=?i:tid AND question_id=?i:qid AND field_id=?i:fid'; - $queryD1 = 'DELETE FROM :poll + $queryD1 = 'DELETE FROM ::poll WHERE tid=?i:tid AND question_id IN(?ai:qids)'; - $queryD2 = 'DELETE FROM :poll + $queryD2 = 'DELETE FROM ::poll WHERE tid=?i:tid AND question_id=?i:qid AND field_id IN(?ai:fid)'; $modified = false; @@ -49,10 +46,9 @@ class Save extends Action $oldType = $old->type; foreach ($poll->question as $qid => $qna) { - $vars[':qid'] = $qid; - $vars[':fid'] = 0; - $vars[':qna'] = $qna; - $vars[':votes'] = $poll->type[$qid]; + $vars[':qid'] = $qid; + $vars[':fid'] = 0; + $vars[':qna'] = $poll->type[$qid] . '|' . $qna; if (! isset($oldQuestion[$qid])) { $modified = true; @@ -67,12 +63,11 @@ class Save extends Action $this->c->DB->exec($queryU1, $vars); } - $vars[':votes'] = 0; - $oldAnswer = $old->answer[$qid] ?? []; + $oldAnswer = $old->answer[$qid] ?? []; foreach ($poll->answer[$qid] as $fid => $qna) { - $vars[':fid'] = $fid; - $vars[':qna'] = $qna; + $vars[':fid'] = $fid; + $vars[':qna'] = $qna; if (! isset($oldAnswer[$fid])) { $modified = true; @@ -81,7 +76,7 @@ class Save extends Action } elseif ($qna !== $oldAnswer[$fid]) { $modified = true; - $this->c->DB->exec($queryU2, $vars); + $this->c->DB->exec($queryU1, $vars); } unset($oldAnswer[$fid]); @@ -126,22 +121,19 @@ class Save extends Action $vars = [ ':tid' => $poll->tid, ]; - $query = 'INSERT INTO ::poll (tid, question_id, field_id, qna_text, votes) - VALUES (?i:tid, ?i:qid, ?i:fid, ?s:qna, ?i:votes)'; + $query = 'INSERT INTO ::poll (tid, question_id, field_id, qna_text) + VALUES (?i:tid, ?i:qid, ?i:fid, ?s:qna)'; foreach ($poll->question as $qid => $qna) { - $vars[':qid'] = $qid; - $vars[':fid'] = 0; - $vars[':qna'] = $qna; - $vars[':votes'] = $poll->type[$qid]; + $vars[':qid'] = $poll->type[$qid] . '|' . $qid; + $vars[':fid'] = 0; + $vars[':qna'] = $qna; $this->c->DB->exec($query, $vars); - $vars[':votes'] = 0; - foreach ($poll->answer[$qid] as $fid => $qna) { - $vars[':fid'] = $fid; - $vars[':qna'] = $qna; + $vars[':fid'] = $fid; + $vars[':qna'] = $qna; $this->c->DB->exec($query, $vars); } diff --git a/app/bootstrap.php b/app/bootstrap.php index fc7e6640..9221c641 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -44,7 +44,7 @@ if ( } $c->PUBLIC_URL = $c->BASE_URL . $forkPublicPrefix; -$c->FORK_REVISION = 28; +$c->FORK_REVISION = 29; $c->START = $forkStart; $c->DIR_APP = __DIR__; $c->DIR_PUBLIC = $forkPublic; diff --git a/app/templates/layouts/poll.forkbb.php b/app/templates/layouts/poll.forkbb.php index e0e7711a..6ae0ef7f 100644 --- a/app/templates/layouts/poll.forkbb.php +++ b/app/templates/layouts/poll.forkbb.php @@ -33,7 +33,7 @@ @endforeach -

{!! __('In total voted: %s', 0) !!}

+

{!! __('In total voted: %s', $poll->total[$q]) !!}

@endforeach @if ($poll->canVote)