passchn / cakephp-assets
CakePHP 的资产管理插件
Requires
- php: >=8.1
- ext-fileinfo: *
- cakephp/cakephp: ^5.0.0
- intervention/image: ^2.7.2
- josegonzalez/cakephp-upload: ^8.0
- league/csv: ^9.8
- nette/utils: ^3.2 || ^4.0.0
Requires (Dev)
- cakedc/cakephp-phpstan: ^3.0
- cakephp/cakephp-codesniffer: ^5.1
- phpunit/phpunit: ^10.1
This package is auto-updated.
Last update: 2024-09-16 15:18:16 UTC
README
插件的功能
此插件帮助您管理后端资产,这些资产可以是任何文件类型。资产保存在非公开文件夹中,并由 AssetsTable 处理。
您可以使用具有有用方法的 AssetEntities
通用方法
- 检查上传的文件是否仍然存在:
$asset->exists() // true 或 false
$asset->getFileSizeInfo()
打印一个可读的文件大小。- 获取 AssetsController::download() 的链接(带有 Admin 前缀):
$asset->getDownloadLink()
图像渲染
- 调用
echo $asset->getImage()->scaleWidth(350)->toWebP()->addCSS('my-class')
以将 WebP 缩略图作为 HTML 渲染。 - 渲染的图像将保存在
webroot/img/modified
中,具体取决于修改和传递的选项。 - 通过
ImageAsset::applyFilter()
传递您的自定义 InterventionImage 过滤器 - 您可以通过
ImageAsset::modify()
调用任何 InterventionImage API 方法
CSV 预览
- 您可以使用
TextAssetPreviewHelper
来渲染 CSV 文件的表格。 - 遍历 csv-Asset 中的行:
foreach ($asset->getReader()->getRecords() as $row) ...
任何模型的旁证属性
$asset
可以是$user->image
,$company->logo
或您最新的 CSV 导入。只需在您的模型上配置一个belongsTo
关系并设置 ClassName 即可。
安装
您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。
安装 composer 包的推荐方法是
composer require passchn/cakephp-assets
加载插件
bin/cake plugin load Assets
运行迁移以创建插件表
bin/cake migrations migrate -p Assets
现在您应该在数据库中有一个 assets_assets
和一个 assets_phinxlog
表。
CakePHP 版本映射
此插件还没有版本 1。要在项目中使用它,请检查版本映射
上传文件
AssetsController
您可以直接使用 AssetsController 上传文件。默认情况下,您可以通过 Admin
前缀访问索引、查看和编辑方法: your-app.test/admin/assets/assets
使用旁证名称
您可以使用 Assets 表从任何模型上传文件,例如,您有一个 users
表并需要一个用户图像
- 在
users
表中创建一个userimage_id
字段,作为可空的char(36)
(UUID)。 - 运行迁移:
bin/cake bake users
- 现在您需要告诉 CakePHP,您的
Userimage
不是一个真正的实体,而是来自Assets.AssetsTable
表
in \App\Model\Table\Users:
$this->belongsTo('Userimages')
->setForeignKey('userimage_id')
->setClassName('Assets.Assets');
这不再有效。从版本
2.8
开始的cakephp-bake
插件似乎检测到您实际上没有userimages
表,并且不会假设一个belongsTo
关系。您必须自己编写代码或降级到版本2.7
。
现在您可以在 templates/Users/edit.php
中放置一个用于 Userimage 的上传字段
<?= $this->Form->create($user, ['type' => 'file']) ?>
...
...
<?= $this->Form->control('userimage.filename', [
'type' => 'file',
'label' => 'Upload a profile photo',
]) ?>
...
<?= $this->Form->end() ?>
为了使此操作正常工作,关系应该设置正确,例如通过 bin/cake bake users
,这样 CakePHP 就知道您的 $user->userimage
是一个 Asset
实体。请注意,您必须在控制器或表的查找方法中包含 Userimages
$users = $this->Users->find()->contain([
'Userimages',
'Addresses,
'...
]);
$image = $users->first()->userimage?->getImage();
AssetsTable不知道上传的文件属于哪个模型。您可以使用title
、description
或category
字段来跟踪。
为此,您可以将自定义行为注入到AssetsTable中,以挂钩事件处理器(例如,在beforeSave()
上设置title
),或者创建自定义查找方法,例如通过您定义的分类。
在您的配置文件app.php
、app_local.php
或app_assets.php
中,您可以覆盖默认设置并添加自定义行为。
文件操作
图片
如果资产是图片(MIME类型以image/*
开头),您可以调用
$asset->getImage();
这返回一个Assets\Utilities\ImageAsset
类的实例,它提供了对ImagineImage
的包装API。
例如,您可以调用
echo $asset->getImage()->scaleWidth(350)->toWebP()->getPath()
这将生成原始文件的缩放版本,转换为WebP,并返回文件相对于/webroot
的路径。
您可能希望直接输出HTML
<?= $asset->getImage()->scaleWidth(520)->toJpg()->setCSS('my-class') ?>
这将调用ImageAsset::__toString()
方法,并将返回包含您设置的class、具有资产标题的alt参数以及正确的width
和height
参数的HTML。
图像操作通过Intervention使用GD作为默认,但您可以通过app.php配置启用imagick。
<picture>
元素的渲染
在AppView.php
中加载PictureHelper
$this->loadHelper('Assets.Picture');
在模板中,将ImageAsset
以及包含宽度和参数的数组传递给Helper
<?= $this->Picture->webp(
$user->photo->modify('resize', 350, 600),
[150, 350],
[
'class' => 'user-img',
'width' => 350,
'height' => 600,
'sizes' => "(min-width: 230px) 100vw, (min-width: 640px) 50vw"
]
) ?>
反馈、错误报告和功能请求
从一开始,这个插件就不是插件,我们现在正在努力使它在不同的CakePHP安装中可用。
由于这个包作为插件处于早期开发阶段,我们目前不期望它适用于许多用例。
如果您对该插件有任何疑问或问题,请在GitHub上创建一个Issue。
您也可以通过以下电子邮件联系我:post@pascalschneider.eu
此插件使用的包
除了CakePHP之外,该插件还依赖于以下包
"josegonzalez/cakephp-upload": "^6.0",
"league/csv": "^9.8",
"nette/utils": "^3.2 || ^4.0",
"intervention/image": "^2.7"