Giải thích về lưới thành phần UI trong Magento 2


91

Có một giải thích tốt và / hoặc mẫu về cấu hình tối thiểu cần thiết để tạo Lưới thành phần UI trong Magento 2 không?

Tôi biết có vô số thành phần cốt lõi, như

./vendor/magento/module-catalog/view/adminhtml/ui_component/product_listing.xml

Tuy nhiên, các tệp XML này là mở rộng và có rất ít lời giải thích về việc mỗi nút làm gì và cách bạn sử dụng điều này để xây dựng lưới từ đầu.

Cũng có mô-đun mẫu này , nhưng nó

  1. Xuất hiện trước một hình thức
  2. Thiếu bất kỳ bối cảnh / giải thích về những gì mỗi nút làm

Tôi đang tìm kiếm thông tin "bắt đầu" cho phép tôi xây dựng lưới cho bộ sưu tập mô hình CRUD của riêng tôi.


6
Không hoàn toàn xứng đáng với một câu trả lời đầy đủ - nhưng loạt Thành phần UI của tôi là nơi tốt để bắt đầu: alanstorm.com/carget/magento-2/#magento-2-ui
Alan Storm

Câu trả lời:


166

[EDIT 3 tháng 10 năm 2018]

Cập nhật các liên kết đến devdocs: 2.0 - https://devdocs.magento.com/guides/v2.0/ui-components/ui-listing-grid.htmlhttps://devdocs.magento.com/guides/v2. 0 / ui-thành phần / ui-junior.html

2.1 - https://devdocs.magento.com/guides/v2.1/ui_comp_guide/components/ui-listing-grid.html

2.2 - https://devdocs.magento.com/guides/v2.2/ui_comp_guide/components/ui-listing-grid.html

[EDIT ngày 21 tháng 1 năm 2016]

Kể từ ngày 20/01/2016 magd2 devdocs đã được cập nhật với tài liệu mở rộng về các thành phần UI. Tôi chưa kiểm tra rộng rãi nhưng chúng có thể chứa nhiều thông tin hơn phản hồi tôi đã đưa ra vài ngày trước, vì vậy bạn có thể muốn xem http://devdocs.magento.com/guides/v2.0/ui -l Library / ui-library-junior.html

[/BIÊN TẬP]

Tôi đã làm việc với Magento2 được hơn một tháng và đây là điều tôi nhận thấy về cách tạo lưới mới.

Thành phần lưới Magento 2 UI

1) tệp bố trí bên trong Company/Module/view/adminhtml/layout/module_controller_action.xmlxác định lưới là uiComponent với:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <update handle="styles"/>
    <body>
        <referenceContainer name="content">
            <uiComponent name="listing_name"/>
        </referenceContainer>
    </body>
</page>

2) uiComponent được định nghĩa trong Company/Module/view/adminhtml/ui_component/listing_name.xmltệp. Tên tệp phải giống với tên uiComponent được sử dụng trong tệp bố cục. Cấu trúc của tệp có vẻ khá phức tạp ngay từ cái nhìn đầu tiên nhưng như mọi khi đây là một số nút lặp lại. Để làm cho nó đơn giản cho phép cắt nó. Nút chính của tập tin thành phần là <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">. Nó là cố định và tôi tin rằng nó yêu cầu thuộc tính vị trí không gian tên. Tiếp theo đó thường là 4 nút bên <listing />nút: <argument />, <dataSource />, <container /><columns />. Tuy nhiên, đây không phải là một thiết lập nghiêm ngặt vì <argument />nút có thể được sao chép để cung cấp thêm cấu hình hoặc <container />như trong danh sách trang cms có thêm thùng chứa "dính" vì một số lý do.

Nút đầu tiên là <argument />. Nút này xác định dữ liệu cho thành phần. Thông thường bạn cần cung cấp một cái gì đó như thế này:

