Como obter uma coleção de categorias por loja no Magento 2?

7

Quero obter todos os nomes de categorias de uma loja específica. Estou tentando:

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

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

Mas mostra todas as categorias no mesmo idioma (exibição na mesma loja).

Então ->setProductStoreId($store->getId())não funciona.

Eu também tentei $category->setStoreId($store->getId())->getName().

Como posso obter todos os nomes de categorias para a visualização específica da loja?

Kiwop
fonte

Respostas:

2

Tente o seguinte:

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();
}
Manashvi Birla
fonte
Inclua o $ objectManager = $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
senthil
16

Usar diretamente o gerenciador de objetos não é o melhor / Maneira recomendada de fazer no magento usar o Bloco com o método consturct and fetch no seu arquivo phtml.

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

Para obter mais detalhes, consulte o link de blogs, coleção de categorias por loja

Usando o modo Block,

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

  }

chamar dentro do arquivo phtml ,

 $categorys = $this->getStoreCategories(false,false,true);
  foreach($categorys as $category){
     echo $category->getName()
  }
Rakesh Jesadiya
fonte
Não deve $contextser uma instância de \Magento\Framework\View\Element\Template\Context? De acordo com o método construtor do \Magento\Framework\View\Element\Templatequal o bloco de respostas está sendo estendido.
Darren Felton
Além disso, qualquer classe que se estende \Magento\Framework\View\Element\Templatejá pode ser \Magento\Store\Model\StoreManagerInterfaceacessada por meio da propriedade de classe protegida $_storeManager, portanto, é desnecessário defini-la nos construtores de nossas próprias classes para outra propriedade. +1 Para obter ajuda com a pergunta do OP, isso ajudou muito, muito obrigado.
Darren Felton
Eu tentei isso, mas fiquei nulo.
Purushotam Sangroula
1
Você deve mencionar que isso retornará apenas as categorias incluídas no menu.
vitoriodachef
E se o senhor quiser obter todas as categorias na configuração?
Asad Khan
8

Crie um bloco e adicione o código abaixo ao seu bloco.

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

E $ block-> getCategoryCollection () usou isso no seu arquivo de modelo. para obter coleção de categorias

Savoo
fonte
Isso carregará apenas as informações disponíveis na tabela catalog_category_entity. Não carregará atributos como nome, por exemplo.
vitoriodachef
0

Método 1 - Usando injeção de dependência (DI)

Aqui está o código de exemplo para obter a lista de todas as categorias no Magento 2 usando injeção de dependência.

Para obter as informações da categoria, talvez seja necessário injetar o objeto \Magento\Catalog\Model\ResourceModel\Category\CollectionFactorye \Magento\Catalog\Helper\Categoryclasses no construtor da classe de bloco do nosso módulo e acessá-lo no arquivo 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);
    }
}

Agora, podemos usar as funções em nosso arquivo view (.phtml) da seguinte maneira.

// 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 />';
}

Método 2- Usando o Gerenciador de Objetos

Aqui está o código para obter a lista de todas as categorias no Magento 2 usando o gerenciador de objetos.

$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 />';
}
Vishal Thakur
fonte