11794c5faSDominik Eckelmann<?php 21794c5faSDominik Eckelmann 31794c5faSDominik Eckelmannif(!defined('DOKU_INC')) die(); 41794c5faSDominik Eckelmann 51794c5faSDominik Eckelmannclass action_plugin_publish_approve extends DokuWiki_Action_Plugin { 61794c5faSDominik Eckelmann 7248339c4SDominik Eckelmann /** 8248339c4SDominik Eckelmann * @var helper_plugin_publish 9248339c4SDominik Eckelmann */ 101794c5faSDominik Eckelmann private $helper; 111794c5faSDominik Eckelmann 121794c5faSDominik Eckelmann function __construct() { 131794c5faSDominik Eckelmann $this->helper = plugin_load('helper', 'publish'); 141794c5faSDominik Eckelmann } 151794c5faSDominik Eckelmann 165ccce1abSMichael Große function register(Doku_Event_Handler $controller) { 171794c5faSDominik Eckelmann $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array()); 18*9d4b9aa0SMichael Große $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'approveNS', array()); 19*9d4b9aa0SMichael Große } 20*9d4b9aa0SMichael Große 21*9d4b9aa0SMichael Große function approveNS(Doku_Event &$event, $param) { 22*9d4b9aa0SMichael Große if ($event->data !== 'plugin_publish_approveNS') { 23*9d4b9aa0SMichael Große return; 24*9d4b9aa0SMichael Große } 25*9d4b9aa0SMichael Große //no other ajax call handlers needed 26*9d4b9aa0SMichael Große $event->stopPropagation(); 27*9d4b9aa0SMichael Große $event->preventDefault(); 28*9d4b9aa0SMichael Große 29*9d4b9aa0SMichael Große //e.g. access additional request variables 30*9d4b9aa0SMichael Große global $INPUT; //available since release 2012-10-13 "Adora Belle" 31*9d4b9aa0SMichael Große $namespace = $INPUT->str('namespace'); 32*9d4b9aa0SMichael Große $pages = $this->helper->getPagesFromNamespace($namespace); 33*9d4b9aa0SMichael Große $pages = $this->helper->removeSubnamespacePages($pages, $namespace); 34*9d4b9aa0SMichael Große 35*9d4b9aa0SMichael Große global $ID, $INFO; 36*9d4b9aa0SMichael Große $original_id = $ID; 37*9d4b9aa0SMichael Große foreach ($pages as $page) { 38*9d4b9aa0SMichael Große $ID = $page[0]; 39*9d4b9aa0SMichael Große $INFO = pageinfo(); 40*9d4b9aa0SMichael Große if (!$this->helper->canApprove()) { 41*9d4b9aa0SMichael Große continue; 42*9d4b9aa0SMichael Große } 43*9d4b9aa0SMichael Große $this->addApproval(); 44*9d4b9aa0SMichael Große } 45*9d4b9aa0SMichael Große $ID = $original_id; 461794c5faSDominik Eckelmann } 471794c5faSDominik Eckelmann 48d9258364SDominik Eckelmann function handle_io_write(Doku_Event &$event, $param) { 491794c5faSDominik Eckelmann # This is the only hook I could find which runs on save, 501794c5faSDominik Eckelmann # but late enough to have lastmod set (ACTION_ACT_PREPROCESS 511794c5faSDominik Eckelmann # is too early) 521794c5faSDominik Eckelmann global $ACT; 5351621a57SChristopher Smith global $INPUT; 54*9d4b9aa0SMichael Große global $ID; 551794c5faSDominik Eckelmann 561794c5faSDominik Eckelmann if ($ACT != 'show') { 571794c5faSDominik Eckelmann return; 581794c5faSDominik Eckelmann } 591794c5faSDominik Eckelmann 608fc40594SChristopher Smith if (!$INPUT->has('publish_approve')) { 611794c5faSDominik Eckelmann return; 621794c5faSDominik Eckelmann } 631794c5faSDominik Eckelmann 641794c5faSDominik Eckelmann if (!$this->helper->canApprove()) { 651794c5faSDominik Eckelmann msg($this->getLang('wrong permissions to approve'), -1); 661794c5faSDominik Eckelmann return; 671794c5faSDominik Eckelmann } 681794c5faSDominik Eckelmann 691794c5faSDominik Eckelmann $this->addApproval(); 70*9d4b9aa0SMichael Große send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&')); 711794c5faSDominik Eckelmann } 721794c5faSDominik Eckelmann 731794c5faSDominik Eckelmann function addApproval() { 741794c5faSDominik Eckelmann global $USERINFO; 751794c5faSDominik Eckelmann global $ID; 761794c5faSDominik Eckelmann global $INFO; 771794c5faSDominik Eckelmann 781794c5faSDominik Eckelmann if (!$INFO['exists']) { 791794c5faSDominik Eckelmann msg($this->getLang('cannot approve a non-existing revision'), -1); 801794c5faSDominik Eckelmann return; 811794c5faSDominik Eckelmann } 821794c5faSDominik Eckelmann 831794c5faSDominik Eckelmann $approvalRevision = $this->helper->getRevision(); 841794c5faSDominik Eckelmann $approvals = $this->helper->getApprovals(); 851794c5faSDominik Eckelmann 861794c5faSDominik Eckelmann if (!isset($approvals[$approvalRevision])) { 871794c5faSDominik Eckelmann $approvals[$approvalRevision] = array(); 881794c5faSDominik Eckelmann } 891794c5faSDominik Eckelmann 901794c5faSDominik Eckelmann $approvals[$approvalRevision][$INFO['client']] = array( 911794c5faSDominik Eckelmann $INFO['client'], 921794c5faSDominik Eckelmann $_SERVER['REMOTE_USER'], 931794c5faSDominik Eckelmann $USERINFO['mail'], 941794c5faSDominik Eckelmann time() 951794c5faSDominik Eckelmann ); 961794c5faSDominik Eckelmann 971794c5faSDominik Eckelmann $success = p_set_metadata($ID, array('approval' => $approvals), true, true); 981794c5faSDominik Eckelmann if ($success) { 991794c5faSDominik Eckelmann msg($this->getLang('version approved'), 1); 100facaff5bSDominik Eckelmann 101facaff5bSDominik Eckelmann $data = array(); 102facaff5bSDominik Eckelmann $data['rev'] = $approvalRevision; 103facaff5bSDominik Eckelmann $data['id'] = $ID; 104facaff5bSDominik Eckelmann $data['approver'] = $_SERVER['REMOTE_USER']; 105facaff5bSDominik Eckelmann $data['approver_info'] = $USERINFO; 1068bc37331SMichael Große if ($this->getConf('send_mail_on_approve') && $this->helper->isRevisionApproved($approvalRevision)) { 1070a79fa6aSMichael Große /** @var action_plugin_publish_mail $mail */ 1080a79fa6aSMichael Große $mail = plugin_load('action','publish_mail'); 10992b96518SMichael Große $mail->send_approve_mail(); 11092b96518SMichael Große } 111facaff5bSDominik Eckelmann trigger_event('PLUGIN_PUBLISH_APPROVE', $data); 1121794c5faSDominik Eckelmann } else { 1131794c5faSDominik Eckelmann msg($this->getLang('cannot approve error'), -1); 1141794c5faSDominik Eckelmann } 1151794c5faSDominik Eckelmann 1161794c5faSDominik Eckelmann } 1171794c5faSDominik Eckelmann 1181794c5faSDominik Eckelmann} 119