<?php
namespace App\Controller;
use App\Form\CatalogAddressInformationFormType;
use App\Repository\CatalogOrderRepository;
use Factory\OrderManagementBundle\Repository\Customer\AddressRepository;
use Factory\SupportBundle\Repository\FormRepository;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Model\DataObject\Catalog;
use Pimcore\Model\DataObject\Catalog\Listing as CatalogListing;
use Pimcore\Model\DataObject\Fieldcollection;
use App\Classes\Controller\AbstractFrontController as AbstractFrontController;
use App\Classes\DataMapper\Catalog\CatalogListingDataMapper;
use App\Classes\DataMapper\Customer\Address\AddressDataMapper;
use App\Repository\CustomerRepository;
use App\Service\Contract\RecaptchaValidationServiceInterface;
use App\Traits\ControllerSidebarLinks;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Zend\Paginator\Paginator;
class CatalogController extends AbstractFrontController
{
use ControllerSidebarLinks;
const SHOW_PER_PAGE = 6;
public function __construct(
private FormRepository $formRepository,
private CustomerRepository $customerRepository,
private AddressRepository $addressRepository,
private CatalogOrderRepository $catalogOrderRepository,
private RecaptchaValidationServiceInterface $recaptchaValidationService,
private PaginatorInterface $paginator
) {}
#[Template()]
public function indexAction(Request $request)
{
$currentDocument = $request->get('contentDocument');
$oldFlashes = $request->getSession()->getBag('flashes')->get('_oldFormData');
$this->view->lastCatalog = '';
if ($oldFlashes) {
$lastCatalog = unserialize($oldFlashes[0]);
$this->addFlash('_oldFormData', serialize($lastCatalog));
$this->view->lastCatalog = array_key_exists('catalog', $lastCatalog) ? $lastCatalog['catalog'] : '';
}
$elements = array_values(array_filter(explode('/', $currentDocument->getPath())));
$division = $elements[0] ?? 'neuroscience';
$this->view->sidebar = $this->getSidebarLinks($currentDocument);
$user = $this->getUser();
$addresses = [];
$currentAddresses = [];
$defaultShippingAddress = null;
if ($user) {
$addresses = $user->getAddresses() ?? new Fieldcollection();
$addresses = AddressDataMapper::list(array_merge($addresses->getItems(), $currentAddresses))->all($request);
$defaultShippingAddress = $user->getDefaultShippingAddress();
}
$formAction = $this->generateUrl('catalog_email_send', [
'division' => $division
]);
$shippingForm = $this->formRepository->createForm(
CatalogAddressInformationFormType::class,
null,
['action' => $formAction]
);
$listing = new CatalogListing;
$listing->addConditionParam('o_path LIKE ?', "/Catalogs/{$division}/%");
$paginator = $this->paginator->paginate(
$listing,
$request->get('page', 1),
self::SHOW_PER_PAGE
);
$this->view->paginator = $paginator;
$this->view->paginationVariables = $paginator->getPaginationData();
$articles = CatalogListingDataMapper::list($paginator->getItems())->all($request);
$modalForms = [];
foreach ($articles as $article) {
$modalForms[$article['id']] = $shippingForm->createView();
}
$this->view->articles = $articles;
$this->view->modalForms = $modalForms;
$this->view->defaultShippingAddress = $defaultShippingAddress;
$this->view->addresses = $addresses;
$this->view->isUser = !$user;
}
/**
* @Route("{division}/resources/catalog/send", name="catalog_email_send", methods={"POST"})
*
* @param Request $request
* @return RedirectResponse|void
*/
public function send(Request $request)
{
$customer = $this->getUser();
$form = $this->createForm(
CatalogAddressInformationFormType::class
);
$form->handleRequest($request);
$data = $form->getData();
$address = $data;
if ($form->isSubmitted()) {
if ($customer) {
$addressId = $request->get('address');
$addToAddressBook = $data['addToAddressBook'];
if (empty($addressId) && $addToAddressBook) {
if ($form->isValid()) {
$customerAddress = $this->customerRepository->createAddress($address);
$this->customerRepository->addCustomerAddress($customerAddress, $customer);
}
} else {
$address = $this->addressRepository->findOrFail($customer->getAddresses(), $addressId);
$address = array_combine(
array_map('lcfirst', array_keys($address->toArray())),
array_values($address->toArray())
);
$address['email'] = $customer->getEmail();
}
}
if (!$form->isValid() && (!$customer || ($customer && empty($request->get('address'))))) {
$payload = array_merge(
$request->query->all(),
$request->request->all()
);
$this->addFlash('_oldFormData', serialize($payload));
return $this->redirectBack($request);
}
$catalogOrder = $address;
$catalogOrder['catalog'] = Catalog::getById($data['catalog']);
$catalogOrder['quantity'] = $data['quantity'];
if (!$this->recaptchaValidationService->isValid($data)) {
$payload = array_merge(
$request->query->all(),
$request->request->all()
);
$this->addFlash('_oldFormData', serialize($payload));
$this->addFlash('error', 'stoelting.recaptcha-failed.error');
return $this->redirectBack($request);
}
$catalogOrder = $this->catalogOrderRepository->create($catalogOrder);
$this->catalogOrderRepository->sendCatalogOrderEmail($catalogOrder, $request);
$this->addFlash('success', $this->trans('catalog.address.message.sent'));
}
return $this->redirectBack($request);
}
}