CKFinder 3 – PHP 连接器文档
插件

简介

CKFinder 使用两种类型的插件

  • JavaScript 插件,由 CKFinder 前端使用,可用于更改和扩展 CKFinder UI。
  • PHP 插件,可用于更改和扩展服务器端连接器的行为。

下面您可以找到有关 CKFinder PHP 插件的信息和示例。有关 JavaScript 插件的详细信息,请参阅 创建 CKFinder 3.x JavaScript 插件 文档。

插件安装

手动安装需要下载插件源代码并将其解压缩到 CKFinder 的 plugins 目录中。目录结构需要遵循以下模式

plugins
└── PluginName
└── PluginName.php

配置

安装后,必须在 CKFinder 配置文件中启用插件。有关详细信息,请参阅 plugins

插件通常提供一些可在 CKFinder 主配置文件中设置的配置选项。有关详细信息,请查看插件文档。

插件开发

可以使用自定义插件更改和扩展 CKFinder 的默认行为。插件必须满足一些约束才能被识别为有效

  1. 插件必须具有满足以下条件的唯一名称
    • 它必须以大写字母开头。
    • 它必须是有效的 PHP 类名。
    • 它在 CKSource\CKFinder\Plugin 命名空间中必须是唯一的。
  2. 插件必须位于 CKSource\CKFinder\Plugin\<plugin_name> 下的自身命名空间中。
  3. 主插件类名必须与插件名匹配,并且必须位于插件的命名空间中。例如,假设您要创建一个名为 ImageWatermark 的插件。在这种情况下,插件命名空间将是 CKSource\CKFinder\Plugin\ImageWatermark,插件的主类需要作为 CKSource\CKFinder\Plugin\ImageWatermark\ImageWatermark 访问。
  4. 插件类需要实现 PluginInterface

插件接口

每个 CKFinder 插件都必须实现 PluginInterface

namespace CKSource\CKFinder\Plugin;
interface PluginInterface
{
public function setContainer(CKFinder $app);
public function getDefaultConfig();
}

它包含两个需要在插件类中实现的方法

  • setContainer 用于将 CKFinder 依赖注入容器注入插件范围(有关详细信息,请参阅 依赖注入容器)。
  • getDefaultConfig 返回一个数组,其中包含插件的默认配置选项。

插件配置

getDefaultConfig 方法返回的默认配置选项会合并到 CKFinder Config 中,对应于插件名称的节点下。假设 ImageWatermark 插件的 getDefaultConfig 方法如下所示

public function getDefaultConfig()
{
return array(
'imagePath' => '/path/stamp.png',
'position' => array(
'right' => 10,
'bottom' => 'center'
)
);
}

要访问插件配置设置,首先需要从 setContainer 插件方法中注入的依赖注入容器中获取 Config 对象

$config = $this->app['config'];

稍后在插件代码中,您可以通过以下方式访问插件选项

$config->get('ImageWatermark.imagePath'); // '/path/stamp.png'
$config->get('ImageWatermark.position.bottom'); // 'center'
$config->get('ImageWatermark.position'); // 数组:array('right' => 10, 'bottom' => 'center')
$config->get('ImageWatermark'); // 数组:整个插件配置数组

所有默认插件配置选项都可以在 CKFinder 主配置文件中覆盖。如果用户想要使用 ImageWatermark 插件的不同图像,可以在适当的选项中添加它

// ...
'ImageWatermark' => array(
'imagePath' => '/custom/path/image.png'
),

之后

$config->get('ImageWatermark.imagePath'); // '/custom/path/image.png'

插件类型

插件可以执行许多不同的任务。根据您的插件目的,您需要确定需要哪种类型的插件。主要有两种插件类型

  • 事件订阅者 – 为定义的应用程序事件执行操作的插件(有关详细信息,请参阅 事件)。如果您要创建此类型的插件,则必须在您的插件类中实现 EventSubscriberInterface
  • 命令插件 – 像其他 CKFinder 命令一样工作的插件(有关详细信息,请参阅 命令)。在这种情况下,您需要扩展 CommandAbstract 类,或任何现有的 CKFinder 命令类。

插件结构示例

回到 ImageWatermark 插件示例,假设它应该以以下方式工作

  • 侦听文件上传事件,在文件验证后(如果是图像,则还需要调整大小),并在保存文件之前。
  • 如果文件是支持的图像类型,则获取上传的文件内容并添加水印。
  • 将带水印的图像设置为上传的文件内容。

然后,该插件将成为事件订阅者类型,侦听 CKFinderEvent::FILE_UPLOADImageWatermark 插件类的基本代码结构如下所示

namespace CKSource\CKFinder\Plugin\ImageWatermark;
use CKSource\CKFinder\CKFinder;
use CKSource\CKFinder\Config;
use CKSource\CKFinder\Event\CKFinderEvent;
use CKSource\CKFinder\Event\FileUploadEvent;
use CKSource\CKFinder\Plugin\PluginInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ImageWatermark implements PluginInterface, EventSubscriberInterface
{
protected $app;
public function setContainer(CKFinder $app)
{
$this->app = $app;
}
public function getDefaultConfig()
{
return [
'imagePath' => __DIR__ . '/stamp.png',
'position' => [
'right' => 0,
'bottom' => 0
]
];
}
public function addWatermark(FileUploadEvent $event)
{
$config = $this->app['config'];
$uploadedFile = $event->getUploadedFile();
$imageData = $uploadedFile->getContents();
$watermarkImagePath = $config->get('ImageWatermark.imagePath');
// 处理上传的图像。
$uploadedFile->setContents($processedImageData);
}
public static function getSubscribedEvents()
{
return [CKFinderEvent::FILE_UPLOAD => 'addWatermark'];
}
}

您可以在 GitHub 上找到 ImageWatermark 插件的完整工作示例。