2

In the standard left navigation catalog/navigation/left.phtml of Magento 1.9 when entering a child category, with no children of its own, the navigation area is left blank. For these childless categories only, I would like to show sibling categories in the left navigation.

For example:

Parent Category

  • Child A
  • Child B
  • Child C

In the above scenario, if I navigated to 'Child A' then 'Child A, Child B and Child C' would be shown in the left navigation bar (with Child A ideally being shown in bold).

My current navigation/left.phtml code is:

<?php if (!Mage::registry('current_category')) return ?>
<?php $_categories = $this->getCurrentChildCategories() ?>
<?php $_count = is_array($_categories)?count($_categories):$_categories->count(); ?>
<?php if($_count): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Browse By') ?></span></strong>
    </div>
    <div class="block-content">
        <dl id="narrow-by-list2">
            <!--<dt><?php echo $this->__('Category') ?></dt>-->
            <dd>
                <ol>
                <?php foreach ($_categories as $_category): ?>
                    <?php if($_category->getIsActive()): ?>
                    <li>
                        <a href="<?php echo $this->getCategoryUrl($_category) ?>"<?php if ($this->isCategoryActive($_category)): ?> class="current"<?php endif; ?>><?php echo $this->escapeHtml($_category->getName()) ?></a>
                    </li>
                    <?php endif; ?>
                <?php endforeach ?>
                </ol>
            </dd>
        </dl>
        <script type="text/javascript">decorateDataList('narrow-by-list2')</script>
    </div>
</div>
<?php endif; ?>

Can an edit be suggested to the above, please, to get this working as desired?

  • Your requirement is to show sibling categories if current category don't have child categories. Right? If your current category have child categories then? – Sukumar Gorai Jul 16 '18 at 12:20
  • @yorkieMagento , please try my below answer and let me know if any issue. – Chirag Rajput Jul 17 '18 at 9:03
4

For achieve it you need to edit below file from your theme:

frontend/XYZ/THEME/template/catalog/layer/view.phtml

<?php
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magento.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magento.com for more information.
 *
 * @category    design
 * @package     rwd_default
 * @copyright   Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
?>
<?php
/**
 * Category layered navigation
 *
 * @see Mage_Catalog_Block_Layer_View
 */
?>
<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav<?php if (!$this->getLayer()->getState()->getFilters()): ?> block-layered-nav--no-filters<?php endif; ?>">
    <div class="block-title">
        <strong><span><?php echo $this->__('Shop By') ?></span></strong>
    </div>
    <div class="block-content toggle-content">
        <?php echo $this->getStateHtml() ?>
        <?php if ($this->getLayer()->getState()->getFilters()): ?>
            <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
        <?php endif; ?>
        <?php if($this->canShowOptions()): ?>
            <p class="block-subtitle block-subtitle--filter"><?php echo $this->__('Filter') ?></p>
            <dl id="narrow-by-list">
                <?php $_filters = $this->getFilters() ?>
                <?php foreach ($_filters as $_filter): ?>
                <?php if($_filter->getItemsCount()): ?>
                    <dt><?php echo $this->__($_filter->getName()) ?></dt>
                    <dd><?php echo $_filter->getHtml() ?></dd>
                <?php endif; ?>
                <?php endforeach; ?>
            </dl>
            <script type="text/javascript">decorateDataList('narrow-by-list')</script>
        <?php endif; ?>
    </div>
</div>
<?php else: 
       $_categories = Mage::getModel('catalog/category')->getCollection()->setStoreId(Mage::app()->getStore()->getId());
       $_categories->addAttributeToSelect('*')
        ->addAttributeToFilter('parent_id', Mage::registry('current_category')->getParentId()) //siblings have the same parent as the current category
        ->addAttributeToFilter('is_active', 1)//get only active categories
        ->addAttributeToSort('position');//sort by position
    ?>
    <div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Browse By') ?></span></strong>
    </div>
    <div class="block-content">
        <dl id="narrow-by-list2">
            <!--<dt><?php echo $this->__('Category') ?></dt>-->
            <dd>
                <ol>
                <?php foreach ($_categories as $_category): ?>
                    <?php if($_category->getIsActive()): ?>
                    <li>
                        <a href="<?php echo $_category->getUrl();?>"><?php echo $_category->getName();?></a>
                    </li>
                    <?php endif; ?>
                <?php endforeach ?>
                </ol>
            </dd>
        </dl>
        <script type="text/javascript">decorateDataList('narrow-by-list2')</script>
    </div>
    </div>
