获取类别和子类别以树状显示

时间:2019-02-04 16:50:47

标签: magento2

如何使用Magento 2递归获取类别和子类别?我能够显示所有类别,但问题是我需要以树状方式显示,例如下面的

  • 默认类别
    • 首页
    • 关于我们
    • 产品
      • P一
        • SC-四
      • P-2
        • SC-One
        • SC-Two
      • 网站地图
      • SC-One

但是我得到的是所有这些类别的显示。有没有办法实现上述示例?现在我的代码看起来像这样

class Index extends \Magento\Framework\View\Element\Template 
{

protected $_categoryCollectionFactory;
protected $_categoryHelper;
protected $_categoryRepository;
protected $_storeManager;

public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
    array $data = []
)
{
    $this->_categoryCollectionFactory = $categoryCollectionFactory;
    $this->_categoryHelper = $categoryHelper;
    $this->_categoryCategoryRepository = $categoryRepository; 
    $this->_storeManager = $storeManager;
    $this->layerResolver = $layerResolver;
    parent::__construct($context, $data);
}

/**
 * Get category collection
 *
 * @param bool $isActive
 * @param bool|int $level
 * @param bool|string $sortBy
 * @param bool|int $pageSize
 * @return \Magento\Catalog\Model\ResourceModel\Category\Collection or array
 */
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);
    }

    // select certain number of categories
    if ($pageSize) {
        $collection->setPageSize($pageSize);
    }

    return $collection;
}

在我的phtml文件中,我有这个

$categories = $this->getCategoryCollection();
foreach ($categories as $category) {
    echo $category->getName() . '<br />';
}

我不确定该怎么做,如果我也能获得任何Magento 2文档的参考,它教如何获得网站的不同部分(如产品和其他内容),那将是很好的。现在,我对Magento的知识为零,而且我不知道可以遵循的任何文档/教程。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Magento\Theme\Block\Html\Topmenu区块已经递归给您所有类别和子类别 检查phtml文件/vendor/magento/module-theme/view/frontend/templates/html/topmenu.phtml 您可以使用以下代码获取菜单

<?php $columnsLimit = $block->getColumnsLimit() ?: 0; ?>
<?php echo $_menu = $block->getHtml('level-top', 'submenu', $columnsLimit) ?>

上面的代码将为您提供html树结构的类别。 您还可以重写块Magento\Theme\Block\Html\Topmenu以获取所需格式的输出。

OR

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$categoryFactory = $objectManager->create('Magento\Catalog\Helper\Category');
$all = $categoryFactory->getStoreCategories(false,true,true);