Magento 2.2引入了一个新文件definition.map.xml。
该文件的目的和意图是什么?它似乎与在中构建schemaMap属性有关Magento\Ui\Config\Converter
,但是GitHub注释都没有真正解释该文件的意图或其意图传达的内容。
除了好奇心外,我的主要兴趣是修补M2.2中损坏的教程模块。
Magento 2.2引入了一个新文件definition.map.xml。
该文件的目的和意图是什么?它似乎与在中构建schemaMap属性有关Magento\Ui\Config\Converter
,但是GitHub注释都没有真正解释该文件的意图或其意图传达的内容。
除了好奇心外,我的主要兴趣是修补M2.2中损坏的教程模块。
Answers:
我目前的高层理解是,的目的definition.map.xml
是将XML数据从(Magento 2.2)UI组件的节点映射<settings>
到其<argument>
节点。
编辑:写下此答案后,我发现Magento文档在此处具有有关语义更改的其他信息。
就上下文而言,UI组件使用<argument>
节点的时间比更长<settings>
。具体来说,在view/[area]/ui_component/etc/definition.xml
文件或view/[area]/ui_component/[ui_component_name].xml
配置文件中,标准做法是包括一个XML节点,例如:
<argument name="data" xsi:type="array">
<item name="js_config" xsi:type="array">
<item name="provider" xsi:type="string">oracle_order_form.oracle_order_form_data_source</item>
</item>
<item name="label" xsi:type="string" translate="true">Company Information</item>
<item name="template" xsi:type="string">templates/form/collapsible</item>
</argument>
如果将该配置(如果赋予<form>
UI组件),则最终将传递给数组中Form
PHP类的构造函数(Magento/Ui/Component/Form.php
)$data
。翻译非常简单。
但是,此结构没有提供对定义XML的细微控制或验证。开发人员可以不受约束地将他们想要的任何东西放入<argument>
节点中(至少在XSD验证级别上),并且这些值无需进行大量转换即可直接传递回PHP代码。
为了增加抽象和验证级别,Magento引入了该<settings>
节点。再看一下一个节点definition.map.xml
:
<component name="form" include="uiElementSettings">
<schema name="current">
<argument name="data" xsi:type="array">
<item name="layout" xsi:type="array">
<item name="type" type="string" xsi:type="xpath">settings/layout/type</item>
<item name="navContainerName" type="string" xsi:type="xpath">settings/layout/navContainerName</item>
</item>
<item name="config" xsi:type="array">
<item name="selectorPrefix" type="string" xsi:type="xpath">settings/selectorPrefix</item>
<item name="messagesClass" type="string" xsi:type="xpath">settings/messagesClass</item>
<item name="errorClass" type="string" xsi:type="xpath">settings/errorClass</item>
<item name="ajaxSaveType" type="string" xsi:type="xpath">settings/ajaxSaveType</item>
<item name="namespace" type="string" xsi:type="xpath">settings/namespace</item>
<item name="ajaxSave" type="boolean" xsi:type="xpath">settings/ajaxSave</item>
<item name="reloadItem" type="string" xsi:type="xpath">settings/reloadItem</item>
</item>
<item name="buttons" type="buttons" xsi:type="converter">settings/buttons</item>
<item name="spinner" type="string" xsi:type="xpath">settings/spinner</item>
</argument>
</schema>
</component>
...看起来与<argument>
老树非常相似的结构开始出现。唯一的区别是,例如,当一个人想要向表单添加一个微调器而不是使用<argument>
样式时:
<argument name="data" xsi:type="array">
<item name="spinner" xsi:type="string">[My_Spinner_Name]</item>
</argument>
...可能会注意到,该行将相同的配置值映射<item name="spinner" type="string" xsi:type="xpath">settings/spinner</item>
到以下替代语法:
<settings>
<spinner>[My_Spinner_Name]</spinner>
</settings>
从表面上看,这似乎是一个完全致命的抽象级别,通过向新的映射文件中添加多行来在一个配置文件中保存XML的几个字符。
但是,并非每个映射都是复制粘贴的简单问题。例如,似乎按钮配置的映射:
<item name="buttons" type="buttons" xsi:type="converter">settings/buttons</item>
...是的xsi:type="converter"
(而不是xpath
像上面的微调框示例一样)。确定这样的声明的后果超出了我的能力范围,但是无畏的源代码浏览器可能想查看Magento\Ui\Config\Converter
,其中许多更复杂的XML配置节点都具有带有匹配名称的PHP类。
对XML的影响更加明显。而按钮定义的旧语法本来是
<argument name="data" xsi:type="array">
<item name="buttons" xsi:type="array">
<item name="back" xsi:type="string">Company\Basic\Block\Adminhtml\Slides\BackButton</item>
<item name="save" xsi:type="string">Company\Basic\Block\Adminhtml\Slides\SaveButton</item>
</item>
</argument>
...新配置如下所示:
<settings>
<buttons>
<button name="back" class="Company\Basic\Block\Adminhtml\Slides\BackButton"/>
<button name="save" class="Company\Basic\Block\Adminhtml\Slides\SaveButton"/>
</buttons>
</settings>
...表面上还具有通过Magento的Ui/Config
PHP转换代码传递的其他好处。
这只是局外人认为这些文件背后意图的粗略视图:我相信实际的Magento开发人员将能够提供更多有关代码功能细节以及此附加级别背后动机的见解。的抽象。
编辑:看起来Magento文档确实有一个页面,描述了这些更改背后的动机。看这里了解更多信息。