Question

I need to render a sidebar with a navigation menu that contains all the categories, and its respective subcategories, of an application. However, when the current page is referring to a category or subcategory, the current category needs to be the first from the menu, but I have no idea how to do this correctly.

The first thing that crossed my mind was to repeat the loop twice, in the first loop check if the category in question is the same as the category of the current request, and then render it, otherwise skip the loop. The other loop would be almost the same thing, but if the category is the same as the category of the current request, skip the loop to the next element. But this is a very bad idea, repeat the HTML twice, making maintenance a headache.

My current code:

//View Helper
<?php
namespace App\View\Helper;

class Category extends AbstractHelper {

    protected $category;

    /**
     * @param \Entities\Product\Category $category
     * @return \App\View\Helper\Category
     */
    public function category( \Entities\Product\Category $category = null )
    {
        $this->category = $category;
        return $this;
    }

    /**
     * @return string
     */
    public function renderSidebar( )
    {
        $repositoryHelper = \Zend_Controller_Action_HelperBroker::getStaticHelper( 'repository' );
        $categories = $repositoryHelper->getRepository( 'Product\Category' )->getCategoriesWithSubCategories();

        $isCorrectAction = ($this->getRequestVariable( 'action', false ) === 'products');
        $isACategoryPage = false;
        $requestedCategoryId = $this->getRequestVariable( 'category', false );

        if( $isCorrectAction && $requestedCategoryId ){
            $isACategoryPage = true;
        }

        return $this->view->partial(
            'partials/categoriesSidebar.phtml',
            array(
                'categories'      => $categories,
                'isACategoryPage' => $isACategoryPage,
                'requestedCategoryId' => (int) $requestedCategoryId
            )
        );
    }


}

//inside categoriesSidebar.phtml
<ul class="sidebar-menu">
    <?php foreach( $this->categories as $category ): ?>
        <?php if( $this->isACategoryPage && $this->requestedCategoryId === $category->getId()): ?>
            //???
        <?php endif; ?>
        <li class="category" id="category-<?= $category->getId() ?>">
            <a href="..." class="category-link"><?= $category->getName() ?></a>
            <?php if( $category->hasSubCategories() ): ?>
                <span class="subcategory-view desactivated"></span>
                <ul class="category-subcategories">
                    <?php foreach( $category->getSubCategories() as $subCategory ): ?>
                        <li class="subcategory category-<?= $category->getId() ?>-subcategories" id="subcategory-<?= $subCategory->getId() ?>" data-category="<?= $category->getId() ?>">
                            <a href="..." class="subcategory-link"><?= $subCategory->getName() ?></a>
                        </li>
                    <?php endforeach; ?>
                </ul>
            <?php endif; ?>
        </li>
    <?php endforeach; ?>
</ul>

Do you have ideas on how I could do this? I'm not using Zend_Navigation, In this case, I should be using it? Or should I make this just with CSS?

Was it helpful?

Solution

//inside categoriesSidebar.phtml
<ul class="sidebar-menu">
    <?php ob_start(); ?>
    <?php foreach( $this->categories as $category ): ?>
        <?php if( $this->isACategoryPage && $this->requestedCategoryId === $category->getId()): ?>
            <?php $current = $this->partial(
                                'partials/categoriesSidebarItem.phtml',
                                array(
                                    'category'      => $category,
                                )); ?>
        <?php endif; ?>
        <?php echo $this->partial(
                       'partials/categoriesSidebarItem.phtml',
                       array(
                           'category'      => $category,
                       )); ?>
    <?php endforeach; ?>
    <?php $list = ob_get_clean(); echo $current; echo $list; ?>
</ul>

// inside categoriesSidebarItem.phtml
        <li class="category" id="category-<?= $category->getId() ?>">
            <a href="..." class="category-link"><?= $category->getName() ?></a>
            <?php if( $category->hasSubCategories() ): ?>
                <span class="subcategory-view desactivated"></span>
                <ul class="category-subcategories">
                    <?php foreach( $category->getSubCategories() as $subCategory ): ?>
                        <li class="subcategory category-<?= $category->getId() ?>-subcategories" id="subcategory-<?= $subCategory->getId() ?>" data-category="<?= $category->getId() ?>">
                            <a href="..." class="subcategory-link"><?= $subCategory->getName() ?></a>
                        </li>
                    <?php endforeach; ?>
                </ul>
            <?php endif; ?>
        </li>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top