update
This commit is contained in:
@@ -5,6 +5,7 @@ class ShopBasketController
|
||||
{
|
||||
private const ORDER_SUBMIT_TOKEN_SESSION_KEY = 'order-submit-token';
|
||||
private const ORDER_SUBMIT_LAST_ORDER_ID_SESSION_KEY = 'order-submit-last-order-id';
|
||||
private const ORDER_SUBMIT_TOKEN_TTL = 1800;
|
||||
|
||||
public static $title = [
|
||||
'mainView' => 'Koszyk'
|
||||
@@ -298,20 +299,23 @@ class ShopBasketController
|
||||
$orderSubmitToken = (string)\Shared\Helpers\Helpers::get( 'order_submit_token', true );
|
||||
$existingOrderId = isset( $_SESSION[ self::ORDER_SUBMIT_LAST_ORDER_ID_SESSION_KEY ] ) ? (int)$_SESSION[ self::ORDER_SUBMIT_LAST_ORDER_ID_SESSION_KEY ] : 0;
|
||||
|
||||
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
|
||||
if ( empty( $basket ) && $existingOrderId > 0 )
|
||||
{
|
||||
$existingOrderHash = $this->orderRepository->findHashById( $existingOrderId );
|
||||
if ( $existingOrderHash )
|
||||
{
|
||||
$this->logOrder( 'Double-submit detected, redirecting to existing order id=' . $existingOrderId );
|
||||
header( 'Location: /zamowienie/' . $existingOrderHash );
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !$this->isValidOrderSubmitToken( $orderSubmitToken ) )
|
||||
{
|
||||
if ( $existingOrderId > 0 )
|
||||
{
|
||||
$existingOrderHash = $this->orderRepository->findHashById( $existingOrderId );
|
||||
if ( $existingOrderHash )
|
||||
{
|
||||
header( 'Location: /zamowienie/' . $existingOrderHash );
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$this->logOrder( 'Token validation failed. formToken=' . $orderSubmitToken . ' existingOrderId=' . $existingOrderId );
|
||||
\Shared\Helpers\Helpers::error( \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-zlozone-komunikat-blad' ) );
|
||||
header( 'Location: /koszyk' );
|
||||
header( 'Location: /koszyk-podsumowanie' );
|
||||
exit;
|
||||
}
|
||||
|
||||
@@ -325,7 +329,10 @@ class ShopBasketController
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( $order_id = $this->orderRepository->createFromBasket(
|
||||
$order_id = null;
|
||||
try
|
||||
{
|
||||
$order_id = $this->orderRepository->createFromBasket(
|
||||
$client[ 'id' ],
|
||||
\Shared\Helpers\Helpers::get_session( 'basket' ),
|
||||
\Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' ),
|
||||
@@ -347,7 +354,18 @@ class ShopBasketController
|
||||
\Shared\Helpers\Helpers::get_session( 'basket_orlen_point_info' ),
|
||||
\Shared\Helpers\Helpers::get_session( 'coupon' ),
|
||||
\Shared\Helpers\Helpers::get_session( 'basket_message' )
|
||||
) )
|
||||
);
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
$this->logOrder( 'createFromBasket exception: ' . $e->getMessage() );
|
||||
error_log( '[basketSave] createFromBasket exception: ' . $e->getMessage() );
|
||||
\Shared\Helpers\Helpers::error( \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-zlozone-komunikat-blad' ) );
|
||||
header( 'Location: /koszyk' );
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( $order_id )
|
||||
{
|
||||
\Shared\Helpers\Helpers::set_session( self::ORDER_SUBMIT_LAST_ORDER_ID_SESSION_KEY, (int)$order_id );
|
||||
\Shared\Helpers\Helpers::alert( \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-zlozone-komunikat' ) );
|
||||
@@ -374,6 +392,7 @@ class ShopBasketController
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->logOrder( 'createFromBasket returned falsy order_id. client_id=' . ( $client['id'] ?? '?' ) . ' email=' . ( \Shared\Helpers\Helpers::get( 'email', true ) ?: '?' ) );
|
||||
\Shared\Helpers\Helpers::error( \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-zlozone-komunikat-blad' ) );
|
||||
header( 'Location: /koszyk' );
|
||||
exit;
|
||||
@@ -420,6 +439,79 @@ class ShopBasketController
|
||||
] );
|
||||
}
|
||||
|
||||
public function basketUpdateCustomFields()
|
||||
{
|
||||
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
|
||||
$product_code = \Shared\Helpers\Helpers::get( 'product_code' );
|
||||
|
||||
if ( !isset( $basket[ $product_code ] ) )
|
||||
{
|
||||
echo json_encode( [ 'result' => 'error', 'message' => 'Pozycja nie istnieje w koszyku' ] );
|
||||
exit;
|
||||
}
|
||||
|
||||
$position = $basket[ $product_code ];
|
||||
$new_custom_fields = [];
|
||||
$custom_fields_raw = \Shared\Helpers\Helpers::get( 'custom_field' );
|
||||
|
||||
if ( is_array( $custom_fields_raw ) )
|
||||
{
|
||||
foreach ( $custom_fields_raw as $field_id => $value )
|
||||
{
|
||||
$new_custom_fields[ (int)$field_id ] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
|
||||
$missing_fields = [];
|
||||
|
||||
foreach ( $new_custom_fields as $field_id => $value )
|
||||
{
|
||||
$field_meta = $productRepo->findCustomFieldCached( $field_id );
|
||||
if ( $field_meta && (int)$field_meta['is_required'] === 1 && trim( $value ) === '' )
|
||||
{
|
||||
$missing_fields[] = $field_meta['name'];
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $missing_fields ) > 0 )
|
||||
{
|
||||
echo json_encode( [ 'result' => 'error', 'message' => 'Wypełnij wymagane pola: ' . implode( ', ', $missing_fields ) ] );
|
||||
exit;
|
||||
}
|
||||
|
||||
$attributes_implode = '';
|
||||
if ( isset( $position['attributes'] ) && is_array( $position['attributes'] ) && count( $position['attributes'] ) > 0 )
|
||||
{
|
||||
$attributes_implode = implode( '|', $position['attributes'] );
|
||||
}
|
||||
|
||||
$message = isset( $position['message'] ) ? $position['message'] : '';
|
||||
$new_product_code = md5( $position['product-id'] . $attributes_implode . $message . json_encode( $new_custom_fields ) );
|
||||
|
||||
if ( $new_product_code === $product_code )
|
||||
{
|
||||
$basket[ $product_code ]['custom_fields'] = $new_custom_fields;
|
||||
}
|
||||
elseif ( isset( $basket[ $new_product_code ] ) )
|
||||
{
|
||||
$basket[ $new_product_code ]['quantity'] += $position['quantity'];
|
||||
unset( $basket[ $product_code ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
$position['custom_fields'] = $new_custom_fields;
|
||||
$basket[ $new_product_code ] = $position;
|
||||
unset( $basket[ $product_code ] );
|
||||
}
|
||||
|
||||
$basket = ( new \Domain\Promotion\PromotionRepository( $GLOBALS['mdb'] ) )->findPromotion( $basket );
|
||||
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
|
||||
|
||||
echo json_encode( [ 'result' => 'ok' ] );
|
||||
exit;
|
||||
}
|
||||
|
||||
private function jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id )
|
||||
{
|
||||
global $settings;
|
||||
@@ -445,8 +537,23 @@ class ShopBasketController
|
||||
|
||||
private function createOrderSubmitToken()
|
||||
{
|
||||
$sessionData = isset( $_SESSION[ self::ORDER_SUBMIT_TOKEN_SESSION_KEY ] )
|
||||
? $_SESSION[ self::ORDER_SUBMIT_TOKEN_SESSION_KEY ]
|
||||
: null;
|
||||
|
||||
if ( is_array( $sessionData ) && isset( $sessionData['token'], $sessionData['created_at'] ) )
|
||||
{
|
||||
if ( ( time() - $sessionData['created_at'] ) < self::ORDER_SUBMIT_TOKEN_TTL )
|
||||
{
|
||||
return $sessionData['token'];
|
||||
}
|
||||
}
|
||||
|
||||
$token = $this->generateOrderSubmitToken();
|
||||
\Shared\Helpers\Helpers::set_session( self::ORDER_SUBMIT_TOKEN_SESSION_KEY, $token );
|
||||
\Shared\Helpers\Helpers::set_session( self::ORDER_SUBMIT_TOKEN_SESSION_KEY, [
|
||||
'token' => $token,
|
||||
'created_at' => time()
|
||||
] );
|
||||
\Shared\Helpers\Helpers::delete_session( self::ORDER_SUBMIT_LAST_ORDER_ID_SESSION_KEY );
|
||||
|
||||
return $token;
|
||||
@@ -469,10 +576,29 @@ class ShopBasketController
|
||||
if ( !$token )
|
||||
return false;
|
||||
|
||||
$sessionToken = isset( $_SESSION[ self::ORDER_SUBMIT_TOKEN_SESSION_KEY ] ) ? (string)$_SESSION[ self::ORDER_SUBMIT_TOKEN_SESSION_KEY ] : '';
|
||||
if ( !$sessionToken )
|
||||
$sessionData = isset( $_SESSION[ self::ORDER_SUBMIT_TOKEN_SESSION_KEY ] )
|
||||
? $_SESSION[ self::ORDER_SUBMIT_TOKEN_SESSION_KEY ]
|
||||
: null;
|
||||
|
||||
if ( !$sessionData )
|
||||
return false;
|
||||
|
||||
// Backward compatibility: stary format (plain string)
|
||||
if ( is_string( $sessionData ) )
|
||||
{
|
||||
$sessionToken = $sessionData;
|
||||
}
|
||||
elseif ( is_array( $sessionData ) && isset( $sessionData['token'], $sessionData['created_at'] ) )
|
||||
{
|
||||
if ( ( time() - $sessionData['created_at'] ) >= self::ORDER_SUBMIT_TOKEN_TTL )
|
||||
return false;
|
||||
$sessionToken = $sessionData['token'];
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( function_exists( 'hash_equals' ) )
|
||||
return hash_equals( $sessionToken, $token );
|
||||
|
||||
@@ -483,4 +609,11 @@ class ShopBasketController
|
||||
{
|
||||
\Shared\Helpers\Helpers::delete_session( self::ORDER_SUBMIT_TOKEN_SESSION_KEY );
|
||||
}
|
||||
|
||||
private function logOrder( $message )
|
||||
{
|
||||
$logFile = __DIR__ . '/../../../logs/logs-order-' . date( 'Y-m-d' ) . '.log';
|
||||
$line = '[' . date( 'Y-m-d H:i:s' ) . '] ' . $message . "\n";
|
||||
@file_put_contents( $logFile, $line, FILE_APPEND );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user