com web/wiki: Update plugin: dokuwiki/lib/plugins/doodle/doodle _template.php dokuwiki/lib/plugins/doodle/lang/de/lang. php
dokuwiki/lib/plugins/doodle/lang/en/lang.php dokuwiki /lib/plugins/doodle/script.js dokuwiki/lib/plugins/doodle/s tyle.css
dokuwiki/lib/plugins/doodle/syntax.php

From: Date: Mon, 16 Dec 2013 18:01:30 +0000
Subject: com web/wiki: Update plugin: dokuwiki/lib/plugins/doodle/doodle _template.php dokuwiki/lib/plugins/doodle/lang/de/lang. php
dokuwiki/lib/plugins/doodle/lang/en/lang.php dokuwiki /lib/plugins/doodle/script.js dokuwiki/lib/plugins/doodle/s tyle.css
dokuwiki/lib/plugins/doodle/syntax.php
Groups: php.webmaster 
Request: Send a blank email to php-webmaster+get-17675@lists.php.net to get a copy of this message
Commit: 8a77e300a74953e4332346031ce38af9837eb63e Author: Hannes Magnusson <bjori@mongodb.com> Mon, 16 Dec 2013 10:01:30 -0800 Parents: 5226c7ce6acdc64a4f0f7a16a33d531be08702d3 Branches: master Link: http://git.php.net/?p=web/wiki.git;a=commitdiff;h=8a77e300a74953e4332346031ce38af9837eb63e Log: Update plugin Changed paths: M dokuwiki/lib/plugins/doodle/doodle_template.php M dokuwiki/lib/plugins/doodle/lang/de/lang.php M dokuwiki/lib/plugins/doodle/lang/en/lang.php M dokuwiki/lib/plugins/doodle/script.js M dokuwiki/lib/plugins/doodle/style.css M dokuwiki/lib/plugins/doodle/syntax.php

