Próbuję zmienić kolejność kart na stronie produktu w Magento 2. Domyślnie jest Details|More Information|Reviews
.
Próbowałem:
Dostawca / theme / Magento_Catalog / layout / catalog_product_view.xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<move element="product.info.description" destination="product.info.details" after="-" />
</body>
</page>
Ale to nie działa i jest to zalecany sposób przenoszenia elementów. Byłem w stanie przenieść karty z obszaru kart i do innych obszarów, a także dodać nowe karty, ale nie mogę kontrolować kolejności kart.
Domyślam się, że ma to coś wspólnego group="detailed_info"
; Wygląda na to, że Magento pobiera elementy układu z tym atrybutem w pliku XML i przechodzi przez nie, aby utworzyć zakładki.
Czy istnieje sposób na zmianę kolejności zakładek bez przepisywania modułu?
Odpowiedzi:
Moje podejście jest nieco inne, ale prawdopodobnie bardziej przyszłościowe, w przypadku późniejszego dodawania nowych kart i zmiany priorytetu / kolejności tych kart.
Podałem argument dla każdej karty poprzez plik XML w moim pliku XML motywów
Tak więc plik XML moich motywów wygląda mniej więcej tak:
Ponadto musimy dostosować
details.phtml
, więc skopiuj go zdo
Należy pamiętać, że własne Magento
details.phtml
mogą zostać zmienione w przyszłych wersjach lub łatkach Magento. Te zmiany należy również zastosować do motywudetails.phtml
Teraz musimy uzyskać priorytet, który przekazaliśmy za pomocą pliku XML.
Więc widzisz: Musisz tylko dodać kilka wierszy i zawsze możesz zmienić priorytet / kolejność kart za pomocą pliku xml, nie musisz
details.phtml
już więcej zmieniać w przyszłości.źródło
Aby zmienić pozycję Tabulacji na stronie szczegółów, użycie pliku konfiguracyjnego XML po lub przed atrybutem nie pomaga w tym przypadku.
Musisz zmienić z pliku szablonu.
Skopiuj plik details.phtml z rdzenia do motywu,
Wewnątrz tego pliku możesz pobrać nazwę wszystkich kart, używając print_r ($ szczegółowyInfoGroup) , musisz uzyskać wartość, np.
Musisz ustawić zgodnie z wymaganiami w nowej tablicy, zanim zaczniesz w pliku,
dodać
<?php foreach ($newOrderTab as $name):?>
,Pełny kod w pliku details.phtml jest jak poniżej,
źródło
W Magento 2.3.1 lub powyżej możemy użyć
sort_order
argumentu wapp/design/frontend/Packagename/themename/Magento_Catalog/layout/catalog_product_view.xml
konfiguracji „ ” xmlUpewnij się także, aby zaktualizować metodę „
getGroupChildNames
” za pomocą „getGroupSortedChildNames
” w pliku szablonu ( jeśli ją zastępujesz ) „app/design/frontend/Packagename/themename/Magento_Catalog/templates/product/view/details.phtml
”.Stara metoda
Zaktualizowana metoda
Jeśli przesłaniasz
Magento\Catalog\Block\Product\View\Details.php
klasę bloków, twoja klasa bloków również powinna mieć zaktualizowaną metodę „getGroupSortedChildNames
”.źródło
Wiem, że były inne odpowiedzi na to pytanie, ale wszystkie były zbyt inwazyjne na mój gust. Analizując problem, Magento dodaje osobny atrybut „grupa” do elementu i dodaje elementy podrzędne do tego atrybutu w kolejności załadowanej w układzie, całkowicie oddzielone od tablicy podrzędnej zawierającej posortowaną tablicę elementów. Aby to naprawić, napisałem prostą wtyczkę, która naprawia sortowanie podczas pobierania grup dzieci:
Umożliwi to teraz zamawianie kart przy użyciu standardu
before
iafter
atrybutów w układzie XML zgodnie z oczekiwaniami i prawdopodobnie nie będzie potrzeby modyfikacji w przyszłych łatkach Magento.źródło
Innym sposobem jest użycie argumentu kolejności sortowania.
Ścieżka pliku -
app\design\frontend\<companyNAme>\<ThemeName>\Magento_Catalog\layout\catalog_product_view.xml
Dodaj argument kolejności sortowania w kontenerze bloku referencyjnego product.info.details.
Przykładowy kod
Zmień wartość argumentu kolejności sortowania na 10, 20, 30 zgodnie z zamówieniem.
źródło
sort_order
była dla mnie ważna, +1 sprawiło, że mój dzień :)Myślę, że musisz je dodać w wybranej przez siebie kolejności. Dla mnie używam 4 zakładek w tej kolejności:
W moim module niestandardowym utworzyłem ten plik układu: katalog_produktu_widok.xml z następującą zawartością:
Widać, że dodałem tylko 3 zakładki, ponieważ zakładka szczegółów już istnieje. W rezultacie mam zakładki w następującej kolejności:
Co nie jest tym, czego chciałem, teraz moim rozwiązaniem jest dodanie jeszcze raz zakładki Szczegóły, aby mój plik układu wyglądał następująco:
Teraz mam zamówienie, które chcę :)
źródło
Moim zdaniem najłatwiejszym i najlepszym sposobem jest rozwiązanie LordZardeck z wtyczką. Po zaktualizowaniu dostawcy / modułu / etc / frontend / di.xml
wszystko działało zgodnie z oczekiwaniami.
Dzięki @LordZardeck za czysty kod!
źródło
Oto rozwiązanie, którego użyłem. Zamieni zakładkę opisu i atrybutów, jeśli są one dostępne. To używa motywu Ultimo. Ale dostaniesz sens. POCAŁUNEK.
źródło
Moim rozwiązaniem tego problemu jest zmodyfikowanie szablonu details.phtml, aby pobierał bloki potomne z układu.
$blocks = $layout->getChildBlocks($block->getNameInLayout());
Robiąc to w ten sposób, przestrzega kolejności podanej przez modyfikatory po i przed nimi .
Nadal używam tablicy dostarczonej przez getGroupChildNames w celu sprawdzenia, czy blok należy do grupy.
if(in_array($child_block->getNameInLayout(),$detailedInfoGroup))
źródło
Nie chciałem pracować nad kompozycją, chciałem zmodyfikować zachowanie metody „getGroupChildNames”. To podejście powinno działać, nawet jeśli szablon zostanie zmodyfikowany.
Dodałem to do catalog_product_view.xml:
Następnie utwórz blok, aby zmienić zachowanie „getGroupChildNames”:
To wszystko.
źródło
LordZardeck ma najlepszą odpowiedź, ale jest to zasadniczo błąd i powinien zostać naprawiony w rdzeniu.
Najprostsze rozwiązanie problemu, jaki znalazłem, jest następujące: Zastąp szablon Magento_Catalog :: product / view / details.phtml i po pierwszym warunku php w linii 10:
dodaj następujący kod, aby zmodyfikować zamówienie:
to zmieni kolejność i popchnie wszystkie karty wymienione w $ _prepend na początek tablicy w zdefiniowanej kolejności.
źródło
Wygląda na to, że wszystkie powyższe nie są już istotne. Od Magento 2.3.1 możemy używać
sort_order
argumentu w konfiguracji xml.źródło
Wtyczka jest dobrym rozwiązaniem. Ale nadal możesz to poprawić. Nie chcesz pisać innej wtyczki za każdym razem, gdy musisz zmienić kolejność kart. Co chcesz zrobić, to ustawić kolejność w XML. Lubię to:
a następnie, zamiast modyfikować szablon, utwórz wtyczkę, dzięki której Magento zrozumie
priority
argument użyty w konfiguracji xml:I wreszcie wtyczka musi zostać zastosowana do
Magento\Catalog\Block\Product\View\Description
klasy w pliku di.xml.źródło
W przypadku Magento 2 zmień kolejność zakładek na stronie produktu.
Możesz łatwo dostosować kolejność kart w prosty sposób.
Jeśli plik details.phtml już istnieje, zaktualizuj go.
Oryginalny kod:
Po dodaniu kodu:
I dodaj niestandardową kartę na stronie produktu sprawdź ten link
Magento 2 - Utwórz kartę produktu, która wyświetla niestandardowy atrybut
źródło