*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
/**
* Class action_plugin_move_rename
*/
class action_plugin_move_rename extends DokuWiki_Action_Plugin {
/**
* Register event handlers.
*
* @param Doku_Event_Handler $controller The plugin controller
*/
public function register(Doku_Event_Handler $controller) {
$controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'handle_init');
// TODO: DEPRECATED JAN 2018
$controller->register_hook('TEMPLATE_PAGETOOLS_DISPLAY', 'BEFORE', $this, 'handle_pagetools');
$controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'addsvgbutton', array());
$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax');
}
/**
* set JavaScript info if renaming of current page is possible
*/
public function handle_init() {
global $JSINFO;
global $INFO;
$JSINFO['move_renameokay'] = $this->renameOkay($INFO['id']);
}
/**
* Adds a button to the default template
*
* TODO: DEPRECATED JAN 2018
*
* @param Doku_Event $event
*/
public function handle_pagetools(Doku_Event $event) {
if($event->data['view'] != 'main') return;
if (!$this->getConf('pagetools_integration')) {
return;
}
$newitem = '
' . $this->getLang('renamepage') . '';
$offset = count($event->data['items']) - 1;
$event->data['items'] =
array_slice($event->data['items'], 0, $offset, true) +
array('plugin_move' => $newitem) +
array_slice($event->data['items'], $offset, null, true);
}
/**
* Add 'rename' button to page tools, new SVG based mechanism
*
* @param Doku_Event $event
*/
public function addsvgbutton(Doku_Event $event) {
global $INFO, $JSINFO;
if(
$event->data['view'] !== 'page' ||
!$this->getConf('pagetools_integration') ||
!$JSINFO['move_renameokay']
) {
return;
}
if(!$INFO['exists']) {
return;
}
array_splice($event->data['items'], -1, 0, array(new \dokuwiki\plugin\move\MenuItem()));
}
/**
* Rename a single page
*/
public function handle_ajax(Doku_Event $event) {
if($event->data != 'plugin_move_rename') return;
$event->preventDefault();
$event->stopPropagation();
global $MSG;
global $INPUT;
$src = cleanID($INPUT->str('id'));
$dst = cleanID($INPUT->str('newid'));
/** @var helper_plugin_move_op $MoveOperator */
$MoveOperator = plugin_load('helper', 'move_op');
$JSON = new JSON();
header('Content-Type: application/json');
if($this->renameOkay($src) && $MoveOperator->movePage($src, $dst)) {
// all went well, redirect
echo $JSON->encode(array('redirect_url' => wl($dst, '', true, '&')));
} else {
if(isset($MSG[0])) {
$error = $MSG[0]; // first error
} else {
$error = $this->getLang('cantrename');
}
echo $JSON->encode(array('error' => $error));
}
}
/**
* Determines if it would be okay to show a rename page button for the given page and current user
*
* @param $id
* @return bool
*/
public function renameOkay($id) {
global $ACT;
global $USERINFO;
if(!($ACT == 'show' || empty($ACT))) return false;
if(!page_exists($id)) return false;
if(auth_quickaclcheck($id) < AUTH_EDIT) return false;
if(checklock($id) !== false || @file_exists(wikiLockFN($id))) return false;
if(!isset($_SERVER['REMOTE_USER'])) return false;
if(!auth_isMember($this->getConf('allowrename'), $_SERVER['REMOTE_USER'], (array) $USERINFO['grps'])) return false;
return true;
}
/**
* Use this in your template to add a simple "move this page" link
*
* Alternatively give anything the class "plugin_move_page" - it will automatically be hidden and shown and
* trigger the page move dialog.
*/
public function tpl() {
echo '';
echo $this->getLang('renamepage');
echo '';
}
}