<argument name="data" xsi:type="array">
    <item name="js_config" xsi:type="array">
        <item name="provider" xsi:type="string">listing_name.listing_name_data_source</item>
        <item name="deps" xsi:type="string">listing_name.listing_name_data_source</item>
    </item>
    <item name="spinner" xsi:type="string">listing_columns</item>
    <item name="buttons" xsi:type="array">
        <item name="add" xsi:type="array">
            <item name="name" xsi:type="string">add</item>
            <item name="label" xsi:type="string" translate="true">Add New Item</item>
            <item name="class" xsi:type="string">primary</item>
            <item name="url" xsi:type="string">*/*/new</item>
        </item>
    </item>
</argument>

<argument />nút yêu cầu thuộc tính name. Trong trường hợp này dataxác định thông tin cơ bản về thành phần. Nó chứa nhiều <item />nút cho mỗi phần cụ thể của cấu hình. js_configcho biết thành phần nơi cung cấp dữ liệu và phụ thuộc trong cấu hình xml liệt kê (mà tôi nghĩ được chuyển đổi thành hàm băm javascript). providergiá trị bao gồm tên danh sách được sử dụng trong tệp bố cục và tên nguồn dữ liệu uniqure sẽ được sử dụng sau này. Trong những danh sách đó tôi đã kiểm tra trong magento providerdepsđều giống nhau. Tôi không chắc chắn những gì được sử dụng có sự khác biệt này. spinnerlấy tên của nút nơi các cột của lưới được xác định. buttonscho phép thêm các nút vào đầu lưới. Trong hầu hết các trường hợp, nó sẽ chỉ là Add newnút. Các nút có một số yếu tố:nameđược sử dụng làm id phần tử, labellà những gì nút nói, classlà lớp nút và urllà liên kết mà nó trỏ tới. Dấu hoa thị được thay thế bằng phần url hiện tại. Khác có thể <item />nút cho nút là: id, title, type(reset, nộp hoặc nút), onclick(thay vì url, nó có ưu tiên), style, value, disabled. Phần tử nút được hiển thị theo Magento\Ui\Component\Control\Buttonlớp.

Tiếp theo chúng ta có <dataSource />nút:

<dataSource name="listing_name_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">UniqueNameGridDataProvider</argument>
        <argument name="name" xsi:type="string">listing_name_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">database_id</argument>
        <argument name="requestFieldName" xsi:type="string">request_id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
            </item>
        </argument>
    </argument>
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
        </item>
    </argument>
</dataSource>

nameđược sử dụng trong <dataSource />nút phải khớp với cái được sử dụng trong argument/js_config/providerargument/js_config/deps. Nút tiếp theo xác định lớp nào chịu trách nhiệm chuẩn bị dữ liệu cho lưới. classđối số yêu cầu tên duy nhất sẽ được khớp trong di.xml. primaryFieldNameliên quan đến cột chính của cơ sở dữ liệu và requestFieldNamebiến trong các yêu cầu http. Họ có thể tương đương nhưng không phải, niêm yết ở trang CMS sử dụng page_idnhư primaryFieldNameidnhư requestFieldName. update_urlđề cập đến điểm vào nơi các lệnh gọi ajax để lọc và sắp xếp được gửi. Đối số thứ hai trong <dataSource />tham chiếu đến tệp javascript xử lý phần js của việc gửi và xử lý các lệnh gọi ajax cho lưới. Các tập tin mặc định là Magento/Ui/view/base/web/js/grid/provider.js.

Một nút khác là <container />.

<container name="listing_top"> ... </container>

Vì nó chứa rất nhiều dữ liệu nên tôi cũng chia nó ra. Con của nó là các phần của toàn bộ trang. Con đầu lòng <argument />:

<argument name="data" xsi:type="array">
    <item name="config" xsi:type="array">
        <item name="template" xsi:type="string">ui/grid/toolbar</item>
    </item>
</argument>

Nó xác định mẫu loại trực tiếp chịu trách nhiệm xử lý bố cục và tất cả các hành động và theo các điểm mặc định để Magento/Ui/view/base/web/templates/grid/toolbar.html

Nút tiếp theo là (hoặc có thể) <bookmark />

<bookmark name="bookmarks">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="storageConfig" xsi:type="array">
                <item name="namespace" xsi:type="string">listing_name</item>
            </item>
        </item>
    </argument>
</bookmark>

Nút này thêm tính năng đánh dấu vào lưới. Nó cho phép quản trị viên thiết lập các "hồ sơ" khác nhau của lưới hiển thị các cột khác nhau. Nhờ đó, bạn có thể thêm tất cả các cột từ bảng vào lưới và để người dùng quyết định thông tin nào có liên quan đến anh ta. namespacephải khớp tên được sử dụng trong tập tin bố trí.

Một nút khác là <component />

<component name="columns_controls">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="columnsData" xsi:type="array">
                <item name="provider" xsi:type="string">listing_name.listing_name.listing_columns</item>
            </item>
            <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item>
            <item name="displayArea" xsi:type="string">dataGridActions</item>
        </item>
    </argument>
</component>

Chúng tôi có 3 giá trị để cấu hình ở đây. Đầu tiên là providertheo mẫu [list_name_from_layout]. [List_name_from_layout]. [List_columns_node_name] (như trong danh sách nút / đối số / spinner). componentđề cập đến tệp js hiển thị lưới và theo các điểm mặc định Magento/Ui/view/base/web/js/grid/controls/columns.jssử dụng mẫu Magento/Ui/view/base/web/templates/grid/controls/columns.html. Mục cuối cùng là displayAreađịnh nghĩa nơi các điều khiển cột cần được hiển thị. Nó đề cập đến getRegion('dataGridActions')trong tệp được định nghĩa trong container/argument/config/template(mặc định Magento/Ui/view/base/web/templates/grid/toolbar.html:).

Nút tiếp theo là <filterSearch />

<filterSearch name="fulltext">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="provider" xsi:type="string">listing_name.listing_name_data_source</item>
            <item name="chipsProvider" xsi:type="string">listing_name.listing_name.listing_top.listing_filters_chips</item>
            <item name="storageConfig" xsi:type="array">
                <item name="provider" xsi:type="string">listing_name.listing_name.listing_top.bookmarks</item>
                <item name="namespace" xsi:type="string">current.search</item>
            </item>
        </item>
    </argument>
</filterSearch>

Nút này thêm tìm kiếm toàn văn vào trang. Nó được đặt phía trên lưới dưới dạng trường nhập văn bản đơn với "Tìm kiếm theo từ khóa" dưới dạng giữ chỗ. Tôi không chắc chắn những tùy chọn nào khả thi ở đây vì tôi không chơi nhiều như vậy nhưng list_filtftimechips đề cập đến Magento/Ui/view/base/web/js/grid/filters/chips.jstệp.

Nút tiếp theo là <filters />

<filters name="listing_filters">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="columnsProvider" xsi:type="string">listing_name.listing_name.listing_columns</item>
            <item name="storageConfig" xsi:type="array">
                <item name="provider" xsi:type="string">listing_name.listing_name.listing_top.bookmarks</item>
                <item name="namespace" xsi:type="string">current.filters</item>
            </item>
            <item name="templates" xsi:type="array">
                <item name="filters" xsi:type="array">
                    <item name="select" xsi:type="array">
                        <item name="component" xsi:type="string">Magento_Ui/js/form/element/ui-select</item>
                        <item name="template" xsi:type="string">ui/grid/filters/elements/ui-select</item>
                    </item>
                </item>
            </item>
            <item name="childDefaults" xsi:type="array">
                <item name="provider" xsi:type="string">listing_name.listing_name.listing_top.listing_filters</item>
                <item name="imports" xsi:type="array">
                    <item name="visible" xsi:type="string">listing_name.listing_name.listing_columns.${ $.index }:visible</item>
                </item>
            </item>
        </item>
        <item name="observers" xsi:type="array">
            <item name="column" xsi:type="string">column</item>
        </item>
    </argument>
</filters>

Nút này xác định cấu hình cho lọc cột hiển thị sau khi nhấp vào nút "Bộ lọc" ở trên cùng bên phải trên lưới. columnsProvidertheo cấu trúc tương tự như các nút trước đó, vì vậy [list_name_from_layout]. [List_name_from_layout]. [list_columns_node_name]. storegeConfigđi như [list_name_from_layout]. [list_name_from_layout]. [container_node_name] [bookmark_node_name]. Trong templatesnút mục, bạn có thể xác định tệp nào được sử dụng để hiển thị các tùy chọn bộ lọc cụ thể. Trong trường hợp này chỉ chọn được định nghĩa và nó sử dụng Magento/Ui/view/base/web/js/form/element/ui-select.jsnhư componentMagento/Ui/view/base/web/templates/grid/filters/elements/ui-select.htmlnhư mẫu knock-out. Nhìn vào Magento/Ui/view/base/web/js/form/elementđể thấy những khả năng khác. Chỉ chọn được xác định ở đây để ghi đè các giá trị mặc định: Magento/Ui/view/base/web/js/form/element/select.jsMagento/Ui/view/base/web/templates/grid/filters/elements/select.html. Giá trị mặc định cho các bộ lọc và các nút khác được xác định trong Magento/Ui/view/base/ui_component/etc/definition.xml.

Nút tiếp theo là <massAction />và cho phép thêm hành động chọn khối vào lưới

<massaction name="listing_massaction">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="selectProvider" xsi:type="string">listing_name.listing_name.listing_columns.ids</item>
            <item name="component" xsi:type="string">Magento_Ui/js/grid/tree-massactions</item>
            <item name="indexField" xsi:type="string">database_id</item>
        </item>
    </argument>
    <action name="delete">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">delete</item>
                <item name="label" xsi:type="string" translate="true">Delete</item>
                <item name="url" xsi:type="url" path="*/*/massDelete"/>
                <item name="confirm" xsi:type="array">
                    <item name="title" xsi:type="string" translate="true">Delete items</item>
                    <item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected items?</item>
                </item>
            </item>
        </argument>
    </action>
    <action name="change_status">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="type" xsi:type="string">change_status</item>
                <item name="label" xsi:type="string" translate="true">Change Status</item>
            </item>
        </argument>
        <argument name="actions" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Company\Module\Ui\Component\MassAction\Status\Options</argument>
            <argument name="data" xsi:type="array">
                <item name="confirm" xsi:type="array">
                    <item name="title" xsi:type="string" translate="true">Change Status</item>
                    <item name="message" xsi:type="string" translate="true">Are you sure to change status for selected feed(s)?</item>
                </item>
            </argument>
        </argument>
    </action>
