Magento 2 - รวบรวมผลิตภัณฑ์ที่กำหนดเองผ่าน list.phtml


16

ตารางผลิตภัณฑ์ของหน้าหมวดหมู่ (ส่วนหน้า) จะแสดงผลผ่านทางรูปแบบในcatalog_category_view.xml

ให้บอกว่าฉันมีคอลเลกชันผลิตภัณฑ์ที่กำหนดเอง (ซึ่งฉันได้ผ่าน

ProductRepositoryInterface::getList($searchCriteria) method

ในคลาสบล็อกที่กำหนดเองและต้องการแสดงคอลเลกชันนี้ ผลลัพธ์ที่แสดงควรแสดงเป็นกริดผลิตภัณฑ์ที่ส่วนหน้า (เช่นเดียวกับหน้าหมวดหมู่ใด ๆ )

สิ่งนี้สามารถทำได้?

การดูcatalog_category_view.xmlมีสองบรรทัดที่สำคัญซึ่งรับผิดชอบในการเรนเดอร์การรวบรวมผลิตภัณฑ์:

<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">

ฉันจะมอบชุดผลิตภัณฑ์ที่กำหนดเองของฉันให้กับไฟล์เทมเพลตเหล่านี้ได้อย่างไร

ถูกต้องฉันถ้าฉันผิดในเรื่องนี้

นี่คือลักษณะของรหัสบล็อกของฉัน:

<?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;
}
}

1
คุณกำลังขอวิธีเปลี่ยนผลิตภัณฑ์ในหน้าหมวดหมู่หรือจะมีตัวควบคุมหมวดหมู่รุ่นอื่นเป็นหลักหรือไม่?
Josh Davenport

การแบ่งหน้าและเลเยอร์การนำทางจะไม่เกิดขึ้นหากคุณแก้ไขการรวบรวมใน list.phtml หรือบล็อกที่เกี่ยวข้อง ดังนั้นตรวจสอบให้แน่ใจว่าคำตอบที่คุณยอมรับนั้นทำทั้งสองอย่างข้างต้นข้อตกลง
Vivek Kumar

คำตอบ:


1

คุณสามารถลองสิ่งนี้:

อัปเดต catalog_category_view.xml ของคุณ

<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">
<block class="Your(Mod)\Namespace(Mod1)\Block\YourBlockFileName(Main)" name="your.category.products.list" template="Magento_Catalog::product/yourFile.phtml" />
</block>

และโทร yourFile.phtml ในผลิตภัณฑ์ / list.phtml:

<?php echo $this->getChildHtml('your.category.products.list'); ?>

ตอนนี้คุณสามารถใช้ฟังก์ชันของคุณใน yourfile.phtml ดังนี้:

$block->yourfunction();

ตัวอย่าง:

$block->getLoadedProductCollection();

หวังว่านี่จะช่วยคุณได้


1

วิธีที่ดีที่สุดคือ:

อัปเดตcatalog_category_view.xmlและแทนที่Magento\Catalog\Block\Product\ListProductด้วยMod\Mod1\Block\Main

ก่อน:

<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

หลังจาก:

block class="Mod\Mod1\Block\Main" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">

Mainชั้นเรียนของคุณต้องขยายออกไปMagento\Catalog\Block\Product\ListProduct

จากนั้นคุณจะต้องเขียนวิธีgetLayer()การของคุณเอง

FYI: ชั้นเรียนของคุณMod\Mod1\Block\Mainต้องการการปรับโครงสร้างใหม่

สร้างLayerคลาสใหม่ของคุณเองที่จะขยายMagento\Catalog\Model\Layerและเล่นกับคอลเลกชัน

/**
 * Retrieve current layer product collection
 *
 * @return \Magento\Catalog\Model\ResourceModel\Product\Collection
 */
public function getProductCollection()

และ

/**
 * Initialize product collection
 *
 * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
 * @return \Magento\Catalog\Model\Layer
 */
public function prepareProductCollection($collection)

1

โดยพื้นฐานแล้วคุณต้องการสร้างคอนโทรลเลอร์หรือแม้แต่หน้า CMS พื้นฐานเพื่อให้คุณมีหน้าแสดงคอลเลกชันของคุณ

จากนั้นคุณสามารถใช้บล็อกที่กำหนดเองซึ่งสร้างคอลเลกชันของคุณรวมกับไฟล์เทมเพลตlist.phtmlเพื่อแสดงผลิตภัณฑ์ในหน้าของคุณ

{{block class="Vendor\Module\Block\ProductCollection" template="Magento_Catalog::product/list.phtml" name="specialproducts"}} 

เพิ่ม xml ด้านบนโดยที่Vendor \ Module \ Block \ ProductCollectionเป็นรหัสบล็อกที่กำหนดเองซึ่งคอลเล็กชันของคุณถูกสร้างเป็น xml สำหรับหน้านั้น

list.phtmlแฟ้มรวบรวมคอลเลกชันจากบล็อกของคุณกับด้านล่างบรรทัดของรหัส:

$_productCollection = $block->getLoadedProductCollection();

ตราบใดที่บล็อกของคุณมีฟังก์ชั่นgetLoadedProductCollection () ที่ส่งคืนคอลเลกชันของคุณของผลิตภัณฑ์ไฟล์list.phtmlจะวนซ้ำผ่านแต่ละผลิตภัณฑ์ในคอลเลกชันของคุณซึ่งจะแสดงในกริดผลิตภัณฑ์วีโอไอพีเริ่มต้น

สำหรับรหัสบล็อกของคุณลองอัปเดตด้านล่างบรรทัดเพื่อรวมgetItems () :

$list = $this->_productRepository->getList($searchCrit)->getItems();

ฉันทำตามที่คุณพูด บล็อกของฉันมีฟังก์ชัน 'getLoadedProductCollection ()' ซึ่งส่งคืน 'ProductRepositoryInterface :: getList ()' แต่ฉันได้รับข้อผิดพลาด: Uncaught Error: Call to undefined Magento \ Framework \ Api \ SearchResults :: count () ใน ... ดูเหมือนว่านี่ไม่ใช่วิธีการที่เหมาะสม
Blackpanther0001

ดูโพสต์ที่อัปเดตแล้ว
Blackpanther0001

อาจลองเปลี่ยน $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems ();
harri

@shahirhajir คุณลองกับ getItems หรือไม่
harri

ไม่ทำงาน. $ list = $ this -> _ productRepository-> getList ($ searchCrit) -> getItems (); ส่งคืน ProductInterface [] array และอาร์เรย์นี้ไม่มีการนับ () funtion ข้อผิดพลาดที่ไม่ได้แปล: เรียกจำนวนสมาชิกฟังก์ชัน () บนอาเรย์ใน ... \ list.phtml ที่บรรทัดที่ 22 ในบรรทัดที่ 22 ใน list.phtml เรามี: $ _productCollection-> count ()
Blackpanther0001

-1

คุณสามารถแสดงคอลเลกชันผลิตภัณฑ์ในไฟล์ phtml ของคุณเช่นนี้

$ product_collection = $ block-> getLoadedProductCollection ();


ไม่เป็นประโยชน์เลย
Blackpanther0001
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.