aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAndreas Gohr <gohr@cosmocode.de>2016-11-30 15:45:13 +0100
committerAndreas Gohr <gohr@cosmocode.de>2016-11-30 15:45:13 +0100
commit407958fea87f294e6eec4489a342b3f01c0187d8 (patch)
tree17858d1cd9fc5ffcc726ad52a04ae55efbfea409
parent30ecb892fe887b3cfe6ed4976ddcdcfc7c34827f (diff)
downloaddokuwiki-extensionevent.tar.gz
dokuwiki-extensionevent.zip
make actions preventable in extension managerextensionevent
-rw-r--r--lib/plugins/extension/helper/extension.php129
1 files changed, 79 insertions, 50 deletions
diff --git a/lib/plugins/extension/helper/extension.php b/lib/plugins/extension/helper/extension.php
index 2e699c945..6e3301f0b 100644
--- a/lib/plugins/extension/helper/extension.php
+++ b/lib/plugins/extension/helper/extension.php
@@ -638,11 +638,22 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*/
public function uninstall() {
$this->purgeCache();
- if(io_rmdir($this->getInstallDir(), true)) {
- $this->triggerEvent($this->getID(), 'uninstall');
- return true;
+
+ $data = array(
+ 'extension' => $this,
+ 'action' => 'uninstall'
+ );
+ $trigger = new Doku_Event('PLUGIN_EXTENSION_CHANGE', $data);
+
+ if($trigger->advise_before()) {
+ if(io_rmdir($this->getInstallDir(), true)) {
+ $trigger->advise_after();
+ return true;
+ } else {
+ return false;
+ }
}
- return false;
+ return (bool) $trigger->result;
}
/**
@@ -654,16 +665,26 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
if ($this->isTemplate()) return $this->getLang('notimplemented');
if (!$this->isInstalled()) return $this->getLang('notinstalled');
if ($this->isEnabled()) return $this->getLang('alreadyenabled');
-
/* @var Doku_Plugin_Controller $plugin_controller */
global $plugin_controller;
- if ($plugin_controller->enable($this->base)) {
- $this->purgeCache();
- $this->triggerEvent($this->getID(), 'enable');
- return true;
- } else {
- return $this->getLang('pluginlistsaveerror');
+
+ $data = array(
+ 'extension' => $this,
+ 'action' => 'enable'
+ );
+ $trigger = new Doku_Event('PLUGIN_EXTENSION_CHANGE', $data);
+
+ if($trigger->advise_before()) {
+ if($plugin_controller->enable($this->base)) {
+ $this->purgeCache();
+ $trigger->advise_after();
+ return true;
+ } else {
+ return $this->getLang('pluginlistsaveerror');
+ }
}
+ if($trigger->result === true) return true;
+ return (string) $trigger->result;
}
/**
@@ -673,18 +694,28 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*/
public function disable() {
if ($this->isTemplate()) return $this->getLang('notimplemented');
-
- /* @var Doku_Plugin_Controller $plugin_controller */
- global $plugin_controller;
if (!$this->isInstalled()) return $this->getLang('notinstalled');
if (!$this->isEnabled()) return $this->getLang('alreadydisabled');
- if ($plugin_controller->disable($this->base)) {
- $this->purgeCache();
- $this->triggerEvent($this->getID(), 'disable');
- return true;
- } else {
- return $this->getLang('pluginlistsaveerror');
+ /* @var Doku_Plugin_Controller $plugin_controller */
+ global $plugin_controller;
+
+ $data = array(
+ 'extension' => $this,
+ 'action' => 'disable'
+ );
+ $trigger = new Doku_Event('PLUGIN_EXTENSION_CHANGE', $data);
+
+ if($trigger->advise_before()) {
+ if($plugin_controller->disable($this->base)) {
+ $this->purgeCache();
+ $trigger->advise_after();
+ return true;
+ } else {
+ return $this->getLang('pluginlistsaveerror');
+ }
}
+ if($trigger->result === true) return true;
+ return (string) $trigger->result;
}
/**
@@ -921,33 +952,43 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
continue;
}
+ // gather info
$action = file_exists($target) ? 'update' : 'install';
+ $extname = $item['base'];
+ if($item['type'] == 'template') {
+ $extname = 'template:'.$extname;
+ }
- // copy action
- if($this->dircopy($item['tmp'], $target)) {
- // return info
- $id = $item['base'];
- if($item['type'] == 'template') {
- $id = 'template:'.$id;
+ // prepare plugin hook
+ $extension = new helper_plugin_extension_extension();
+ $extension->setExtension($extname);
+ $data = array(
+ 'extension' => $extension,
+ 'action' => $action,
+ 'src' => $item['tmp'],
+ 'dst' => $target
+ );
+
+ // execute the copy
+ $trigger = new Doku_Event('PLUGIN_EXTENSION_CHANGE', $data);
+ if($trigger->advise_before()) {
+ // copy action
+ if($this->dircopy($item['tmp'], $target)) {
+ $installed_extensions[$extname] = array(
+ 'base' => $item['base'],
+ 'type' => $item['type'],
+ 'action' => $action
+ );
+ } else {
+ throw new Exception(sprintf($this->getLang('error_copy') . DOKU_LF, '<bdi>' . $item['base'] . '</bdi>'));
}
- $installed_extensions[$id] = array(
- 'base' => $item['base'],
- 'type' => $item['type'],
- 'action' => $action
- );
- } else {
- throw new Exception(sprintf($this->getLang('error_copy').DOKU_LF, '<bdi>'.$item['base'].'</bdi>'));
}
+ $trigger->advise_after();
}
// cleanup
if($tmp) io_rmdir($tmp, true);
- // trigger for each extension
- foreach($installed_extensions as $ext => $info) {
- $this->triggerEvent($ext, $info['action']);
- }
-
return $installed_extensions;
}
@@ -1168,18 +1209,6 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
}
}
- /**
- * Trigger a custom event when an extension has been changed
- *
- * @param string $extname
- * @param string $action (install, update, uninstall, disable, enable)
- */
- protected function triggerEvent($extname, $action) {
- $extension = new helper_plugin_extension_extension();
- $extension->setExtension($extname);
- $data = array('extension' => $extension, 'action' => $action);
- trigger_event('PLUGIN_EXTENSION_CHANGE', $data, null, false);
- }
}
// vim:ts=4:sw=4:et: