<?php declare(strict_types=1);
/**
* gb media
* All Rights Reserved.
*
* Unauthorized copying of this file, via any medium is strictly prohibited.
* The content of this file is proprietary and confidential.
*
* @category Shopware
* @package Shopware_Plugins
* @subpackage GbmedForm
* @copyright Copyright (c) 2020, gb media
* @license proprietary
* @author Giuseppe Bottino
* @link http://www.gb-media.biz
*/
namespace Gbmed\Form\Storefront\Page;
use Gbmed\Form\Framework\Struct\GbmedFormStruct;
use Shopware\Core\Content\Category\CategoryEntity;
use Shopware\Core\Content\Category\Tree\Tree;
use Shopware\Core\Content\Cms\CmsPageEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
use Shopware\Core\Framework\Struct\Struct;
use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Core\System\Salutation\SalutationCollection;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\Navigation\NavigationPage;
use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CmsPage implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $categoryRepository;
/**
* @var SalesChannelRepositoryInterface
*/
private $salutationRepository;
/**
* @var SystemConfigService
*/
private $systemConfigService;
/**
* @var EntityRepositoryInterface
*/
private $cmsPageRepository;
/**
* ProductPage constructor.
*
* @param EntityRepositoryInterface $categoryRepository
* @param SalesChannelRepositoryInterface $salutationRepository
* @param EntityRepositoryInterface $cmsPageRepository
* @param SystemConfigService $systemConfigService
*/
public function __construct(
EntityRepositoryInterface $categoryRepository,
SalesChannelRepositoryInterface $salutationRepository,
EntityRepositoryInterface $cmsPageRepository,
SystemConfigService $systemConfigService
) {
$this->categoryRepository = $categoryRepository;
$this->salutationRepository = $salutationRepository;
$this->cmsPageRepository = $cmsPageRepository;
$this->systemConfigService = $systemConfigService;
}
/**
* subscribed events
*
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
NavigationPageLoadedEvent::class => 'onNavigationPageLoadedEvent'
];
}
/**
* add category into cmsPage
*
* @param NavigationPageLoadedEvent $event
* @throws \Exception
*/
public function onNavigationPageLoadedEvent(NavigationPageLoadedEvent $event): void
{
if ($category = $this->findCategory($event->getRequest()->get('navigationId'), $event->getContext())) {
/** @var NavigationPage $navigationPage */
$navigationPage = $event->getPage();
/** @var CmsPageEntity $cmsPage */
$cmsPage = $navigationPage->getCmsPage();
if (!($cmsPage instanceof CmsPageEntity)) {
$cmsPage = $this->basicCmsPage($event->getContext());
$navigationPage->setCmsPage($cmsPage);
}
$cmsPage->addExtension('category', $category);
$cmsPage->addExtension('gbmedForm', $this->getFormData($event->getSalesChannelContext(), $category));
}
}
/**
* @param SalesChannelContext $salesChannelContext
* @param CategoryEntity $category
* @return Struct
*/
private function getFormData(SalesChannelContext $salesChannelContext, CategoryEntity $category): Struct
{
/** @var array $config */
$config = $this->systemConfigService->get(
'GbmedForm.config',
$salesChannelContext->getSalesChannel()->getId()
);
/** @var string $formId */
$formId = (string)$this->systemConfigService->get(
'core.basicInformation.contactPage',
$salesChannelContext->getSalesChannel()->getId()
);
/** @var SalutationCollection $salutations */
$salutations = $this->salutationRepository->search(new Criteria(), $salesChannelContext)->getEntities();
return new GbmedFormStruct([
'id' => null,
'formId' => $formId,
'data' => $salutations,
'type' => isset($config['contactCategory']) && $config['contactCategory'] === $category->getId() ? 'contact' : false,
'isRecaptcha' => (!empty($config['sitekey']) && !empty($config['secret'])),
'config' => $config
]);
}
/**
* return current category
*
* @param string|null $id
* @param Context $context
* @return CategoryEntity|null
*/
private function findCategory($id, Context $context): ?CategoryEntity
{
return $id === null ? null : $this->categoryRepository->search(
new Criteria([$id]),
$context
)->first();
}
/**
* return basic contactPage
*
* @param Context $context
* @return CmsPageEntity
*/
private function basicCmsPage(Context $context): CmsPageEntity
{
return $this->cmsPageRepository->search(
new Criteria([$this->systemConfigService->get('core.basicInformation.contactPage')]),
$context
)->first();
}
}