</massaction>

nameđối số nên là duy nhất. Nút con đầu tiên <argument />xác định dữ liệu cơ bản. providertheo cấu trúc tương tự như các nút khác và tham chiếu đến tên nút cột và cột ids của nó. Cột này sẽ giữ các hộp kiểm với các mục được chọn để xử lý hàng loạt. componentđịnh nghĩa tập tin nào được sử dụng để kết xuất và xử lý hành động hàng loạt. Giá trị mặc định là Magento_Ui/js/grid/massactions(trỏ đến Magento/Ui/view/base/web/js/grid/massactions.js). Bạn có thể sử dụng Magento_Ui/js/grid/tree-massactionsđể thêm cấu trúc giống như cây. Trong trường hợp trên, tôi sử dụng nó để thêm hành động "Thay đổi trạng thái" hiển thị tùy chọn "bật" và "tắt". Sau <argument />nút bạn có thể thêm bao nhiêu <action />nút bao nhiêu hành động bạn muốn có. Mỗi <action />nút theo sơ đồ tương tự. Trong trường hợp đầu tiên (xóa hành động) nút yêu cầu tên duy nhất. Sau đó argumentchứa cấu hình trong đólabellà những gì hiển thị trong tùy chọn chọn, urlđiểm cuối để gửi dữ liệu và confirmthêm phương thức xác nhận trước khi gửi. Trong trường hợp hành động "Thay đổi trạng thái" urltrong argumentnút đầu tiên được thông báo vì các url được cung cấp cho mỗi trạng thái theo lớp được xác định trong argumentnút thứ hai . Lớp nên thực hiện giao diện Zend \ Stdlib \ JsonSerializable. Kiểm tra Magento\Customer\Ui\Component\MassAction\Group\Optionsnhư một tài liệu tham khảo.

