Wow this tutorial observe the frontend side of Magento 2 , how you can get collection of categories in the home page , for that we create small extension , and we explain here :
You can download the complete code from github
1 – Create you new Extension for our case in folder app/code/Ibnab/CategoriesSide
and inside etc folder declare you etc declare module.xml and di.xml with content :
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="Ibnab_CategoriesSide" setup_version="1.0.0" schema_version="1.0.0"> <sequence> <module name="Magento_Catalog"/> </sequence> </module> </config>
di.xml :
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> <type name="Ibnab\CategoriesSide\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>
Note - Here the dependency is for inject the class \Magento\Catalog\Helper\Category for getting all categories of current store (And OR ) get the top menu html for the complete collection you need inject \Magento\Theme\Block\Html\Topmenu ,
2 - the injection is for our data source the block
Ibnab\CategoriesSide\Block\CategorisCollection create and put the code :
<?php namespace Ibnab\CategoriesSide\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 top menu html * 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()) { } else { $subcategories = $category->getChildren(); } return $subcategories; } }
Note – The more important here is getStoreCategories and getChildCategories($category)
, it get you the data collection tree from helper , and getHtml()
is return the complete collection is more quick for correct the html
3 - ok now create you template inside view/frontend/template/storecategories.phtml with content :
<?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> <h1>OR Just</h1> <?php echo $this->getHtml() ?>
Note : if you have just 2 level or less you can play but if you have many child why not using $this->getHtml()
4 – Now you have 2 technique for add to left or right container :
A – first technique go to you home page in the admin panel click content choose page and on the edit action now click tab design choose 2 columns with let bar from layout and put inside the Layout Update XML :
<referenceContainer name="sidebar.main"> <block class="Ibnab\CategoriesSide\Block\CategorisCollection" name="categoriecollection" template="Ibnab_CategoriesSide::storecategories.phtml"/> </referenceContainer>
B – the second technique is to create cms_index_index.xml inside view/frontend/layout/ and put the code :
<?xml version="1.0"?> <!-- /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="sidebar.main"> <block class="Ibnab\CategoriesSide\Block\CategorisCollection" name="categoriecollection" template="Ibnab_CategoriesSide::storecategories.phtml"/> </referenceContainer> </body> </page>
You can download the complete code from github
Comments