matfish / craft-entry-meta
为任何元素添加元数据
Requires
- craftcms/cms: ^5.0
This package is auto-updated.
Last update: 2024-09-13 08:10:28 UTC
README
第4版现在发布,使用专用多态表。如果您正在从版本3迁移,请阅读相关部分 此处
元素元数据
此软件包可以为所有元素类型添加无模式的元数据,包括自定义元素。
为什么?
有时您可能需要将附加信息附加到元素(例如条目、产品或类别)而无需在Craft中创建相应的字段。常见的例子包括在其他系统中保存元素的标识符、跟踪帖子查看次数或标记元素为已播种以便以后删除。
一种选择是使用允许隐藏/只读字段类型的插件在Craft中创建只读字段。然而,这种方法存在多个缺点
- 您现在在您的区域布局中有一个不属于那里的字段。
- 它可以从控制面板(仅在开发环境中)访问、修改和删除。
- 它在创建或编辑帖子时加载,这很容易从浏览器的开发者控制台进行篡改。
- 它不允许添加临时的数据,这些数据可能仅与单个帖子或一些帖子相关,而无需创建另一个字段。
- 它保存到
content
表,这不是它的自然栖息地。
Element Meta提供了一个更灵活的无模式替代方案,绕过Craft数据结构,并允许您将JSON格式的元数据保存到指定的多态表中。
安装
- 包含软件包
composer require matfish/craft-entry-meta
- 安装插件
php craft plugin/install entry-meta
初始设置
安装后,请转到插件的设置页面(在控制面板中的设置
下)。
选择您要添加元数据的元素。请注意,对于自定义元素(与Craft的本地元素相比),您需要提供元素类和Active Record类。例如,如果您想启用Craft Commerce的产品元数据
元素类 = craft\commerce\elements\Product
Active Record类 = craft\commerce\records\Product
软件包将对这两个类进行验证,以确保它们存在并且分别是Element和Active Record的子类。
保存设置后,插件将向相关元素添加元数据功能。
使用方法
$entry
以下是指条目元素(craft\elements\Entry
)。
请注意,元素必须已经保存才能使用元数据方法。
设置元数据(将替换现有元数据)
$entry->setElementMetadata([ 'foo'=>'bar' ]);
添加到现有元数据,或替换现有值
$entry->addElementMetadata([ 'a'=>1 ]);
删除元数据
$entry->deleteElementMetadata();
获取条目的所有元数据
$entry->getElementMetadata();
获取特定键值
$entry->getElementMetadata('foo');
获取嵌套值
$entry->getElementMetadata('foo.bar');
或使用Twig
{{entry.getElementMetadata('foo')}}
通过元数据查询
您可以使用以下详细说明的方法在Active Record类(例如 craft\records\Entry
)上通过元数据进行查询。
当使用版本4或更高版本时,用户应首先连接元数据表。例如
Entry::find()->joinMetadata()->whereMetadata('foo','bar')
这是一个左连接,所以它不会影响查询结果,只是添加了元数据列。
通过元数据筛选
值
Entry::find()->whereMetadata('foo','bar');
对于更复杂的查询,您还可以链接 orWhereMetadata
和 andWhereMetadata
。
默认情况下,该方法使用=
运算符,您可以在第三个参数中覆盖它。例如
Entry::find()->whereMetadata('views',0,'>');
存在性
您还可以检查元数据 键 的存在性
Entry::find()->hasMetadata('foo');
或者,反过来
Entry::find()->doesntHaveMetadata('foo');
要过滤掉元数据本身的存在,只需省略键参数
Entry::find()->hasMetadata();
或者
Entry::find()->doesntHaveMetadata();
按元数据排序
Entry::find()->whereMetadata('views',0,'>')->orderByMetadata('views',false, true);
第二个布尔参数表示是否按升序排序。默认为 true
第三个布尔参数表示值是否为整数。默认为 false
嵌套数据
您可以使用 .
语法搜索和排序嵌套数据
Entry::find()->whereMetadata('foo.bar','baz')->orderByMetadata('foobar.baz');
元素编辑页面上的元数据
默认情况下,元数据在侧边栏中与 Craft 的元数据(状态、创建时间、更新时间)一起渲染。您可以通过插件设置页面禁用此行为。
迁移到版本 4
版本 4 修改了存储元数据的方式。到目前为止,元数据被保存在相应的表(例如 entries
)的附加 emMetadata
列中。在版本 4 中,这被替换为一个存储所有元数据的单一多态表。从版本 3 迁移数据应该是完全自动化的。
出于额外谨慎,旧的 emMetadata
列不会自动删除。在生产环境中更新版本后,运行以下查询以获取每个元素类型的计数
select elementType, count(*) FROM [prefix]_elementmeta
GROUP BY 1
然后,对每个单独的表运行
SELECT count(*) FROM [table] WHERE emMetadata IS NOT NULL
数字应该匹配。
然后,为了验证数据是否相同,对每个单独的表运行以下操作
SELECT count(*) FROM [table]
JOIN elementmeta
ON [table].id=elementmeta.elementId
AND elementmeta.elementType='[elementClass]'
WHERE [table].emMetadata=elementmeta.data
例如:
SELECT count(*) FROM mf_categories
JOIN mf_elementmeta
ON mf_categories.id=mf_elementmeta.elementId
AND mf_elementmeta.elementType='craft\\elements\\Category'
WHERE mf_categories.emMetadata=mf_elementmeta.data
数字应该再次匹配。
一旦您确认所有元数据都已正确迁移, 您可以删除相应表上的列(s)。
您可能还需要在设置页面中重新启用原生元素(例如条目、分类等)。
在公共 API 方面,唯一的重大变化是在查询活动记录之前,应使用 ->joinMetadata()
连接元数据表。此外,还添加了 deleteElementMetadata
方法。
如果在迁移过程中遇到任何问题,请打开一个问题或给我发邮件到 matfish2@gmail.com
,我会尽力尽快解决。
许可证
您可以在开发环境中尝试 Element Meta,直到您想试多久就多久。一旦您的网站上线,您需要为插件购买许可证。许可证可通过 Craft 插件商店 购买。
有关更多信息,请参阅 Craft 的 商业插件许可。
要求
此插件需要 Craft CMS 3.7.0 或更高版本。
贡献指南
社区是开源项目的核心。我们总是很高兴从用户那里收到建设性的反馈,以逐步改进产品和/或文档。
以下是一些旨在促进互动并防止误解的简单规则
请只为错误报告打开一个新问题。对于功能请求和问题,请打开一个新的 讨论,并在标题前加上 [FR]。
如果您想支持现有的 FR,只需为 OP 投票,同时避免 +1 回复。