<?php
/**
* Base Menu Manager
*
* @author Vincent van Waasbergen <v.vanwaasbergen@visualmedia.nl>
*/
namespace VisualMedia\MenuBundle\Manager;
use Doctrine\Common\Collections\ArrayCollection;
use VisualMedia\LisaBundle\Component\Interfaces\BundleInterfaces\MenuManagerInterface;
use VisualMedia\LisaBundle\Component\ManagerData;
use VisualMedia\MenuBundle\Repository\BaseMenuRepository;
use VisualMedia\MenuBundle\Entity\BaseMenu;
use VisualMedia\OrderingBundle\Helper\OrderingHelper;
use VisualMedia\TranslationBundle\Service\ChannelProvider;
/**
* Base Menu Manager
*/
class BaseMenuManager extends BaseMenuRepository implements MenuManagerInterface
{
/**
* @var ChannelProvider
*/
protected $channelProvider;
/**
* {@inheritdoc}
*/
public static function getEntityName(): string
{
return BaseMenu::class;
}
/**
* @param ChannelProvider $channelProvider
*/
public function initialize(ChannelProvider $channelProvider): void
{
$this->channelProvider = $channelProvider;
}
/**
* {@inheritdoc}
*/
public function getMenuIndex(ManagerData $data = null) : array
{
$channel = $this->channelProvider->getCurrentChannel();
foreach ($result = $this->getIndex($data) as $index=>$menu) {
if (!$menu->channels->contains($channel)) {
unset($result[$index]);
}
$menuItems = $menu->getMenuItems()->toArray();
OrderingHelper::postProcess($menuItems);
$menu->setMenuItems(new ArrayCollection($menuItems));
}
return $result;
}
/**
* @param string $reference
* @return BaseMenu
*/
public function getOrCreateMenu(string $reference): ?BaseMenu
{
$channel = $this->channelProvider->getCurrentChannel();
$managerData = new ManagerData([
'reference' => $reference,
'channel' => $channel,
]);
if (null === $menu = $this->getFirst($managerData)) {
$menu = new BaseMenu();
$menu->setReference($reference);
$menu->setTitle(sprintf('%s (%s)', ucfirst(str_replace('_', ' ', $reference)), $channel->title));
$menu->channels->add($channel);
$this->persist($menu);
$this->flush();
}
return $menu;
}
}