跳到内容
新问题

对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

API问题:块的复制/粘贴处理程序筛选器 #23377

关闭
埃利奥特康登已打开此问题2020年6月23日·6条评论
关闭

API问题:块的复制/粘贴处理程序筛选器 #23377

埃利奥特康登已打开此问题2020年6月23日·6条评论
标签
[功能]块API 允许表达块范例的API。 [类型]帮助请求 有关设置、实施或“我该怎么做?”问题的帮助。

评论

@埃利奥特康登

大家好,

给你一个快速的技术问题:是否有方法[通过块API]自定义块的属性在复制和过去事件处理程序期间?

例如,开发人员可能希望他们的块实例包含一个唯一的标识符。如果复制并粘贴(或复制)块属性也将被复制,导致两个块共享相同的标识符。👉 这只是一个例子,并不是要求澄清属性.客户端ID.

也许有一个过滤器,或者有一种方法可以连接到某个地方并定制数据?我已经搜索了插件的源代码,但还没有找到任何明显的东西。

提前谢谢。

@安娜扎祖 安娜扎祖补充[功能]块API 允许表达块范例的API。 [类型]帮助请求 有关设置、实施或“我该怎么做?”问题的帮助。标签2020年6月30日
@最大连续频率
复制链接
贡献者

你好!

这是一个有趣的问题。我将试着逐条回答:

是否有方法[通过块API]自定义块的属性在复制和过去事件处理程序期间?

简短回答:不,没有。最接近的是“原始”在粘贴HTML时进行转换,但在粘贴实际块时,这些块是可以一字不差地接受的,减去他们的ID.

也许有一个过滤器,或者有一种方法可以连接到某个地方并定制数据?

看待这一问题的一种方法是颠倒关系:与其设置一个过滤器来自动更改/剥离某些数据,块的编辑组件负责确保块数据良好?

在解释我的上述意思之前,让我们先讨论一下这个问题:

例如,开发人员可能希望他们的块实例包含一个唯一的标识符。[…]这只是一个例子,而不是要求明确[…]

我尽力不去关注手边的示例:)但我认为这有点不可避免,因为用例可以满足我们的需求。块属性实际上是块,每个属性对于块的外观和行为都至关重要。在这种情况下,很难不把标识符看作是不同的东西。事实上,古腾堡自己客户端ID是的一部分道具而不是属性正如你所指出的。这也不是偶然的客户端ID 永远不会是永久的,只有一个随机且短暂的值来标识内存中存在的块。

下面是我发现的用例,它可能最接近ID,但仍然是一个“有意义的”块属性:元素的可选HTML锚。

