1 <?php
2 
3 use dokuwiki\Extension\AdminPlugin;
4 
5 /**
6  * Popularity Feedback Plugin
7  *
8  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
9  * @author     Andreas Gohr <andi@splitbrain.org>
10  */
11 class admin_plugin_popularity extends AdminPlugin
12 {
13     /** @var helper_plugin_popularity */
14     protected $helper;
15     protected $sentStatus;
16 
17     /**
18      * admin_plugin_popularity constructor.
19      */
20     public function __construct()
21     {
22         $this->helper = $this->loadHelper('popularity', false);
23     }
24 
25     /**
26      * return prompt for admin menu
27      * @param $language
28      * @return string
29      */
30     public function getMenuText($language)
31     {
32         return $this->getLang('name');
33     }
34 
35     /**
36      * return sort order for position in admin menu
37      */
38     public function getMenuSort()
39     {
40         return 2000;
41     }
42 
43     /**
44      * Accessible for managers
45      */
46     public function forAdminOnly()
47     {
48         return false;
49     }
50 
51 
52     /**
53      * handle user request
54      */
55     public function handle()
56     {
57         global $INPUT;
58 
59         //Send the data
60         if ($INPUT->has('data')) {
61             $this->sentStatus = $this->helper->sendData($INPUT->str('data'));
62             if ($this->sentStatus === '') {
63                 //Update the last time we sent the data
64                 touch($this->helper->popularityLastSubmitFile);
65             }
66             //Deal with the autosubmit option
67             $this->enableAutosubmit($INPUT->has('autosubmit'));
68         }
69     }
70 
71     /**
72      * Enable or disable autosubmit
73      * @param bool $enable If TRUE, it will enable autosubmit. Else, it will disable it.
74      */
75     protected function enableAutosubmit($enable)
76     {
77         if ($enable) {
78             io_saveFile($this->helper->autosubmitFile, ' ');
79         } else {
80             @unlink($this->helper->autosubmitFile);
81         }
82     }
83 
84     /**
85      * Output HTML form
86      */
87     public function html()
88     {
89         global $INPUT;
90 
91         if (! $INPUT->has('data')) {
92             echo $this->locale_xhtml('intro');
93             //If there was an error the last time we tried to autosubmit, warn the user
94             if ($this->helper->isAutoSubmitEnabled()) {
95                 if (file_exists($this->helper->autosubmitErrorFile)) {
96                     echo $this->getLang('autosubmitError');
97                     echo io_readFile($this->helper->autosubmitErrorFile);
98                 }
99             }
100             flush();
101             echo $this->buildForm('server');
102             //Print the last time the data was sent
103             $lastSent = $this->helper->lastSentTime();
104             if ($lastSent !== 0) {
105                 echo $this->getLang('lastSent') . ' ' . datetime_h($lastSent);
106             }
107         } elseif ($this->sentStatus === '') {
108             //If we successfully send the data
109             echo $this->locale_xhtml('submitted');
110         } else {
111             //If we failed to submit the data, try directly with the browser
112             echo $this->getLang('submissionFailed') . $this->sentStatus . '<br />';
113             echo $this->getLang('submitDirectly');
114             echo $this->buildForm('browser', $INPUT->str('data'));
115         }
116     }
117 
118 
119     /**
120      * Build the form which presents the data to be sent
121      * @param string $submissionMode How is the data supposed to be sent? (may be: 'browser' or 'server')
122      * @param string $data   The popularity data, if it has already been computed. NULL otherwise.
123      * @return string The form, as an html string
124      */
125     protected function buildForm($submissionMode, $data = null)
126     {
127         $url = ($submissionMode === 'browser' ? $this->helper->submitUrl : script());
128         if (is_null($data)) {
129             $data = $this->helper->gatherAsString();
130         }
131 
132         $form = '<form method="post" action="' . $url  . '" accept-charset="utf-8">'
133             . '<fieldset style="width: 60%;">'
134             . '<textarea class="edit" rows="10" cols="80" readonly="readonly" name="data">'
135             . $data
136             . '</textarea><br />';
137 
138         //If we submit via the server, we give the opportunity to suscribe to the autosubmission option
139         if ($submissionMode !== 'browser') {
140             $form .= '<label for="autosubmit">'
141                 . '<input type="checkbox" name="autosubmit" id="autosubmit" '
142                 . ($this->helper->isAutosubmitEnabled() ? 'checked' : '' )
143                 . '/> ' . $this->getLang('autosubmit') . '<br />'
144                 . '</label>'
145                 . '<input type="hidden" name="do" value="admin" />'
146                 . '<input type="hidden" name="page" value="popularity" />';
147         }
148         $form .= '<button type="submit">' . $this->getLang('submit') . '</button>'
149             . '</fieldset>'
150             . '</form>';
151         return $form;
152     }
153 }
154