Cuối cùng trong <container />nút chúng ta có <paging />nút xác định phân trang.

<paging name="listing_paging">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="storageConfig" xsi:type="array">
                <item name="provider" xsi:type="string">listing_name.listing_name.listing_top.bookmarks</item>
                <item name="namespace" xsi:type="string">current.paging</item>
            </item>
            <item name="selectProvider" xsi:type="string">listing_name.listing_name.listing_columns.ids</item>
        </item>
    </argument>
</paging>

Cấu trúc cho providerselectProvidernên rõ ràng ngay bây giờ.

Và nút cuối cùng cho lưới cơ bản là <columns />. Nó chứa tất cả các định nghĩa về các cột có sẵn để sử dụng bởi quản trị viên. Nút được định nghĩa là

<columns name="listing_columns"> ... </columns>

và thuộc tính name được sử dụng trong các nút khác khi đề cập đến nó. Con đầu lòng là

<argument name="data" xsi:type="array">
    <item name="config" xsi:type="array">
        <item name="storageConfig" xsi:type="array">
            <item name="provider" xsi:type="string">listing_name.listing_name.listing_top.bookmarks</item>
            <item name="namespace" xsi:type="string">current</item>
        </item>
        <item name="childDefaults" xsi:type="array">
            <item name="storageConfig" xsi:type="array">
                <item name="provider" xsi:type="string">listing_name.listing_name.listing_top.bookmarks</item>
                <item name="root" xsi:type="string">columns.${ $.index }</item>
                <item name="namespace" xsi:type="string">current.${ $.storageConfig.root}</item>
            </item>
            <item name="fieldAction" xsi:type="array">
                <item name="provider" xsi:type="string">name_listing.name_listing.listing_columns.actions</item>
                <item name="target" xsi:type="string">applyAction</item>
                <item name="params" xsi:type="array">
                    <item name="0" xsi:type="string">edit</item>
                    <item name="1" xsi:type="string">${ $.$data.rowIndex }</item>
                </item>
            </item>
        </item>
    </item>
</argument>

Những gì tôi đã làm ở đây chỉ là cung cấp providercác giá trị chính xác theo sơ đồ được sử dụng trong danh sách. fieldActionnút cho phép xác định hành động được kích hoạt khi nhấp vào ô. Cài đặt mặc định gọi hành động chỉnh sửa

Tiếp theo là <selectionColumns />

<selectionsColumn name="ids">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="resizeEnabled" xsi:type="boolean">false</item>
            <item name="resizeDefaultWidth" xsi:type="string">55</item>
            <item name="indexField" xsi:type="string">id</item>
        </item>
    </argument>
</selectionsColumn>

Nút này xác định cột với các hộp kiểm cho hành động hàng loạt để sử dụng. Tên của nó được gọi sau dấu chấm trong một số nút được mô tả ở trên.

Sau đó, bạn có thể thêm bất kỳ số lượng cột trong cùng định dạng:

<column name="name" class="Company\Module\Ui\Component\Listing\Column\Name">
    <argument name="data" xsi:type="array">
        <item name="options" xsi:type="object">Company\Module\Model\Source\Type</item>
        <item name="config" xsi:type="array">
            <item name="filter" xsi:type="string">select</item>
            <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
            <item name="dataType" xsi:type="string">select</item>
            <item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>
            <item name="label" xsi:type="string" translate="true">Name</item>
            <item name="sortOrder" xsi:type="number">80</item>
            <item name="visible" xsi:type="boolean">false</item>
        </item>
    </argument>
</column>

Không phải tất cả các nút bên trong hầu hết là cần thiết. Họ đang xác định:

filter- loại bộ lọc của cột. Điều này được sử dụng trong khối bộ lọc. Các giá trị khả dụng là: văn bản, chọn, dateRange. Nếu chọn được sử dụng <item name="options">...</item>sẽ được sử dụng như một lớp cung cấp các tùy chọn cho bộ lọc chọn

