Celem modułu, który obecnie opracowuję, jest dodanie niestandardowego typu obrazu o nazwie „opengraph_image”. Dodałem nowy atrybut EAV przez mój skrypt InstallData.php, który działa dobrze. Kiedy teraz loguję się do backendu Magento2 i zmieniam produkt, mogę wybrać typ obrazu „opengraph_image” podczas przesyłania lub edycji zdjęć produktu.
Jednak na froncie chciałbym wyświetlić ten obraz. Dlatego utworzyłem plik etc / view.xml w moim module o następującej treści:
<?xml version="1.0"?>
<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Esites_SEO:etc/custom.xsd">
<media>
<images module="Magento_Catalog">
<image id="opengraph_image" type="opengraph_image">
<width>265</width>
<height>265</height>
</image>
</images>
</media>
</view>
Ale teraz pojawia się następujący błąd:
Invalid XML in file /var/www/html/vhosts/magento2/app/code/Esites/SEO/etc/view.xml:
Element 'image', attribute 'type': [facet 'enumeration'] The value 'opengraph_image' is not an element of the set {'thumbnail', 'small_image', 'image', 'swatch_image', 'swatch_thumb'}.
Line: 5
Element 'image', attribute 'type': 'opengraph_image' is not a valid value of the local atomic type.
Line: 5
Powodem jest to, że nie ładuje mojego pliku custom.xsd znajdującego się w: app/code/Esites/SEO/etc/custom.xsd
gdzie definiuję opengraph_image. Zamiast tego wydaje się, że po prostu ładuje to domyślny plik XSD:vendor/magento/framework/Config/etc/view.xsd
Zawartość mojego pliku custom.xsd jest kopią (do celów testowych) tego oryginalnego pliku view.xsd, w którym w wierszu 75 dodałem:
<xs:enumeration value="opengraph_image"/>
Frontend działa bez błędów, jeśli dołączę powyższą linię do oryginalnego pliku view.xsd. Postępowałem zgodnie z dokumentacją: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html, a moje ścieżki są budowane zgodnie z informacjami na tej stronie. Pamięć podręczna jest czyszczona wiele razy.
czego mi brakuje?
module="Magento_Catalog"
namodule="Esites_SEO"
?Odpowiedzi:
Magento2 ładuje domyślny view.xsd, ponieważ program ConfigView Reader używa
lib/internal/Magento/Framework/Config/SchemaLocator.php
i zwraca wartość domyślnąview.xsd
Byłem w stanie to zmienić, wykonując poniższe kroki:
Utwórz definicję wtyczki w
{MODULE}/etc/di.xml
Utwórz wtyczkę w {MODULE} /Model/Plugin/SchemaLocator.php
Aktualizacja dla Magento 2.0. wersja
lib/internal/Magento/Framework/Config/etc/view.xsd
do{MODULE}/etc/view.xsd
Dla Magento 2.1. wersja, skopiuj
Vendor/Magento/Framework/Config/etc/view.xsd
do{MODULE}/etc/view.xsd
* Edytuj{MODULE}/etc/view.xsd
i dodaj nowy typmedia_attribute
źródło
Magento\Framework\Config\Dom\UrnResolver
ponieważ są miejsca, które używają jej bezpośrednio zamiast przechodzićSchemaLocator
.To wydaje się być wadą projektową w połączeniu z błędem Magento 2. Utworzyłem tutaj raport o błędzie: https://github.com/magento/magento2/issues/10161
Jeśli używasz konstruktora obrazów bezpośrednio w szablonie do generowania obrazu opengraph_image, lepszym rozwiązaniem jest przekazanie niestandardowych atrybutów (za pomocą
Magento\Catalog\Block\Product\ImageBuilder::setAttributes
lub trzeciego parametruMagento\Catalog\Block\Product\View::getImage
).Jednak to nie zadziała (biorąc pod uwagę mój raport o błędach), więc nadal będziesz musiał zastąpić
create
metodę ImageBuilder, aby przekazać te atrybuty do programu Image Image Helper.źródło
Jest prostszy sposób niż odpowiedź Jarosława. Można zmienić parametry konstruktora na SchemaLocator w pliku di.xml modułu. Lubić:
Nie potrzebujesz wtyczki.
źródło
Nie musisz go modyfikować ani zastępować
view.xsd
, ten plik służy wyłącznie do sprawdzania poprawności.Niedawno zaimplementowałem moje rozwiązanie, wykonując następujące czynności: Utwórz atrybut katalogu obrazów (powiedzmy, że nowy atrybut o identyfikatorze 162). Po utworzeniu atrybutu będziesz mógł zastosować go do dowolnego obrazu katalogu. Teraz musisz zastosować odpowiedni model i widoczność z przodu. Możesz to zrobić programowo lub postępując zgodnie z tym przewodnikiem.
Otwórz bazę danych za pomocą phpMyAdmin lub MySQL i spróbuj wykonać kopię lustrzaną dowolnego atrybutu systemowego, takiego jak small_image
Przejdź do
www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml
i dodaj nowy typ obrazu:www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
Dla mnie zadziałało najechanie kursorem na listę produktów kategorii, mam nadzieję, że ta pomoc.
źródło