Làm cách nào để có được Bộ sưu tập Danh mục trên mỗi Cửa hàng trong Magento 2?


7

Tôi muốn nhận được tất cả các tên danh mục từ một cửa hàng cụ thể. Tôi đang cô:

$categoryFactory = $objectManager->create('Magento\Catalog\Model\ResourceModel\Category\CollectionFactory');
$categories = $categoryFactory->create()                              
    ->addAttributeToSelect('*')
    ->setProductStoreId($store->getId());

    foreach ($categories as $category){
        $category->getName();
    }

Nhưng nó hiển thị tất cả các danh mục trong cùng một ngôn ngữ (cùng chế độ xem cửa hàng).

Vì vậy, ->setProductStoreId($store->getId())không làm việc.

Tôi cũng đã thử $category->setStoreId($store->getId())->getName().

Làm cách nào tôi có thể nhận được tất cả các tên danh mục cho chế độ xem cửa hàng cụ thể?

Câu trả lời:


2

Thử cái này :

protected $_storeManager;

public function __construct(
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    $data = []
) {
    $this->_storeManager = $storeManager;
    parent::__construct($data);
}

$objectManager = $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$categoryFactory = $objectManager->create('Magento\Catalog\Model\ResourceModel\Category\CollectionFactory');
$categories = $categoryFactory->create()                              
    ->addAttributeToSelect('*')
    ->setStore($this->_storeManager->getStore()); //categories from current store will be fetched

foreach ($categories as $category){
    $category->getName();
}

Bao gồm $ objectManager = $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
Senthil

16

Sử dụng trực tiếp objectmanager không phải là cách tốt nhất / Được khuyến nghị trong magento, sử dụng Block với consturct và phương thức tìm nạp trong tệp phtml của bạn.

$categoryFactory = $objectManager->create('Magento\Catalog\Helper\Category');
$categoryFactory->getStoreCategories(false,false,true);

Để biết thêm chi tiết, vui lòng tham khảo liên kết blog, Bộ sưu tập danh mục trên mỗi cửa hàng

Sử dụng cách chặn,

class Categorydata extends \Magento\Framework\View\Element\Template {
    protected $_categoryHelper;
    protected $categoryFactory;
    protected $_catalogLayer;

    public function __construct(
        \Magento\Catalog\Block\Product\Context $context,     
        \Magento\Catalog\Helper\Category $categoryHelper,        
        array $data = []
    ) {
        $this->_categoryHelper = $categoryHelper;   
        parent::__construct(
            $context,          
            $data
        );
    }

    /**
     * Retrieve current store level 2 category
     *
     * @param bool|string $sorted (if true display collection sorted as name otherwise sorted as based on id asc)
     * @param bool $asCollection (if true display all category otherwise display second level category menu visible category for current store)
     * @param bool $toLoad
     */

    public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true)
    {
        return $this->_categoryHelper->getStoreCategories($sorted , $asCollection, $toLoad);
    }

  }

gọi bên trong tập tin phtml ,

 $categorys = $this->getStoreCategories(false,false,true);
  foreach($categorys as $category){
     echo $category->getName()
  }

Không nên $contextlà một ví dụ của \Magento\Framework\View\Element\Template\Context? Theo phương thức constructor \Magento\Framework\View\Element\Templatemà khối câu trả lời của bạn đang mở rộng.
Darren Felton

Ngoài ra, bất kỳ lớp nào mở rộng \Magento\Framework\View\Element\Templateđã có \Magento\Store\Model\StoreManagerInterfacethể truy cập được thông qua thuộc tính lớp được bảo vệ $_storeManager, do đó, đặt nó trong các hàm tạo của lớp chúng ta sang thuộc tính khác là không cần thiết. +1 Để được hỗ trợ với câu hỏi của OP mặc dù điều này đã giúp rất nhiều lời cảm ơn.
Darren Felton

Tôi đã thử điều này nhưng không có giá trị.
Purushotam Sangroula

1
Bạn nên đề cập rằng điều này sẽ chỉ trả lại các danh mục được bao gồm trong menu.
vitoriodachef

Điều gì xảy ra nếu ngài tôi muốn có được tất cả các loại trong cấu hình ??
Asad Khan

8

Tạo Khối và thêm mã dưới đây vào khối của bạn.

namespace <vendor>\<module>\Block;