diff --git a/dokuwiki/lib/plugins/doodle/doodle_template.php b/dokuwiki/lib/plugins/doodle/doodle_template.php index 4aa6369..a3e55b4 100755 --- a/dokuwiki/lib/plugins/doodle/doodle_template.php +++ b/dokuwiki/lib/plugins/doodle/doodle_template.php @@ -6,6 +6,8 @@ * doodle_tempalte.php is simply included and evaled from syntax.php * The variable $template will be inherited from syntax.php and can be used here. */ + global $ID; + $template = $this->template; $c = count($template['choices']); ?> @@ -13,6 +15,7 @@ <!-- Doodle Plugin --> <form action="<?php echo wl() ?>" method="post" name="doodle__form" id="<?php echo $template['formId'] ?>" accept-charset="utf-8" > +<input type="hidden" name="sectok" value="<?php echo getSecurityToken() ?>" /> <input type="hidden" name="do" value="show" > <input type="hidden" name="id" value="<?php echo $ID ?>" > <input type="hidden" name="formId" value="<?php echo $template['formId'] ?>" > @@ -28,9 +31,9 @@ </tr> <tr class="row1"> <th class="col0"><?php echo $lang['fullname'] ?></th> - <?php foreach ($template['choices'] as $choice) { ?> +<?php foreach ($template['choices'] as $choice) { ?> <td class="centeralign"><?php echo $choice ?></td> - <?php } ?> +<?php } ?> </tr> <?php foreach ($template['doodleData'] as $fullname => $userData) { ?> @@ -47,9 +50,9 @@ <!-- Results / sum per column --> <tr> <th class="rightalign"><b><?php echo $template['result'] ?></b></th> - <?php for ($col = 0; $col < $c; $col++) { ?> +<?php for ($col = 0; $col < $c; $col++) { ?> <th class="centeralign"><b><?php echo $template['count'][$col] ?></b></th> - <?php } ?> +<?php } ?> </tr> <?php @@ -65,7 +68,6 @@ </tr> <?php } ?> - </tbody> </table> @@ -74,4 +76,3 @@ - diff --git a/dokuwiki/lib/plugins/doodle/lang/de/lang.php b/dokuwiki/lib/plugins/doodle/lang/de/lang.php index 9ff881d..423125b 100644 --- a/dokuwiki/lib/plugins/doodle/lang/de/lang.php +++ b/dokuwiki/lib/plugins/doodle/lang/de/lang.php @@ -1,18 +1,23 @@ <?php +// headers and buttons $lang['btn_vote'] = 'Abstimmen'; $lang['btn_change'] = 'Stimme &Auml;ndern'; $lang['count'] = 'Summe:'; $lang['final_result'] = 'Ergebnis:'; $lang['edit'] = '&auml;ndern'; +// info messages +$lang['poll_closed'] = 'Abstimmung beendet'; +$lang['vote_saved'] = 'Stimme wurde gez&auml;hlt.'; +$lang['vote_deleted'] = 'Stimme wurde gel&ouml;scht.'; + // error messages -$lang['must_be_logged_in'] = 'Du must eingeloggt sein um abstimmen zu d&uuml;rfen!'; -$lang['ip_has_already_voted'] = 'Diese IP (<code>%s</code>) hat bereits abgestimmt!'; +$lang['dont_have_name'] = 'Du hast vergessen deinen Namen anzugeben!'; +$lang['must_be_logged_in'] = 'Du must eingeloggt sein um abzustimmen!'; +$lang['ip_has_already_voted'] = 'Die IP (<code>%s</code>) hat bereits abgestimmt!'; +$lang['select_one_option'] = 'Bitte w&auml;hle eine Option.'; $lang['you_voted_already'] = 'Du hast bereits abgestimmt!'; -$lang['not_allowed_to_change'] = 'Du darfst diese Stimme nicht ver&auml;ndern!'; -$lang['vote_saved'] = 'Deine Stimme wurde gez&auml;hlt.'; -$lang['vote_deleted'] = 'Stimme gel&ouml;scht.'; - +$lang['not_allowed_to_change'] = 'Du darfst diese Stimme nicht &auml;ndern!'; ?> diff --git a/dokuwiki/lib/plugins/doodle/lang/en/lang.php b/dokuwiki/lib/plugins/doodle/lang/en/lang.php index 6cafcd4..39f2388 100644 --- a/dokuwiki/lib/plugins/doodle/lang/en/lang.php +++ b/dokuwiki/lib/plugins/doodle/lang/en/lang.php @@ -1,18 +1,24 @@ <?php +// headers and buttons $lang['btn_vote'] = 'Vote'; $lang['btn_change'] = 'Change Vote'; $lang['count'] = 'Count:'; $lang['final_result'] = 'Final result:'; $lang['edit'] = 'edit'; +// info messages +$lang['poll_closed'] = 'This poll has been closed.'; +$lang['vote_saved'] = 'Vote has been saved.'; +$lang['vote_deleted'] = 'Vote has been deleted.'; + // error messages +$lang['dont_have_name'] = 'You forgot to provide your name!'; $lang['must_be_logged_in'] = 'You must be logged in to vote!'; $lang['ip_has_already_voted'] = 'The IP (<code>%s</code>) has already voted!'; +$lang['select_one_option'] = 'Please select one option.'; $lang['you_voted_already'] = 'You voted already!'; $lang['not_allowed_to_change'] = 'You are not allowed to change this vote!'; -$lang['vote_saved'] = 'Vote has been saved.'; -$lang['vote_deleted'] = 'Vote has been deleted.'; ?> diff --git a/dokuwiki/lib/plugins/doodle/script.js b/dokuwiki/lib/plugins/doodle/script.js index a967fcf..56a2024 100644 --- a/dokuwiki/lib/plugins/doodle/script.js +++ b/dokuwiki/lib/plugins/doodle/script.js @@ -1,7 +1,5 @@ /** - * JavsScript methods - * for the dokuwiki - * doodle plugin + * JavsScript methods for the dokuwiki doodle plugin * * @author Robert Rackl <spam11@doogie.de> * @date January 2011 @@ -13,10 +11,10 @@ * @param fullname name of the entry that should be edited */ function editEntry(formId, fullname) { - var doodleForm = document.getElementById(formId); - doodleForm.formId = formId; - doodleForm.edit__entry.value = fullname; - doodleForm.submit(); + var doodleForm = document.getElementById(formId); + doodleForm.formId = formId; + doodleForm.edit__entry.value = fullname; + doodleForm.submit(); } /** @@ -25,8 +23,8 @@ function editEntry(formId, fullname) { * @param fullname name of the entry that should be edited */ function deleteEntry(formId, fullname) { - var doodleForm = document.getElementById(formId); - doodleForm.formId = formId; - doodleForm.delete__entry.value = fullname; - doodleForm.submit(); -} + var doodleForm = document.getElementById(formId); + doodleForm.formId = formId; + doodleForm.delete__entry.value = fullname; + doodleForm.submit(); +} \ No newline at end of file diff --git a/dokuwiki/lib/plugins/doodle/style.css b/dokuwiki/lib/plugins/doodle/style.css index 7aee3f7..0db25ee 100644 --- a/dokuwiki/lib/plugins/doodle/style.css +++ b/dokuwiki/lib/plugins/doodle/style.css @@ -7,3 +7,23 @@ div.dokuwiki table.inline td.notokay { background-color: #fcc; text-align: center; } + +.doodle__edit { + background:url(../../../lib/images/pencil.png) top right no-repeat; + width: 20px; + height: 20px; + padding: 0 0 0 10px; + cursor: pointer; + border: 0; + color: rgba(0, 0, 0, 0); +} + +.doodle__delete { + background:url(../../../lib/images/del.png) top right no-repeat; + width: 20px; + height: 20px; + padding: 0 0 0 10px; + cursor: pointer; + border: 0; + color: rgba(0, 0, 0, 0); +} diff --git a/dokuwiki/lib/plugins/doodle/syntax.php b/dokuwiki/lib/plugins/doodle/syntax.php index 8dce672..eb75dba 100755 --- a/dokuwiki/lib/plugins/doodle/syntax.php +++ b/dokuwiki/lib/plugins/doodle/syntax.php @@ -7,6 +7,7 @@ * @author Robert Rackl <wiki@doogie.de> * @author Jonathan Tsai <tryweb@ichiayi.com> * @author Esther Brunner <wikidesign@gmail.com> + * @author Romain Coltel <aorimn@gmail.com> */ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); @@ -20,31 +21,33 @@ require_once(DOKU_PLUGIN.'syntax.php'); * <pre> * <doodle * title="What do you like best?" - * auth="none|ip|login" + * auth="none|ip|user" * adminUsers="user1|user2" * adminGroups="group1|group2" - * voteType="single|multi" - * closed="true|false" - * > + * voteType="default|multi" + * closed="true|false" > * * Option 1 * * Option 2 **some wikimarkup** \\ is __allowed__! * * Option 3 - * </doodle> + * </doodle> * </pre> * - * Required: a title and at least one option. + * Only required parameteres are a title and at least one option. * * <h3>Parameters</h3> * auth="none" - everyone can vote with any username, (IPs will be recorded but not checked) * auth="ip" - everyone can vote with any username, votes will be tracked by IP to prevent duplicate voting * auth="user" - users must login with a valid dokuwiki user. This has the advantage, that users can * edit their vote ("change their mind") later on. - * adminUser/adminGroups - Logged in adminUsers or members of the adminGroups can always edit and delete any entry. * - * If type="single", then each user can choose only one option (round checkboxes will be shown). - * If type="multi", then each user can choose multiple options (square checkboxes will be shown). + * <h3>adminUsers and adminGroups</h3> + * "|"-separated list of adminUsers or adminGroups, whose members can always edit and delete <b>any</b> entry. * - * If the doodle is closed, then no one can vote anymore. The result will still be shown on the page. + * <h3>Vote Type</h3> + * default - user can vote for exactly one option (round checkboxes will be shown) + * multi - can choose any number of options, including none (square checkboxes will be shown). + * + * If closed=="true", then no one can vote anymore. The result will still be shown on the page. * * The doodle's data is saved in '<dokuwiki>/data/meta/title_of_vote.doodle'. The filename is the (masked) title. * This has the advantage that you can move your doodle to another page, without loosing the data. @@ -58,7 +61,7 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin /** * return info about this plugin */ - function getInfo(){ + function getInfo() { return array( 'author' => 'Robert Rackl', 'email' => 'wiki@doogie.de', @@ -76,7 +79,7 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin /** * Connect pattern to lexer */ - function connectTo($mode){ + function connectTo($mode) { $this->Lexer->addSpecialPattern('<doodle\b.*?>.+?</doodle>', $mode, 'plugin_doodle'); } @@ -90,11 +93,13 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin //----- default parameter settings $params = array( - 'title' => 'Default title', - 'auth' => self::AUTH_NONE, - 'adminGroup' => '', - 'voteTyp' => 'single', - 'closed' => FALSE + 'title' => 'Default title', + 'auth' => self::AUTH_NONE, + 'adminUsers' => '', + 'adminGroups' => '', + 'adminMail' => null, + 'voteType' => 'default', + 'closed' => FALSE ); //----- parse parameteres into name="value" pairs @@ -120,15 +125,29 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin } else if (strcmp($name, "ADMINGROUPS") == 0) { $params['adminGroups'] = $value; + } else + if (strcmp($name, "ADMINMAIL") == 0) { + // check for valid email adress + if (preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})$/', $value)) { + $params['adminMail'] = $value; + } } else if (strcmp($name, "VOTETYPE") == 0) { - $params['allowMultiVote'] = strcasecmp($value, "multi") == 0; - } else - if (strcmp($name, "AUTOGROUP") == 0) { - $params['autoGroup'] = $value; + if (preg_match('/default|multi/', $value)) { + $params['voteType'] = $value; + } + } else + if ((strcmp($name, "CLOSEON") == 0) && + (($timestamp = strtotime($value)) !== false) && + (time() > $timestamp) ) + { + $params['closed'] = 1; } else if (strcmp($name, "CLOSED") == 0) { $params['closed'] = strcasecmp($value, "TRUE") == 0; + } else + if (strcmp($name, "SORT") == 0) { + $params['sort'] = $value; // make it possible to sort by time } } @@ -143,7 +162,7 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin /** * parse list of choices * explode, trim and encode html entities, - * emtpy choices will be skipped. + * empty choices will be skipped. */ function parseChoices($choiceStr) { $choices = array(); @@ -183,8 +202,11 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin global $conf; global $INFO; // needed for users real name global $ACT; // action from $_REQUEST['do'] + global $REV; // to not allow any action if it's an old page global $ID; // name of current page + //debout('data in render', $data); + $this->params = $data['params']; $this->choices = $data['choices']; $this->doodle = array(); @@ -197,16 +219,12 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin if (count($this->choices) > 0) { $this->doodle = $this->readDoodleDataFromFile(); } - //FIXME: count($choices) may be different from number of choices in $doodle data! - $can_vote = false; - if (count(array_intersect(array('admin', 'phpcvs', 'voting'), $INFO['userinfo']['grps'])) > 0) { - $can_vote = true; - } + //FIXME: count($choices) may be different from number of choices in $doodle data! - // ----- FORM ACTIONS (only allowed when showing the page, not when editing) ----- + // ----- FORM ACTIONS (only allowed when showing the most recent version of the page, not when editing) ----- $formId = 'doodle__form__'.cleanID($this->params['title']); - if ($ACT == 'show' && $_REQUEST['formId'] == $formId && $can_vote) { + if ($ACT == 'show' && $_REQUEST['formId'] == $formId && $REV == false) { // ---- cast new vote if (!empty($_REQUEST['cast__vote'])) { $this->castVote(); @@ -229,7 +247,7 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin * The $doodle array maps fullnames (with html special characters masked) to an array of userData for this vote. * Each sub array contains: * 'username' loggin name if use was logged in - * 'choices' is an array of column indexes where user has voted !!! + * 'choices' is an (variable length!) array of column indexes where user has voted * 'ip' ip of voting machine * 'time' unix timestamp when vote was casted @@ -260,28 +278,31 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin $this->template['result'] = $this->params['closed'] ? $this->getLang('final_result') : $this->getLang('count'); $this->template['doodleData'] = array(); // this will be filled with some HTML snippets $this->template['formId'] = $formId; + if ($this->params['closed']) { + $this->template['msg'] = $this->getLang('poll_closed'); + } for($col = 0; $col < count($this->choices); $col++) { $this->template['count'][$col] = 0; foreach ($this->doodle as $fullname => $userData) { if (!empty($userData['username'])) { - $this->template['doodleData']["$fullname"]['username'] = '&nbsp('.$userData['username'].')'; + $this->template['doodleData']["$fullname"]['username'] = '&nbsp;('.$userData['username'].')'; } if (in_array($col, $userData['choices'])) { $timeLoc = strftime($conf['dformat'], $userData['time']); // localized time of vote $this->template['doodleData']["$fullname"]['choice'][$col] = - '<td class="okay"><img src="'.DOKU_BASE.'lib/images/success.png" title="'.$timeLoc.'"></td>'; + '<td class="centeralign" style="background-color:#AFA"><img src="'.DOKU_BASE.'lib/images/success.png" title="'.$timeLoc.'"></td>'; $this->template['count']["$col"]++; } else { $this->template['doodleData']["$fullname"]['choice'][$col] = - '<td class="notokay">&nbsp;</td>'; + '<td class="centeralign" style="background-color:#FCC">&nbsp;</td>'; } } } // ---- add edit link to editable entries foreach($this->doodle as $fullname => $userData) { - if ($ACT == 'show' && + if ($ACT == 'show' && $REV == false && $this->isAllowedToEditEntry($fullname)) { // the javascript source of these functions is in script.js @@ -296,9 +317,9 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin } // ---- calculates if user is allowed to vote - $this->template['inputTR'] = ($can_vote?$this->getInputTR():''); + $this->template['inputTR'] = $this->getInputTR(); - // ----- I am using PHP as a templating enginge here. + // ----- I am using PHP as a templating engine here. //debout("Template", $this->template); ob_start(); include 'doodle_template.php'; // the array $template can be used inside doodle_template.php! @@ -316,13 +337,20 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin function castVote() { $fullname = hsc(trim($_REQUEST['fullname'])); $selected_indexes = $_REQUEST['selected_indexes']; // may not be set when all checkboxes are deseleted. - if (empty($selected_indexes)) { - $selected_indexes = array(); - } - + if (empty($fullname)) { + $this->template['msg'] = $this->getLang('dont_have_name'); return; } + if (empty($selected_indexes)) { + if ($this->params['voteType'] == 'multi') { + $selected_indexes = array(); //allow empty vote only if voteType is "multi" + } else { + $this->template['msg'] = $this->getLang('select_one_option'); + return; + } + } + //---- check if user is allowed to vote, according to 'auth' parameter //if AUTH_USER, then user must be logged in @@ -364,16 +392,24 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin $this->doodle["$fullname"]['ip'] = $_SERVER['REMOTE_ADDR']; $this->writeDoodleDataToFile(); $this->template['msg'] = $this->getLang('vote_saved'); + + //send mail if $params['adminMail'] is filled + if (!empty($this->params['adminMail'])) { + $subj = "[DoodlePlugin] Vote casted by $fullname (".$this->doodle["$fullname"]['username'].')'; + $body = 'User has casted a vote'."\n\n".print_r($this->doodle["$fullname"], true); + mail_send($this->params['adminMail'], $subj, $body, $conf['mailfrom']); + } } - /** ACTION: start editing an entry */ + /** + * ACTION: start editing an entry + * expects fullname of voter in request param edit__entry + */ function startEditEntry() { $fullname = hsc(trim($_REQUEST['edit__entry'])); - if (empty($fullname) || - !isset($this->doodle["$fullname"]) || - !$this->isAllowedToEditEntry($fullname) ) return; + if (!$this->isAllowedToEditEntry($fullname)) return; - $this->template['editEntry']['fullname'] = $fullname; + $this->template['editEntry']['fullname'] = $fullname; $this->template['editEntry']['selected_indexes'] = $this->doodle["$fullname"]['choices']; // $fullname will be shown in the input row } @@ -381,9 +417,7 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin /** ACTION: delete an entry completely */ function deleteEntry() { $fullname = hsc(trim($_REQUEST['delete__entry'])); - if (empty($fullname) || - !isset($this->doodle["$fullname"]) || - !$this->isAllowedToEditEntry($fullname) ) return; + if (!$this->isAllowedToEditEntry($fullname)) return; unset($this->doodle["$fullname"]); $this->writeDoodleDataToFile(); @@ -393,13 +427,16 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin // ---------- HELPER METHODS ----------- /** - * check if the currently logged in user is allowed to edit a given entry - * @return true if user is loggedin and in the list of admins or $entryFullname is his own entry + * check if the currently logged in user is allowed to edit a given entry. + * @return true if entryFullname is the entry of the current user, or + * the currently logged in user is in the list of admins */ function isAllowedToEditEntry($entryFullname) { global $INFO; global $auth; - + + if (empty($entryFullname)) return false; + if (!isset($this->doodle["$entryFullname"])) return false; if ($this->params['closed']) return false; if (!$this->isLoggedIn()) return false; @@ -411,9 +448,9 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin } //check adminUsers - if (!empty($this->params['adminUsers']) && - stripos($this->params['adminUsers'], $_SERVER['REMOTE_USER']) !== false) { - return true; + if (!empty($this->params['adminUsers'])) { + $adminUsers = explode('|', $this->params['adminUsers']); + return in_array($_SERVER['REMOTE_USER'], $adminUsers); } //check own entry @@ -424,14 +461,14 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin * return true if the user is currently logged in */ function isLoggedIn() { - global $conf; - global $auth; - return $conf['useacl'] && $auth && $_SERVER['REMOTE_USER']; + // see http://www.dokuwiki.org/devel:environment + global $INFO; + return isset($INFO['userinfo']); } /** * calculate the input table row: - * + * @return complete <TR> tags for input row and information message * May return empty string, if user is not allowed to vote * * If user is logged in he is always allowed edit his own entry. ("change his mind") @@ -466,7 +503,8 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin $TR .= '<td class="rightalign">'; if ($fullname) { if ($editMode) $TR .= $this->getLang('edit').':&nbsp;'; - $TR .= hsc($fullname).'<input type="hidden" name="fullname" value="'.$fullname.'">'; + $TR .= $fullname.'&nbsp;('.$_SERVER['REMOTE_USER'].')'; + $TR .= '<input type="hidden" name="fullname" value="'.$fullname.'">'; } else { $TR .= '<input type="text" name="fullname" value="">'; } @@ -477,20 +515,26 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin if ($editMode && in_array($col, $this->template['editEntry']['selected_indexes']) ) { $selected = 'checked="checked"'; } - if ($this->params['allowMultiVote']) { - $TR .= '<td class="centeralign"><input type="checkbox" name="selected_indexes[]" value="'."$col\" $selected></td>"; + $TR .= '<td class="centeralign">'; + + if ($this->params['voteType'] == 'multi') { + $inputType = "checkbox"; } else { - $TR .= '<td class="centeralign"><input type="radio" name="selected_indexes[]" value="'."$col\" $selected></td>"; + $inputType = "radio"; } + $TR .= '<input type="'.$inputType.'" name="selected_indexes[]" value="'.$col.'"'; + $TR .= $selected.">"; + $TR .= '</TD>'; } $TR .= '</tr>'; $TR .= '<tr>'; $TR .= ' <td colspan="'.($c+1).'" class="centeralign">'; + if ($editMode) { - $TR .= ' <input type="submit" value=" '.$this->getLang('btn_change').' " name="change__vote" class="button">'; + $TR .= ' <input type="submit" id="voteButton" value=" '.$this->getLang('btn_change').' " name="change__vote" class="button">'; } else { - $TR .= ' <input type="submit" value=" '.$this->getLang('btn_vote').' " name="cast__vote" class="button">'; + $TR .= ' <input type="submit" id="voteButton" value=" '.$this->getLang('btn_vote').' " name="cast__vote" class="button">'; } $TR .= ' </td>'; $TR .= '</tr>'; @@ -514,9 +558,16 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin //sanitize: $doodle[$fullnmae]['choices'] must be at least an array // This may happen if user deselected all choices foreach($doodle as $fullname => $userData) { - if (!is_array($doodle["$fullname"]['choices'])) { - $doodle["$fullname"]['choices'] = array(); - } + if (!is_array($doodle["$fullname"]['choices'])) { + $doodle["$fullname"]['choices'] = array(); + } + } + + if (strcmp($this->params['sort'], 'time') == 0) { + debout("sorting by time"); + uasort($doodle, 'cmpEntryByTime'); + } else { + uksort($doodle, "strnatcasecmp"); // case insensitive "natural" sort } //debout("read from $dfile", $doodle); return $doodle; @@ -528,7 +579,7 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin function writeDoodleDataToFile() { if (!is_array($this->doodle)) return; $dfile = $this->getDoodleFileName(); - ksort($this->doodle, SORT_LOCALE_STRING); // sort by localized fullnames + uksort($this->doodle, "strnatcasecmp"); // case insensitive "natural" sort io_saveFile($dfile, serialize($this->doodle)); //debout("written to $dfile", $doodle); return $dfile; @@ -548,10 +599,17 @@ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin return $dfile; } + } // end of class // ----- static functions +/** compare two doodle entries by the time of vote */ +function cmpEntryByTime($a, $b) { + return strcmp($a['time'], $b['time']); +} + + function debout() { if (func_num_args() == 1) { msg('<pre>'.hsc(print_r(func_get_arg(0), true)).'</pre>');
« previous php.webmaster (#17675) next »