Siatka produktu na stronie kategorii (frontend) jest renderowana za pomocą układu w catalog_category_view.xml .
Powiedzmy, że mam niestandardową kolekcję produktów (którą otrzymałem
ProductRepositoryInterface::getList($searchCriteria) method
w niestandardowej klasie bloku i chcesz renderować tę kolekcję. Renderowany wynik powinien być wyświetlany jako siatka produktu na interfejsie (tak jak każda strona kategorii).
Jak można to zrobić?
Przyglądając się, catalog_category_view.xml
istnieją dwie znaczące linie, które są odpowiedzialne za renderowanie kolekcji produktów:
<block class="Magento\Catalog\Block\Category\View" name="category.products" template="Magento_Catalog::category/products.phtml">
<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">
Jak mogę dostarczyć własną kolekcję produktów do tych plików szablonów, aby renderowały moją kolekcję?
Popraw mnie, jeśli się mylę.
Tak wygląda mój kod blokowy:
<?php
namespace Mod\Mod1\Block;
use Magento\Framework\View\Element\Template;
class Main extends Template
{
protected $_filterBuilder;
protected $_filterGroupArray;
protected $_filterGroupBuilder;
protected $_searchCriteriaBuilder;
protected $_productRepository;
protected $_productFactory;
protected $_list;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
\Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Catalog\Model\ProductFactory $productFactory,
array $data = [])
{
$this->_productRepository = $productRepository;
$this->_searchCriteriaBuilder = $searchCriteriaBuilder;
$this->_filterGroupBuilder = $filterGroupBuilder;
$this->_filterBuilder = $filterBuilder;
parent::__construct($context, $data);
}
public function getLoadedProductCollection(){
$searchCrit = $this->buildSearchCriteria('','','','','','5-',1);
$list = $this->_productRepository->getList($searchCrit);
return $list;
}
public function buildSearchCriteria(...){
....
return $searchCriteria;
}
}
magento-2.1
custom
product-collection
render
Blackpanther0001
źródło
źródło
Odpowiedzi:
Możesz spróbować:
Zaktualizuj plik catalog_category_view.xml
I wywołaj swój plik.phtml w product / list.phtml:
Teraz możesz użyć swojej funkcji w pliku yourfile.phtml w następujący sposób:
Przykład:
Mam nadzieję, że to może ci pomóc.
źródło
Najlepszym podejściem byłoby:
Zaktualizuj swoje
catalog_category_view.xml
i wymienićMagento\Catalog\Block\Product\ListProduct
zMod\Mod1\Block\Main
przed:
po:
Twoja
Main
klasa MUSI przedłużyćMagento\Catalog\Block\Product\ListProduct
Następnie musisz przepisać metodę
getLayer()
na własną.Stwórz własną nową
Layer
klasę, która będzie rozszerzaćMagento\Catalog\Model\Layer
i bawić się kolekcjami.i
źródło
Zasadniczo początkowo chcesz utworzyć kontroler lub nawet podstawową stronę CMS, aby mieć stronę do pokazania swojej kolekcji.
Stamtąd można użyć niestandardowego bloku, który tworzy kolekcję w połączeniu z plikiem szablonu list.phtml , aby renderować produkty na stronie.
Dodaj powyżej xml, gdzie Vendor \ Module \ Block \ ProductCollection to niestandardowy kod bloku, w którym tworzona jest kolekcja do xml dla tej strony.
Plik list.phtml gromadzi kolekcję z Twojego bloku z poniższym wierszem kodu:
Tak długo, jak twój blok ma funkcję getLoadedProductCollection () zwracającą Twoją kolekcję produktów, plik list.phtml będzie następnie przechodził przez każdy produkt w Twojej kolekcji, renderując je w domyślnej siatce produktów Magento.
Dla kodu blokowego spróbuj zaktualizować poniższy wiersz, aby uwzględnić getItems () :
źródło
Możesz renderować kolekcję produktów w pliku phtml w ten sposób
źródło