JEMBOT MAWOT Bypass Shell

Current Path : /home/cinepatreb/billetterie/src/PrestaShopBundle/Controller/Admin/
Upload File :
Current File : /home/cinepatreb/billetterie/src/PrestaShopBundle/Controller/Admin/MultistoreController.php

<?php
/**
 * Copyright since 2007 PrestaShop SA and Contributors
 * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.md.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/OSL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to https://devdocs.prestashop.com/ for more information.
 *
 * @author    PrestaShop SA and Contributors <contact@prestashop.com>
 * @copyright Since 2007 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
 */

declare(strict_types=1);

namespace PrestaShopBundle\Controller\Admin;

use Doctrine\ORM\EntityManager;
use PrestaShop\PrestaShop\Adapter\Feature\MultistoreFeature;
use PrestaShop\PrestaShop\Adapter\Product\Repository\ProductRepository;
use PrestaShop\PrestaShop\Adapter\Shop\Context;
use PrestaShop\PrestaShop\Core\Domain\Configuration\ShopConfigurationInterface;
use PrestaShop\PrestaShop\Core\Domain\Product\ValueObject\ProductId;
use PrestaShop\PrestaShop\Core\Domain\Shop\ValueObject\ShopId;
use PrestaShop\PrestaShop\Core\Util\ColorBrightnessCalculator;
use PrestaShopBundle\Entity\Shop;
use PrestaShopBundle\Entity\ShopGroup;
use PrestaShopBundle\Service\Multistore\CustomizedConfigurationChecker;
use Symfony\Component\HttpFoundation\Response;

/**
 * This class is responsible for preparing multistore elements that will be displayed in the BO
 * It does not control or render a BO page, the items being output are used inside other BO pages.
 */
class MultistoreController extends FrameworkBundleAdminController
{
    /**
     * @var MultistoreFeature
     */
    public $multistoreFeature;

    /**
     * @var Context
     */
    public $multistoreContext;

    /**
     * @var EntityManager
     */
    public $entityManager;

    /**
     * @var ProductRepository
     */
    public $productRepository;

    /**
     * This method returns a Response object containing the multistore header displayed at the top of migrated pages
     *
     * @param bool $lockedToAllShopContext
     *
     * @return Response
     */
    public function header(bool $lockedToAllShopContext): Response
    {
        if (!$this->multistoreFeature->isUsed()) {
            return $this->render('@PrestaShop/Admin/Multistore/header.html.twig', [
                'isMultistoreUsed' => false,
            ]);
        }

        $groupList = [];
        if (!$lockedToAllShopContext) {
            $groupList = $this->entityManager->getRepository(ShopGroup::class)->findBy(['active' => true]);
        }

        return $this->renderHeader('@PrestaShop/Admin/Multistore/header.html.twig', [
            'groupList' => $groupList,
            'lockedToAllShopContext' => $lockedToAllShopContext,
        ]);
    }

    /**
     * This method returns a Response object containing the multistore header displayed at the top of product page
     *
     * @param int $productId
     *
     * @return Response
     */
    public function productHeader(int $productId): Response
    {
        $groupList = $this->entityManager->getRepository(ShopGroup::class)->findBy(['active' => true]);

        // Filter shops that are not associated to product
        $productShops = $this->productRepository->getAssociatedShopIds(new ProductId($productId));

        if (!empty($productShops)) {
            $productShopIds = array_map(function (ShopId $shopId) {
                return $shopId->getValue();
            }, $productShops);

            /** @var ShopGroup $shopGroup */
            foreach ($groupList as $shopGroup) {
                /** @var Shop $shop */
                foreach ($shopGroup->getShops() as $shop) {
                    if (!in_array($shop->getId(), $productShopIds)) {
                        $shopGroup->getShops()->removeElement($shop);
                    }
                }
            }
        }

        return $this->renderHeader('@PrestaShop/Admin/Multistore/product_header.html.twig', [
            'groupList' => $groupList,
            'productId' => $productId,
        ]);
    }

    /**
     * @param ShopConfigurationInterface $configuration
     * @param string $configurationKey
     *
     * @return Response
     */
    public function configurationDropdown(ShopConfigurationInterface $configuration, string $configurationKey): Response
    {
        $shopGroups = $this->entityManager->getRepository(ShopGroup::class)->findBy(['active' => true]);
        $shopCustomizationChecker = $this->get('prestashop.multistore.customized_configuration_checker');

        if ($this->multistoreContext->isAllShopContext()) {
            $dropdownData = $this->allShopDropdown($shopCustomizationChecker, $shopGroups, $configurationKey);
        } else {
            $dropdownData = $this->groupShopDropdown($shopCustomizationChecker, $shopGroups, $configurationKey);
        }

        if (!$dropdownData['shouldDisplayDropdown']) {
            // no dropdown is displayed if no shop overrides this configuration value, so we return an empty response.
            return new Response();
        }

        return $this->render('@PrestaShop/Admin/Multistore/dropdown.html.twig', $dropdownData['templateData']);
    }

