Внутри меню визуализируйте текущую категорию сверху
Мне нужно сделать боковую панель с навигационным меню, которое содержит все категории и соответствующие подкатегории приложения. Однако, когда текущая страница ссылается на категорию или подкатегорию, текущая категория должна быть первой в меню, но я не знаю, как это сделать правильно.
Первое, что пришло мне в голову, это повторить цикл дважды, в первом цикле проверить, совпадает ли рассматриваемая категория с категорией текущего запроса, и затем отрендерить его, в противном случае пропустить цикл. Другой цикл будет почти таким же, но если категория совпадает с категорией текущего запроса, пропустите цикл до следующего элемента. Но это очень плохая идея, повторяйте 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?
1 ответ
//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>