matfish/craft-entry-meta

为任何元素添加元数据

安装: 814

依赖关系: 0

建议者: 0

安全: 0

星级: 3

关注者: 1

分支: 0

开放问题: 0

类型:craft-plugin

5.0.0 2024-04-13 07:16 UTC

README

第4版现在发布,使用专用多态表。如果您正在从版本3迁移,请阅读相关部分 此处

元素元数据

此软件包可以为所有元素类型添加无模式的元数据,包括自定义元素。

为什么?

有时您可能需要将附加信息附加到元素(例如条目、产品或类别)而无需在Craft中创建相应的字段。常见的例子包括在其他系统中保存元素的标识符、跟踪帖子查看次数或标记元素为已播种以便以后删除。

一种选择是使用允许隐藏/只读字段类型的插件在Craft中创建只读字段。然而,这种方法存在多个缺点

  1. 您现在在您的区域布局中有一个不属于那里的字段。
  2. 它可以从控制面板(仅在开发环境中)访问、修改和删除。
  3. 它在创建或编辑帖子时加载,这很容易从浏览器的开发者控制台进行篡改。
  4. 它不允许添加临时的数据,这些数据可能仅与单个帖子或一些帖子相关,而无需创建另一个字段。
  5. 它保存到content表,这不是它的自然栖息地。

Element Meta提供了一个更灵活的无模式替代方案,绕过Craft数据结构,并允许您将JSON格式的元数据保存到指定的多态表中。

安装

  1. 包含软件包
composer require matfish/craft-entry-meta
  1. 安装插件
php craft plugin/install entry-meta

初始设置

安装后,请转到插件的设置页面(在控制面板中的设置下)。

Settings Page

选择您要添加元数据的元素。请注意,对于自定义元素(与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');

对于更复杂的查询,您还可以链接 orWhereMetadataandWhereMetadata

默认情况下,该方法使用=运算符,您可以在第三个参数中覆盖它。例如

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 回复。