Підсумок
Моє сучасне розуміння на високому рівні полягає в тому, що мета definition.map.xml
полягає у зіставленні даних XML з <settings>
вузла (Magento 2.2) компонента інтерфейсу користувача до його <argument>
вузлів.
Редагувати : Після написання цієї відповіді я виявив, що документація Magento містить додаткову інформацію про смислові зміни тут .
Пояснення
Для контексту компоненти інтерфейсу користуються <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>
компоненту інтерфейсу користувача, буде завершена, перейшла в 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>
... і нібито мають додаткові переваги при проходженні Ui/Config
коду конверсії PHP Magento .
Це лише короткий перегляд того, що стороннє підприємство сприймає за наміром цих файлів: я впевнений, що фактичний розробник Magento міг би набагато більше зрозуміти як функціональні деталі коду, так і мотивацію цього додаткового рівня абстракції.
Редагувати : Схоже, що в документації Magento насправді є сторінка, що описує мотивацію цих змін. Подивіться тут для отримання додаткової інформації.