component- định nghĩa các tệp js được sử dụng để kết xuất cột. Tùy chọn có sẵn là trong Magento/Ui/view/base/web/js/grid/columns/*. chọn được cung cấp là bộ lọc được thiết lập để chọn. Đối với bộ lọc văn bản, giá trị này là không bắt buộc.

dataType- cung cấp thông tin về kiểu dữ liệu được sử dụng cho giá trị cột. Đối với chọn sử dụng cũng chọn, đối với dateRange sử dụng ngày bodyTmpl- xác định tệp html được sử dụng bởi loại trực tiếp để kết xuất ô. Theo mặc định ui / lưới / ô / văn bản được sử dụng ( Magento/Ui/view/base/web/templates/grid/cells/text.html). Các tùy chọn khác được đặt trong Magento/Ui/view/base/web/templates/grid/cells/*thư mục. ui/grid/cells/htmlcho phép sử dụng nội dung html trong ô.

label - điều này sẽ được hiển thị trong tiêu đề cột và khối bộ lọc

sortOrder - đặt hàng

visible- có hay không hiển thị cột. Điều này có thể được sử dụng để xác định các cột cho dấu trang nhưng không hiển thị chúng theo mặc định.

Cuối cùng, bạn có thể thêm các hành động phù thủy cột hành động có sẵn để làm cho một mục duy nhất

<actionsColumn name="actions" class="Company\Module\Ui\Component\Listing\Column\Actions">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="resizeEnabled" xsi:type="boolean">false</item>
            <item name="resizeDefaultWidth" xsi:type="string">107</item>
            <item name="indexField" xsi:type="string">database_id</item>
        </item>
    </argument>
</actionsColumn>

indexFieldđề cập đến tên cột trong cơ sở dữ liệu. Lớp hành động nên mở rộng Magento\Ui\Component\Listing\Columns\Columnvà định nghĩa prepareDataSourcephương thức. Xem Magento/Cms/Ui/Component/Listing/Column/PageActions.phpnhư một tài liệu tham khảo

3) để kết thúc lưới, chúng ta cần xác định một số thành phần trong Công ty / Mô-đun / etc / di.xml

Đầu tiên chúng ta định nghĩa lớp nhà cung cấp đã được sử dụng trong nút dataSource/class

<virtualType name="UniqueNameGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
    <arguments>
        <argument name="collection" xsi:type="object" shared="false">Company\Module\Model\Resource\Item\Collection</argument>
        <argument name="filterPool" xsi:type="object" shared="false">UniqueNameItemIdFilterPool</argument>
    </arguments>
</virtualType>

collectiongiải quyết lớp thu thập tiêu chuẩn và filerPoolđịnh nghĩa phần tử mới:

<virtualType name="UniqueNameItemIdFilterPool" type="Magento\Framework\View\Element\UiComponent\DataProvider\FilterPool">
    <arguments>
        <argument name="appliers" xsi:type="array">
            <item name="regular" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\RegularFilter</item>
            <item name="fulltext" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\FulltextFilter</item>
        </argument>
    </arguments>
</virtualType>

Điều này rõ ràng phải làm một cái gì đó với lọc và tìm kiếm. Bây giờ tôi luôn sử dụng các giá trị mặc định.

Bây giờ chúng tôi đăng ký nguồn dữ liệu của chúng tôi:

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <arguments>
        <argument name="collections" xsi:type="array">
            <item name="listing_name_data_source" xsi:type="string">Company\Module\Model\Resource\Item\Grid\Collection</item>
        </argument>
    </arguments>
</type>

Trong trường hợp này, tên nút phải khớp với tên được sử dụng trong <dataSource />nút trong danh sách xml và nó giải quyết không phải là bộ sưu tập mà là lớp GridCollection. Nó nên mở rộng lớp thu thập thường xuyên và thực hiện bổ sung Magento\Framework\Api\Search\SearchResultInterface.

Cuối cùng, chúng tôi định cấu hình bộ sưu tập lưới của chúng tôi (tên đối số khá rõ ràng)

<type name="Company\Module\Model\Resource\Item\Grid\Collection">
    <arguments>
        <argument name="mainTable" xsi:type="string">database_table_name</argument>
        <argument name="eventPrefix" xsi:type="string">name_for_events</argument>
        <argument name="eventObject" xsi:type="string">event_object_name</argument>
        <argument name="resourceModel" xsi:type="string">Company\Module\Model\Resource\Item</argument>
    </arguments>
</type>


13
Điều này vẫn đánh bại các tài liệu bằng một chặng đường dài, theo như tôi có thể thấy.
Aaron Pollock

2) uiComponent được định nghĩa trong Công ty / Mô-đun / view / adminhtml / ui_component / list_name.xml. Vì vậy, về cơ bản, thành phần lưới không hoạt động trên frontend?
Lachezar Raychev

bài đăng cũ tôi biết - nhưng, tôi đã đến đây, đã theo dõi nó (cảm ơn btw, chắc chắn là một trong những lời giải thích chi tiết nhất về vấn đề này ngoài kia) nhưng tôi nhận được một lỗi chưa được phát hiện liên quan đến bộ sưu tậpFactory. cụ thể là hàm argumentResolver. Nó nói đối số 2 phải là một mảng nhưng null được đưa ra - Tôi đã thực hiện tất cả các điều trên - nhưng tôi còn phải làm gì nữa không? :)
treyBake

1
@AshishViradiya các liên kết được cập nhật ở trên, trong phần [EDIT 3 tháng 10 năm 2018]
Zefiryn

9

Đối với lưới, chúng ta cần hai tệp chính, một là ui_component xml và tệp thứ hai là di.xml

Tôi hy vọng bạn biết trong tệp xml bố cục, bạn cần thêm thẻ uiComponent, tức là -

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <update handle="styles"/>
    <body>
        <referenceContainer name="content">
            <uiComponent name="test_lists_listing"/>
        </referenceContainer>
    </body>
</page>

bây giờ bạn cần tạo một test_lists_listing.xmlthư mục ui_component.

Ví dụ: ứng dụng \ code \ Sugarcode \ Test \ view \ adminhtml \ ui_component \ test_lists_listing.xml

Tập tin này có số lượng thẻ

  1. <argument name="data" xsi:type="array"> : - cần đề cập đến arugemnt như nút js, v.v.
  2. <dataSource name="test_lists_listing_data_source">: - khối này được sử dụng để cung cấp dữ liệu cho các lưới trong một trong các đối số <argument name="class" xsi:type="string">ListsGridDataProvider</argument>mà chúng ta cần đề cập đến di.xml(được giải thích trong phần di.xml )

  3. <container name="listing_top"> : - trong khối này, chúng tôi đề cập đến các bộ lọc, xuất, đánh dấu (lưu dữ liệu trong bảng ui_bookmark), khối lượng, phân trang và toàn văn bản (để thực hiện tìm kiếm toàn văn bản trong thiết lập hoặc bảng mà cột phải là chỉ mục toàn văn bản)

  4. <columns name="test_lists_columns"> : - trong này chúng tôi cần đề cập đến tất cả các cột

Cái cuối cùng là trong di.xml

<virtualType name="TestGirdFilterPool" type="Magento\Framework\View\Element\UiComponent\DataProvider\FilterPool">
    <arguments>
        <argument name="appliers" xsi:type="array">
            <item name="regular" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\RegularFilter</item>
            <item name="fulltext" xsi:type="object">Magento\Framework\View\Element\UiComponent\DataProvider\FulltextFilter</item>
        </argument>
    </arguments>
</virtualType>  


<virtualType name="ListsGridDataProvider" type="Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider">
    <arguments>
        <argument name="collection" xsi:type="object" shared="false">Sugarcode\Test\Model\ResourceModel\Test\Collection</argument>
        <argument name="filterPool" xsi:type="object" shared="false">TestGirdFilterPool</argument>
    </arguments>
</virtualType>  


<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <arguments>
        <argument name="collections" xsi:type="array">
            <item name="test_lists_listing_data_source" xsi:type="string">Sugarcode\Test\Model\ResourceModel\Test\Grid\Collection</item>
        </argument>
    </arguments>
</type>
<type name="Sugarcode\Test\Model\ResourceModel\Test\Grid\Collection">
    <arguments>
        <argument name="mainTable" xsi:type="string">testtable</argument>
        <argument name="eventPrefix" xsi:type="string">test_test_grid_collection</argument>
        <argument name="eventObject" xsi:type="string">test_grid_collection</argument>
        <argument name="resourceModel" xsi:type="string">Sugarcode\Test\Model\ResourceModel\Test</argument>
    </arguments>
</type>
  1. TestGirdFilterPool: - đề cập đến các bộ lọc
  2. ListsGridDataProvider: - mà tôi đã đề cập trong ui xml cho nhà cung cấp dữ liệu
  3. CollectionFactory: - cần đề cập đến bộ sưu tập
  4. Lưới / Bộ sưu tập: - trong trường hợp này, chúng ta cần vượt qua tất cả các thông số như tên bảng, bộ sưu tập, v.v.

ứng dụng \ code \ Sugarcode \ Test \ view \ adminhtml \ ui_component \ test_lists_listing.xml

<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../Ui/etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing_data_source</item>
            <item name="deps" xsi:type="string">test_lists_listing.test_lists_listing_data_source</item>
        </item>
        <item name="spinner" xsi:type="string">test_lists_columns</item>
        <item name="buttons" xsi:type="array">
            <item name="add" xsi:type="array">
                <item name="name" xsi:type="string">add</item>
                <item name="label" xsi:type="string" translate="true">Add New Info</item>
                <item name="class" xsi:type="string">primary</item>
                <item name="url" xsi:type="string">*/*/new</item>
            </item>
        </item>
    </argument>
    <dataSource name="test_lists_listing_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">ListsGridDataProvider</argument>
            <argument name="name" xsi:type="string">test_lists_listing_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id</argument>
            <argument name="requestFieldName" xsi:type="string">id</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="update_url" xsi:type="url" path="mui/index/render"/>
                </item>
            </argument>
        </argument>
        <argument name="data" xsi:type="array">
            <item name="js_config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
            </item>
        </argument>
    </dataSource>
    <container name="listing_top">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="template" xsi:type="string">ui/grid/toolbar</item>
            </item>
        </argument>
        <bookmark name="bookmarks">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="storageConfig" xsi:type="array">
                        <item name="namespace" xsi:type="string">test_lists_listing</item>
                    </item>
                </item>
            </argument>
        </bookmark>
        <exportButton name="export_button">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="selectProvider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns.ids</item>
                </item>
            </argument>
        </exportButton>
        <container name="columns_controls">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="columnsData" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns</item>
                    </item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item>
                    <item name="displayArea" xsi:type="string">dataGridActions</item>
                </item>
            </argument>
        </container>
        <filterSearch name="fulltext">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/search/search</item>
                    <item name="displayArea" xsi:type="string">dataGridFilters</item>
                    <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing_data_source</item>
                    <item name="chipsProvider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.listing_filters_chips</item>
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.bookmarks</item>
                        <item name="namespace" xsi:type="string">current.search</item>
                    </item>
                </item>
            </argument>
        </filterSearch>
        <filters name="listing_filters">

            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="columnsProvider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns</item>
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.bookmarks</item>
                        <item name="namespace" xsi:type="string">current.filters</item>
                    </item>
                    <item name="templates" xsi:type="array">
                        <item name="filters" xsi:type="array">
                            <item name="select" xsi:type="array">
                                <item name="component" xsi:type="string">Magento_Ui/js/form/element/ui-select</item>
                                <item name="template" xsi:type="string">ui/grid/filters/elements/ui-select</item>
                            </item>
                        </item>
                    </item>
                    <item name="childDefaults" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.listing_filters</item>
                        <item name="imports" xsi:type="array">
                            <item name="visible" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns.${ $.index }:visible</item>
                        </item>
                    </item>
                </item>
            </argument>


            <filterSelect name="status">
                <argument name="optionsProvider" xsi:type="configurableObject">
                    <argument name="class" xsi:type="string">Sugarcode\Test\Model\Status</argument>
                </argument>
                <argument name="data" xsi:type="array">
                    <item name="config" xsi:type="array">
                        <item name="dataScope" xsi:type="string">status</item>
                        <item name="caption" xsi:type="string" translate="true">Select...</item>
                        <item name="label" xsi:type="string" translate="true">Status</item>
                    </item>
                </argument>
            </filterSelect>

        </filters>

        <massaction name="listing_massaction">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="selectProvider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns.ids</item>
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </argument>
            <action name="delete">
                <argument name="data" xsi:type="array">
                    <item name="config" xsi:type="array">
                        <item name="type" xsi:type="string">delete</item>
                        <item name="label" xsi:type="string" translate="true">Delete</item>
                        <item name="url" xsi:type="url" path="test/lists/massDelete"/>
                        <item name="confirm" xsi:type="array">
                            <item name="title" xsi:type="string" translate="true">Delete items</item>
                            <item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected items?</item>
                        </item>
                    </item>
                </argument>
            </action>
            <action name="edit">
                <argument name="data" xsi:type="array">
                    <item name="config" xsi:type="array">
                        <item name="type" xsi:type="string">edit</item>
                        <item name="label" xsi:type="string" translate="true">Edit</item>
                        <item name="callback" xsi:type="array">
                            <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns_editor</item>
                            <item name="target" xsi:type="string">editSelected</item>
                        </item>
                    </item>
                </argument>
            </action>
            <action name="disable">
                <argument name="data" xsi:type="array">
                    <item name="config" xsi:type="array">
                        <item name="type" xsi:type="string">disable</item>
                        <item name="label" xsi:type="string" translate="true">Disable</item>
                        <item name="url" xsi:type="url" path="test/lists/massDisable"/>
                    </item>
                </argument>
            </action>
            <action name="enable">
                <argument name="data" xsi:type="array">
                    <item name="config" xsi:type="array">
                        <item name="type" xsi:type="string">enable</item>
                        <item name="label" xsi:type="string" translate="true">Enable</item>
                        <item name="url" xsi:type="url" path="test/lists/massEnable"/>
                    </item>
                </argument>
            </action>
        </massaction>

        <paging name="listing_paging">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.bookmarks</item>
                        <item name="namespace" xsi:type="string">current.paging</item>
                    </item>
                    <item name="selectProvider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns.ids</item>
                    <item name="displayArea" xsi:type="string">bottom</item>
                    <item name="options" xsi:type="array">
                        <item name="20" xsi:type="array">
                            <item name="value" xsi:type="number">20</item>
                            <item name="label" xsi:type="string" translate="true">20</item>
                        </item>
                        <item name="30" xsi:type="array">
                            <item name="value" xsi:type="number">30</item>
                            <item name="label" xsi:type="string" translate="true">30</item>
                        </item>
                        <item name="50" xsi:type="array">
                            <item name="value" xsi:type="number">50</item>
                            <item name="label" xsi:type="string" translate="true">50</item>
                        </item>
                        <item name="100" xsi:type="array">
                            <item name="value" xsi:type="number">100</item>
                            <item name="label" xsi:type="string" translate="true">100</item>
                        </item>
                        <item name="200" xsi:type="array">
                            <item name="value" xsi:type="number">200</item>
                            <item name="label" xsi:type="string" translate="true">200</item>
                        </item>
                    </item>
                </item>
            </argument>
        </paging>
    </container>
    <columns name="test_lists_columns">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="storageConfig" xsi:type="array">
                    <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.bookmarks</item>
                    <item name="namespace" xsi:type="string">current</item>
                </item>
                <item name="editorConfig" xsi:type="array">
                    <item name="selectProvider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns.ids</item>
                    <item name="enabled" xsi:type="boolean">true</item>
                    <item name="indexField" xsi:type="string">id</item>
                    <item name="clientConfig" xsi:type="array">
                        <item name="saveUrl" xsi:type="url" path="test/lists/inlineEdit"/>
                        <item name="validateBeforeSave" xsi:type="boolean">false</item>
                    </item>
                </item>

                <item name="childDefaults" xsi:type="array">
                    <item name="fieldAction" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.test_lists_columns.actions</item>
                        <item name="target" xsi:type="string">applyAction</item>
                        <item name="params" xsi:type="array">
                            <item name="0" xsi:type="string">edit</item>
                            <item name="1" xsi:type="string">${ $.$data.rowIndex }</item>
                        </item>
                    </item>
                    <item name="controlVisibility" xsi:type="boolean">true</item>
                    <item name="storageConfig" xsi:type="array">
                        <item name="provider" xsi:type="string">test_lists_listing.test_lists_listing.listing_top.bookmarks</item>
                        <item name="root" xsi:type="string">columns.${ $.index }</item>
                        <item name="namespace" xsi:type="string">current.${ $.storageConfig.root }</item>
                    </item>
                </item>
            </item>
        </argument>     
        <selectionsColumn name="ids">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                    <item name="sortOrder" xsi:type="number">0</item>
                </item>
            </argument>
        </selectionsColumn> 
        <column name="id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">textRange</item>
                    <item name="sorting" xsi:type="string">asc</item>
                    <item name="label" xsi:type="string" translate="true">ID</item>
                    <item name="sortOrder" xsi:type="number">10</item>
                </item>
            </argument>
        </column>   
         <column name="order_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="filter_index" xsi:type="string">o.increment_id</item>
                    <item name="add_field" xsi:type="boolean">false</item>
                    <item name="label" xsi:type="string" translate="true">Order ID</item>
                    <item name="sortOrder" xsi:type="number">20</item>
                </item>
            </argument>
        </column>       
        <column name="title">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="editor" xsi:type="array">
                        <item name="editorType" xsi:type="string">text</item>
                        <item name="validation" xsi:type="array">
                            <item name="required-entry" xsi:type="boolean">true</item>
                        </item>
                    </item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Title</item>
                    <item name="sortOrder" xsi:type="number">30</item>
                </item>
            </argument>
        </column>

        <column name="status">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Sugarcode\Test\Model\Status</item>
                <item name="js_config" xsi:type="array">
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                </item>
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">select</item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                    <item name="editor" xsi:type="string">select</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="label" xsi:type="string" translate="true">Status</item>
                    <item name="sortOrder" xsi:type="number">40</item>
                </item>
            </argument>
        </column>   


        <column name="created_at" class="Magento\Ui\Component\Listing\Columns\Date">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">dateRange</item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item>
                    <item name="dataType" xsi:type="string">date</item>
                    <item name="label" xsi:type="string" translate="true">Created</item>
                    <item name="sortOrder" xsi:type="number">50</item>
                </item>
            </argument>
        </column>

        <actionsColumn name="actions" class="Sugarcode\Test\Ui\Component\Listing\Column\TestActions">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </argument>
        </actionsColumn>
    </columns>
