Files
prestashop/controllers/front/GuestTrackingController.php

184 lines
6.5 KiB
PHP
Raw Normal View History

<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
use PrestaShop\PrestaShop\Adapter\Presenter\Order\OrderPresenter;
use PrestaShop\PrestaShop\Core\Security\PasswordPolicyConfiguration;
class GuestTrackingControllerCore extends FrontController
{
/** @var bool */
public $ssl = true;
/** @var bool */
public $auth = false;
/** @var string */
public $php_self = 'guest-tracking';
protected $order;
/**
* Initialize guest tracking controller.
*
* @see FrontController::init()
*/
public function init(): void
{
if ($this->context->customer->isLogged()) {
Tools::redirect('history.php');
}
parent::init();
}
/**
* Start forms process.
*
* @see FrontController::postProcess()
*/
public function postProcess(): void
{
$order_reference = current(explode('#', Tools::getValue('order_reference')));
$email = Tools::getValue('email');
if (!$email && !$order_reference) {
return;
} elseif (!$email || !$order_reference) {
$this->errors[] = $this->getTranslator()->trans(
'Please provide the required information',
[],
'Shop.Notifications.Error'
);
return;
}
$this->order = Order::getByReferenceAndEmail($order_reference, $email);
if (!Validate::isLoadedObject($this->order)) {
$this->errors[] = $this->getTranslator()->trans(
'We couldn\'t find your order with the information provided, please try again',
[],
'Shop.Notifications.Error'
);
}
if (Tools::isSubmit('submitTransformGuestToCustomer') && Tools::getValue('password')) {
$customer = new Customer((int) $this->order->id_customer);
/** @var string $password */
$password = Tools::getValue('password');
if (empty($password)) {
$this->errors[] = $this->trans(
'Enter a password to transform your guest account into a customer account.',
[],
'Shop.Forms.Help'
);
} elseif (!Validate::isAcceptablePasswordLength($password)) {
$this->errors[] = $this->trans(
'Your password length must be between %d and %d',
[Configuration::get(PasswordPolicyConfiguration::CONFIGURATION_MINIMUM_LENGTH), Configuration::get(PasswordPolicyConfiguration::CONFIGURATION_MAXIMUM_LENGTH)],
'Shop.Forms.Help'
);
} elseif (!Validate::isAcceptablePasswordScore($password)) {
$this->errors[] = $this->trans(
'Customer password is too weak',
[],
'Shop.Forms.Help'
);
// Prevent error
// A) either on page refresh
// B) if we already transformed him in other window or through backoffice
} elseif ($customer->is_guest == 0) {
$this->errors[] = $this->trans(
'A customer account has already been created from this guest account. Please sign in.',
[],
'Shop.Notifications.Error'
);
// Check if a different customer with the same email was not already created in a different window or through backoffice
} elseif (Customer::customerExists($customer->email)) {
$this->errors[] = $this->trans(
'You can\'t transform your account into a customer account, because a registered customer with the same email already exists.',
[],
'Shop.Notifications.Error'
);
// Attempt to convert the customer
} elseif ($customer->transformToCustomer($this->context->language->id, $password)) {
$this->success[] = $this->trans(
'Your guest account has been successfully transformed into a customer account. You can now log in as a registered shopper.',
[],
'Shop.Notifications.Success'
);
} else {
$this->errors[] = $this->trans(
'An unexpected error occurred while creating your account.',
[],
'Shop.Notifications.Error'
);
}
}
}
/**
* Assign template vars related to page content.
*
* @see FrontController::initContent()
*/
public function initContent(): void
{
parent::initContent();
if (!Validate::isLoadedObject($this->order)) {
$this->setTemplate('customer/guest-login');
return;
}
if ((int) $this->order->isReturnable()) {
$this->info[] = $this->trans(
'You cannot return merchandise with a guest account.',
[],
'Shop.Notifications.Warning'
);
}
// Kept for backwards compatibility (is_customer), inline it in later versions
$registered_customer_exists = Customer::customerExists(Tools::getValue('email'));
$this->context->smarty->assign([
'order' => (new OrderPresenter())->present($this->order),
'guest_email' => Tools::getValue('email'),
'registered_customer_exists' => $registered_customer_exists,
'is_customer' => $registered_customer_exists, // Kept for backwards compatibility
'HOOK_DISPLAYORDERDETAIL' => Hook::exec('displayOrderDetail', ['order' => $this->order]),
]);
$this->setTemplate('customer/guest-tracking');
}
public function getBreadcrumbLinks(): array
{
$breadcrumbLinks = parent::getBreadcrumbLinks();
$breadcrumbLinks['links'][] = [
'title' => $this->getTranslator()->trans('Guest order tracking', [], 'Shop.Theme.Checkout'),
'url' => $this->context->link->getPageLink('guest-tracking'),
];
if (Validate::isLoadedObject($this->order)) {
$breadcrumbLinks['links'][] = [
'title' => $this->order->reference,
'url' => '#',
];
}
return $breadcrumbLinks;
}
/**
* {@inheritdoc}
*/
public function getCanonicalURL(): string
{
return $this->context->link->getPageLink('guest-tracking');
}
}