Breadcrumb

Verze:

18. 07. 2025

Zodpovědná osoba:

Dominik Šlechta

Poslední aktualizace:

18. 07. 2025, kocandajan488@gmail.com

<?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 '';
        }
    }
}