</listing>

sortOrder không hoạt động cho các lựa chọnColumn. Đừng hiểu tại sao nó lại đến cuối cùng
Bhupendra Jadeja

6

Phần bổ sung của câu trả lời hàng đầu

Câu trả lời hàng đầu là tuyệt vời, tôi làm theo nó để tạo một trang danh sách. Nhưng, nó có một vấn đề :

Khi bạn áp dụng bộ lọc, sau đó xóa bộ lọc, cùng một nội dung hàng sẽ lặp lại trong toàn bộ lưới trang .

Giải pháp

Trong <dataSource />nút, bên dưới <item name="update_url" xsi:type="url" path="mui/index/render"/>, thêm nội dung:

<item name="storageConfig" xsi:type="array">
    <item name="indexField" xsi:type="string">entity_id</item>
</item>

entity_id là khóa chính cho bộ sưu tập danh sách.


4

Tôi thấy câu trả lời của @ Zefiryn rất hữu ích và là một cách tuyệt vời để bắt đầu mà không cần đọc tài liệu đầy đủ từ Magento.

Điều đó nói rằng tôi đã không làm mọi thứ khá hiệu quả sau những câu trả lời này. Hơn nữa, khi bạn có một trang danh sách hoạt động, bạn sẽ ngay lập tức muốn phần còn lại của giao diện CRUD.

Tôi tìm thấy một mô-đun mẫu trên github . Bắt đầu với chủ đề này để định hướng, sau đó chuyển / hack mã từ plugin mẫu hóa ra là cách nhanh nhất để có giao diện CRUD dựa vào bảng tùy chỉnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.