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