<?php
namespace Filters;
use App\Repository\MenuRepository;
use App\Repository\ProductRepository;
use Nette;
use Nette\Utils\Html;
use Tracy\Debugger;
class Breadcrumb
{
use Nette\SmartObject;
private $menuRepository;
private $productRepository;
private $link;
private $name;
private $plink;
public function __construct(MenuRepository $menuRepository, ProductRepository $productRepository, Link $link, Name $name, PLink $PLink
)
{
$this->menuRepository = $menuRepository;
$this->productRepository = $productRepository;
$this->link = $link;
$this->name = $name;
$this->plink = $PLink;
}
public function __invoke($menu, $homepage, $product = null, $returnBool = false, $returnArr = false)
{
return $this->newBreadcrumb($menu, $homepage, $product, $returnBool, $returnArr);
}
/**
* @param array|null $menu
* @param array $homepage
* @param string|null $product
* @param bool $returnBool
* @param bool $returnArr
* @param array $menuitems
* @param array $categories
* @return array|bool|string
*/
public function newBreadcrumb(?array $menu, array $homepage, string $product = null, bool $returnBool = false,
bool $returnArr = false, array $menuitems = [], array $categories = [])
{
if(!$menu){
if ($returnBool) {
return false;
}
if ($returnArr) {
return [];
}
return '';
}
try {
$el = Html::el('ol', [
'class' => 'breadcrumb'
]);
$returnPath = [];
$original = $menu;
if ($product !== null && $product !== false) {
if (isset($categories[$menu['id']])) {
$deepestMenuitem = $this->productRepository->deepestCategoryBranch($menu['id'], $categories[$menu['id']], $menuitems,true);
} else {
$deepestMenuitem = $this->productRepository->deepestCategoryBranch($menu['id'],[],[],true);
}
if ($deepestMenuitem === false || $deepestMenuitem === null) {
if ($returnBool) {
return false;
}
if ($returnArr) {
return [];
}
return '';
}
$menu = $menuitems[$deepestMenuitem] ?? $this->menuRepository->page($deepestMenuitem, null, true, null, false);
if ($menu === false) {
if ($returnBool) {
return false;
}
if ($returnArr) {
return [];
}
return '';
}
$returnPath[] = [
'name' => strip_tags($this->name->create($menu)),
'url' => $this->link->create($menu)
];
while ($menu['parent_id'] !== null) {
if (isset($menuitems[$menu['parent_id']])) {
$menu = $menuitems[$menu['parent_id']];
} else {
$menu = $this->menuRepository->page($menu['parent_id'], null, true);
}
$returnPath[] = [
'name' => strip_tags($this->name->create($menu)),
'url' => $this->link->create($menu)
];
}
$returnPath[] = [
'name' => $homepage['name'],
'url' => $this->link->create($homepage)
];
$returnPath = array_reverse($returnPath);
foreach ($returnPath as $item) {
$li = Html::el('li', [
'class' => 'breadcrumb__item'
]);
$li->addHtml(Html::el('a')
->href($item['url'])
->setAttribute('class', 'breadcrumb__link')
->setText($item['name']));
$el->addHtml($li);
}
$li = Html::el('li', [
'class' => 'breadcrumb__item breadcrumb__item--active'
])->setText($product);
$el->addHtml($li);
$returnPath[] = [
'name' => $product,
'url' => $this->plink->create($original)
];
} else {
$baseMenu = $menu;
if(isset($menu['parent_id'])){
while ($menu['parent_id'] !== null) {
if (isset($menuitems[$menu['parent_id']])) {
$menu = $menuitems[$menu['parent_id']];
} else {
$menu = $this->menuRepository->page($menu['parent_id'], null, true);
}
$returnPath[] = [
'name' => strip_tags($this->name->create($menu)),
'url' => $this->link->create($menu)
];
}
}
$returnPath[] = [
'name' => $homepage['name'],
'url' => $this->link->create($homepage)
];
if($returnArr && $baseMenu['id'] === 1){
return $returnPath;
}
if($returnBool && $baseMenu['id'] === 1){
return true;
}
$returnPath = array_reverse($returnPath);
foreach ($returnPath as $item) {
$li = Html::el('li', [
'class' => 'breadcrumb__item'
]);
$li->addHtml(Html::el('a')
->href($item['url'])
->setAttribute('class', 'breadcrumb__link')
->setHtml($item['name']));
$el->addHtml($li);
}
$li = Html::el('li', [
'class' => 'breadcrumb__item breadcrumb__item--active'
])->setText($original['name']);
$el->addHtml($li);
$returnPath[] = [
'name' => $original['name'],
'url' => $this->link->create($original)
];
}
if ($returnBool) {
return true;
}
if ($returnArr) {
return $returnPath;
}
return $el->render();
} catch (\Exception $exception) {
Debugger::log($exception);
if ($returnBool) {
return false;
}
if ($returnArr) {
return [];
}
return '';
}
}
}