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(&$controller) { 17 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array()); 18 } 19 20 function handle_io_write(&$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 26 if ($ACT != 'show') { 27 return; 28 } 29 30 if (!isset($_REQUEST['publish_approve'])) { 31 return; 32 } 33 34 if (!$this->helper->canApprove()) { 35 msg($this->getLang('wrong permissions to approve'), -1); 36 return; 37 } 38 39 $this->addApproval(); 40 return; 41 } 42 43 function addApproval() { 44 global $USERINFO; 45 global $ID; 46 global $INFO; 47 48 if (!$INFO['exists']) { 49 msg($this->getLang('cannot approve a non-existing revision'), -1); 50 return; 51 } 52 53 $approvalRevision = $this->helper->getRevision(); 54 $approvals = $this->helper->getApprovals(); 55 56 if (!isset($approvals[$approvalRevision])) { 57 $approvals[$approvalRevision] = array(); 58 } 59 60 $approvals[$approvalRevision][$INFO['client']] = array( 61 $INFO['client'], 62 $_SERVER['REMOTE_USER'], 63 $USERINFO['mail'], 64 time() 65 ); 66 67 $success = p_set_metadata($ID, array('approval' => $approvals), true, true); 68 if ($success) { 69 msg($this->getLang('version approved'), 1); 70 71 $data = array(); 72 $data['rev'] = $approvalRevision; 73 $data['id'] = $ID; 74 $data['approver'] = $_SERVER['REMOTE_USER']; 75 $data['approver_info'] = $USERINFO; 76 trigger_event('PLUGIN_PUBLISH_APPROVE', $data); 77 } else { 78 msg($this->getLang('cannot approve error'), -1); 79 } 80 81 send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&')); 82 } 83 84} 85