Skip to content

Commit 513c9a2

Browse files
authored
Merge pull request #8 from Sylius/SY-264/fix-contact
Fix contact page
2 parents 7903fa2 + 2d792d0 commit 513c9a2

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

config/services/controller.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,16 @@
4040
<service id="sylius.controller.shop.security_widget" class="Sylius\LegacyShopBridgePlugin\Controller\SecurityWidgetController">
4141
<argument type="service" id="twig" />
4242
</service>
43+
44+
<service id="sylius.controller.shop.contact" class="Sylius\LegacyShopBridgePlugin\Controller\ContactController">
45+
<argument type="service" id="router" />
46+
<argument type="service" id="form.factory" />
47+
<argument type="service" id="twig" />
48+
<argument type="service" id="sylius.context.channel" />
49+
<argument type="service" id="sylius.context.customer" />
50+
<argument type="service" id="sylius.context.locale" />
51+
<argument type="service" id="sylius_shop.mailer.contact_email_manager" />
52+
</service>
53+
<service id="sylius_shop.controller.contact" alias="sylius.controller.shop.contact" />
4354
</services>
4455
</container>
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\LegacyShopBridgePlugin\Controller;
15+
16+
use Sylius\Bundle\CoreBundle\Form\Type\ContactType;
17+
use Sylius\Bundle\CoreBundle\Mailer\ContactEmailManagerInterface;
18+
use Sylius\Component\Channel\Context\ChannelContextInterface;
19+
use Sylius\Component\Core\Model\ChannelInterface;
20+
use Sylius\Component\Customer\Context\CustomerContextInterface;
21+
use Sylius\Component\Locale\Context\LocaleContextInterface;
22+
use Symfony\Component\Form\FormFactoryInterface;
23+
use Symfony\Component\HttpFoundation\RedirectResponse;
24+
use Symfony\Component\HttpFoundation\Request;
25+
use Symfony\Component\HttpFoundation\Response;
26+
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
27+
use Symfony\Component\Routing\RouterInterface;
28+
use Twig\Environment;
29+
use Webmozart\Assert\Assert;
30+
31+
final class ContactController
32+
{
33+
public function __construct(
34+
private RouterInterface $router,
35+
private FormFactoryInterface $formFactory,
36+
private Environment $templatingEngine,
37+
private ChannelContextInterface $channelContext,
38+
private CustomerContextInterface $customerContext,
39+
private LocaleContextInterface $localeContext,
40+
private ContactEmailManagerInterface $contactEmailManager,
41+
) {
42+
}
43+
44+
public function requestAction(Request $request): Response
45+
{
46+
$formType = $this->getSyliusAttribute($request, 'form', ContactType::class);
47+
$form = $this->formFactory->create($formType, null, $this->getFormOptions());
48+
49+
if ($request->isMethod('POST') && $form->handleRequest($request)->isSubmitted() && $form->isValid()) {
50+
/** @var mixed $data */
51+
$data = $form->getData();
52+
Assert::isArray($data);
53+
54+
$channel = $this->channelContext->getChannel();
55+
56+
/** @var ChannelInterface $channel */
57+
Assert::isInstanceOf($channel, ChannelInterface::class);
58+
59+
$contactEmail = $channel->getContactEmail();
60+
61+
$redirectRoute = $this->getSyliusAttribute($request, 'redirect', 'referer');
62+
63+
if (null === $contactEmail) {
64+
$errorMessage = $this->getSyliusAttribute(
65+
$request,
66+
'error_flash',
67+
'sylius.contact.request_error',
68+
);
69+
70+
/** @var FlashBagInterface $flashBag */
71+
$flashBag = $request->getSession()->getBag('flashes');
72+
$flashBag->add('error', $errorMessage);
73+
74+
return new RedirectResponse($this->router->generate($redirectRoute));
75+
}
76+
77+
$localeCode = $this->localeContext->getLocaleCode();
78+
$this->contactEmailManager->sendContactRequest($data, [$contactEmail], $channel, $localeCode);
79+
80+
$successMessage = $this->getSyliusAttribute(
81+
$request,
82+
'success_flash',
83+
'sylius.contact.request_success',
84+
);
85+
86+
/** @var FlashBagInterface $flashBag */
87+
$flashBag = $request->getSession()->getBag('flashes');
88+
$flashBag->add('success', $successMessage);
89+
90+
return new RedirectResponse($this->router->generate($redirectRoute));
91+
}
92+
93+
$template = $this->getSyliusAttribute($request, 'template', '@SyliusShop/Contact/request.html.twig');
94+
95+
return new Response($this->templatingEngine->render($template, ['form' => $form->createView()]));
96+
}
97+
98+
private function getSyliusAttribute(Request $request, string $attributeName, ?string $default): ?string
99+
{
100+
$attributes = $request->attributes->get('_sylius', []);
101+
102+
return $attributes[$attributeName] ?? $default;
103+
}
104+
105+
private function getFormOptions(): array
106+
{
107+
$customer = $this->customerContext->getCustomer();
108+
109+
if (null === $customer) {
110+
return [];
111+
}
112+
113+
return ['email' => $customer->getEmail()];
114+
}
115+
}

0 commit comments

Comments
 (0)