在菜单内部,在顶部渲染当前类别


Inside menu, render the current category at top

我需要呈现一个带有导航菜单的侧边栏,其中包含应用程序的所有类别及其相应的子类别。然而,当当前页面引用某个类别或子类别时,当前类别需要是菜单中的第一个,但我不知道如何正确执行此操作。

我想到的第一件事是重复两次循环,在第一次循环中,检查有问题的类别是否与当前请求的类别相同,然后进行渲染,否则跳过循环。另一个循环几乎是一样的,但如果类别与当前请求的类别相同,则跳过循环到下一个元素。但这是一个非常糟糕的主意,重复HTML两次,使维护变得头疼。

我当前的代码:

//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>

你对我该怎么做有什么想法吗?我没有使用Zend_Navigation,在这种情况下,我应该使用它吗?或者我应该只使用CSS来实现这一点?

//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>