因此,为了完整起见,我更改了Heading的Edit组件,以便在已经使用相同值的情况下去掉锚属性:
const isAnchorUnique=使用选择((选择)=>选择('核心/块编辑器').getBlocks().过滤器(({attributes:{anchor:otherAnchor}})=>其他锚!==未定义&&otherAnchor===锚点).长度<=1);使用效果(()=>{if(是AnchorUnique){回报;}控制台.log(“标题锚点”、“锚点”已在使用中。正在取消设置值…');setAttributes({锚:未定义});},[锚]);

这“行得通”,但实际上不行,因为它必然会破坏撤销。的确,setAttribute(设置属性)必须始终是用户操作的结果,而不是自动操作(请参见更多关于“撤消陷阱”的信息).

然而,它确实提供了关于当前问题的一些见解:让用户知道存在重复的锚,并要求他们修复此问题。这与文档中错位标题或低对比度颜色组合的原则相同,它告知并建议编辑不敢自动“修复”。这可以通过打补丁扩展到HTML锚点块编辑器挂钩/锚.js当锚已经使用时显示通知。

因此,最后,我想了解更多有关预期用例的信息。你什么时候真的需要这个?这些需要剥离的ID是什么,它们是否暗示了潜在的问题?我并不是要阻止一个可能的新API,我只是想特别注意我们如何扩展API。:)

@埃利奥特康登
复制链接
作者

您好!@最大连续频率

感谢您对此的关注🙌.

您已经很好地回答了所有问题,isAnchorUnique代码示例非常棒。这种方法正是ACF当前在复制块时处理唯一块属性的方式。虽然对于“每篇文章唯一”的解决方案来说是完美的,但当需要“每个站点唯一”的值时,这种方法的局限性就显而易见了。

好的,让我更详细地解释一下为什么这对ACF和其他第三方开发人员很重要。

从WordPress本身派生出来的ACF插件有一个强大的理念,即对象和元的关系概念。每个Object(post、term、user)都包含一个唯一的ID,可以用来定位正确的元数据。

为了将这种原理(ACF函数工作所必需的)集成到块中,我们选择为每个块提供一个持久的唯一ID,该ID保存在属性数据。我可以相信这可能与块编辑器的API“格格不入”,但这是一个独特问题的独特要求,效果很好。因此,每个块都有一个唯一的ID,看起来像“block_123jhg24k5”,它永远不会改变,允许我们执行关系数据。

我提到,我们已经在编辑功能中使用了“是唯一的”解决方案。这可以解决复制块时的冲突-很容易。我们现在面临的问题是,当用户拷贝来自一个帖子的一个块,并将其粘贴到另一篇帖子上时。如果没有针对该事件的过滤器,我们(在任何性能领域)都无法检测到这实际上是一个需要新的唯一ID的新块。“复制”上的过滤器(用于取消设置ID)或“粘贴”上的筛选器(用于生成新ID)将100%解决我们的问题。

现在,对于一个与“ID”无关的场景本月流行的CSS技巧一个。开发人员希望作者经常在站点周围插入或复制/粘贴此块,并希望确保渐变颜色有所变化。“新块”、“复制块”和“粘贴块”的特定过滤器将允许一种简单的方法在正确的时间生成新渐变(不是在每个“编辑”渲染上)。

我希望这些示例足以考虑此功能请求。它将帮助许多ACF阻止用户👍.

谢谢
埃利奥特

@最大连续频率
复制链接
贡献者

感谢您提供的所有详细信息,@埃利奥特康登

我认为这可能是一个有价值的补充。它确实提出了一些用户体验问题,尤其是在用户期望和一致性方面。例如,当用户使用“复制”操作而不是“复制”然后再粘贴时会发生什么?事实上,这个问题让我发现#20237,这恰好是一个有用的交叉参考,与当前问题有许多相似之处。

我还认为,与其使用宽“过滤器”来拦截某些块操作,不如使用块属性中的新属性作为更简单、更有效的界面:

{
  排列:{
    类型:“字符串”,
  },
  acfId(acfId):{
    类型:“字符串”,
    便携式的:,
  },

便携式的这是一个很糟糕的名字,但你明白了。我还考虑了“可复制”、“可转移”等。有了这些,我们可以在或接近于创建块,这可能更有效。

@埃利奥特康登
复制链接
作者

埃利奥特康登 评论2020年7月4日

@最大连续频率这个便携式的属性设置是一个很好的主意,我希望看到它得到实现🙌.

正如您所提到的,这里的好处是一种更“通用”的方法,可以覆盖更多的使用卡。缺点是它可能需要更多的架构和策略,因为它将具有全球影响。这最终增加了它被已经大量的特性请求所淹没的可能性。

回想一下定制WordPress的“经典方式”,Gutenberg开发团队对添加操作/过滤器的总体感觉如何?是否有回避的倾向?

我坚信WordPress中的钩子系统使开发社区蓬勃发展,并希望看到块编辑中所有主要事件的钩子,如复制、复制、粘贴、插入。我可以看到这些工作方式与编辑。块编辑块.getSaveContent.extraProps.

让我知道我可以做什么来帮助改进👍

@wweb先生
复制链接

我很乐意提供一个真实的用例,在这个用例中,拥有一个稳定的唯一块ID是非常有用的:一个手风琴块。

手风琴块需要ID至少有两个原因:

  1. 允许指向页面上特定节的锚定链接
  2. 通过变量控制属性。

虽然编辑器当然可以指定一个自定义ID,但我想为每个手风琴块自动提供一个唯一的ID,以便可以选择使用“漂亮”的ID。由于锚链的性质,它们需要既独特又稳定。与OP类似,在复制或复制时,需要重新生成ID。

这不仅仅是我遇到的一个问题,在这个手风琴琴块。我还认为目录块也会遇到类似的问题,因为要提供稳定的页面锚定是一个高优先级的问题。

@吵闹声
复制链接
成员

作为@最大连续频率注意,目前还没有API能够很好地解决这个用例。

在中有关于创建这样一个API的讨论#29693有几个提案,但不幸的是,没有一个提案在贡献者中获得广泛共识。这是对块API的一个重大更改,因此每个人都希望正确使用它。

同时,您可以使用小部件编辑器使用的相同方法,即将ID存储在一个属性中,该属性不是在块的块.json。当将块序列化为HTML并复制/复制它时,块编辑器将忽略这些属性,这使其成为存储外键的一个很好的解决方案。

我将按回答结束此帮助请求(尽管我很感激这不是一个令人满意的回答😀) 让我们使用#29693跟踪创建更好的API。

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
标签
[功能]块API 允许表达块范例的API。 [类型]帮助请求 有关设置、实施或“我该怎么做?”问题的帮助。
项目
还没有
开发

没有分支或拉请求

5名参与者