Magento 2でストアごとのカテゴリコレクションを取得する方法


7

特定のストアからすべてのカテゴリ名を取得したい。私はしようとしています:

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

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

ただし、すべてのカテゴリが同じ言語で表示されます(同じストアビュー)。

だから->setProductStoreId($store->getId())動作しません。

私もやってみました$category->setStoreId($store->getId())->getName()

特定のストアビューのすべてのカテゴリ名を取得するにはどうすればよいですか?

回答:


2

これを試して :

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

$ objectManager = $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance();を含めます。
センティル2018年

16

直接使用するObjectManagerは、magentoでブロックを使用するための最善の方法/推奨されない方法であり、phtmlファイルの構成およびフェッチメソッドでブロックを使用します。

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

詳細については、ブログのリンクを参照してください、賢明な店舗ごとのカテゴリコレクション

ブロックウェイを使用して、

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

  }

phtmlファイル内で呼び出し、

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

$contextインスタンスであってはなりません\Magento\Framework\View\Element\Template\Contextか?\Magento\Framework\View\Element\Template回答のブロックが拡張しているコンストラクターメソッドごと。
Darren Felton 2017

さらに、拡張するクラスはすべて、保護されたクラスプロパティを介して\Magento\Framework\View\Element\Templateすでに\Magento\Store\Model\StoreManagerInterfaceアクセスできる$_storeManagerため、独自のクラスのコンストラクタ内で別のプロパティに設定する必要はありません。+1 OPの質問の支援について。これは非常に感謝しました。
Darren Felton 2017

私はこれを試しましたが、ヌルになりました。
Purushotam Sangroula 2017

1
これは、メニューに含まれているカテゴリのみを返すことを言及する必要があります。
vitoriodachef

もし私がすべてのカテゴリーを構成で取得したい場合はどうなりますか?
Asad Khan

8

ブロックを作成し、以下のコードをブロックに追加します。

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

そして$ block-> getCategoryCollection()はこれをテンプレートファイルで使用しました。カテゴリコレクションを取得する


これは、catalog_category_entityテーブルで利用可能な情報のみをロードします。たとえば名前などの属性はロードされません。
vitoriodachef

0

方法1-依存性注入(DI)の使用

以下は、依存関係注入を使用してMagento 2のすべてのカテゴリのリストを取得するコードの例です。

カテゴリ情報を取得するには、モジュールのブロッククラスのコンストラクターにクラス\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory\Magento\Catalog\Helper\Categoryクラスのオブジェクトを挿入し、ビュー(.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);
    }
}

これで、ビュー(.phtml)ファイルの関数を次のように使用できます。

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

方法2- オブジェクトマネージャを使用する

オブジェクトマネージャーを使用してMagento 2のすべてのカテゴリのリストを取得するコードは次のとおりです。

$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 />';
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.