class FeaturedCategories extends \Magento\Framework\View\Element\Template{
protected $_categoryCollection;
protected $_storeManager;

public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollection,
    array $data = []
)
{
    $this->_categoryCollection = $categoryCollection;
    $this->_storeManager = $storeManager;
    parent::__construct($context, $data);
}

public function getCategoryCollection()
{
    $collection = $this->_categoryCollection->create()
        ->addAttributeToSelect('*')
        ->setStore($this->_storeManager->getStore())
        //->addAttributeToFilter('attribute_code', '1')
        ->addAttributeToFilter('is_active','1');
   return $collection;
}
}

Và $ block-> getC CategoryCollection () đã sử dụng điều này trong tệp mẫu của bạn. để có được bộ sưu tập thể loại


Điều này sẽ chỉ tải thông tin có sẵn trên bảng catalog_carget_entity. Nó sẽ không tải các thuộc tính như tên chẳng hạn.
vitoriodachef

0

Phương pháp 1 - Sử dụng tiêm phụ thuộc (DI)

Dưới đây là mã ví dụ để lấy danh sách tất cả các danh mục trong Magento 2 bằng cách sử dụng phép nội xạ phụ thuộc.

Để có được thông tin danh mục, chúng ta có thể cần phải tiêm đối tượng \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory\Magento\Catalog\Helper\Categorycác lớp trong hàm tạo của lớp khối của mô-đun và truy cập nó từ tệp view (.phtml).

app/code/YourCompanyName/YourModuleName/Block/YourCustomBlock.php

<?php
namespace YourCompanyName\YourModuleName\Block;
class YourCustomBlock extends \Magento\Framework\View\Element\Template
{ 
    protected $_categoryCollectionFactory;

    protected $_categoryHelper;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
        \Magento\Catalog\Helper\Category $categoryHelper,
        array $data = []
    ) {
        $this->_categoryCollectionFactory = $categoryCollectionFactory;
        $this->_categoryHelper = $categoryHelper;
        parent::__construct($context, $data);
    }

    public function getCategoryCollection($isActive = true, $level = false, $sortBy = false, $pageSize = false) {
        $collection = $this->_categoryCollectionFactory->create();
        $collection->addAttributeToSelect('*');

        // select only active categories
        if ($isActive) {
            $collection->addIsActiveFilter();
        }

        // select categories of certain level
        if ($level) {
            $collection->addLevelFilter($level);
        }

        // sort categories by some value
        if ($sortBy) {
            $collection->addOrderField($sortBy);
        }

        // set pagination
        if ($pageSize) {
            $collection->setPageSize($pageSize); 
        } 

        return $collection;
    }

 /**
 * Retrieve current store level 2 category
 *
 * @param bool|string $sorted (if true display collection sorted as name otherwise sorted as based on id asc)
 * @param bool $asCollection (if true display all category otherwise display second level category menu visible category for current store)
 * @param bool $toLoad
 */

    public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true) {
        return $this->_categoryHelper->getStoreCategories($sorted = false, $asCollection = false, $toLoad = true);
    }
}

Bây giờ, chúng ta có thể sử dụng các hàm trong tệp view (.phtml) như sau.

// get the list of all categories
$categories = $block->getCategoryCollection(); 
foreach ($categories as $category) {
    echo $category->getId() . '<br />';
    echo $category->getName() . '<br />';
}

// get categories sorted by category name
$categories = $block->getCategoryCollection(true, false, 'name', false);
foreach ($categories as $category) { 
    echo $category->getId() . '<br />';
    echo $category->getName() . '<br />';
}

// get current store’s categories
$categories = $block->getStoreCategories();
foreach ($categories as $category) { 
    echo $category->getId() . '<br />';
    echo $category->getName() . '<br />';
}

Phương pháp 2- Sử dụng Trình quản lý đối tượng

Dưới đây là mã để lấy danh sách tất cả các danh mục trong Magento 2 bằng trình quản lý đối tượng.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

// get the list of all categories
$categoryCollection = $objectManager->get('\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory');
$categories = $categoryCollection->create();
$categories->addAttributeToSelect('*');

foreach ($categories as $category) {
    echo $category->getId() . '<br />';
    echo $category->getName() . '<br />';
    echo $category->getUrl() . '<br />';
}

// get current store’s categories 
$categoryHelper = $objectManager->get('\Magento\Catalog\Helper\Category');
$categories = $categoryHelper->getStoreCategories();

foreach ($categories as $category) {
    echo $category->getId() . '<br />';
    echo $category->getName() . '<br />';
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.