EmicoEcommerce/Magento2Tweakwise

View on GitHub
Model/Catalog/Layer/Url.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php

/**
 * Tweakwise (https://www.tweakwise.com/) - All Rights Reserved
 *
 * @copyright Copyright (c) 2017-2022 Tweakwise.com B.V. (https://www.tweakwise.com)
 * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

namespace Tweakwise\Magento2Tweakwise\Model\Catalog\Layer;

use Tweakwise\Magento2Tweakwise\Model\Catalog\Layer\Filter\Item;
use Tweakwise\Magento2Tweakwise\Model\Catalog\Layer\Url\CategoryUrlInterface;
use Tweakwise\Magento2Tweakwise\Model\Catalog\Layer\Url\FilterApplierInterface;
use Tweakwise\Magento2Tweakwise\Model\Catalog\Layer\Url\Strategy\UrlStrategyFactory;
use Tweakwise\Magento2Tweakwise\Model\Catalog\Layer\Url\UrlInterface;
use Tweakwise\Magento2Tweakwise\Model\Catalog\Layer\Url\UrlModel;
use Tweakwise\Magento2Tweakwise\Model\Client\Request\ProductNavigationRequest;
use Tweakwise\Magento2Tweakwise\Model\Client\Type\FacetType\SettingsType;
use Tweakwise\Magento2TweakwiseExport\Model\Helper as ExportHelper;
use Magento\Catalog\Api\CategoryRepositoryInterface;
use Magento\Catalog\Api\Data\CategoryInterface;
use Magento\Framework\App\Request\Http as MagentoHttpRequest;
use Magento\Framework\Exception\NoSuchEntityException;

/**
 * Class Url will later implement logic to use implementation selected in configuration.
 */
class Url
{
    /**
     * @var UrlInterface
     */
    protected $urlStrategy;

    /**
     * @var FilterApplierInterface
     */
    protected $filterApplier;

    /**
     * @var CategoryUrlInterface
     */
    protected $categoryUrlStrategy;

    /**
     * @var CategoryRepositoryInterface
     */
    protected $categoryRepository;

    /**
     * @var ExportHelper
     */
    protected $exportHelper;

    /**
     * @var MagentoHttpRequest
     */
    protected $request;

    /**
     * @var UrlStrategyFactory
     */
    protected $urlStrategyFactory;

    protected $magentoUrl;

    /**
     * Builder constructor.
     *
     * @param UrlStrategyFactory $urlStrategyFactory
     * @param MagentoHttpRequest $request
     * @param CategoryRepositoryInterface $categoryRepository
     * @param ExportHelper $exportHelper
     */
    public function __construct(
        UrlStrategyFactory $urlStrategyFactory,
        MagentoHttpRequest $request,
        CategoryRepositoryInterface $categoryRepository,
        ExportHelper $exportHelper,
        UrlModel $magentoUrl
    ) {
        $this->urlStrategyFactory = $urlStrategyFactory;
        $this->categoryRepository = $categoryRepository;
        $this->exportHelper = $exportHelper;
        $this->request = $request;
        $this->magentoUrl = $magentoUrl;
    }

    /**
     * @return UrlInterface
     */
    public function getUrlStrategy()
    {
        if (!$this->urlStrategy) {
            $this->urlStrategy = $this->urlStrategyFactory->create();
        }

        return $this->urlStrategy;
    }

    /**
     * @return FilterApplierInterface
     */
    protected function getFilterApplier()
    {
        if (!$this->filterApplier) {
            $this->filterApplier = $this->urlStrategyFactory
                ->create(FilterApplierInterface::class);
        }

        return $this->filterApplier;
    }

    /**
     * @return CategoryUrlInterface
     */
    protected function getCategoryUrlStrategy()
    {
        if (!$this->categoryUrlStrategy) {
            $this->categoryUrlStrategy = $this->urlStrategyFactory
                ->create(CategoryUrlInterface::class);
        }

        return $this->categoryUrlStrategy;
    }

    /**
     * @param Item $item
     * @return string
     */
    public function getSelectFilter(Item $item): string
    {
        $settings = $item
            ->getFilter()
            ->getFacet()
            ->getFacetSettings();

        if ($settings->getSource() === SettingsType::SOURCE_CATEGORY) {
            return $this->getCategoryUrlStrategy()
                ->getCategoryFilterSelectUrl($this->request, $item);
        }

        return $this->addBaseUrl($this->getUrlStrategy()->getAttributeSelectUrl($this->request, $item));
    }

    /**
     * {@inheritdoc}
     */
    public function getRemoveFilter(Item $item): string
    {
        $settings = $item->getFilter()
            ->getFacet()
            ->getFacetSettings();

        if ($settings->getSource() === SettingsType::SOURCE_CATEGORY) {
            return $this->getCategoryUrlStrategy()
                ->getCategoryFilterRemoveUrl($this->request, $item);
        }

        return $this->addBaseUrl($this->getUrlStrategy()->getAttributeRemoveUrl($this->request, $item));
    }

    /**
     * @param Item[] $activeFilterItems
     * @return string
     */
    public function getClearUrl(array $activeFilterItems)
    {
        return $this->addBaseUrl(
            $this->getUrlStrategy()
            ->getClearUrl($this->request, $activeFilterItems)
        );
    }

    /**
     * @param array $activeFilterItems
     * @return string
     */
    public function getFilterUrl(array $activeFilterItems)
    {
        return $this->addBaseUrl(
            $this->getUrlStrategy()
            ->buildFilterUrl($this->request, $activeFilterItems)
        );
    }

    /**
     * @param ProductNavigationRequest $navigationRequest
     */
    public function apply(ProductNavigationRequest $navigationRequest)
    {
        $this->getFilterApplier()->apply($this->request, $navigationRequest);
    }

    /**
     * @param Item $item
     * @return string
     */
    public function getSliderUrl(Item $item)
    {
        return $this->addBaseUrl($this->getUrlStrategy()->getSliderUrl($this->request, $item));
    }

    public function addBaseUrl($url)
    {

        $baseUrl = $this->magentoUrl->getBaseUrl();
        //prevent double base urls
        $url = str_replace($baseUrl, '', $url);
        //remove slashes to prevent double slashes
        $baseUrl = rtrim($baseUrl, '/');
        $url = ltrim($url, '/');

        return $baseUrl . '/' . $url;
    }

    /**
     * @param Item $item
     * @return CategoryInterface
     * @throws NoSuchEntityException
     */
    protected function getCategoryFromItem(Item $item): CategoryInterface
    {
        $tweakwiseCategoryId = $item->getAttribute()->getAttributeId();
        $categoryId = $this->exportHelper->getStoreId($tweakwiseCategoryId);

        return $this->categoryRepository->get($categoryId);
    }
}