Czy istnieje dobre wyjaśnienie i / lub próbka konfiguracji minimalnej niezbędnej do utworzenia siatki składników interfejsu użytkownika w Magento 2?
Wiem, że istnieją niezliczone podstawowe elementy, takie jak
./vendor/magento/module-catalog/view/adminhtml/ui_component/product_listing.xml
Jednak te pliki XML są ekspansywne i nie ma żadnego wyjaśnienia na temat tego, co robi każdy węzeł, ani tego, jak użyć go do zbudowania siatki od zera.
Jest też ten przykładowy moduł , ale to
- Wygląda na formę
- Brakuje kontekstu / wyjaśnienia na temat tego, co robi każdy węzeł
Szukam informacji „na początek”, które pozwoliłyby mi zbudować siatkę dla mojej własnej kolekcji modeli CRUD.
magento2
php
layout
uicomponent
Alan Storm
źródło
źródło
Odpowiedzi:
[EDYCJA 3 października 2018 r.]
Aktualizacja linków do devdocs: 2.0 - https://devdocs.magento.com/guides/v2.0/ui-components/ui-listing-grid.html i https://devdocs.magento.com/guides/v2. 0 / ui-components / ui-wtórny.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 21 stycznia 2016 r.]
Od 20.01.2016 magento2 devdocs zostało zaktualizowane o rozszerzoną dokumentację komponentów interfejsu użytkownika. Nie sprawdziłem go dokładnie, ale mogą zawierać więcej informacji niż odpowiedź, którą udzieliłem kilka dni temu, więc w interesie twojego czasu możesz zobaczyć http://devdocs.magento.com/guides/v2.0/ui -library / ui-library-wtórna.html
[/EDYTOWAĆ]
Pracuję z Magento2 od ponad miesiąca i właśnie to zauważyłem w nowym sposobie tworzenia siatek.
Składnik interfejsu Magento 2 UI
1) plik układu wewnątrz
Company/Module/view/adminhtml/layout/module_controller_action.xml
definiuje siatkę jako komponent uiComponent z:2) uiComponent jest zdefiniowany w
Company/Module/view/adminhtml/ui_component/listing_name.xml
pliku. Nazwa pliku musi być taka sama jak nazwa uiComponent używana w pliku układu. Struktura pliku może na pierwszy rzut oka wydawać się skomplikowana, ale jak zwykle są to niektóre powtarzające się węzły. Aby było to proste, pokrójmy go. Głównym węzłem pliku komponentu jest<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
. Jest naprawiony i uważam, że wymaga atrybutu lokalizacji przestrzeni nazw. Następne są zazwyczaj 4 węzły wewnątrz<listing />
węzła:<argument />
,<dataSource />
,<container />
i<columns />
. Nie jest to jednak ścisła konfiguracja, ponieważ<argument />
węzeł może zostać zduplikowany w celu zapewnienia większej konfiguracji lub<container />
jak na liście stron cms, która z jakiegoś powodu dodaje „lepki” pojemnik.Pierwszy węzeł to
<argument />
. Ten węzeł definiuje dane dla komponentu. Zwykle musisz podać coś takiego:<argument />
węzeł wymaga atrybutuname
. W tym przypadkudata
określa podstawowe informacje o komponencie. Zawiera wiele<item />
węzłów dla każdej określonej części konfiguracji.js_config
informuje komponent, gdzie są dostawcy danych i zależności w konfiguracji listingu xml (co myślę, że jest konwertowane na hash javascript).provider
wartość składa się z nazwy listy używanej w pliku układu i unikalnej nazwy źródła danych, która będzie później używana. Na tych listach zameldowałem się w Magentoprovider
ideps
są takie same. Nie jestem pewien, jaki pożytek z posiadania tego innego.spinner
przyjmuje nazwę węzła, w którym zdefiniowano kolumny siatki.buttons
pozwala dodawać przyciski na górze siatki. W większości przypadków byłby to tylkoAdd new
przycisk. Przyciski mają kilka elementów:name
używany jako identyfikator elementu,label
to, co mówi przycisk,class
jest klasą przycisku iurl
jest linkiem, na który wskazuje. Gwiazdki zastępuje się częścią bieżącego adresu URL. Inne możliwe<item />
węzły dla przycisku to:id
,title
,type
(reset, złożyć lub przycisk),onclick
(zamiasturl
, to ma pierwszeństwo),style
,value
,disabled
. Element przycisku jest renderowany wedługMagento\Ui\Component\Control\Button
klasy.Następnie mamy
<dataSource />
węzeł:name
użyte w<dataSource />
węźle musi być zgodne z tym używanym wargument/js_config/provider
iargument/js_config/deps
. Następny węzeł określa, która klasa jest odpowiedzialna za przygotowanie danych do siatki.class
argument wymaga unikalnej nazwy, która zostanie dopasowanadi.xml
.primaryFieldName
odnosi się do podstawowej kolumny bazy danych irequestFieldName
zmiennej w żądaniach HTTP. Mogą być równe, ale nie muszą, lista stron CMS używapage_id
jakoprimaryFieldName
iid
jakorequestFieldName
.update_url
odnosi się do punktu wejścia, do którego wysyłane są wywołania ajax w celu filtrowania i sortowania. Drugi argument<dataSource />
dotyczy pliku javascript, który obsługuje część js wysyłania i przetwarzania wywołań ajax dla siatki. Domyślny plik toMagento/Ui/view/base/web/js/grid/provider.js
.Innym węzłem jest
<container />
.Ponieważ zawiera wiele danych, podzielę je również. Jego dzieci są częściami całej strony. Pierwsze dziecko
<argument />
:Definiuje szablon nokaut odpowiedzialny za obsługę układu i wszystkich działań i domyślnie wskazuje na
Magento/Ui/view/base/web/templates/grid/toolbar.html
Następny węzeł to (lub może być)
<bookmark />
Ten węzeł dodaje do zakładek funkcję zakładek. Pozwala administratorowi skonfigurować różne „profile” siatki, która wyświetla różne kolumny. Dzięki temu możesz dodać wszystkie kolumny z tabeli do siatki i pozwolić użytkownikowi zdecydować, które informacje są dla niego istotne.
namespace
musi pasować do nazwy użytej w pliku układu.Innym węzłem jest
<component />
Mamy tutaj 3 wartości do skonfigurowania. Pierwszym z nich jest
provider
następujący wzór [nazwa_listy_z gry]. [Nazwa_listy z gry]. [Nazwa_listy_węzła listy] (jak w przypadku listy węzłów / argumentu / pokrętła).component
odnosi się do pliku js, który wyświetla siatkę i domyślnie wskazuje punkty, doMagento/Ui/view/base/web/js/grid/controls/columns.js
których wykorzystuje szablonMagento/Ui/view/base/web/templates/grid/controls/columns.html
. Ostatni elementdisplayArea
określa, gdzie mają być wyświetlane kontrolki kolumn. Odnosi się dogetRegion('dataGridActions')
pliku zdefiniowanego wcontainer/argument/config/template
(domyślnie:)Magento/Ui/view/base/web/templates/grid/toolbar.html
.Następny węzeł to
<filterSearch />
Ten węzeł dodaje wyszukiwanie pełnotekstowe na stronie. Znajduje się nad siatką jako pojedyncze pole wprowadzania tekstu z „Szukaj według słowa kluczowego” jako symbolem zastępczym. Nie jestem pewien, jakie opcje są tutaj możliwe, ponieważ nie grałem zbyt wiele, ale listing_filters_chips odnosi się do
Magento/Ui/view/base/web/js/grid/filters/chips.js
pliku.Następny węzeł to
<filters />
Ten węzeł określa konfigurację filtrowania kolumn, która jest widoczna po kliknięciu przycisku „Filtry” w prawym górnym rogu nad siatką.
columnsProvider
ma podobną strukturę jak poprzednie węzły, więc [nazwa_listy_z gry]. [nazwa_listy z gry]. [nazwa_kolekcji_listy].storegeConfig
wygląda jak [nazwa_wpisu_z gry]. [nazwa_wpisu z gry]. [nazwa_węzła kontenera] [nazwa_węzła zakładki]. Wtemplates
węźle elementu możesz określić, które pliki są używane do renderowania określonych opcji filtrów. W tym przypadku zdefiniowano tylko opcję select, która używaMagento/Ui/view/base/web/js/form/element/ui-select.js
jakocomponent
iMagento/Ui/view/base/web/templates/grid/filters/elements/ui-select.html
jako szablonu nokautu. Sprawdź,Magento/Ui/view/base/web/js/form/element
aby zobaczyć inne możliwości. W tym miejscu zdefiniowano tylko wybór, aby zastąpić wartości domyślne:Magento/Ui/view/base/web/js/form/element/select.js
iMagento/Ui/view/base/web/templates/grid/filters/elements/select.html
. Domyślne wartości filtrów i innych węzłów są zdefiniowane wMagento/Ui/view/base/ui_component/etc/definition.xml
.Następny węzeł jest
<massAction />
i pozwala dodać masową akcję selekcji do siatkiname
argument powinien być unikalny. Pierwszy węzeł potomny<argument />
definiuje podstawowe dane.provider
ma taką samą strukturę jak inne węzły i odnosi się do kolumny nazwa węzła i jego kolumny id. W tej kolumnie znajdują się pola wyboru z wybranymi elementami do przetworzenia przez akcję masową.component
określa, który plik jest używany do renderowania i obsługi akcji masowej. Wartość domyślna toMagento_Ui/js/grid/massactions
(wskazujeMagento/Ui/view/base/web/js/grid/massactions.js
). Możesz użyć,Magento_Ui/js/grid/tree-massactions
aby dodać strukturę drzewiastą. W powyższym przypadku używam go do dodawania akcji „Zmień status”, która pokazuje opcje „włącz” i „wyłącz”. Po<argument />
węźle możesz dodać tyle<action />
węzłów, ile chcesz akcji. Każdy<action />
węzeł ma podobny schemat. W pierwszym przypadku (akcja usuwania) węzeł wymaga unikalnej nazwy. Następnieargument
zawiera konfigurację gdzielabel
jest widoczny w opcji select,url
punkcie końcowym do wysłania danych iconfirm
dodaje modalne potwierdzenie przed wysłaniem. W przypadku „Zmień status” akcjaurl
w pierwszymargument
węźle jest zalecana, ponieważ adresy URL są podawane według statusu według klasy zdefiniowanej w drugimargument
węźle. Klasa powinna implementować interfejs Zend \ Stdlib \ JsonSerializable. SprawdźMagento\Customer\Ui\Component\MassAction\Group\Options
jako odniesienie.Wreszcie w
<container />
węźle mamy<paging />
węzeł, który definiuje paginację.Struktura
provider
iselectProvider
powinna być teraz jasna.Ostatni węzeł dla podstawowej siatki to
<columns />
. Zawiera całą definicję kolumn, które są dostępne do użytku przez administratora. Węzeł jest zdefiniowany jakoa atrybut name jest używany w innych węzłach, gdy się do niego odwołuje. Pierwsze dziecko to
To, co tu zrobiłem, to podanie poprawnych
provider
wartości tylko zgodnie ze schematem zastosowanym na liście.fieldAction
węzeł pozwala zdefiniować akcję uruchamianą po kliknięciu komórki. Ustawienia domyślne wywoływania operacji edycjiNastępne jest
<selectionColumns />
Ten węzeł definiuje kolumnę z polami wyboru do użycia akcji masowej. Nazwy są określane po kropce w kilku opisanych powyżej węzłach.
Następnie możesz dodać dowolną liczbę kolumn w tym samym formacie:
Nie wszystkie najbardziej wewnętrzne elementy są potrzebne. Definiują:
filter
- typ filtra kolumny. Jest to używane w bloku filtrów. Dostępne wartości to: text, select, dateRange. Jeśli<item name="options">...</item>
zostanie użyta opcja select, zostanie użyta jako klasa zapewniająca opcje wyboru filtracomponent
- definiuje pliki js, które są używane do renderowania kolumny. Dostępne opcje są wMagento/Ui/view/base/web/js/grid/columns/*
. pod warunkiem, że wybrano opcję Filtr. W przypadku filtru tekstowego ta wartość nie jest wymagana.dataType
- dostarcza informacji o typie danych użytym dla wartości kolumny. Dla select use również select, dla dateRange use datebodyTmpl
- definiuje plik HTML używany przez nokaut do renderowania komórki. Domyślnie używany jest interfejs użytkownika / siatka / komórki / tekst (Magento/Ui/view/base/web/templates/grid/cells/text.html
). Inne opcje znajdują się wMagento/Ui/view/base/web/templates/grid/cells/*
katalogu.ui/grid/cells/html
pozwala na użycie zawartości HTML w komórce.label
- zostanie to wyświetlone w nagłówku kolumny i bloku filtrusortOrder
- zamawianievisible
- czy wyświetla kolumnę, czy nie. Można tego użyć do zdefiniowania kolumn dla zakładek, ale nie wyświetlaj ich domyślnie.Na koniec możesz dodać kolumnę działań, które można wykonać dla pojedynczego elementu
indexField
odnosi się do nazwy kolumny w bazie danych. Klasa akcji powinna rozszerzyćMagento\Ui\Component\Listing\Columns\Column
i zdefiniowaćprepareDataSource
metodę. ZobaczMagento/Cms/Ui/Component/Listing/Column/PageActions.php
jako odniesienie3) Aby zakończyć siatkę, musimy zdefiniować niektóre elementy w Company / Module / etc / di.xml
Najpierw definiujemy klasę dostawcy, która została użyta w węźle
dataSource/class
collection
rozwiązuje do standardowej klasy kolekcji ifilerPool
definiuje nowy element:To najwyraźniej ma coś wspólnego z filtrowaniem i wyszukiwaniem. Na razie zawsze korzystałem z wartości domyślnych.
Teraz rejestrujemy nasze źródło danych:
W tym przypadku nazwa węzła musi być zgodna z nazwą użytą w
<dataSource />
węźle na liście xml i rozwiązuje nie kolekcję, ale klasę GridCollection. Powinien rozszerzyć regularną klasę kolekcji i dodatkowo zaimplementowaćMagento\Framework\Api\Search\SearchResultInterface
.Na koniec konfigurujemy naszą kolekcję siatki (nazwy argumentów są dość oczywiste)
źródło
Do grid potrzebujemy dwóch głównych plików, jeden to ui_component xml, a drugi to di.xml
Mam nadzieję, że wiesz, że w pliku XML układu musisz dodać znacznik uiComponent, tj. -
teraz musisz utworzyć
test_lists_listing.xml
folder ui_component.Np. App \ code \ Sugarcode \ Test \ view \ adminhtml \ ui_component \ test_lists_listing.xml
Ten plik ma liczbę tagów
<argument name="data" xsi:type="array">
: - trzeba wspomnieć o arugemnt jak przycisk js itp.<dataSource name="test_lists_listing_data_source">
: - ten blok służy do dostarczania danych do siatek w tym jednym z argumentów, o<argument name="class" xsi:type="string">ListsGridDataProvider</argument>
którym musimy wspomniećdi.xml
(wyjaśnione w części di.xml )<container name="listing_top">
: - w tym bloku wymieniamy filtry, eksport, zakładki (które zapisują dane w tabeli ui_bookmark), masowanie, stronicowanie i pełny tekst (aby przeprowadzić wyszukiwanie pełnotekstowe w ustawieniach lub w tabeli, kolumna powinna być indeksem pełnotekstowym)<columns name="test_lists_columns">
: - w tym musimy wspomnieć całą kolumnęOstatni znajduje się w pliku di.xml
app \ code \ Sugarcode \ Test \ view \ adminhtml \ ui_component \ test_lists_listing.xml
źródło
Suplement do najlepszej odpowiedzi
Najlepsza odpowiedź jest świetna, śledzę ją, aby utworzyć stronę z listą. Ale ma problem :
Rozwiązanie
W
<dataSource />
węźle poniżej<item name="update_url" xsi:type="url" path="mui/index/render"/>
dodaj treść:entity_id
jest podstawowym kluczem do zbioru list.źródło
Uważam, że odpowiedź @ Zefiryn jest bardzo pomocna i świetna, jak zacząć bez czytania pełnej dokumentacji z Magento.
To powiedziawszy, że po tych odpowiedziach nie działało mi całkiem dobrze. Co więcej, gdy już uruchomisz stronę z listą, od razu będziesz potrzebować pozostałej części interfejsu CRUD.
Znalazłem przykładowy moduł na github . Zaczynając od tego wątku służącego do orientacji, okazało się, że portowanie / hakowanie kodu z przykładowej wtyczki jest najszybszym sposobem uzyskania interfejsu CRUD dla niestandardowej tabeli.
źródło