1<?php 2 3if(!defined('DOKU_INC')) die(); 4 5class action_plugin_publish_approve extends DokuWiki_Action_Plugin { 6 7 /** 8 * @var helper_plugin_publish 9 */ 10 private $helper; 11 12 function __construct() { 13 $this->helper = plugin_load('helper', 'publish'); 14 } 15 16 function register(Doku_Event_Handler $controller) { 17 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array()); 18 } 19 20 function handle_io_write(Doku_Event &$event, $param) { 21 # This is the only hook I could find which runs on save, 22 # but late enough to have lastmod set (ACTION_ACT_PREPROCESS 23 # is too early) 24 global $ACT; 25 global $INPUT; 26 27 if ($ACT != 'show') { 28 return; 29 } 30 31 if (!$INPUT->has('publish_approve')) { 32 return; 33 } 34 35 if (!$this->helper->canApprove()) { 36 msg($this->getLang('wrong permissions to approve'), -1); 37 return; 38 } 39 40 $this->addApproval(); 41 return; 42 } 43 44 function addApproval() { 45 global $USERINFO; 46 global $ID; 47 global $INFO; 48 49 if (!$INFO['exists']) { 50 msg($this->getLang('cannot approve a non-existing revision'), -1); 51 return; 52 } 53 54 $approvalRevision = $this->helper->getRevision(); 55 $approvals = $this->helper->getApprovals(); 56 57 if (!isset($approvals[$approvalRevision])) { 58 $approvals[$approvalRevision] = array(); 59 } 60 61 $approvals[$approvalRevision][$INFO['client']] = array( 62 $INFO['client'], 63 $_SERVER['REMOTE_USER'], 64 $USERINFO['mail'], 65 time() 66 ); 67 68 $success = p_set_metadata($ID, array('approval' => $approvals), true, true); 69 if ($success) { 70 msg($this->getLang('version approved'), 1); 71 72 $data = array(); 73 $data['rev'] = $approvalRevision; 74 $data['id'] = $ID; 75 $data['approver'] = $_SERVER['REMOTE_USER']; 76 $data['approver_info'] = $USERINFO; 77 if ($this->getConf('send_mail_on_approve') && $this->helper->isRevisionApproved($approvalRevision)) { 78 /** @var action_plugin_publish_mail $mail */ 79 $mail = plugin_load('action','publish_mail'); 80 $mail->send_approve_mail(); 81 } 82 trigger_event('PLUGIN_PUBLISH_APPROVE', $data); 83 } else { 84 msg($this->getLang('cannot approve error'), -1); 85 } 86 87 send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&')); 88 } 89 90} 91