xref: /plugin/recommend/action.php (revision 70f4a43540fdf426571ddb807d625a4c9a577649)
14654e4deSAdrian Lang<?php
24654e4deSAdrian Langrequire_once DOKU_PLUGIN . 'action.php';
3*70f4a435SAdrian Langrequire_once DOKU_INC . 'inc/form.php';
44654e4deSAdrian Lang
54654e4deSAdrian Langclass action_plugin_recommend extends DokuWiki_Action_Plugin {
64654e4deSAdrian Lang    function getInfo(){
74654e4deSAdrian Lang        return confToHash(dirname(__FILE__).'/INFO.txt');
84654e4deSAdrian Lang    }
94654e4deSAdrian Lang
104654e4deSAdrian Lang    function register($controller) {
11*70f4a435SAdrian Lang        foreach (array('ACTION_ACT_PREPROCESS', 'AJAX_CALL_UNKNOWN',
12*70f4a435SAdrian Lang                       'TPL_ACT_UNKNOWN') as $event) {
134654e4deSAdrian Lang            $controller->register_hook($event, 'BEFORE', $this, '_handle');
144654e4deSAdrian Lang        }
154654e4deSAdrian Lang    }
164654e4deSAdrian Lang
174654e4deSAdrian Lang    function _handle($event, $param) {
18*70f4a435SAdrian Lang        if (!in_array($event->data, array('recommend', 'plugin_recommend')) ||
19*70f4a435SAdrian Lang            !isset($_SERVER['REMOTE_USER'])) {
204654e4deSAdrian Lang            return;
214654e4deSAdrian Lang        }
224654e4deSAdrian Lang
234654e4deSAdrian Lang        $event->preventDefault();
244654e4deSAdrian Lang
254654e4deSAdrian Lang        if ($event->name === 'ACTION_ACT_PREPROCESS') {
264654e4deSAdrian Lang            return;
274654e4deSAdrian Lang        }
284654e4deSAdrian Lang
294654e4deSAdrian Lang        $event->stopPropagation();
304654e4deSAdrian Lang
31*70f4a435SAdrian Lang        if ($_SERVER['REQUEST_METHOD'] == 'POST' &&
32*70f4a435SAdrian Lang            isset($_POST['sectok']) &&
33*70f4a435SAdrian Lang            !($err = $this->_handle_post())) {
34*70f4a435SAdrian Lang            if ($event->name === 'AJAX_CALL_UNKNOWN') {
35*70f4a435SAdrian Lang                /* To signal success to AJAX. */
36*70f4a435SAdrian Lang                header('HTTP/1.1 204 No Content');
374654e4deSAdrian Lang                return;
384654e4deSAdrian Lang            }
39*70f4a435SAdrian Lang            echo 'Thanks for recommending our site.';
40*70f4a435SAdrian Lang            return;
41*70f4a435SAdrian Lang        }
42*70f4a435SAdrian Lang        /* To display msgs even via AJAX. */
43*70f4a435SAdrian Lang        echo ' ';
44*70f4a435SAdrian Lang        if (isset($err)) {
45*70f4a435SAdrian Lang            msg($err, -1);
46*70f4a435SAdrian Lang        }
474654e4deSAdrian Lang        $this->_show_form();
484654e4deSAdrian Lang    }
494654e4deSAdrian Lang
504654e4deSAdrian Lang    function _show_form() {
514654e4deSAdrian Lang        $name    = isset($_REQUEST['r_name']) ? $_REQUEST['r_name'] : '';
524654e4deSAdrian Lang        $mail    = isset($_REQUEST['r_email']) ? $_REQUEST['r_email'] : '';
534654e4deSAdrian Lang        $comment = isset($_REQUEST['comment']) ? $_REQUEST['r_comment'] : '';
54*70f4a435SAdrian Lang        if (isset($_REQUEST['id'])) {
55*70f4a435SAdrian Lang            $id  = $_REQUEST['id'];
56*70f4a435SAdrian Lang        } else {
57*70f4a435SAdrian Lang            global $ID;
58*70f4a435SAdrian Lang            if (!isset($ID)) {
59*70f4a435SAdrian Lang                throw new Exception('Unknown page');
60*70f4a435SAdrian Lang            }
61*70f4a435SAdrian Lang            $id  = $ID;
62*70f4a435SAdrian Lang        }
634654e4deSAdrian Lang        $form = new Doku_Form('recommend_plugin', '?do=recommend');
64*70f4a435SAdrian Lang        $form->addHidden('id', $id);
65*70f4a435SAdrian Lang        $form->startFieldset('Recommend page “' . hsc($id). '”');
664654e4deSAdrian Lang        $form->addElement(form_makeTextField('r_name', $name, 'Recipient name'));
67*70f4a435SAdrian Lang        $form->addElement(form_makeTextField('r_email', $mail,
68*70f4a435SAdrian Lang                                             'Recipient email address'));
694654e4deSAdrian Lang        $form->addElement('<label><span>'.hsc('Additional comment').'</span>'.
70*70f4a435SAdrian Lang                          '<textarea name="comment" rows="3" cols="10" ' .
71*70f4a435SAdrian Lang                          'class="edit">' . $comment . '</textarea></label>');
724654e4deSAdrian Lang        $form->addElement(form_makeButton('submit', '', 'Send recommendation'));
734654e4deSAdrian Lang        $form->printForm();
744654e4deSAdrian Lang    }
754654e4deSAdrian Lang
764654e4deSAdrian Lang    function _handle_post() {
772cdbf48fSAdrian Lang        /* Validate input. */
784654e4deSAdrian Lang        if (!isset($_POST['r_email']) || !mail_isvalid($_POST['r_email'])) {
79*70f4a435SAdrian Lang            return 'Invalid email address submitted';
804654e4deSAdrian Lang        }
814654e4deSAdrian Lang        $email = $_POST['r_email'];
824654e4deSAdrian Lang
834654e4deSAdrian Lang        if (!isset($_POST['id']) || !page_exists($_POST['id'])) {
84*70f4a435SAdrian Lang            return 'Invalid page submitted';
854654e4deSAdrian Lang        }
864654e4deSAdrian Lang        $page = $_POST['id'];
874654e4deSAdrian Lang
884654e4deSAdrian Lang        if (!isset($_POST['r_name']) || trim($_POST['r_name']) === '') {
89*70f4a435SAdrian Lang            return 'Invalid name submitted';
904654e4deSAdrian Lang        }
914654e4deSAdrian Lang        $name = $_POST['r_name'];
924654e4deSAdrian Lang
934654e4deSAdrian Lang        $comment = isset($_POST['comment']) ? $_POST['comment'] : null;
944654e4deSAdrian Lang
952cdbf48fSAdrian Lang        /* Prepare mail text. */
964654e4deSAdrian Lang        $mailtext = file_get_contents(dirname(__FILE__).'/template.txt');
974654e4deSAdrian Lang
984654e4deSAdrian Lang        global $conf;
994654e4deSAdrian Lang        global $USERINFO;
1004654e4deSAdrian Lang        foreach (array('NAME' => $name,
1014654e4deSAdrian Lang                       'PAGE' => $page,
1024654e4deSAdrian Lang                       'SITE' => $conf['title'],
1034654e4deSAdrian Lang                       'URL'  => wl($page, '', true),
1044654e4deSAdrian Lang                       'COMMENT' => $comment,
1054654e4deSAdrian Lang                       'AUTHOR' => $USERINFO['name']) as $var => $val) {
1064654e4deSAdrian Lang            $mailtext = str_replace('@' . $var . '@', $val, $mailtext);
1074654e4deSAdrian Lang        }
1082cdbf48fSAdrian Lang        /* Limit to two empty lines. */
1094654e4deSAdrian Lang        $mailtext = preg_replace('/\n{4,}/', "\n\n\n", $mailtext);
1104654e4deSAdrian Lang
1112cdbf48fSAdrian Lang        /* Perform stuff. */
1124654e4deSAdrian Lang        mail_send($email, 'Page recommendation', $mailtext);
1132cdbf48fSAdrian Lang        $this->_log($USERINFO['mail'], $email);
114*70f4a435SAdrian Lang        return false;
1154654e4deSAdrian Lang    }
1164654e4deSAdrian Lang
1172cdbf48fSAdrian Lang    function _log($sender, $receiver) {
1182cdbf48fSAdrian Lang        global $ID;
1192cdbf48fSAdrian Lang        $path = DOKU_INC.'data/cache/recommend';
1202cdbf48fSAdrian Lang        if (!file_exists($path)) {
1212cdbf48fSAdrian Lang            mkdir($path);
1222cdbf48fSAdrian Lang        }
1232cdbf48fSAdrian Lang        file_put_contents($path . '/' . date('Y-m') . '.log', date('r') . ': ' .
1242cdbf48fSAdrian Lang                          "“${sender}” recommended “${ID}” to “${receiver}”.",
1252cdbf48fSAdrian Lang                          FILE_APPEND);
1262cdbf48fSAdrian Lang    }
1274654e4deSAdrian Lang}
128