I need to display magento 2 category tree on footer and on some other places. I think best practice is creating a module and call it on desired block (place). How to do that ? I already created a module but it is not working it returns an error "Object DOMDocument should be created."
app/code/Muaw/CategoriesList/registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Muaw_CategoriesList', __DIR__ );
app/code/Muaw/CategoriesList/Block/CategorisCollection.phtml <?php namespace Muaw\CategoriesList\Block; class CategorisCollection extends \Magento\Framework\View\Element\Template { protected $_categoryHelper; protected $categoryFlatConfig; protected $topMenu; /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Catalog\Helper\Category $categoryHelper * @param array $data */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Magento\Catalog\Helper\Category $categoryHelper, \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState, \Magento\Theme\Block\Html\Topmenu $topMenu ) { $this->_categoryHelper = $categoryHelper; $this->categoryFlatConfig = $categoryFlatState; $this->topMenu = $topMenu; parent::__construct($context); } /** * Return categories helper */ public function getCategoryHelper() { return $this->_categoryHelper; } /** * Return categories helper * getHtml($outermostClass = '', $childrenWrapClass = '', $limit = 0) * example getHtml('level-top', 'submenu', 0) */ public function getHtml() { return $this->topMenu->getHtml(); } /** * Retrieve current store categories * * @param bool|string $sorted * @param bool $asCollection * @param bool $toLoad * @return \Magento\Framework\Data\Tree\Node\Collection|\Magento\Catalog\Model\Resource\Category\Collection|array */ public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true) { return $this->_categoryHelper->getStoreCategories($sorted, $asCollection, $toLoad); } /** * Retrieve child store categories * */ public function getChildCategories($category) { if ($this->categoryFlatConfig->isFlatEnabled() && $category->getUseFlatResource()) { $subcategories = (array)$category->getChildrenNodes(); } else { $subcategories = $category->getChildren(); } return $subcategories; } } app/code/Muaw/CategoriesList/etc/di.xml <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> <type name="Muaw\CategoriesList\Block\CategorisCollection"> <arguments> <argument name="deleteorderAction" xsi:type="array"> <item name="context" xsi:type="string">\Magento\Framework\View\Element\Template\Context</item> <item name="helper" xsi:type="string">\Magento\Catalog\Helper\Category</item> <item name="flatstate" xsi:type="string">\Magento\Catalog\Model\Indexer\Category\Flat\State</item> <item name="menu" xsi:type="string">\Magento\Theme\Block\Html\Topmenu</item> </argument> </arguments> </type> </config> app/code/Muaw/CategoriesList/etc/module.xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd"> <module name="Muaw_CategoriesList" setup_version="2.0.1" schema_version="2.0.0"> <sequence> <module name="Magento_Catalog"/> </sequence> </module> </config> app/code/Muaw/CategoriesList/view/frontend/template/storecategories.phtml <?php $categories = $this->getStoreCategories(true, false, true); $categoryHelper = $this->getCategoryHelper(); ?> <ul> <?php foreach ($categories as $category): if (!$category->getIsActive()) { continue; } ?> <li><a href="<?php echo $categoryHelper->getCategoryUrl($category) ?>"><?php echo $category->getName() ?></a> </li> <?php if ($childrenCategories = $this->getChildCategories($category)): ?> <ul> <?php foreach ($childrenCategories as $childrenCategory): if (!$childrenCategory->getIsActive()) { continue; } ?> <li> <a href="<?php echo $categoryHelper->getCategoryUrl($childrenCategory) ?>"><?php echo $childrenCategory->getName() ?></a> </li> <?php endforeach; ?> </ul> <?php endif; endforeach; ?> </ul>
A tutorial on How to display the category tree in Magento 2
See this video https://www.youtube.com/watch?v=p5wKTzWnOaY
I hope it will save your time.