我们阅读了每一条反馈,并非常认真地对待您的意见。
要查看所有可用的限定符,请参阅我们的文档.
对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。
单击“注册GitHub”,表示您同意我们的服务条款和隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。
已经在GitHub上了?登录到您的帐户
大家好,
给你一个快速的技术问题:是否有方法[通过块API]自定义块的属性在复制和过去事件处理程序期间?
属性
例如,开发人员可能希望他们的块实例包含一个唯一的标识符。如果复制并粘贴(或复制)块属性也将被复制,导致两个块共享相同的标识符。👉 这只是一个例子,并不是要求澄清属性.客户端ID.
属性.客户端ID
也许有一个过滤器,或者有一种方法可以连接到某个地方并定制数据?我已经搜索了插件的源代码,但还没有找到任何明显的东西。
提前谢谢。
文本已成功更新,但遇到以下错误:
你好!
这是一个有趣的问题。我将试着逐条回答:
是否有方法[通过块API]自定义块的属性在复制和过去事件处理程序期间?
简短回答:不,没有。最接近的是“原始”在粘贴HTML时进行转换,但在粘贴实际块时,这些块是可以一字不差地接受的,减去他们的ID.
“原始”
也许有一个过滤器,或者有一种方法可以连接到某个地方并定制数据?
看待这一问题的一种方法是颠倒关系:与其设置一个过滤器来自动更改/剥离某些数据,块的编辑组件负责确保块数据良好?
编辑
在解释我的上述意思之前,让我们先讨论一下这个问题:
例如,开发人员可能希望他们的块实例包含一个唯一的标识符。[…]这只是一个例子,而不是要求明确[…]
我尽力不去关注手边的示例:)但我认为这有点不可避免,因为用例可以满足我们的需求。块属性实际上是块是,每个属性对于块的外观和行为都至关重要。在这种情况下,很难不把标识符看作是不同的东西。事实上,古腾堡自己客户端ID是的一部分道具而不是属性正如你所指出的。这也不是偶然的客户端ID 永远不会是永久的,只有一个随机且短暂的值来标识内存中存在的块。
客户端ID
道具
下面是我发现的用例,它可能最接近ID,但仍然是一个“有意义的”块属性:元素的可选HTML锚。
const isAnchorUnique=使用选择((选择)=>选择('核心/块编辑器').getBlocks().过滤器(({attributes:{anchor:otherAnchor}})=>其他锚!==未定义&&otherAnchor===锚点).长度<=1);使用效果(()=>{if(是AnchorUnique){回报;}控制台.log(“标题锚点”、“锚点”已在使用中。正在取消设置值…');setAttributes({锚:未定义});},[锚]);
这“行得通”,但实际上不行,因为它必然会破坏撤销。的确,setAttribute(设置属性)必须始终是用户操作的结果,而不是自动操作(请参见更多关于“撤消陷阱”的信息).
setAttribute(设置属性)
然而,它确实提供了关于当前问题的一些见解:让用户知道存在重复的锚,并要求他们修复此问题。这与文档中错位标题或低对比度颜色组合的原则相同,它告知并建议编辑不敢自动“修复”。这可以通过打补丁扩展到HTML锚点块编辑器的挂钩/锚.js当锚已经使用时显示通知。
块编辑器
挂钩/锚.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):{ 类型:“字符串”, 便携式的:假, },…
便携式的这是一个很糟糕的名字,但你明白了。我还考虑了“可复制”、“可转移”等。有了这些,我们可以在或接近于创建块,这可能更有效。
便携式的
创建块
@最大连续频率这个便携式的属性设置是一个很好的主意,我希望看到它得到实现🙌.
正如您所提到的,这里的好处是一种更“通用”的方法,可以覆盖更多的使用卡。缺点是它可能需要更多的架构和策略,因为它将具有全球影响。这最终增加了它被已经大量的特性请求所淹没的可能性。
回想一下定制WordPress的“经典方式”,Gutenberg开发团队对添加操作/过滤器的总体感觉如何?是否有回避的倾向?
我坚信WordPress中的钩子系统使开发社区蓬勃发展,并希望看到块编辑中所有主要事件的钩子,如复制、复制、粘贴、插入。我可以看到这些工作方式与编辑。块编辑或块.getSaveContent.extraProps.
让我知道我可以做什么来帮助改进👍
我很乐意提供一个真实的用例,在这个用例中,拥有一个稳定的唯一块ID是非常有用的:一个手风琴块。
手风琴块需要ID至少有两个原因:
变量控制
虽然编辑器当然可以指定一个自定义ID,但我想为每个手风琴块自动提供一个唯一的ID,以便可以选择使用“漂亮”的ID。由于锚链的性质,它们需要既独特又稳定。与OP类似,在复制或复制时,需要重新生成ID。
这不仅仅是我遇到的一个问题,在这个手风琴琴块。我还认为目录块也会遇到类似的问题,因为要提供稳定的页面锚定是一个高优先级的问题。
作为@最大连续频率注意,目前还没有API能够很好地解决这个用例。
在中有关于创建这样一个API的讨论#29693有几个提案,但不幸的是,没有一个提案在贡献者中获得广泛共识。这是对块API的一个重大更改,因此每个人都希望正确使用它。
同时,您可以使用小部件编辑器使用的相同方法,即将ID存储在一个属性中,该属性不是在块的块.json。当将块序列化为HTML并复制/复制它时,块编辑器将忽略这些属性,这使其成为存储外键的一个很好的解决方案。
块.json
我将按回答结束此帮助请求(尽管我很感激这不是一个令人满意的回答😀) 让我们使用#29693跟踪创建更好的API。
没有分支或拉请求