xref: /plugin/recommend/action.php (revision b8b86b6cc38a68c8eb36a4b455118cdd5062ca1b)
14654e4deSAdrian Lang<?php
24654e4deSAdrian Lang
34654e4deSAdrian Langclass action_plugin_recommend extends DokuWiki_Action_Plugin {
44654e4deSAdrian Lang
52937e9a5SAnna Dabrowska    public function register(Doku_Event_Handler $controller) {
670f4a435SAdrian Lang        foreach (array('ACTION_ACT_PREPROCESS', 'AJAX_CALL_UNKNOWN',
770f4a435SAdrian Lang                       'TPL_ACT_UNKNOWN') as $event) {
82937e9a5SAnna Dabrowska            $controller->register_hook($event, 'BEFORE', $this, 'handle');
94654e4deSAdrian Lang        }
1045cf09e9SAnna Dabrowska        $controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'handleMenu');
114654e4deSAdrian Lang    }
124654e4deSAdrian Lang
132937e9a5SAnna Dabrowska    public function handle(Doku_Event $event) {
142937e9a5SAnna Dabrowska        if ($event->data !=='recommend') {
154654e4deSAdrian Lang            return;
164654e4deSAdrian Lang        }
174654e4deSAdrian Lang
184654e4deSAdrian Lang        $event->preventDefault();
194654e4deSAdrian Lang
204654e4deSAdrian Lang        if ($event->name === 'ACTION_ACT_PREPROCESS') {
214654e4deSAdrian Lang            return;
224654e4deSAdrian Lang        }
234654e4deSAdrian Lang
244654e4deSAdrian Lang        $event->stopPropagation();
254654e4deSAdrian Lang
26945a672eSAnna Dabrowska        global $INPUT;
27945a672eSAnna Dabrowska
28945a672eSAnna Dabrowska        // early output to trigger display msgs even via AJAX.
2970f4a435SAdrian Lang        echo ' ';
30945a672eSAnna Dabrowska        tpl_flush();
31945a672eSAnna Dabrowska        if ($INPUT->server->str('REQUEST_METHOD') === 'POST') {
32945a672eSAnna Dabrowska            try {
33945a672eSAnna Dabrowska                $this->handlePost();
34945a672eSAnna Dabrowska                if ($event->name === 'AJAX_CALL_UNKNOWN') {
35945a672eSAnna Dabrowska                    $this->ajaxSuccess(); // To signal success to AJAX.
36945a672eSAnna Dabrowska                } else {
37945a672eSAnna Dabrowska                    msg($this->getLang('thanks'), 1);
3870f4a435SAdrian Lang                }
39945a672eSAnna Dabrowska                return; // we're done here
40945a672eSAnna Dabrowska            } catch (\Exception $e) {
41945a672eSAnna Dabrowska                msg($e->getMessage(), -1);
42945a672eSAnna Dabrowska            }
43945a672eSAnna Dabrowska        }
44945a672eSAnna Dabrowska
452937e9a5SAnna Dabrowska        echo $this->getForm();
464654e4deSAdrian Lang    }
474654e4deSAdrian Lang
4845cf09e9SAnna Dabrowska    public function handleMenu(Doku_Event $event)
4945cf09e9SAnna Dabrowska    {
5045cf09e9SAnna Dabrowska        if ($event->data['view'] !== 'page') return;
5145cf09e9SAnna Dabrowska
5245cf09e9SAnna Dabrowska        array_splice($event->data['items'], -1, 0, [new \dokuwiki\plugin\recommend\MenuItem()]);
5345cf09e9SAnna Dabrowska    }
542937e9a5SAnna Dabrowska    /**
552937e9a5SAnna Dabrowska     * Returns rendered form
562937e9a5SAnna Dabrowska     *
572937e9a5SAnna Dabrowska     * @return string
582937e9a5SAnna Dabrowska     */
592937e9a5SAnna Dabrowska    protected function getForm()
602937e9a5SAnna Dabrowska    {
612937e9a5SAnna Dabrowska        global $INPUT;
622937e9a5SAnna Dabrowska
632937e9a5SAnna Dabrowska        $id = getID(); // we may run in AJAX context
642937e9a5SAnna Dabrowska        if ($id === '') throw new \RuntimeException('No ID given');
652937e9a5SAnna Dabrowska
662937e9a5SAnna Dabrowska        $form = new \dokuwiki\Form\Form([
672937e9a5SAnna Dabrowska            'action' => wl($id, ['do' => 'recommend'], false, '&'),
68945a672eSAnna Dabrowska            'id' => 'plugin__recommend',
692937e9a5SAnna Dabrowska        ]);
702937e9a5SAnna Dabrowska        $form->setHiddenField('id', $id); // we need it for the ajax call
712937e9a5SAnna Dabrowska
72*b8b86b6cSAnna Dabrowska        /** @var helper_plugin_recommend_assignment $helper */
73*b8b86b6cSAnna Dabrowska        $helper = plugin_load('helper', 'recommend_assignment');
74*b8b86b6cSAnna Dabrowska        $template = $helper->loadMatchingTemplate();
75*b8b86b6cSAnna Dabrowska
762937e9a5SAnna Dabrowska        if ($INPUT->server->has('REMOTE_USER')) {
77e596e22bSAdrian Lang            global $USERINFO;
782937e9a5SAnna Dabrowska            $form->setHiddenField('s_name', $USERINFO['name']);
792937e9a5SAnna Dabrowska            $form->setHiddenField('s_email', $USERINFO['mail']);
80e596e22bSAdrian Lang        } else {
812937e9a5SAnna Dabrowska            $form->addTextInput('s_name', $this->getLang('yourname'))->addClass('edit');
822937e9a5SAnna Dabrowska            $form->addTextInput('s_email', $this->getLang('youremailaddress'))->addClass('edit');
83e596e22bSAdrian Lang        }
84e596e22bSAdrian Lang
85*b8b86b6cSAnna Dabrowska        $recipientEmails = $template['user'] ?? '';
86*b8b86b6cSAnna Dabrowska        $message = $template['message'] ?? '';
87*b8b86b6cSAnna Dabrowska        $form->addTextInput('r_email', $this->getLang('recipients'))->addClass('edit')->val($recipientEmails);
882937e9a5SAnna Dabrowska        $form->addTextInput('subject', $this->getLang('subject'))->addClass('edit');
89*b8b86b6cSAnna Dabrowska        $form->addTextarea('comment', $this->getLang('message'))
90*b8b86b6cSAnna Dabrowska            ->attr('rows', '8')
91*b8b86b6cSAnna Dabrowska            ->attr('cols', '40')
92*b8b86b6cSAnna Dabrowska            ->addClass('edit')
93*b8b86b6cSAnna Dabrowska            ->val($message);
942937e9a5SAnna Dabrowska
952937e9a5SAnna Dabrowska        /** @var helper_plugin_captcha $captcha */
962937e9a5SAnna Dabrowska        $captcha = plugin_load('helper', 'captcha');
972937e9a5SAnna Dabrowska        if ($captcha) $form->addHTML($captcha->getHTML());
982937e9a5SAnna Dabrowska
992937e9a5SAnna Dabrowska        $form->addTagOpen('div')->addClass('buttons');
1002937e9a5SAnna Dabrowska        $form->addButton('submit', $this->getLang('send'))->attr('type', 'submit');
1012937e9a5SAnna Dabrowska        $form->addTagClose('div');
1022937e9a5SAnna Dabrowska
1032937e9a5SAnna Dabrowska        return $form->toHTML();
1044654e4deSAdrian Lang    }
1054654e4deSAdrian Lang
1062937e9a5SAnna Dabrowska    /**
107945a672eSAnna Dabrowska     * Handles form submission
1082937e9a5SAnna Dabrowska     *
1092937e9a5SAnna Dabrowska     * @throws Exception
1102937e9a5SAnna Dabrowska     */
111945a672eSAnna Dabrowska    protected function handlePost()
1122937e9a5SAnna Dabrowska    {
113945a672eSAnna Dabrowska        global $INPUT;
114945a672eSAnna Dabrowska
1152937e9a5SAnna Dabrowska        if (!checkSecurityToken()) {
1162937e9a5SAnna Dabrowska            throw new \Exception('Security token did not match');
1172937e9a5SAnna Dabrowska        }
1182937e9a5SAnna Dabrowska
119945a672eSAnna Dabrowska        // Captcha plugin
120e596e22bSAdrian Lang        $helper = null;
121e596e22bSAdrian Lang        if (@is_dir(DOKU_PLUGIN . 'captcha')) $helper = plugin_load('helper','captcha');
122e596e22bSAdrian Lang        if (!is_null($helper) && $helper->isEnabled() && !$helper->check()) {
123945a672eSAnna Dabrowska            throw new \Exception($this->getLang('err_captcha'));
124e596e22bSAdrian Lang        }
125e596e22bSAdrian Lang
1262cdbf48fSAdrian Lang        /* Validate input. */
1272937e9a5SAnna Dabrowska        $recipient = $INPUT->str('r_email');
1282937e9a5SAnna Dabrowska        if (!$recipient || !mail_isvalid($recipient)) {
129945a672eSAnna Dabrowska            throw new \Exception($this->getLang('err_recipient'));
1304654e4deSAdrian Lang        }
131e596e22bSAdrian Lang
132e596e22bSAdrian Lang        if (!isset($_POST['s_email']) || !mail_isvalid($_POST['s_email'])) {
133945a672eSAnna Dabrowska            throw new \Exception($this->getLang('err_sendermail'));
134e596e22bSAdrian Lang        }
135c18a4184SAdrian Lang        if (!isset($_POST['s_name']) || trim($_POST['s_name']) === '') {
136945a672eSAnna Dabrowska            throw new \Exception($this->getLang('err_sendername'));
137c18a4184SAdrian Lang        }
138c18a4184SAdrian Lang        $s_name = $_POST['s_name'];
139c18a4184SAdrian Lang        $sender = $s_name . ' <' . $_POST['s_email'] . '>';
1404654e4deSAdrian Lang
1412937e9a5SAnna Dabrowska        $id = $INPUT->filter('cleanID')->str('id');
1422937e9a5SAnna Dabrowska        if ($id === '' || !page_exists($id)) throw new \Exception($this->getLang('err_page'));
1434654e4deSAdrian Lang
1442937e9a5SAnna Dabrowska        $comment = $INPUT->str('comment');
1454654e4deSAdrian Lang
1462cdbf48fSAdrian Lang        /* Prepare mail text. */
1474654e4deSAdrian Lang        $mailtext = file_get_contents(dirname(__FILE__).'/template.txt');
1484654e4deSAdrian Lang
1494654e4deSAdrian Lang        global $conf;
1502937e9a5SAnna Dabrowska        foreach (array('NAME' => $recipient,
1512937e9a5SAnna Dabrowska                       'PAGE' => $id,
1524654e4deSAdrian Lang                       'SITE' => $conf['title'],
1532937e9a5SAnna Dabrowska                       'URL'  => wl($id, '', true),
1544654e4deSAdrian Lang                       'COMMENT' => $comment,
155c18a4184SAdrian Lang                       'AUTHOR' => $s_name) as $var => $val) {
1564654e4deSAdrian Lang            $mailtext = str_replace('@' . $var . '@', $val, $mailtext);
1574654e4deSAdrian Lang        }
1582cdbf48fSAdrian Lang        /* Limit to two empty lines. */
1594654e4deSAdrian Lang        $mailtext = preg_replace('/\n{4,}/', "\n\n\n", $mailtext);
1604654e4deSAdrian Lang
1612937e9a5SAnna Dabrowska        $this->sendMail($recipient, $mailtext, $sender);
162945a672eSAnna Dabrowska
1632937e9a5SAnna Dabrowska        /** @var helper_plugin_recommend_log $log */
1642937e9a5SAnna Dabrowska        $log = new helper_plugin_recommend_log(date('Y-m'));
1652937e9a5SAnna Dabrowska        $log->writeEntry($id, $sender, $recipient, $comment);
1664654e4deSAdrian Lang    }
1672937e9a5SAnna Dabrowska
1682937e9a5SAnna Dabrowska    /**
1692937e9a5SAnna Dabrowska     * @param string $recipient
1702937e9a5SAnna Dabrowska     * @param string $mailtext
1712937e9a5SAnna Dabrowska     * @param string $sender
1722937e9a5SAnna Dabrowska     * @return void
1732937e9a5SAnna Dabrowska     */
1742937e9a5SAnna Dabrowska    protected function sendMail($recipient, $mailtext, $sender)
1752937e9a5SAnna Dabrowska    {
1762937e9a5SAnna Dabrowska        global $INPUT;
1772937e9a5SAnna Dabrowska
1782937e9a5SAnna Dabrowska        $mailer = new Mailer();
1792937e9a5SAnna Dabrowska        $mailer->bcc($recipient);
1802937e9a5SAnna Dabrowska        $mailer->from($sender);
1812937e9a5SAnna Dabrowska
1822937e9a5SAnna Dabrowska        $subject = $INPUT->str('subject');
1832937e9a5SAnna Dabrowska        $mailer->subject($subject);
1842937e9a5SAnna Dabrowska        $mailer->setBody($mailtext);
1852937e9a5SAnna Dabrowska        $mailer->send();
1862937e9a5SAnna Dabrowska    }
187945a672eSAnna Dabrowska
188945a672eSAnna Dabrowska    /**
189945a672eSAnna Dabrowska     * show success message in ajax mode
190945a672eSAnna Dabrowska     */
191945a672eSAnna Dabrowska    protected function ajaxSuccess()
192945a672eSAnna Dabrowska    {
193945a672eSAnna Dabrowska        echo '<form id="plugin__recommend" accept-charset="utf-8" method="post" action="?do=recommend">';
194945a672eSAnna Dabrowska        echo '<div class="no">';
195945a672eSAnna Dabrowska        echo '<span class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 50px 0;"></span>';
196945a672eSAnna Dabrowska        echo '<p>' . $this->getLang('done') . '</p>';
197945a672eSAnna Dabrowska        echo '<button type="reset" class="button">' . $this->getLang('close') . '</button>';
198945a672eSAnna Dabrowska        echo '</div>';
199945a672eSAnna Dabrowska        echo '</form>';
200945a672eSAnna Dabrowska    }
2014654e4deSAdrian Lang}
202