简介
CKFinder 使用两种类型的插件
- JavaScript 插件,由 CKFinder 前端使用,可用于更改和扩展 CKFinder UI。
- PHP 插件,可用于更改和扩展服务器端连接器的行为。
下面您可以找到有关 CKFinder PHP 插件的信息和示例。有关 JavaScript 插件的详细信息,请参阅 创建 CKFinder 3.x JavaScript 插件 文档。
插件安装
手动安装需要下载插件源代码并将其解压缩到 CKFinder 的 plugins
目录中。目录结构需要遵循以下模式
plugins
└── PluginName
└── PluginName.php
配置
安装后,必须在 CKFinder 配置文件中启用插件。有关详细信息,请参阅 plugins。
插件通常提供一些可在 CKFinder 主配置文件中设置的配置选项。有关详细信息,请查看插件文档。
插件开发
可以使用自定义插件更改和扩展 CKFinder 的默认行为。插件必须满足一些约束才能被识别为有效
- 插件必须具有满足以下条件的唯一名称
- 它必须以大写字母开头。
- 它必须是有效的 PHP 类名。
- 它在
CKSource\CKFinder\Plugin
命名空间中必须是唯一的。
- 插件必须位于
CKSource\CKFinder\Plugin\<plugin_name>
下的自身命名空间中。
- 主插件类名必须与插件名匹配,并且必须位于插件的命名空间中。例如,假设您要创建一个名为
ImageWatermark
的插件。在这种情况下,插件命名空间将是 CKSource\CKFinder\Plugin\ImageWatermark
,插件的主类需要作为 CKSource\CKFinder\Plugin\ImageWatermark\ImageWatermark
访问。
- 插件类需要实现 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'
插件类型
插件可以执行许多不同的任务。根据您的插件目的,您需要确定需要哪种类型的插件。主要有两种插件类型
插件结构示例
回到 ImageWatermark
插件示例,假设它应该以以下方式工作
- 侦听文件上传事件,在文件验证后(如果是图像,则还需要调整大小),并在保存文件之前。
- 如果文件是支持的图像类型,则获取上传的文件内容并添加水印。
- 将带水印的图像设置为上传的文件内容。
然后,该插件将成为事件订阅者类型,侦听 CKFinderEvent::FILE_UPLOAD
。ImageWatermark
插件类的基本代码结构如下所示
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
插件的完整工作示例。