Tóm lược
Sự hiểu biết cấp cao hiện tại của tôi là mục đích của definition.map.xml
việc ánh xạ dữ liệu XML từ <settings>
nút Thành phần UI (Magento 2.2) sang các <argument>
nút của nó .
Chỉnh sửa : Sau khi viết câu trả lời này, tôi thấy rằng tài liệu Magento có thêm thông tin về các thay đổi ngữ nghĩa ở đây .
Giải trình
Đối với ngữ cảnh, các thành phần UI đã sử dụng <argument>
các nút trong một thời gian dài hơn <settings>
. Cụ thể, trong view/[area]/ui_component/etc/definition.xml
tệp hoặc tệp view/[area]/ui_component/[ui_component_name].xml
cấu hình, thực tiễn tiêu chuẩn là bao gồm một nút XML, chẳng hạn như sau:
<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>
Cấu hình đó, nếu được trao cho, <form>
Thành phần UI, sẽ được truyền vào hàm Form
tạo của lớp PHP ( Magento/Ui/Component/Form.php
) trong $data
mảng. Bản dịch khá đơn giản.
Tuy nhiên, cấu trúc này không cung cấp kiểm soát sắc thái hoặc xác thực XML xác định. Các nhà phát triển có thể đặt bất cứ thứ gì họ muốn vào các <argument>
nút của họ mà không bị trừng phạt (ít nhất là ở mức xác thực XSD) và các giá trị đó được chuyển ngay về mã PHP mà không cần nhiều biến đổi.
Để thêm một mức độ trừu tượng và xác nhận, Magento đã giới thiệu <settings>
nút. Nhìn lại một nút trong 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>
... Một cấu trúc trông rất giống với <argument>
cây cổ thụ bắt đầu xuất hiện. Ví dụ, sự khác biệt duy nhất là khi người ta muốn thêm một công cụ quay vòng vào một biểu mẫu, thay vì sử dụng <argument>
kiểu:
<argument name="data" xsi:type="array">
<item name="spinner" xsi:type="string">[My_Spinner_Name]</item>
</argument>
... người ta có thể nhận thấy rằng giá trị cấu hình tương tự được ánh xạ bởi dòng <item name="spinner" type="string" xsi:type="xpath">settings/spinner</item>
theo cú pháp thay thế sau:
<settings>
<spinner>[My_Spinner_Name]</spinner>
</settings>
Nhìn bề ngoài, đây có vẻ như là một mức độ trừu tượng hoàn toàn mệt mỏi, lưu một vài ký tự XML trong một tệp cấu hình bằng cách thêm nhiều dòng vào một tệp ánh xạ mới.
Tuy nhiên, không phải mọi ánh xạ đều là vấn đề đơn giản của sao chép và dán. Ví dụ, có vẻ như ánh xạ cho cấu hình nút:
<item name="buttons" type="buttons" xsi:type="converter">settings/buttons</item>
... là của xsi:type="converter"
(chứ không phải xpath
, giống như ví dụ về spinner ở trên). Việc xác định hậu quả của một tuyên bố như vậy là vượt quá khả năng của tôi, nhưng trình thám hiểm mã nguồn thông minh có thể muốn xem xét Magento\Ui\Config\Converter
, trong đó nhiều nút cấu hình XML phức tạp hơn này có các lớp PHP có tên trùng khớp.
Hiệu ứng trên XML rõ ràng hơn. Trong khi đó cú pháp cũ cho các định nghĩa nút sẽ là
<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>
... cấu hình mới sẽ trông như sau:
<settings>
<buttons>
<button name="back" class="Company\Basic\Block\Adminhtml\Slides\BackButton"/>
<button name="save" class="Company\Basic\Block\Adminhtml\Slides\SaveButton"/>
</buttons>
</settings>
... Và rõ ràng có những lợi ích bổ sung khi chuyển qua Ui/Config
mã chuyển đổi PHP của Magento .
Đây chỉ là một quan điểm khó hiểu về những gì người ngoài nhận thấy là mục đích đằng sau các tệp này: Tôi chắc chắn rằng một nhà phát triển Magento thực tế sẽ có thể cung cấp cái nhìn sâu sắc hơn nhiều về cả các chi tiết chức năng của mã và động lực đằng sau mức bổ sung này trừu tượng hóa.
Chỉnh sửa : Trên thực tế, có vẻ như tài liệu Magento có một trang mô tả động lực đằng sau những thay đổi này. Nhìn vào đây để biết thêm thông tin.