Wie erhalte ich eine Kategoriesammlung pro Geschäft in Magento 2?

7

Ich möchte alle Kategorienamen aus einem bestimmten Geschäft erhalten. Ich versuche:

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

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

Es werden jedoch alle Kategorien in derselben Sprache angezeigt (Ansicht des gleichen Geschäfts).

Funktioniert ->setProductStoreId($store->getId())also nicht.

Ich bin auch versucht $category->setStoreId($store->getId())->getName().

Wie kann ich alle Kategorienamen für eine bestimmte Geschäftsansicht abrufen?

Kiwop
quelle

Antworten:

2

Versuche dies :

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
quelle
Fügen Sie $ objectManager = $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance () ein.
Senthil
16

Die direkte Verwendung des Objektmanagers ist nicht die beste / empfohlene Methode, um in Magento Block mit der Konstruktions- und Abrufmethode in Ihrer HTML-Datei zu verwenden.

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

Weitere Informationen finden Sie unter Blog-Link, Kategoriesammlung pro Geschäft

Mit Block Weg,

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

  }

Aufruf in der HTML- Datei,

 $categorys = $this->getStoreCategories(false,false,true);
  foreach($categorys as $category){
     echo $category->getName()
  }
Rakesh Jesadiya
quelle
Sollte nicht $contexteine Instanz von sein \Magento\Framework\View\Element\Template\Context? Gemäß der Konstruktormethode, \Magento\Framework\View\Element\Templatederen Block Ihre Antwort erweitert.
Darren Felton
Darüber hinaus kann auf jede erweiterte Klasse \Magento\Framework\View\Element\Templatebereits \Magento\Store\Model\StoreManagerInterfaceüber die geschützte Klasseneigenschaft zugegriffen $_storeManagerwerden. Daher ist es nicht erforderlich, sie in den Konstruktoren unserer eigenen Klassen auf eine andere Eigenschaft zu setzen. +1 Für die Unterstützung bei der Frage des OP, obwohl dies sehr hilfreich war, danke.
Darren Felton
Ich habe es versucht, aber null bekommen.
Purushotam Sangroula
1
Sie sollten erwähnen, dass dies nur Kategorien zurückgibt, die im Menü enthalten sind.
Vitoriodachef
Was ist, wenn Sir, ich möchte alle Kategorien in Konfiguration bekommen?
Asad Khan
8

Erstellen Sie einen Block und fügen Sie den folgenden Code zu Ihrem Block hinzu.

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

Und $ block-> getCategoryCollection () hat dies in Ihrer Vorlagendatei verwendet. um eine Kategoriesammlung zu erhalten

Savoo
quelle
Dadurch werden nur Informationen geladen, die in der Tabelle catalog_category_entity verfügbar sind. Es werden keine Attribute wie beispielsweise name geladen.
Vitoriodachef
0

Methode 1 - Verwenden der Abhängigkeitsinjektion (DI)

Hier ist der Beispielcode zum Abrufen der Liste aller Kategorien in Magento 2 mithilfe der Abhängigkeitsinjektion.

Um die Kategoriedaten abzurufen, müssen wir möglicherweise das Objekt \Magento\Catalog\Model\ResourceModel\Category\CollectionFactoryund die \Magento\Catalog\Helper\CategoryKlassen in den Konstruktor der Blockklasse unseres Moduls einfügen und über die Ansichtsdatei (.phtml) darauf zugreifen.

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

Jetzt können wir die Funktionen in unserer Ansichtsdatei (.phtml) wie folgt verwenden.

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

Methode 2 - Verwenden des Objektmanagers

Hier ist der Code, um die Liste aller Kategorien in Magento 2 mit dem Objektmanager abzurufen.

$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
quelle