first commit
This commit is contained in:
@@ -0,0 +1,834 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @defgroup plugins Plugins
|
||||
* Implements a plugin structure that can be used to flexibly extend PKP
|
||||
* software via the use of a set of plugin categories.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file classes/plugins/Plugin.php
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2000-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @class Plugin
|
||||
*
|
||||
* @ingroup plugins
|
||||
*
|
||||
* @see PluginRegistry, PluginSettingsDAO
|
||||
*
|
||||
* @brief Abstract class for plugins
|
||||
*
|
||||
* For best performance, a plug-in should not be instantiated if it is
|
||||
* disabled or the current page/operation does not require the plug-in's
|
||||
* functionality.
|
||||
*
|
||||
* Newer plug-ins support enable/disable and request filter settings that
|
||||
* enable the PKP library plug-in framework to lazy-load plug-ins only
|
||||
* when their functionality is actually being required for a request.
|
||||
*
|
||||
* For backwards compatibility we need to assume that older plug-ins
|
||||
* do not support lazy-load because their register() method and hooks
|
||||
* may have side-effects required on all requests. We have no way of
|
||||
* knowing on which pages these side effects are important so we need
|
||||
* to load legacy plug-ins on all pages.
|
||||
*
|
||||
* In these cases the register() function will be called on every request
|
||||
* when the category the plug-in belongs to is being loaded. This was the
|
||||
* default behavior before plug-in lazy load was introduced.
|
||||
*
|
||||
* Plug-ins that want to enable lazy-load have to include a 'lazy-load'
|
||||
* setting in their version.xml:
|
||||
*
|
||||
* <lazy-load>1</lazy-load>
|
||||
*/
|
||||
|
||||
namespace PKP\plugins;
|
||||
|
||||
use APP\core\Application;
|
||||
use APP\template\TemplateManager;
|
||||
use Exception;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use PKP\config\Config;
|
||||
use PKP\core\JSONMessage;
|
||||
use PKP\core\PKPApplication;
|
||||
use PKP\core\PKPRequest;
|
||||
use PKP\core\Registry;
|
||||
use PKP\db\DAORegistry;
|
||||
use PKP\facades\Locale;
|
||||
use PKP\facades\Repo;
|
||||
use PKP\install\Installer;
|
||||
use PKP\observers\events\PluginSettingChanged;
|
||||
use PKP\site\Version;
|
||||
use PKP\site\VersionDAO;
|
||||
use PKP\template\PKPTemplateResource;
|
||||
|
||||
// Define the well-known file name for filter configuration data.
|
||||
define('PLUGIN_FILTER_DATAFILE', 'filterConfig.xml');
|
||||
define('PLUGIN_TEMPLATE_RESOURCE_PREFIX', 'plugins');
|
||||
|
||||
abstract class Plugin
|
||||
{
|
||||
/** @var string Path name to files for this plugin */
|
||||
public $pluginPath;
|
||||
|
||||
/** @var string Category name this plugin is registered to*/
|
||||
public $pluginCategory;
|
||||
|
||||
/** @var PKPRequest the current request object */
|
||||
public $request;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Public Plugin API (Registration and Initialization)
|
||||
*/
|
||||
/**
|
||||
* Load and initialize the plug-in and register plugin hooks.
|
||||
*
|
||||
* For backwards compatibility this method will be called whenever
|
||||
* the plug-in's category is being loaded. If, however, registerOn()
|
||||
* returns an array then this method will only be called when
|
||||
* the plug-in is enabled and an entry in the result set of
|
||||
* registerOn() matches the current request operation. An empty array
|
||||
* matches all request operations.
|
||||
*
|
||||
* @param string $category Name of category plugin was registered to
|
||||
* @param string $path The path the plugin was found in
|
||||
* @param int $mainContextId To identify if the plugin is enabled
|
||||
* we need a context. This context is usually taken from the
|
||||
* request but sometimes there is no context in the request
|
||||
* (e.g. when executing CLI commands). Then the main context
|
||||
* can be given as an explicit ID.
|
||||
*
|
||||
* @return bool True iff plugin registered successfully; if false,
|
||||
* the plugin will not be executed.
|
||||
*/
|
||||
public function register($category, $path, $mainContextId = null)
|
||||
{
|
||||
$this->pluginPath = $path;
|
||||
$this->pluginCategory = $category;
|
||||
if ($this->getInstallMigration()) {
|
||||
Hook::add('Installer::postInstall', [$this, 'updateSchema']);
|
||||
}
|
||||
if ($this->getInstallSitePluginSettingsFile()) {
|
||||
Hook::add('Installer::postInstall', [$this, 'installSiteSettings']);
|
||||
}
|
||||
if ($this->getInstallEmailTemplatesFile()) {
|
||||
Hook::add('Installer::postInstall', [$this, 'installEmailTemplates']);
|
||||
Hook::add('Locale::installLocale', [$this, 'installLocale']);
|
||||
}
|
||||
if ($this->getInstallEmailTemplateDataFile()) {
|
||||
Hook::add('Installer::postInstall', [$this, 'installEmailTemplateData']);
|
||||
}
|
||||
if ($this->getContextSpecificPluginSettingsFile()) {
|
||||
Hook::add('Context::add', [$this, 'installContextSpecificSettings']);
|
||||
}
|
||||
|
||||
Hook::add('Installer::postInstall', [$this, 'installFilters']);
|
||||
|
||||
$this->_registerTemplateResource();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Protected methods (may be overridden by custom plugins)
|
||||
*/
|
||||
|
||||
//
|
||||
// Plugin Display
|
||||
//
|
||||
|
||||
/**
|
||||
* Get the name of this plugin. The name must be unique within
|
||||
* its category, and should be suitable for part of a filename
|
||||
* (ie short, no spaces, and no dependencies on cases being unique).
|
||||
*
|
||||
* @return string name of plugin
|
||||
*/
|
||||
abstract public function getName();
|
||||
|
||||
/**
|
||||
* Get the display name for this plugin.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function getDisplayName();
|
||||
|
||||
/**
|
||||
* Get a description of this plugin.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function getDescription();
|
||||
|
||||
//
|
||||
// Plugin Behavior and Management
|
||||
//
|
||||
|
||||
/**
|
||||
* Return a number indicating the sequence in which this plugin
|
||||
* should be registered compared to others of its category.
|
||||
* Higher = later.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getSeq()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Site-wide plugins should override this function to return true.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isSitePlugin()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a management function.
|
||||
*
|
||||
* @param array $args
|
||||
* @param PKPRequest $request
|
||||
*
|
||||
* @return JSONMessage A JSON-encoded response
|
||||
*/
|
||||
public function manage($args, $request)
|
||||
{
|
||||
throw new Exception('Unhandled management action!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether or not this plugin should be hidden from the
|
||||
* management interface. Useful in the case of derivative plugins,
|
||||
* i.e. when a generic plugin registers a feed plugin.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getHideManagement()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Plugin Installation
|
||||
//
|
||||
|
||||
/**
|
||||
* @deprecated See https://github.com/pkp/pkp-lib/issues/2493
|
||||
*/
|
||||
final public function getInstallSchemaFile()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the installation migration for this plugin.
|
||||
*
|
||||
* @return ?Migration
|
||||
*/
|
||||
public function getInstallMigration()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename of the settings data for this plugin to install
|
||||
* when the system is installed (i.e. site-level plugin settings).
|
||||
* Subclasses using default settings should override this.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getInstallSitePluginSettingsFile()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename of the settings data for this plugin to install
|
||||
* when a new application context (e.g. journal, conference or press)
|
||||
* is installed.
|
||||
*
|
||||
* Subclasses using default settings should override this.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getContextSpecificPluginSettingsFile()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename of the email templates for this plugin.
|
||||
* Subclasses using email templates should override this.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getInstallEmailTemplatesFile()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename of the email template data for this plugin.
|
||||
* Subclasses using email templates should override this.
|
||||
*
|
||||
* @deprecated Starting with OJS/OMP 3.2, localized content should be specified via getInstallEmailTemplatesFile(). (pkp/pkp-lib#5461)
|
||||
* @return string
|
||||
*/
|
||||
public function getInstallEmailTemplateDataFile()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename(s) of the filter configuration data for
|
||||
* this plugin. Subclasses using filters can override this.
|
||||
*
|
||||
* The default implementation establishes "well known" locations
|
||||
* for the filter configuration. If you keep your files in these
|
||||
* locations then there's no need to override this method.
|
||||
*
|
||||
* @return string|array one or more file locations.
|
||||
*/
|
||||
public function getInstallFilterConfigFiles()
|
||||
{
|
||||
// Construct the well-known filter configuration file names.
|
||||
$filterConfigFile = $this->getPluginPath() . '/filter/' . PLUGIN_FILTER_DATAFILE;
|
||||
$filterConfigFiles = [
|
||||
'./lib/pkp/' . $filterConfigFile,
|
||||
'./' . $filterConfigFile
|
||||
];
|
||||
return $filterConfigFiles;
|
||||
}
|
||||
|
||||
/*
|
||||
* Protected helper methods (can be used by custom plugins but
|
||||
* should not be overridden by custom plugins)
|
||||
*/
|
||||
/**
|
||||
* Get the name of the category this plugin is registered to.
|
||||
*
|
||||
* @return string category
|
||||
*/
|
||||
public function getCategory()
|
||||
{
|
||||
return $this->pluginCategory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the path this plugin's files are located in.
|
||||
*
|
||||
* @return string pathname
|
||||
*/
|
||||
public function getPluginPath()
|
||||
{
|
||||
return $this->pluginPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the directory name of the plugin
|
||||
*
|
||||
* @return string directory name
|
||||
*/
|
||||
public function getDirName()
|
||||
{
|
||||
return basename($this->pluginPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Resource Name for templates in this plugin, or if specified, the full resource locator
|
||||
* for a specific template.
|
||||
*
|
||||
* @param string $template path/filename, if desired
|
||||
* @param bool $inCore True if a "core" template should be used.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTemplateResource($template = null, $inCore = false)
|
||||
{
|
||||
$pluginPath = $this->getPluginPath();
|
||||
if ($inCore) {
|
||||
$pluginPath = PKP_LIB_PATH . "/{$pluginPath}";
|
||||
}
|
||||
$plugin = basename($pluginPath);
|
||||
$category = basename(dirname($pluginPath));
|
||||
|
||||
$contextId = PKPApplication::CONTEXT_SITE;
|
||||
if (Application::isInstalled()) {
|
||||
$context = Application::get()->getRequest()->getContext();
|
||||
if ($context instanceof \PKP\context\Context) {
|
||||
$contextId = $context->getId();
|
||||
}
|
||||
}
|
||||
|
||||
// Slash characters (/) are not allowed in resource names, so use dashes (-) instead.
|
||||
$resourceName = strtr(join('/', [PLUGIN_TEMPLATE_RESOURCE_PREFIX, $contextId, $pluginPath, $category, $plugin]), '/', '-');
|
||||
return $resourceName . ($template !== null ? ":{$template}" : '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the canonical template path of this plug-in
|
||||
*
|
||||
* @param bool $inCore Return the core template path if true.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getTemplatePath($inCore = false)
|
||||
{
|
||||
$templatePath = ($inCore ? PKP_LIB_PATH . '/' : '') . "{$this->getPluginPath()}/templates";
|
||||
if (is_dir($templatePath)) {
|
||||
return $templatePath;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register this plugin's templates as a template resource
|
||||
*
|
||||
* @param bool $inCore True iff this is a core resource.
|
||||
*/
|
||||
protected function _registerTemplateResource($inCore = false)
|
||||
{
|
||||
if ($templatePath = $this->getTemplatePath($inCore)) {
|
||||
$templateMgr = TemplateManager::getManager(Application::get()->getRequest());
|
||||
$pluginTemplateResource = new PKPTemplateResource($templatePath);
|
||||
$templateMgr->registerResource($this->getTemplateResource(null, $inCore), $pluginTemplateResource);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this method when an enabled plugin is registered in order to override
|
||||
* template files. Any plugin which calls this method can
|
||||
* override template files by adding their own templates to:
|
||||
* <overridingPlugin>/templates/plugins/<category>/<originalPlugin>/templates/<path>.tpl
|
||||
*
|
||||
* @param string $hookName TemplateResource::getFilename
|
||||
* @param array $args [
|
||||
*
|
||||
* @option string File path to preferred template. Leave as-is to not
|
||||
* override template.
|
||||
* @option string Template file requested
|
||||
* ]
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function _overridePluginTemplates($hookName, $args)
|
||||
{
|
||||
$filePath = & $args[0];
|
||||
$template = $args[1];
|
||||
$checkFilePath = $filePath;
|
||||
|
||||
// If there's a templates/ prefix on the template, clean up the test path.
|
||||
if (strpos($filePath, 'plugins/') === 0) {
|
||||
$checkFilePath = 'templates/' . $checkFilePath;
|
||||
}
|
||||
|
||||
// If there's a lib/pkp/ prefix on the template, test without it.
|
||||
$libPkpPrefix = 'lib/pkp/';
|
||||
if (strpos($checkFilePath, $libPkpPrefix) === 0) {
|
||||
$checkFilePath = substr($filePath, strlen($libPkpPrefix));
|
||||
}
|
||||
|
||||
// Check if an overriding plugin exists in the plugin path.
|
||||
if ($overriddenFilePath = $this->_findOverriddenTemplate($checkFilePath)) {
|
||||
$filePath = $overriddenFilePath;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive check for existing templates
|
||||
*
|
||||
* @param string $path
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
private function _findOverriddenTemplate($path)
|
||||
{
|
||||
$fullPath = sprintf('%s/%s', $this->getPluginPath(), $path);
|
||||
|
||||
if (file_exists($fullPath)) {
|
||||
return $fullPath;
|
||||
}
|
||||
|
||||
// Backward compatibility for OJS prior to 3.1.2; changed path to templates for plugins.
|
||||
if (($fullPath = preg_replace("/templates\/(?!.*templates\/)/", '', $fullPath)) && file_exists($fullPath)) {
|
||||
if (Config::getVar('debug', 'deprecation_warnings')) {
|
||||
trigger_error('Deprecated: The template at ' . $fullPath . ' has moved and will not be found in the future.');
|
||||
}
|
||||
return $fullPath;
|
||||
}
|
||||
|
||||
// Recursive check for templates in ancestors of a current theme plugin
|
||||
if ($this instanceof ThemePlugin
|
||||
&& $this->parent
|
||||
&& $fullPath = $this->parent->_findOverriddenTemplate($path)) {
|
||||
return $fullPath;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load locale data for this plugin.
|
||||
*/
|
||||
public function addLocaleData(): void
|
||||
{
|
||||
$basePath = $this->getPluginPath() . '/locale';
|
||||
foreach ([$basePath, "lib/pkp/{$basePath}"] as $path) {
|
||||
if (is_dir($path)) {
|
||||
Locale::registerPath($path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a plugin setting within the given context
|
||||
*
|
||||
* @param int $contextId Context ID
|
||||
* @param string $name Setting name
|
||||
*/
|
||||
public function getSetting($contextId, $name)
|
||||
{
|
||||
if (!Application::isUpgrading() && !Application::isInstalled()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); /** @var PluginSettingsDAO $pluginSettingsDao */
|
||||
return $pluginSettingsDao->getSetting($contextId, $this->getName(), $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a plugin setting within the given context.
|
||||
*
|
||||
* @param int $contextId Context ID
|
||||
* @param string $name The name of the setting
|
||||
* @param mixed $value Setting value
|
||||
* @param string $type optional
|
||||
*/
|
||||
public function updateSetting($contextId, $name, $value, $type = null)
|
||||
{
|
||||
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); /** @var PluginSettingsDAO $pluginSettingsDao */
|
||||
$pluginSettingsDao->updateSetting($contextId, $this->getName(), $name, $value, $type);
|
||||
|
||||
event(new PluginSettingChanged($this, $name, $value, $contextId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a PHP file from this plugin's installation directory.
|
||||
*
|
||||
* @deprecated 3.4.0 pkp/pkp-lib#8186
|
||||
*
|
||||
* @param string $class
|
||||
*/
|
||||
public function import($class)
|
||||
{
|
||||
require_once $this->getPluginPath() . '/' . str_replace('.', '/', $class) . '.inc.php';
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper methods (for internal use only, should not
|
||||
* be used by custom plug-ins)
|
||||
*
|
||||
* NB: These methods may change without notice in the future!
|
||||
*/
|
||||
/**
|
||||
* Callback used to install settings on system install.
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function installSiteSettings($hookName, $args)
|
||||
{
|
||||
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); /** @var PluginSettingsDAO $pluginSettingsDao */
|
||||
$pluginSettingsDao->installSettings(PKPApplication::CONTEXT_SITE, $this->getName(), $this->getInstallSitePluginSettingsFile());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used to install settings on new context
|
||||
* (e.g. journal, conference or press) creation.
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function installContextSpecificSettings($hookName, $args)
|
||||
{
|
||||
$context = $args[0];
|
||||
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); /** @var PluginSettingsDAO $pluginSettingsDao */
|
||||
$pluginSettingsDao->installSettings($context->getId(), $this->getName(), $this->getContextSpecificPluginSettingsFile());
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used to install email templates.
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function installEmailTemplates($hookName, $args)
|
||||
{
|
||||
$installer = & $args[0]; /** @var Installer $installer */
|
||||
$result = & $args[1];
|
||||
|
||||
// Load email template data as required from the locale files.
|
||||
$locales = [];
|
||||
foreach ($installer->installedLocales as $locale) {
|
||||
if (file_exists($this->getPluginPath() . "/locale/{$locale}/emails.po")) {
|
||||
$locales[] = $locale;
|
||||
}
|
||||
}
|
||||
// Localized data is needed by the email installation
|
||||
$this->addLocaleData();
|
||||
$status = Repo::emailTemplate()->dao->installEmailTemplates($this->getInstallEmailTemplatesFile(), $locales, null, true);
|
||||
|
||||
if ($status === false) {
|
||||
// The template file seems to be invalid.
|
||||
$installer->setError(Installer::INSTALLER_ERROR_DB, str_replace('{$file}', $this->getInstallEmailTemplatesFile(), __('installer.installParseEmailTemplatesFileError')));
|
||||
$result = false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used to install email template data.
|
||||
*
|
||||
* @deprecated Email template data should be installed via installEmailTemplates (pkp/pkp-lib#5461)
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function installEmailTemplateData($hookName, $args)
|
||||
{
|
||||
$installer = & $args[0];
|
||||
$result = & $args[1];
|
||||
|
||||
foreach ($installer->installedLocales as $locale) {
|
||||
$filename = str_replace('{$installedLocale}', $locale, $this->getInstallEmailTemplateDataFile());
|
||||
if (!file_exists($filename)) {
|
||||
continue;
|
||||
}
|
||||
$sql = Repo::emailTemplate()->dao->installEmailTemplateData($filename, $locale, true);
|
||||
if ($sql) {
|
||||
$result = $installer->executeSQL($sql);
|
||||
} else {
|
||||
$installer->setError(Installer::INSTALLER_ERROR_DB, str_replace('{$file}', $filename, __('installer.installParseEmailTemplatesFileError')));
|
||||
$result = false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used to install email template data on locale install.
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function installLocale($hookName, $args)
|
||||
{
|
||||
$locale = & $args[0];
|
||||
$filename = str_replace('{$installedLocale}', $locale, $this->getInstallEmailTemplateDataFile());
|
||||
|
||||
// Since pkp/pkp-lib#5461, there are two ways to specify localized email data in plugins.
|
||||
// Install locale data specified in the old form. (Deprecated!)
|
||||
if ($this->getInstallEmailTemplateDataFile()) {
|
||||
Repo::emailTemplate()->dao->installEmailTemplateData($filename, $locale);
|
||||
}
|
||||
|
||||
// Install locale data specified in the new form.
|
||||
if (file_exists($this->getPluginPath() . "/locale/{$locale}/emails.po")) {
|
||||
$this->addLocaleData();
|
||||
Repo::emailTemplate()->dao->installEmailTemplateLocaleData($this->getInstallEmailTemplatesFile(), [$locale]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used to install filters.
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*/
|
||||
public function installFilters($hookName, $args)
|
||||
{
|
||||
$installer = & $args[0]; /** @var Installer $installer */
|
||||
$result = & $args[1]; /** @var bool $result */
|
||||
|
||||
// Get the filter configuration file name(s).
|
||||
$filterConfigFiles = $this->getInstallFilterConfigFiles();
|
||||
if (is_scalar($filterConfigFiles)) {
|
||||
$filterConfigFiles = [$filterConfigFiles];
|
||||
}
|
||||
|
||||
// Run through the config file positions and see
|
||||
// whether one of these exists and needs to be installed.
|
||||
foreach ($filterConfigFiles as $filterConfigFile) {
|
||||
// Is there a filter configuration?
|
||||
if (!file_exists($filterConfigFile)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Install the filter configuration.
|
||||
$result = $installer->installFilterConfig($filterConfigFile);
|
||||
if (!$result) {
|
||||
// The filter configuration file seems to be invalid.
|
||||
$installer->setError(Installer::INSTALLER_ERROR_DB, str_replace('{$file}', $filterConfigFile, __('installer.installParseFilterConfigFileError')));
|
||||
}
|
||||
}
|
||||
|
||||
// Do not stop installation.
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called during the install process to install the plugin schema,
|
||||
* if applicable.
|
||||
*
|
||||
* @param string $hookName
|
||||
* @param array $args
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function updateSchema($hookName, $args)
|
||||
{
|
||||
$installer = & $args[0];
|
||||
$result = & $args[1];
|
||||
|
||||
if ($migration = $this->getInstallMigration()) {
|
||||
try {
|
||||
$migration->up();
|
||||
} catch (Exception $e) {
|
||||
$installer->setError(Installer::INSTALLER_ERROR_DB, __('installer.installMigrationError', ['class' => get_class($migration), 'message' => $e->getMessage()]));
|
||||
$result = false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extend the {url ...} smarty to support plugins.
|
||||
*
|
||||
* @param array $params
|
||||
* @param \Smarty $smarty
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function smartyPluginUrl($params, $smarty)
|
||||
{
|
||||
$path = [$this->getCategory(), $this->getName()];
|
||||
if (is_array($params['path'])) {
|
||||
$params['path'] = array_merge($path, $params['path']);
|
||||
} elseif (!empty($params['path'])) {
|
||||
$params['path'] = array_merge($path, [$params['path']]);
|
||||
} else {
|
||||
$params['path'] = $path;
|
||||
}
|
||||
return $smarty->smartyUrl($params, $smarty);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current version of this plugin
|
||||
*
|
||||
* @return ?Version
|
||||
*/
|
||||
public function getCurrentVersion()
|
||||
{
|
||||
$versionDao = DAORegistry::getDAO('VersionDAO'); /** @var VersionDAO $versionDao */
|
||||
$pluginPath = $this->getPluginPath();
|
||||
$product = basename($pluginPath);
|
||||
$category = basename(dirname($pluginPath));
|
||||
$installedPlugin = $versionDao->getCurrentVersion('plugins.' . $category, $product);
|
||||
|
||||
if ($installedPlugin) {
|
||||
return $installedPlugin;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current request object
|
||||
*
|
||||
* @return PKPRequest
|
||||
*/
|
||||
public function &getRequest()
|
||||
{
|
||||
if (!$this->request) {
|
||||
$this->request = & Registry::get('request');
|
||||
}
|
||||
return $this->request;
|
||||
}
|
||||
|
||||
/*
|
||||
* Private helper methods
|
||||
*/
|
||||
/**
|
||||
* Get a list of link actions for plugin management.
|
||||
*
|
||||
* @param PKPRequest $request
|
||||
* @param array $actionArgs The list of action args to be included in request URLs.
|
||||
*
|
||||
* @return array List of LinkActions
|
||||
*/
|
||||
public function getActions($request, $actionArgs)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the plugin can be enabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getCanEnable()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the plugin can be disabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getCanDisable()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the plugin is enabled.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getEnabled()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!PKP_STRICT_MODE) {
|
||||
class_alias('\PKP\plugins\Plugin', '\Plugin');
|
||||
}
|
||||
Reference in New Issue
Block a user