Я следил за этим сообщением, чтобы получить мое меню/навигацию немного динамичнее. помощник zf3 Zend Navigation
Теперь мне интересно, как лучше всего задать параметр пункту меню.
Например, пользователь находится на странице клиента, и я хочу реализовать editAction
в меню. Таким образом, должна быть возможность дать идентификатор клиента также для редактирования правильного клиента.
Мой вопрос в том, что было бы лучшим способом? И мне больше всего понравилось бы, как реализовать на своих фабриках, у меня уже есть. Вот мои услуги и фабрики:
МенюФабрика:
namespace Application\View\Helper;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\View\Helper\Menu;
use Application\Service\NavManager;
/**
* This is the factory for Menu view helper. Its purpose is to
instantiate the helper and init menu items. */
class MenuFactory implements FactoryInterface {
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
$navManager = $container->get(NavManager::class);
// Get menu items.
$items = $navManager->getMenuItems();
// Instantiate the helper.
return new Menu($items);
}
}
Меню.php
namespace Application\View\Helper;
use Zend\View\Helper\AbstractHelper;
// This view helper class displays a menu bar.
class Menu extends AbstractHelper
{
// Menu items array.
protected $items = [];
// Active item's ID.
protected $activeItemId = '';
// Constructor.
public function __construct($items=[])
{
$this->items = $items;
}
// Sets menu items.
public function setItems($items)
{
$this->items = $items;
}
// Sets ID of the active items.
public function setActiveItemId($activeItemId)
{
$this->activeItemId = $activeItemId;
}
// Renders the menu.
public function render()
{
if (count($this->items)==0)
return ''; // Do nothing if there are no items.
// $result = '<nav class="navbar navbar-default" role="navigation">';
$result = '<div class="navbar-header">';
$result .= '<button type="button" class="navbar-toggle" ';
$result .= 'data-toggle="collapse" data-target=".navbar-collapse">';
// $result .= '<span class="sr-only">Toggle navigation</span>';
$result .= '<span class="icon-bar"></span>';
$result .= '<span class="icon-bar"></span>';
$result .= '<span class="icon-bar"></span>';
$result .= '</button>';
$result .= '</div>';
$result .= '<div class="collapse navbar-collapse">'; // navbar-ex1-collapse
$result .= '<ul class="nav navbar-nav">';
// Render items
foreach ($this->items as $item) {
$result .= $this->renderItem($item);
}
$result .= '</ul>';
$result .= '</div>';
$result .= '</nav>';
return $result;
}
// Renders an item.
protected function renderItem($item)
{
$id = isset($item['id']) ? $item['id'] : '';
$isActive = ($id==$this->activeItemId);
$label = isset($item['label']) ? $item['label'] : '';
$result = '';
if(isset($item['dropdown'])) {
$dropdownItems = $item['dropdown'];
$result .= '<li class="dropdown ' . ($isActive?'active':'') . '">';
$result .= '<a href="#" class="dropdown-toggle" data-toggle="dropdown">';
$result .= $label . ' <b class="caret"></b>';
$result .= '</a>';
$result .= '<ul class="dropdown-menu">';
foreach ($dropdownItems as $item) {
$link = isset($item['link']) ? $item['link'] : '#';
$label = isset($item['label']) ? $item['label'] : '';
$result .= '<li>';
$result .= '<a href="'.$link.'">'.$label.'</a>';
$result .= '</li>';
}
$result .= '</ul>';
$result .= '</a>';
$result .= '</li>';
} else {
$link = isset($item['link']) ? $item['link'] : '#';
$result .= $isActive?'<li class="active">':'<li>';
$result .= '<a href="'.$link.'">'.$label.'</a>';
$result .= '</li>';
}
return $result;
}
}
NavManagerFactory.php
<?php
namespace Application\Service\Factory;
use Interop\Container\ContainerInterface;
use Application\Service\NavManager;
use Zend\Authentication\Adapter\AdapterInterface;
class NavManagerFactory {
/**
* This method creates the NavManager service and returns its instance.
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
$authService = $container->get(\Zend\Authentication\AuthenticationService::class);
$viewHelperManager = $container->get('ViewHelperManager');
$urlHelper = $viewHelperManager->get('url');
return new NavManager($authService, $urlHelper);
}
}
NavManager.php
<?php
namespace Application\Service;
class NavManager {
/**
* Auth service.
* @var Zend\Authentication\Authentication
*/
private $authService;
/**
* Url view helper.
* @var Zend\View\Helper\Url
*/
private $urlHelper;
/**
* Constructs the service.
*/
public function __construct($authService, $urlHelper) {
$this->authService = $authService;
$this->urlHelper = $urlHelper;
}
/**
* Menu render based on user role
*
* @return array
*/
public function getMenuItems() {
$navItem = array();
$url = $this->urlHelper;
$items = [];
$items[] = [
'label' => 'Dashboard',
'icon' => 'dashboard',
'link' => $url('home'),
'route' => ['home'],
];
$items[] = [
'label' => 'Mandant',
'icon' => 'mandant',
'link' => $url('mandant', ['action'=>'index']),
'route' => ['mandant'],
];
$items[] = [
'label' => 'Ansprechpartner',
'icon' => 'ansprechpartner',
'link' => $url('ansprechpartner', ['action'=>'index']),
'route' => ['ansprechpartner'],
];
$items[] = [
'label' => 'Vertrag',
'icon' => 'vertrag',
'link' => $url('vertrag', ['action'=>'index']),
'route' => ['vertrag'],
];
$items[] = [
'label' => 'Notizen',
'icon' => 'notizen',
'link' => $url('notizen', ['action'=>'index']),
'route' => ['notizen'],
];
$items[] = [
'label' => 'Wiedervorlage',
'icon' => 'wiedervorlage',
'link' => $url('wiedervorlage', ['action'=>'index']),
'route' => ['wiedervorlage'],
];
$items[] = [
'label' => 'Abrechnungsmodul',
'icon' => 'abrechnungsmodul',
// 'link' => $url('mandant', ['action'=>'index']),
// 'route' => ['mandant'],
'dropdown' => [
[
'id' => 'abrechnungsimport',
'label' => 'Import',
'link' => $url('abrechnungsimport', ['action'=>'import'])
],
[
'id' => 'abrechnungenneu',
'label' => 'Abrechnungen manuell erfassen',
'link' => $url("abrechnung", ['action'=>'add']),
],
[
'id' => 'abrechnungen',
'label' => 'noch nicht verbuchte Abrechnungen',
'link' => $url("abrechnung", ['action'=>'erfassung']),
],
[
'id' => 'auswertung',
'label' => 'Import-Auswertung',
'link' => $url("abrechnung", ['action'=>'auswertung']),
]
]
];
return $items;
}
}
Я пытался сделать это с помощью сессионного контейнера, но мне бы хотелось, чтобы его лучше реализовали там, где он принадлежит.