Próbuję utworzyć blok statyczny do wyświetlania produktów dynamicznych. Jest to kod, który ma pobrać każdą kategorię podrzędną i wydrukować obraz każdego produktu w każdej kategorii.
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
?><ol><?php
foreach ($category->getChildrenCategories() as $child_category) {
?><li>
<ul><?php
foreach ($child_category->getProductCollection() as $product) {
?><li><img src="<?php echo $product->getImage();?>"/><li><?php
}
?></ul>
</li><?php
}
?></ol>
To prawie działa, z tym że img srcs to tylko „/a/b/ab001.jpg” jako przykład, a nie pełna ścieżka np. „/ Pub / media / catalog / product / cache / 1 / small_image / 240x300 / abc123def456 / a / b / 001.jpg ”, więc nie można znaleźć obrazów. Jaki jest prawidłowy sposób uzyskiwania zdjęć produktów?
Odpowiedzi:
Jeśli twój blok się rozszerza
Magento\Catalog\Block\Product\AbstractProduct
, możesz użyć:Następnie uzyskaj adres URL obrazu za pomocą
lub jeśli chcesz wyprowadzić go jako
<img>
element:Jeśli twój blok nie rozszerza / nie może rozszerzyć abstrakcyjnego bloku produktu, możesz samodzielnie stworzyć
getImage()
metodę:$this->imageBuilder
musi być wstrzyknięty jakoMagento\Catalog\Block\Product\ImageBuilder
Te
$imageType
lub$imageId
zmienne powinny być jednym z typów obrazów określonych w temacie, na przykładcategory_page_list
.Zobacz
app/design/frontend/Magento/luma/etc/view.xml
na przykład wszystkie typy obrazów w motywie Luma.W Magento 2 te typy obrazów są używane zamiast definiowania szerokości i wysokości bezpośrednio w szablonie.
źródło
Uncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg'
category_page_list
. Zobacz: github.com/magento/magento2/blob/... w Magento 2 używasz ich zamiast definiować szerokość i wysokość bezpośrednio w szablonieJeśli musisz zmienić rozmiar obrazu produktu i użyć domyślnego systemu pamięci podręcznej obrazu Magento, a nie znajdujesz się w obszarze interfejsu użytkownika, możesz skorzystać z tego obejścia.
Przypadek użycia: może być przydatny, jeśli potrzebujesz URL-i obrazów o zmienionym rozmiarze w niestandardowym interfejsie API dla aplikacji zewnętrznej.
Kod funkcji:
Przykład wyjściowy:
Komentarze:
Trzeci parametr funkcji startEnvironmentEmulation służy do wymuszenia użycia obszaru interfejsu użytkownika, jeśli użytkownik jest już w tym samym magazynie. (przydatne w obszarze API)
To obejście pozwala uniknąć tego rodzaju błędów:
źródło
Spróbuj
źródło
Wypróbuj ten kod ..
źródło
getUrl()
nie jest właściwym sposobem, nawet jeśli może zadziałać przypadkowo. Pobiera$route
parametr w postaci „moduł / kontroler / akcja”. „pub / media / katalog” wygląda jak trasa, ale nią nie jest.Może
Magento\Catalog\Helper\Product::getImageUrl()
może pomóc. Nie rozumiem, dlaczego programiści Magento nie wdrożyli go wMagento\Catalog\Helper\Image
klasie, ponieważgetUrl
metoda w pomocniku obrazu nie zwraca tego, czego można się spodziewać ...źródło
Spróbuj tego kodu:
źródło
Możesz użyć ObjectManager lub Block.
Menedżer obiektów:
Blok:
Wywołaj funkcję:
źródło
Wypróbuj ten kod
Mam nadzieję, że to ci pomoże
źródło
W twoim module:
Następnie w swoim bloku otrzymasz ten wynik:
Cóż, to nie jest idealne, ale działa dla mnie.
Spójrz na wynik:
źródło
W twojej klasie wstrzyknij zależność StoreManagerInterface jak:
po w metodzie, na przykład w celu uzyskania kciuka
źródło
Możesz spróbować tego poniżej kodu.
źródło
To kolejna metoda działania:
Lub przestrzeganie bezpiecznego / niepewnego adresu URL na podstawie bieżącego żądania:
Instancję obiektu pozostawię twojej własnej wyobraźni.
źródło
Możemy pobrać adres URL obrazu podstawowego w pliku phtml
źródło