diff options
author | Joey Hess <joeyh@joeyh.name> | 2018-11-26 13:14:21 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2018-11-26 13:14:21 -0400 |
commit | 97d921ca676d51279b9fdfbaa7501fc8ebf8a027 (patch) | |
tree | c0a822a7205bf701a71251fb39b4af2b1c91d684 /IkiWiki | |
parent | 11d5b5c5ea6193e6c6f219b021883a6424b23d38 (diff) | |
download | ikiwiki-97d921ca676d51279b9fdfbaa7501fc8ebf8a027.tar ikiwiki-97d921ca676d51279b9fdfbaa7501fc8ebf8a027.tar.gz |
poll: Added postvote and posttrail options for better multi-page polls.
Modern web users probably expect the poll to move on automatically to the
next question, and this allows for that behavior.
Note that bestlink() runs at vote time, which avoids needing to make the
page containing the poll depend on the page that sets up a trail, as the
current trail at vote time will be used.
This commit was sponsored by Eric Drechsel on Patreon.
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/poll.pm | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm index eb0e6ef04..734fe487e 100644 --- a/IkiWiki/Plugin/poll.pm +++ b/IkiWiki/Plugin/poll.pm @@ -69,6 +69,12 @@ sub preprocess (@) { $ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n"; $ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n"; $ret.="<input type=\"hidden\" name=\"choice\" value=\"$choice\" />\n"; + if (defined $params{postvote}) { + $ret.="<input type=\"hidden\" name=\"postvote\" value=\"".linkpage($params{postvote})."\" />\n"; + } + if (defined $params{posttrail}) { + $ret.="<input type=\"hidden\" name=\"posttrail\" value=\"".linkpage($params{posttrail})."\" />\n"; + } $ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n"; } $ret.="</p>\n<hr class=poll align=left width=\"$percent%\"/>\n"; @@ -112,13 +118,25 @@ sub sessioncgi ($$) { error("bad page name"); } + my $postvote=urlto($page); + if (defined $cgi->param('postvote') && length $cgi->param('postvote')) { + $postvote=urlto(bestlink($page, $cgi->param('postvote'))); + } + elsif (defined $cgi->param('posttrail') && length $cgi->param('posttrail')) { + my $trailname=bestlink($page, $cgi->param('posttrail')); + my $trailnext=$pagestate{$page}{trail}{item}{$trailname}[1]; + if (defined $trailnext) { + $postvote=urlto($trailnext); + } + } + # Did they vote before? If so, let them change their vote, # and check for dups. my $choice_param="poll_choice_${page}_$num"; my $oldchoice=$session->param($choice_param); if (defined $oldchoice && $oldchoice eq $choice) { # Same vote; no-op. - IkiWiki::redirect($cgi, urlto($page)); + IkiWiki::redirect($cgi, $postvote); exit; } @@ -149,7 +167,7 @@ sub sessioncgi ($$) { }; $content =~ s{(\\?)\[\[\Q$prefix\E\s+([^]]+)\s*\]\]}{$edit->($1, $2)}seg; - # Store their vote, update the page, and redirect to it. + # Store their vote, update the page, and redirect. writefile($pagesources{$page}, $config{srcdir}, $content); $session->param($choice_param, $choice); IkiWiki::cgi_savesession($session); @@ -174,8 +192,7 @@ sub sessioncgi ($$) { eval q{use CGI::Cookie}; error($@) if $@; my $cookie = CGI::Cookie->new(-name=> $session->name, -value=> $session->id); - print $cgi->redirect(-cookie => $cookie, - -url => urlto($page)); + print $cgi->redirect(-cookie => $cookie, -url => $postvote); exit; } } |