14654e4deSAdrian Lang<?php 24654e4deSAdrian Lang 34654e4deSAdrian Langclass action_plugin_recommend extends DokuWiki_Action_Plugin { 44654e4deSAdrian Lang 5*2937e9a5SAnna 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) { 8*2937e9a5SAnna Dabrowska $controller->register_hook($event, 'BEFORE', $this, 'handle'); 94654e4deSAdrian Lang } 104654e4deSAdrian Lang } 114654e4deSAdrian Lang 12*2937e9a5SAnna Dabrowska public function handle(Doku_Event $event) { 13*2937e9a5SAnna Dabrowska if ($event->data !=='recommend') { 144654e4deSAdrian Lang return; 154654e4deSAdrian Lang } 164654e4deSAdrian Lang 174654e4deSAdrian Lang $event->preventDefault(); 184654e4deSAdrian Lang 194654e4deSAdrian Lang if ($event->name === 'ACTION_ACT_PREPROCESS') { 204654e4deSAdrian Lang return; 214654e4deSAdrian Lang } 224654e4deSAdrian Lang 234654e4deSAdrian Lang $event->stopPropagation(); 244654e4deSAdrian Lang 2570f4a435SAdrian Lang if ($_SERVER['REQUEST_METHOD'] == 'POST' && 2670f4a435SAdrian Lang isset($_POST['sectok']) && 2770f4a435SAdrian Lang !($err = $this->_handle_post())) { 2870f4a435SAdrian Lang if ($event->name === 'AJAX_CALL_UNKNOWN') { 2970f4a435SAdrian Lang /* To signal success to AJAX. */ 3070f4a435SAdrian Lang header('HTTP/1.1 204 No Content'); 314654e4deSAdrian Lang return; 324654e4deSAdrian Lang } 3370f4a435SAdrian Lang echo 'Thanks for recommending our site.'; 3470f4a435SAdrian Lang return; 3570f4a435SAdrian Lang } 3670f4a435SAdrian Lang /* To display msgs even via AJAX. */ 3770f4a435SAdrian Lang echo ' '; 3870f4a435SAdrian Lang if (isset($err)) { 3970f4a435SAdrian Lang msg($err, -1); 4070f4a435SAdrian Lang } 41*2937e9a5SAnna Dabrowska echo $this->getForm(); 424654e4deSAdrian Lang } 434654e4deSAdrian Lang 44*2937e9a5SAnna Dabrowska /** 45*2937e9a5SAnna Dabrowska * Returns rendered form 46*2937e9a5SAnna Dabrowska * 47*2937e9a5SAnna Dabrowska * @return string 48*2937e9a5SAnna Dabrowska */ 49*2937e9a5SAnna Dabrowska protected function getForm() 50*2937e9a5SAnna Dabrowska { 51*2937e9a5SAnna Dabrowska global $INPUT; 52*2937e9a5SAnna Dabrowska 53*2937e9a5SAnna Dabrowska $id = getID(); // we may run in AJAX context 54*2937e9a5SAnna Dabrowska if ($id === '') throw new \RuntimeException('No ID given'); 55*2937e9a5SAnna Dabrowska 56*2937e9a5SAnna Dabrowska $form = new \dokuwiki\Form\Form([ 57*2937e9a5SAnna Dabrowska 'action' => wl($id, ['do' => 'recommend'], false, '&'), 58*2937e9a5SAnna Dabrowska 'id' => 'recommend__plugin', 59*2937e9a5SAnna Dabrowska ]); 60*2937e9a5SAnna Dabrowska $form->setHiddenField('id', $id); // we need it for the ajax call 61*2937e9a5SAnna Dabrowska 62*2937e9a5SAnna Dabrowska if ($INPUT->server->has('REMOTE_USER')) { 63e596e22bSAdrian Lang global $USERINFO; 64*2937e9a5SAnna Dabrowska $form->setHiddenField('s_name', $USERINFO['name']); 65*2937e9a5SAnna Dabrowska $form->setHiddenField('s_email', $USERINFO['mail']); 66e596e22bSAdrian Lang } else { 67*2937e9a5SAnna Dabrowska $form->addTextInput('s_name', $this->getLang('yourname'))->addClass('edit'); 68*2937e9a5SAnna Dabrowska $form->addTextInput('s_email', $this->getLang('youremailaddress'))->addClass('edit'); 69e596e22bSAdrian Lang } 70e596e22bSAdrian Lang 71*2937e9a5SAnna Dabrowska $form->addTextInput('r_email', $this->getLang('recipients'))->addClass('edit'); 72*2937e9a5SAnna Dabrowska $form->addTextInput('subject', $this->getLang('subject'))->addClass('edit'); 73*2937e9a5SAnna Dabrowska $form->addTextarea('comment', $this->getLang('message'))->attr('rows', '8')->attr('cols', '10')->addClass('edit'); 74*2937e9a5SAnna Dabrowska 75*2937e9a5SAnna Dabrowska /** @var helper_plugin_captcha $captcha */ 76*2937e9a5SAnna Dabrowska $captcha = plugin_load('helper', 'captcha'); 77*2937e9a5SAnna Dabrowska if ($captcha) $form->addHTML($captcha->getHTML()); 78*2937e9a5SAnna Dabrowska 79*2937e9a5SAnna Dabrowska $form->addTagOpen('div')->addClass('buttons'); 80*2937e9a5SAnna Dabrowska $form->addButton('submit', $this->getLang('send'))->attr('type', 'submit'); 81*2937e9a5SAnna Dabrowska $form->addButton('reset', $this->getLang('cancel'))->attr('type', 'reset'); 82*2937e9a5SAnna Dabrowska $form->addTagClose('div'); 83*2937e9a5SAnna Dabrowska 84*2937e9a5SAnna Dabrowska return $form->toHTML(); 854654e4deSAdrian Lang } 864654e4deSAdrian Lang 87*2937e9a5SAnna Dabrowska /** 88*2937e9a5SAnna Dabrowska * Handles form submission and returns error state: error message or else false. 89*2937e9a5SAnna Dabrowska * 90*2937e9a5SAnna Dabrowska * @return string|false 91*2937e9a5SAnna Dabrowska * @throws Exception 92*2937e9a5SAnna Dabrowska */ 93*2937e9a5SAnna Dabrowska protected function _handle_post() 94*2937e9a5SAnna Dabrowska { 95*2937e9a5SAnna Dabrowska if (!checkSecurityToken()) { 96*2937e9a5SAnna Dabrowska throw new \Exception('Security token did not match'); 97*2937e9a5SAnna Dabrowska } 98*2937e9a5SAnna Dabrowska 99*2937e9a5SAnna Dabrowska global $INPUT; 100*2937e9a5SAnna Dabrowska 101e596e22bSAdrian Lang $helper = null; 102e596e22bSAdrian Lang if (@is_dir(DOKU_PLUGIN.'captcha')) $helper = plugin_load('helper','captcha'); 103e596e22bSAdrian Lang if (!is_null($helper) && $helper->isEnabled() && !$helper->check()) { 104e596e22bSAdrian Lang return 'Wrong captcha'; 105e596e22bSAdrian Lang } 106e596e22bSAdrian Lang 1072cdbf48fSAdrian Lang /* Validate input. */ 108*2937e9a5SAnna Dabrowska $recipient = $INPUT->str('r_email'); 109*2937e9a5SAnna Dabrowska if (!$recipient || !mail_isvalid($recipient)) { 110e596e22bSAdrian Lang return 'Invalid recipient email address submitted'; 1114654e4deSAdrian Lang } 112e596e22bSAdrian Lang 113e596e22bSAdrian Lang if (!isset($_POST['s_email']) || !mail_isvalid($_POST['s_email'])) { 114e596e22bSAdrian Lang return 'Invalid sender email address submitted'; 115e596e22bSAdrian Lang } 116c18a4184SAdrian Lang if (!isset($_POST['s_name']) || trim($_POST['s_name']) === '') { 117c18a4184SAdrian Lang return 'Invalid sender name submitted'; 118c18a4184SAdrian Lang } 119c18a4184SAdrian Lang $s_name = $_POST['s_name']; 120c18a4184SAdrian Lang $sender = $s_name . ' <' . $_POST['s_email'] . '>'; 1214654e4deSAdrian Lang 122*2937e9a5SAnna Dabrowska $id = $INPUT->filter('cleanID')->str('id'); 123*2937e9a5SAnna Dabrowska if ($id === '' || !page_exists($id)) throw new \Exception($this->getLang('err_page')); 1244654e4deSAdrian Lang 125*2937e9a5SAnna Dabrowska $comment = $INPUT->str('comment'); 1264654e4deSAdrian Lang 1272cdbf48fSAdrian Lang /* Prepare mail text. */ 1284654e4deSAdrian Lang $mailtext = file_get_contents(dirname(__FILE__).'/template.txt'); 1294654e4deSAdrian Lang 1304654e4deSAdrian Lang global $conf; 131*2937e9a5SAnna Dabrowska foreach (array('NAME' => $recipient, 132*2937e9a5SAnna Dabrowska 'PAGE' => $id, 1334654e4deSAdrian Lang 'SITE' => $conf['title'], 134*2937e9a5SAnna Dabrowska 'URL' => wl($id, '', true), 1354654e4deSAdrian Lang 'COMMENT' => $comment, 136c18a4184SAdrian Lang 'AUTHOR' => $s_name) as $var => $val) { 1374654e4deSAdrian Lang $mailtext = str_replace('@' . $var . '@', $val, $mailtext); 1384654e4deSAdrian Lang } 1392cdbf48fSAdrian Lang /* Limit to two empty lines. */ 1404654e4deSAdrian Lang $mailtext = preg_replace('/\n{4,}/', "\n\n\n", $mailtext); 1414654e4deSAdrian Lang 1422cdbf48fSAdrian Lang /* Perform stuff. */ 143*2937e9a5SAnna Dabrowska $this->sendMail($recipient, $mailtext, $sender); 144*2937e9a5SAnna Dabrowska /** @var helper_plugin_recommend_log $log */ 145*2937e9a5SAnna Dabrowska $log = new helper_plugin_recommend_log(date('Y-m')); 146*2937e9a5SAnna Dabrowska $log->writeEntry($id, $sender, $recipient, $comment); 147*2937e9a5SAnna Dabrowska 14870f4a435SAdrian Lang return false; 1494654e4deSAdrian Lang } 150*2937e9a5SAnna Dabrowska 151*2937e9a5SAnna Dabrowska /** 152*2937e9a5SAnna Dabrowska * @param string $recipient 153*2937e9a5SAnna Dabrowska * @param string $mailtext 154*2937e9a5SAnna Dabrowska * @param string $sender 155*2937e9a5SAnna Dabrowska * @return void 156*2937e9a5SAnna Dabrowska */ 157*2937e9a5SAnna Dabrowska protected function sendMail($recipient, $mailtext, $sender) 158*2937e9a5SAnna Dabrowska { 159*2937e9a5SAnna Dabrowska global $INPUT; 160*2937e9a5SAnna Dabrowska 161*2937e9a5SAnna Dabrowska $mailer = new Mailer(); 162*2937e9a5SAnna Dabrowska $mailer->bcc($recipient); 163*2937e9a5SAnna Dabrowska $mailer->from($sender); 164*2937e9a5SAnna Dabrowska 165*2937e9a5SAnna Dabrowska $subject = $INPUT->str('subject'); 166*2937e9a5SAnna Dabrowska $mailer->subject($subject); 167*2937e9a5SAnna Dabrowska $mailer->setBody($mailtext); 168*2937e9a5SAnna Dabrowska $mailer->send(); 169*2937e9a5SAnna Dabrowska } 1704654e4deSAdrian Lang} 171