<?php endif; ?>
  • Thanks for answer. Can you provide code for left.phtml Chirag, as requested, please? – YorkieMagento Jul 20 '18 at 15:38
  • @YorkieMagento , No need to update left.phtml file. – Chirag Rajput Jul 23 '18 at 5:18
2
+50

Code for non-anchor categories:

Use the below code for navigation/left.phtml:

<?php if (!Mage::registry('current_category')) return ?>
<?php $currentCategory = Mage::registry('current_category'); ?>
<?php $_categories = Mage::getModel('catalog/category')->getCollection()->setStoreId(Mage::app()->getStore()->getId());
        $_categories->addAttributeToSelect('*')
        ->addAttributeToFilter('parent_id', $currentCategory->getParentId()) //siblings have the same parent as the current category
        ->addAttributeToFilter('is_active', 1)//get only active categories
        ->addAttributeToSort('position'); ?>

<?php $_count = is_array($_categories)?count($_categories):$_categories->count(); ?>
<?php if($_count): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Browse By') ?></span></strong>
    </div>
    <div class="block-content">
        <dl id="narrow-by-list2">
            <!--<dt><?php echo $this->__('Category') ?></dt>-->
            <dd>
                <ol>
                <?php foreach ($_categories as $_category): ?>
                    <?php if($_category->getIsActive()): ?>
                    <li>
                        <a href="<?php echo $_category->getUrl() ?>"<?php if ($currentCategory->getId() == $_category->getId()): ?> class="current"<?php endif; ?>><?php echo $this->escapeHtml($_category->getName()) ?></a>
                    </li>
                    <?php endif; ?>
                <?php endforeach ?>
                </ol>
            </dd>
        </dl>
        <script type="text/javascript">decorateDataList('narrow-by-list2')</script>
    </div>
</div>
<?php endif; ?>

You need to set bold for current category then add the following css to your css files:

<style type="text/css">
    .current{font-weight: bold;}
</style>

Code for anchor categories: Use the below code for layer/view.phtml:

<?php $currentCategory = Mage::registry('current_category'); ?>
<?php $_categories = Mage::getModel('catalog/category')->getCollection()->setStoreId(Mage::app()->getStore()->getId());
        $_categories->addAttributeToSelect('*')
        ->addAttributeToFilter('parent_id', $currentCategory->getParentId()) //siblings have the same parent as the current category
        ->addAttributeToFilter('is_active', 1)//get only active categories
        ->addAttributeToSort('position'); ?>

<?php $_count = is_array($_categories)?count($_categories):$_categories->count(); ?>
<?php if($_count): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Browse By') ?></span></strong>
    </div>
    <div class="block-content">
        <dl id="narrow-by-list2">
            <!--<dt><?php echo $this->__('Category') ?></dt>-->
            <dd>
                <ol>
                <?php foreach ($_categories as $_category): ?>
                    <li>
                        <a href="<?php echo $_category->getUrl(); ?>"<?php if ($currentCategory->getId() == $_category->getId()): ?> class="current"<?php endif; ?>><?php echo $this->escapeHtml($_category->getName()) ?></a>
                    </li>
                <?php endforeach ?>
                </ol>
            </dd>
        </dl>
        <script type="text/javascript">decorateDataList('narrow-by-list2')</script>
    </div>
