register_hook($event, 'BEFORE', $this, '_handle'); } } function _handle($event, $param) { global $INFO; if($event->data != 'recommend' || !isset($INFO['userinfo'])) { return; } $event->preventDefault(); if ($event->name === 'ACTION_ACT_PREPROCESS') { return; } $event->stopPropagation(); if($_SERVER['REQUEST_METHOD'] == 'POST' && $this->_handle_post()) { return; } $this->_show_form(); } function _show_form() { global $ID; $name = isset($_REQUEST['r_name']) ? $_REQUEST['r_name'] : ''; $mail = isset($_REQUEST['r_email']) ? $_REQUEST['r_email'] : ''; $comment = isset($_REQUEST['comment']) ? $_REQUEST['r_comment'] : ''; $form = new Doku_Form('recommend_plugin', '?do=recommend'); $form->addHidden('id', $ID); $form->startFieldset('Recommend page “' . hsc($ID). '”'); $form->addElement(form_makeTextField('r_name',$name,'Recipient name')); $form->addElement(form_makeTextField('r_email',$mail,'Recipient email address')); $form->addElement(''); $form->addElement(form_makeButton('submit','', 'Send recommendation')); $form->printForm(); } function _handle_post() { if(!isset($_POST['r_email']) || !mail_isvalid($_POST['r_email'])) { msg('Invalid email address submitted', -1); return false; } $email = $_POST['r_email']; if(!isset($_POST['id']) || !page_exists($_POST['id'])) { msg('Invalid page submitted', -1); return false; } $page = $_POST['id']; if(!isset($_POST['r_name']) || trim($_POST['r_name']) === '') { msg('Invalid name submitted', -1); return false; } $name = $_POST['r_name']; $comment = isset($_POST['comment']) ? $_POST['comment'] : null; $mailtext = file_get_contents(dirname(__FILE__).'/template.txt'); global $conf; global $USERINFO; foreach(array('NAME' => $name, 'PAGE' => $page, 'SITE' => $conf['title'], 'URL' => wl($page, '', true), 'COMMENT' => $comment, 'AUTHOR' => $USERINFO['name']) as $var => $val) { $mailtext = str_replace('@' . $var . '@', $val, $mailtext); } $mailtext = preg_replace('/\n{4,}/', "\n\n\n", $mailtext); mail_send($email, 'Page recommendation', $mailtext); echo 'Thanks for recommending our site.'; return true; } }