    /**
     * Gathers data for multistore dropdown in group shop context
     *
     * @param CustomizedConfigurationChecker $shopCustomizationChecker
     * @param array $shopGroups
     * @param string $configurationKey
     *
     * @return array
     */
    private function groupShopDropdown(CustomizedConfigurationChecker $shopCustomizationChecker, array $shopGroups, string $configurationKey): array
    {
        $groupList = [];
        $shouldDisplayDropdown = false;

        foreach ($shopGroups as $key => $group) {
            if ($this->shouldIncludeGroupShop($group)) {
                $groupList[] = $group;
            }
            if (
                $group->getId() === $this->multistoreContext->getContextShopGroup()->id
                && !$shouldDisplayDropdown
            ) {
                foreach ($group->getShops() as $shop) {
                    if ($shopCustomizationChecker->isConfigurationCustomizedForThisShop($configurationKey, $shop, true)) {
                        $shouldDisplayDropdown = true;
                        break;
                    }
                }
            }
        }

        return [
            'shouldDisplayDropdown' => $shouldDisplayDropdown,
            'templateData' => [
                'groupList' => $groupList,
                'shopCustomizationChecker' => $shopCustomizationChecker,
                'configurationKey' => $configurationKey,
                'isGroupShopContext' => true,
            ],
        ];
    }

    /**
     * Gathers data for multistore dropdown in all shop context
     *
     * @param CustomizedConfigurationChecker $shopCustomizationChecker
     * @param array $shopGroups
     * @param string $configurationKey
     *
     * @return array
     */
    private function allShopDropdown(CustomizedConfigurationChecker $shopCustomizationChecker, array $shopGroups, string $configurationKey): array
    {
        $groupList = [];
        $shouldDisplayDropdown = false;
        foreach ($shopGroups as $key => $group) {
            if ($this->shouldIncludeGroupShop($group)) {
                $groupList[] = $group;
            }
            if ($shouldDisplayDropdown) {
                continue;
            }
            foreach ($group->getShops() as $shop) {
                if ($shopCustomizationChecker->isConfigurationCustomizedForThisShop($configurationKey, $shop, false)) {
                    $shouldDisplayDropdown = true;
                    break;
                }
            }
        }

        return [
            'shouldDisplayDropdown' => $shouldDisplayDropdown,
            'templateData' => [
                'groupList' => $groupList,
                'shopCustomizationChecker' => $shopCustomizationChecker,
                'configurationKey' => $configurationKey,
                'isGroupShopContext' => false,
            ],
        ];
    }

    /**
     * @param ShopGroup $group
     *
     * @return bool
     */
    private function shouldIncludeGroupShop(ShopGroup $group): bool
    {
        // group shop is only included if we are in all shop context or in group context when this group is the current context
        if (count($group->getShops()) > 0
            && (
                $this->multistoreContext->isAllShopContext()
                || (
                    $this->multistoreContext->isGroupShopContext()
                    && $group->getId() === $this->multistoreContext->getContextShopGroup()->id
                )
            )
        ) {
            return true;
        }

        return false;
    }

    /**
     * @param string $headerTemplate Header template to use
     * @param array $templateVars Additional template variables that can add new vars or overwrite default ones
     *
     * @return Response
     */
    private function renderHeader(string $headerTemplate, array $templateVars): Response
    {
        $colorBrightnessCalculator = $this->get(ColorBrightnessCalculator::class);
        $isAllShopContext = $this->multistoreContext->isAllShopContext();
        $isShopContext = $this->multistoreContext->isShopContext();
        $colorConfigLink = false;

        if ($isShopContext) {
            $currentContext = $this->entityManager->getRepository(Shop::class)->findOneBy(['id' => $this->multistoreContext->getContextShopID()]);
            $colorConfigLink = $this->getAdminLink('AdminShop', ['shop_id' => $currentContext->getId(), 'updateshop' => true]);
        } elseif (!$isAllShopContext) {
            $shopGroupLegacy = $this->multistoreContext->getContextShopGroup();
            $currentContext = $this->entityManager->getRepository(ShopGroup::class)->findOneBy(['id' => $shopGroupLegacy->id]);
            $colorConfigLink = $this->getAdminLink('AdminShopGroup', ['id_shop_group' => $currentContext->getId(), 'updateshop_group' => true]);
        } else {
            // use ShopGroup object as the container for "all shops" context so that it can be used transparently in twig
            $currentContext = new ShopGroup();
            $currentContext->setName($this->trans('All stores', 'Admin.Global'));
            $currentContext->setColor('');
        }

        return $this->render($headerTemplate, array_merge([
            'isMultistoreUsed' => $this->multistoreFeature->isUsed(),
            'currentContext' => $currentContext,
            'groupList' => [],
            'isShopContext' => $isShopContext,
            'link' => $this->getContext()->link,
            'isTitleDark' => empty($currentContext->getColor()) ? true : $colorBrightnessCalculator->isBright($currentContext->getColor()),
            'isAllShopContext' => $isAllShopContext,
            'isGroupContext' => $this->multistoreContext->isGroupShopContext(),
            'lockedToAllShopContext' => false,
            'colorConfigLink' => !$isAllShopContext && empty($currentContext->getColor()) ? $colorConfigLink : false,
        ], $templateVars));
    }
}

xxxxx1.0, XXX xxxx