</div>
<?php endif; ?>
<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Shop By') ?></span></strong>
    </div>
    <div class="block-content">
        <?php echo $this->getStateHtml() ?>
        <?php if ($this->getLayer()->getState()->getFilters()): ?>
            <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
        <?php endif; ?>
        <?php if($this->canShowOptions()): ?>
            <p class="block-subtitle"><?php echo $this->__('Shopping Options') ?></p>
            <dl id="narrow-by-list">
                <?php $_filters = $this->getFilters() ?>
                <?php foreach ($_filters as $_filter): ?>
                <?php if($_filter->getItemsCount() && $_filter->getName() != 'Category'): ?>
                    <dt><?php echo $this->__($_filter->getName()) ?></dt>
                    <dd><?php echo $_filter->getHtml() ?></dd>
                <?php endif; ?>
                <?php endforeach; ?>
            </dl>
            <script type="text/javascript">decorateDataList('narrow-by-list')</script>
        <?php endif; ?>
    </div>
</div>
<?php endif; ?>

You need to set bold for current category then add the following css to your css files:

<style type="text/css">
    .current{font-weight: bold;}
</style>
  • Sorry Sukumar, I did choose your answer. However, noticed that this doesn't work as requested, where only childless categories have this new navigation applied. I would like parent categories to behave as they did previously (i.e. their navigation shows children only). – YorkieMagento Jul 20 '18 at 15:36
1

Manged to adapt @Sukumar Gorai answer above to get it working how I wanted it to, as per my original question.

Revised code for /navigation/left.phtml.

<?php if (!Mage::registry('current_category')) return ?>
<?php $currentCategory = Mage::registry('current_category'); ?>
<?php $_countchildren = count($currentCategory->getChildrenCategories()); ?>
<?php if ($_countchildren == 0): { ?>
<?php $_categories = Mage::getModel('catalog/category')->getCollection()->setStoreId(Mage::app()->getStore()->getId());
        $_categories->addAttributeToSelect('*')
        ->addAttributeToFilter('parent_id', $currentCategory->getParentId()) //siblings have the same parent as the current category
        ->addAttributeToFilter('is_active', 1)//get only active categories
        ->addAttributeToSort('position'); ?>
<?php $_count = is_array($_categories)?count($_categories):$_categories->count(); ?>
<?php if($_count): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Browse By') ?></span></strong>
    </div>
    <div class="block-content">
        <dl id="narrow-by-list2">
            <!--<dt><?php echo $this->__('Category') ?></dt>-->
            <dd>
                <ol>
                <?php foreach ($_categories as $_category): ?>
                    <?php if($_category->getIsActive()): ?>
                    <li>
                        <a href="<?php echo $_category->getUrl() ?>"<?php if ($currentCategory->getId() == $_category->getId()): ?> class="current"<?php endif; ?>><?php echo $this->escapeHtml($_category->getName()) ?></a>
                    </li>
                    <?php endif; ?>
                <?php endforeach ?>
                </ol>
            </dd>
        </dl>
        <script type="text/javascript">decorateDataList('narrow-by-list2')</script>
    </div>
</div>
<?php endif; ?>
<?php } elseif ($_countchildren != 0): { ?>
<?php $_categories = $this->getCurrentChildCategories() ?>
<?php $_count = is_array($_categories)?count($_categories):$_categories->count(); ?>
<?php if($_count): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Browse By') ?></span></strong>
    </div>
    <div class="block-content">
        <dl id="narrow-by-list2">
            <!--<dt><?php echo $this->__('Category') ?></dt>-->
            <dd>
                <ol>
                <?php foreach ($_categories as $_category): ?>
                    <?php if($_category->getIsActive()): ?>
                    <li>
                        <a href="<?php echo $this->getCategoryUrl($_category) ?>"<?php if ($this->isCategoryActive($_category)): ?> class="current"<?php endif; ?>><?php echo $this->escapeHtml($_category->getName()) ?></a>
                    </li>
                    <?php endif; ?>
                <?php endforeach ?>
                </ol>
            </dd>
        </dl>
        <script type="text/javascript">decorateDataList('narrow-by-list2')</script>
    </div>
</div>
<?php endif; ?>
<?php } endif; ?>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.