alex-net/ tiny-file-man
实现连接到可视化编辑器TinyMCE5的textarea字段和Responsive FileManager文件管理器的组件
Requires
- nicolab/php-ftp-client: ~1.5
- npm-asset/tinymce: ~5.2
- npm-asset/tinymce-i18n: ~20.0
- yiisoft/yii2: ~2.0
README
为了使编辑器与Responsive File Manager文件管理器协同工作,需要下载该管理器的最新版本,并将存档内容放置在服务器上的任何目录中。接下来,需要做一些转换(代码适配)。
发现的问题及其解决方法
工作将在Responsive File Manager存档中的filemanager目录内的文件上进行。
删除config.php
在此目录中,应遍历所有直接位于filemanager目录中的*.php文件,并删除对config.php文件的连接(此文件在操作内部连接)。.. 删除包含以下内容的行
$config = include 'config/config.php';
文件上传修正
为了通过管理器正确地加载文件,需要在upload.php文件中进行修改。为了做到这一点,找到赋值给变量$uploadConfig数组的行,并移除upload_dir键的值中的dirname($_SERVER['SCRIPT_FILENAME']) . '/' .
部分(我们的路径已经是绝对的)
在管理器中查看缩略图
为了在管理器中(缩略图)正确查看图片缩略图,需要在dialog.php文件中找到赋值给变量$src_thumb的代码块,并在该位置之后(尽可能接近布局底部)清除变量$src_thumb、$src和$mini_src的document_root路径,以便文件在服务器上的绝对路径变为相对路径,并变成从web访问该文件的链接。需要注意,$_SERVER['DOCUMENT_ROOT']可能包含符号链接,因此必要时可以将$_SERVER['DOCUMENT_ROOT']包装在realpath()
函数调用中。此外,可以指定thumbsPath目录作为绝对路径到任何可写入的目录。可以应用Yii2别名。如果图片缩略图的目标目录无法从web访问,则需要使用包含在变量$thumbsAsset中的Asset进行替换,即用sourcePath替换为baseUrl。在应用Asset之前,请注意AssetManager中的$linkAssets值。此值应等于true;否则,将复制目录,并不会有任何好处。
生成缩略图时内存不足。
还可能遇到在通过管理器上传图片后生成缩略图时内存不足的问题。上传的结果将是内存不足的错误。这种行为与在php.ini中设置memory_limit参数的方式有关。"出厂设置"中可以找到以兆字节(数字后面跟字母M)和千兆字节(数字后面跟字母G)指定此值的选项。但经常遇到内存数量以字节(一组数字)指定的情况,这时需要从filemanager/include/utils.php文件中添加计算变量$memory_limit的函数image_check_memory_usage,为字节表示的内存大小添加计算。
在同一个utils.php文件中,需要将从getimagesize开始的行到条件结束的行包裹在try catch
中。如果抛出异常,则返回false。问题是,对于不正确的图片和尺寸为零的图片,getimagesize()
函数会抛出异常,而没有人可以捕获这个异常。通过将代码块包裹在try catch
中,我们可以捕获这个异常,并防止脚本崩溃。
上传小于100KB的小文件。
也存在一个小文件(约100KB)加载问题。原因是缺少标题 Content-Range。我们将通过修改文件 filemanager/UploadHandler.php 中的 post() 方法来解决这个问题:如果变量 $content_range 的值是 null,我们将给它赋值一个数组 [0,$size,$size]
,其中 $size 是上传文件的尺寸。
界面翻译
为了支持界面翻译,需要在文件 include/utils.php 的开头添加一个全局变量 $lang_vars
global $lang_vars;
通过链接上传文件。
在从外部来源(通过URL)上传文件时发现了一个问题。在这种情况下,PHP 不认为从外部(另一个服务器)加载的文件是 POST 请求加载的文件,并且不会将文件保存在磁盘上。在页面加载时,除了清除包含指定图片链接的地址字段外,没有发生任何操作。为了修复这个错误,需要在文件 /filemanager/UploadHandler.php 中的 handle_file_upload()
函数中添加一个额外的条件来检查是否存在从另一个服务器上传的“临时”文件。如果文件存在,则使用 file_put_contents()
将文件复制到指定位置。在这种情况下,调用将类似于最后一个 else 中的 file_put_contents()
调用,但文件来源将是上传的文件,路径可能存储在 $uploaded_file 中(需要检查 file_exists())。为此,可以使用 rename()
函数。
同时,在文件 upload.php 的第 89 行(将上传文件的数据数组赋值给 $_FILES['files'])中,需要将字段类型 - 从 null 更改为通过 curl 上传的文件中的 mime 类型 mime_content_type($temp)
。
与 FTP 相关的修正
通过 ftp 管理器工作需要以下代码修正
- 从函数
ftp_con()
开始,在文件 include/utils.php 中删除所有与 ftp 包装相关的文件包含。其实现在扩展中连接到 nicolab/php-ftp-client 包。 - 在文件 execute.php 中的
if (isset($_GET['action']))
之前添加以下行
# таким образом мы расширим путь до корня ftp ... if ($ftp && !empty($config['ftp_base_folder']) && $path) { $path = DIRECTORY_SEPARATOR . $config['ftp_base_folder'] . $path; }
- 在文件 include/unils.php 中的函数
url_exists()
添加通过curl_close()
释放资源的代码 - 如果需要生成缩略图但它们不存在,则需要将以下代码添加到相应的位置
- 文件 include/utils.php 中的函数
create_img()
扩展了一个参数:在列表末尾添加了$ftp = null
- 将检查
isset($config['ftp_host']) && $config['ftp_host']
替换为 $ftp(如果变量不为空,则继续); - 在文件 dialog.php 的条件
if(in_array($file_array['extension'], $config['ext_img'])){
中,对于 $ftp 需要插入生成缩略图的功能,类似于为本地目录执行的操作,但路径应不同。最终结果可能如下
- 文件 include/utils.php 中的函数
if (!in_array($file, $filesThumbs)) { $creation_thumb_path = '/' . $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $subdir . $file; if (!create_img($src, $creation_thumb_path, 122, 91, 'crop', $config,$ftp)) { $src_thumb = $mini_src = ""; } }
- 在文件 execute.php 中,在代码块
case 'rename_folder':
(重命名目录)中,检查路径类型的条件(如果是目录)需要添加以使此条件仅在不存在 ftp 连接时触发=只能对本地文件进行抱怨 .. - 为了从外部来源加载图片,需要改进之前在文件 UploadHandler.php 中为本地文件所做的修改。现在,我们将使用一个条件运算符来检查 ftp 连接的存在,而不是使用
rename($uploaded_file, $file_path);
if (empty($this->options['ftp'])) { rename($uploaded_file, $file_path); } else { $fn = $this->options['storeFolder'] . fix_filename(basename($file_path), $this->options['config']); $this->options['ftp']->put($fn, $uploaded_file, FTP_BINARY); }
- 需要将 include/utils.php 中的函数
create_folder()
补充为 ftp 的递归目录创建 = 调用中的第二个参数$ftp->mkdir = true;
更快地修改
另一种快速修改的方法是下载 9.14 Responsive File Manager 的版本,并在解压后的存档(在目录 responsive_filemanager 中)中初始化一个新的 git 仓库,创建基本提交,并应用名为 for-yii2.patch 的补丁。执行这些操作后,应该一切正常 ..
php8
只有用于转换图片的库文件在 php8 上会出错。该库的更新版本可在以下链接中找到 链接
连接
要使用文本编辑器而不使用文件管理器,只需使用小部件 TinyMCEWidget (\AlexNet\TinyFileMan\widgets\TinyMCEWidget),并将字段 $whithRfm 设置为 false(默认情况下,文件管理器已启用)。小部件可以独立工作(生成 textarea 控件元素),也可以作为表单的一部分(也生成 textarea 标签)。
要与小部件一起使用文件管理器,需要
- 将模块 FileManMod (TinyFileMan\FileManMod) 连接到项目中,并将其添加到预加载(bootstrap)中,以便形成文件管理器的访问路径。
- 编写文件管理器的配置(访问路径),这些配置在模块的设置中指定(字段 baseRFMUrls),以及文件管理器在服务器上的文件位置(字段 RFMlink - 支持别名)。
还可以通过字段 $editorConfig 设置编辑器的通用配置。编辑器的访问权限由关联数组预定义,键是类似于为 urlManager 设置的路径,值是包含 perms、uploadPath 和 thumbsPath 键的数组。使用 perms 可以限制对文件管理器的访问,而 uploadPath 和 thumbsPath 通过绝对路径或别名设置上传文件和缩略图的位置。路径必须可以通过 web 访问,因此必须以别名 @webroot 开头。
设置完上述配置后,可以使用参数 $for 连接小部件,该参数传递一个数组,第一个元素是配置中指定的 baseRFMUrls(路径模式)的关键字,其余参数(如果有)用于通过 \yii\helpers\Url::to()
形成特定链接。