Add view classes for articles, banners, languages, menu, newsletter, containers, shop categories, clients, payment methods, products, and search

- Created Articles.php for rendering article views including full articles, miniature lists, and news sections.
- Added Banners.php for handling banner displays.
- Introduced Languages.php for rendering language options.
- Implemented Menu.php for dynamic menu rendering.
- Developed Newsletter.php for newsletter view rendering.
- Created Scontainers.php for rendering specific containers.
- Added ShopCategory.php for category descriptions and product listings.
- Introduced ShopClient.php for managing client-related views such as address editing and order history.
- Implemented ShopPaymentMethod.php for displaying payment methods in the basket.
- Created ShopProduct.php for generating product URLs.
- Added ShopSearch.php for rendering a simple search form.
- Added .htaccess file to enhance security by restricting access to sensitive files and directories.
This commit is contained in:
2026-02-21 23:00:15 +01:00
parent b51244c1d6
commit 3ecbe628dc
435 changed files with 44107 additions and 31270 deletions

View File

@@ -0,0 +1,49 @@
<?php
namespace front\Controllers;
use Domain\Newsletter\NewsletterRepository;
class NewsletterController
{
private NewsletterRepository $repository;
public function __construct( NewsletterRepository $repository )
{
$this->repository = $repository;
}
public function signin()
{
global $settings;
$result = [ 'status' => 'bad' ];
if ( $this->repository->signup( \Shared\Helpers\Helpers::get( 'email' ), $_SERVER['SERVER_NAME'], !empty( $settings['ssl'] ), $settings ) )
$result = [ 'status' => 'ok' ];
echo json_encode( $result );
exit;
}
public function confirm()
{
global $lang;
if ( $this->repository->confirmSubscription( \Shared\Helpers\Helpers::get( 'hash' ) ) )
\Shared\Helpers\Helpers::alert( $lang['email-zostal-dodany-do-listy-newsletter'] );
header( 'Location: /' );
exit;
}
public function unsubscribe()
{
global $lang;
if ( $this->repository->unsubscribe( \Shared\Helpers\Helpers::get( 'hash' ) ) )
\Shared\Helpers\Helpers::alert( $lang['email-zostal-usuniety-z-listy-newsletter'] );
header( 'Location: /' );
exit;
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace front\Controllers;
class SearchController
{
public function searchResults()
{
global $lang_id;
$bs = \Shared\Helpers\Helpers::get( 'bs' );
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
$results = $productRepo->searchProductsByName( \Shared\Helpers\Helpers::get( 'query' ), $lang_id, (int)$bs );
$out = \Shared\Tpl\Tpl::view( 'shop-search/products', [
'query' => \Shared\Helpers\Helpers::get( 'query' ),
'products' => $results['products']
] );
if ( $results['ls'] > 1 )
{
$tpl = new \Shared\Tpl\Tpl;
$tpl -> ls = $results['ls'];
$tpl -> bs = $bs ? $bs : 1;
$tpl -> link = 'wyszukiwarka/' . \Shared\Helpers\Helpers::get( 'query' );
$out .= $tpl -> render( 'site/pager' );
}
return $out;
}
public function searchProducts()
{
global $lang_id;
$products = [];
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
$results = $productRepo->searchProductByNameAjax( \Shared\Helpers\Helpers::get( 'query' ), $lang_id );
if ( \Shared\Helpers\Helpers::is_array_fix( $results ) ) {
foreach ( $results as $row ) {
$products[] = \Shared\Tpl\Tpl::view( 'shop-search/product-search', [
'product' => $productRepo->findCached( $row['product_id'], $lang_id )
] );
}
}
echo json_encode( $products );
exit;
}
}

View File

@@ -0,0 +1,406 @@
<?php
namespace front\Controllers;
class ShopBasketController
{
public static $title = [
'mainView' => 'Koszyk'
];
private $orderRepository;
private $paymentMethodRepository;
public function __construct( \Domain\Order\OrderRepository $orderRepository, \Domain\PaymentMethod\PaymentMethodRepository $paymentMethodRepository )
{
$this->orderRepository = $orderRepository;
$this->paymentMethodRepository = $paymentMethodRepository;
}
public function basketMessageSave()
{
\Shared\Helpers\Helpers::set_session( 'basket_message', \Shared\Helpers\Helpers::get( 'basket_message' ) );
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function basketRemoveProduct()
{
global $lang_id;
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$coupon = \Shared\Helpers\Helpers::get_session( 'coupon' );
$product_hash = \Shared\Helpers\Helpers::get( 'product_hash' );
$basket_transport_method_id = \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' );
unset( $basket[ $product_hash ] );
$basket = (new \Domain\Promotion\PromotionRepository($GLOBALS['mdb']))->findPromotion( $basket );
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
$this->jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id );
}
public function basketIncreaseQuantityProduct()
{
global $lang_id;
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$coupon = \Shared\Helpers\Helpers::get_session( 'coupon' );
$product_hash = \Shared\Helpers\Helpers::get( 'product_hash' );
$basket_transport_method_id = \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' );
$basket[ $product_hash ][ 'quantity' ]++;
\Domain\Basket\BasketCalculator::checkProductQuantityInStock( $basket, false );
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$basket = (new \Domain\Promotion\PromotionRepository($GLOBALS['mdb']))->findPromotion( $basket );
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
$this->jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id );
}
public function basketDecreaseQuantityProduct()
{
global $lang_id;
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$coupon = \Shared\Helpers\Helpers::get_session( 'coupon' );
$product_hash = \Shared\Helpers\Helpers::get( 'product_hash' );
$basket_transport_method_id = \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' );
$basket[ $product_hash ][ 'quantity' ]--;
if ( $basket[ $product_hash ][ 'quantity' ] < 1 )
unset( $basket[ $product_hash ] );
$basket = (new \Domain\Promotion\PromotionRepository($GLOBALS['mdb']))->findPromotion( $basket );
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
$this->jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id );
}
public function basketChangeQuantityProduct()
{
global $lang_id;
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$coupon = \Shared\Helpers\Helpers::get_session( 'coupon' );
$product_hash = \Shared\Helpers\Helpers::get( 'product_hash' );
$basket_transport_method_id = \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' );
$basket[ $product_hash ][ 'quantity' ] = (int)\Shared\Helpers\Helpers::get( 'quantity' );
if ( $basket[ $product_hash ][ 'quantity' ] < 1 )
unset( $basket[ $product_hash ] );
$basket = (new \Domain\Promotion\PromotionRepository($GLOBALS['mdb']))->findPromotion( $basket );
\Domain\Basket\BasketCalculator::checkProductQuantityInStock( $basket, false );
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$this->jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id );
}
public function productMessageChange()
{
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$basket[ \Shared\Helpers\Helpers::get( 'position_code' ) ]['message'] = \Shared\Helpers\Helpers::get( 'product_message' );
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
exit;
}
public function basketAddProduct()
{
global $lang_id;
$basket = \Domain\Basket\BasketCalculator::validateBasket( \Shared\Helpers\Helpers::get_session( 'basket' ) );
$values_tmp = json_decode( \Shared\Helpers\Helpers::get( 'values' ), true );
$values = [];
$attributes = [];
$custom_fields = [];
foreach( $values_tmp as $key => $val )
$values[ $val['name'] ] = $val['value'];
foreach( $values as $key => $val )
{
if ( $key != 'product-id' and $key != 'quantity' and $key != 'product-message' and strpos( $key, 'custom_field' ) === false )
$attributes[] = $val;
}
foreach( $values as $key => $val )
{
if ( strpos( $key, 'custom_field' ) !== false )
{
preg_match( '/\d+/', $key, $matches );
$custom_field_id = $matches[0];
$custom_fields[ $custom_field_id ] = $val;
}
}
if ( \Shared\Helpers\Helpers::is_array_fix( $attributes ) )
{
$values['parent_id'] = $values[ 'product-id' ];
$values['product-id'] = ( new \Domain\Product\ProductRepository( $GLOBALS['mdb'] ) )->getProductIdByAttributes( $values[ 'product-id' ], $attributes );
$values['attributes'] = $attributes;
}
$values['wp'] = ( new \Domain\Product\ProductRepository( $GLOBALS['mdb'] ) )->getWeightCached( (int)$values[ 'product-id' ] );
$attributes_implode = '';
if ( is_array( $attributes ) and count( $attributes ) > 0 )
$attributes_implode = implode( '|', $attributes );
$product_code = md5( $values['product-id'] . $attributes_implode . $values['product-message'] . json_encode( $custom_fields ) );
if ( isset( $basket[ $product_code ] ) )
$basket[ $product_code ][ 'quantity' ] += $values[ 'quantity' ];
else
$basket[ $product_code ] = $values;
$basket[ $product_code ]['message'] = $values['product-message'];
$basket[ $product_code ]['custom_fields'] = $custom_fields;
$basket = (new \Domain\Promotion\PromotionRepository($GLOBALS['mdb']))->findPromotion( $basket );
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
$coupon = \Shared\Helpers\Helpers::get_session( 'coupon' );
echo json_encode( [
'result' => 'ok',
'basket_mini_count' => \Domain\Basket\BasketCalculator::countProductsText( \Domain\Basket\BasketCalculator::countProducts( $basket ) ),
'basket_mini_value' => \Domain\Basket\BasketCalculator::summaryPrice( $basket, $coupon, $lang_id ),
'product_sets' => ( new \Domain\Product\ProductRepository( $GLOBALS['mdb'] ) )->productSetsWhenAddToBasket( (int)$values['product-id'] )
] );
exit;
}
public function transportMethodInpostCheck()
{
$transport_id = \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' );
if ( $transport_id === '2' or $transport_id === '1' )
{
if ( !\Shared\Helpers\Helpers::get_session( 'basket-inpost-info' ) )
{
echo json_encode( [ 'result' => 'bad' ] );
exit;
}
}
if ( $transport_id === '9' )
{
if ( !\Shared\Helpers\Helpers::get_session( 'basket_orlen_point_id' ) )
{
echo json_encode( [ 'result' => 'bad' ] );
exit;
}
}
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function inpostCheck()
{
if ( !\Shared\Helpers\Helpers::get_session( 'basket-inpost-info' ) )
echo json_encode( [ 'result' => 'bad' ] );
else
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function orlenSave()
{
\Shared\Helpers\Helpers::set_session( 'basket_orlen_point_id', \Shared\Helpers\Helpers::get( 'orlen_point_id' ) );
\Shared\Helpers\Helpers::set_session( 'basket_orlen_point_info', \Shared\Helpers\Helpers::get( 'orlen_point_name' ) );
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function inpostSave()
{
\Shared\Helpers\Helpers::set_session( 'basket-inpost-info', \Shared\Helpers\Helpers::get( 'paczkomat' ) );
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function basketPaymentMethodSet()
{
\Shared\Helpers\Helpers::set_session( 'basket-payment-method-id', \Shared\Helpers\Helpers::get( 'payment_method_id' ) );
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function basketTransportMethodSet()
{
\Shared\Helpers\Helpers::set_session( 'basket-transport-method-id', \Shared\Helpers\Helpers::get( 'transport_method_id' ) );
echo json_encode( [ 'result' => 'ok' ] );
exit;
}
public function basketPaymentsMethods()
{
\Shared\Helpers\Helpers::set_session( 'basket-transport-method-id', \Shared\Helpers\Helpers::get( 'transport_method_id' ) );
echo json_encode( [
'result' => 'ok',
'payment_methods' => \front\Views\ShopPaymentMethod::basketPaymentMethods(
$this->paymentMethodRepository->paymentMethodsByTransport( (int)\Shared\Helpers\Helpers::get( 'transport_method_id' ) ),
\Shared\Helpers\Helpers::get( 'payment_method_id' )
)
] );
exit;
}
public function summaryView()
{
global $lang_id, $settings;
if ( \Domain\Basket\BasketCalculator::checkProductQuantityInStock( \Shared\Helpers\Helpers::get_session( 'basket' ) ) )
{
header( 'Location: /koszyk' );
exit;
}
$client = \Shared\Helpers\Helpers::get_session( 'client' );
return \Shared\Tpl\Tpl::view( 'shop-basket/summary-view', [
'lang_id' => $lang_id,
'client' => \Shared\Helpers\Helpers::get_session( 'client' ),
'basket' => \Shared\Helpers\Helpers::get_session( 'basket' ),
'transport' => ( new \Domain\Transport\TransportRepository( $GLOBALS['mdb'] ) )->findActiveByIdCached( \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' ) ),
'payment_method' => $this->paymentMethodRepository->paymentMethodCached( (int)\Shared\Helpers\Helpers::get_session( 'basket-payment-method-id' ) ),
'addresses' => ( new \Domain\Client\ClientRepository( $GLOBALS['mdb'] ) )->clientAddresses( (int)$client['id'] ),
'settings' => $settings,
'coupon' => \Shared\Helpers\Helpers::get_session( 'coupon' ),
'basket_message' => \Shared\Helpers\Helpers::get_session( 'basket_message' )
] );
}
public function basketSave()
{
$client = \Shared\Helpers\Helpers::get_session( 'client' );
if ( \Domain\Basket\BasketCalculator::checkProductQuantityInStock( \Shared\Helpers\Helpers::get_session( 'basket' ) ) )
{
header( 'Location: /koszyk' );
exit;
}
if ( $order_id = $this->orderRepository->createFromBasket(
$client[ 'id' ],
\Shared\Helpers\Helpers::get_session( 'basket' ),
\Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' ),
\Shared\Helpers\Helpers::get_session( 'basket-payment-method-id' ),
\Shared\Helpers\Helpers::get( 'email', true ),
\Shared\Helpers\Helpers::get( 'phone', true ),
\Shared\Helpers\Helpers::get( 'name', true ),
\Shared\Helpers\Helpers::get( 'surname', true ),
\Shared\Helpers\Helpers::get( 'street' ),
\Shared\Helpers\Helpers::get( 'postal_code', true ),
\Shared\Helpers\Helpers::get( 'city', true ),
\Shared\Helpers\Helpers::get( 'firm_name', true ),
\Shared\Helpers\Helpers::get( 'firm_street', true ),
\Shared\Helpers\Helpers::get( 'firm_postal_code', true ),
\Shared\Helpers\Helpers::get( 'firm_city', true ),
\Shared\Helpers\Helpers::get( 'firm_nip', true ),
\Shared\Helpers\Helpers::get_session( 'basket-inpost-info' ),
\Shared\Helpers\Helpers::get_session( 'basket_orlen_point_id' ),
\Shared\Helpers\Helpers::get_session( 'basket_orlen_point_info' ),
\Shared\Helpers\Helpers::get_session( 'coupon' ),
\Shared\Helpers\Helpers::get_session( 'basket_message' )
) )
{
\Shared\Helpers\Helpers::alert( \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-zlozone-komunikat' ) );
\Shared\Helpers\Helpers::delete_session( 'basket' );
\Shared\Helpers\Helpers::delete_session( 'basket-transport-method-id' );
\Shared\Helpers\Helpers::delete_session( 'basket-payment-method-id' );
\Shared\Helpers\Helpers::delete_session( 'basket-inpost-info' );
\Shared\Helpers\Helpers::delete_session( 'basket_orlen_point_id' );
\Shared\Helpers\Helpers::delete_session( 'basket_orlen_point_info' );
\Shared\Helpers\Helpers::delete_session( 'coupon' );
\Shared\Helpers\Helpers::delete_session( 'basket_message' );
\Shared\Helpers\Helpers::set_session( 'piksel_purchase', true );
\Shared\Helpers\Helpers::set_session( 'google-adwords-purchase', true );
\Shared\Helpers\Helpers::set_session( 'google-analytics-purchase', true );
\Shared\Helpers\Helpers::set_session( 'ekomi-purchase', true );
$redis = \Shared\Cache\RedisConnection::getInstance() -> getConnection();
if ( $redis )
$redis -> flushAll();
header( 'Location: /zamowienie/' . $this->orderRepository->findHashById( $order_id ) );
exit;
}
else
{
\Shared\Helpers\Helpers::error( \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-zlozone-komunikat-blad' ) );
header( 'Location: /koszyk' );
exit;
}
}
public function mainView()
{
global $lang_id, $page, $settings;
$page[ 'language' ][ 'meta_title' ] = 'Koszyk';
$basket = \Shared\Helpers\Helpers::get_session( 'basket' );
$coupon = \Shared\Helpers\Helpers::get_session( 'coupon' );
$payment_method_id = \Shared\Helpers\Helpers::get_session( 'payment_method_id' );
$basket_transport_method_id = \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' );
if ( \Domain\Basket\BasketCalculator::checkProductQuantityInStock( $basket ) )
{
header( 'Location: /koszyk' );
exit;
}
$basket = (new \Domain\Promotion\PromotionRepository($GLOBALS['mdb']))->findPromotion( $basket );
return \Shared\Tpl\Tpl::view( 'shop-basket/basket', [
'basket' => $basket,
'coupon' => $coupon,
'transport_id' => \Shared\Helpers\Helpers::get_session( 'basket-transport-method-id' ),
'transport_methods' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-transport-methods', [
'transports_methods' => ( new \Domain\Transport\TransportRepository( $GLOBALS['mdb'] ) )->transportMethodsFront( $basket, $coupon ),
'transport_id' => $basket_transport_method_id
] ),
'payment_method_id' => $payment_method_id,
'basket_details' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-details', [
'basket' => $basket,
'lang_id' => $lang_id,
'coupon' => $coupon,
'basket_message' => \Shared\Helpers\Helpers::get_session( 'basket_message' ),
'settings' => $settings
] )
] );
}
private function jsonBasketResponse( $basket, $coupon, $lang_id, $basket_transport_method_id )
{
echo json_encode( [
'basket' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-details', [
'basket' => $basket,
'lang_id' => $lang_id,
'coupon' => $coupon
] ),
'basket_mini_count' => \Domain\Basket\BasketCalculator::countProductsText( \Domain\Basket\BasketCalculator::countProducts( $basket ) ),
'basket_mini_value' => \Domain\Basket\BasketCalculator::summaryPrice( $basket, $coupon, $lang_id ),
'products_count' => count( $basket ),
'transport_methods' => \Shared\Tpl\Tpl::view( 'shop-basket/basket-transport-methods', [
'transports_methods' => ( new \Domain\Transport\TransportRepository( $GLOBALS['mdb'] ) )->transportMethodsFront( $basket, $coupon ),
'transport_id' => $basket_transport_method_id
] )
] );
exit;
}
}

View File

@@ -0,0 +1,354 @@
<?php
namespace front\Controllers;
use Domain\Client\ClientRepository;
class ShopClientController
{
private $clientRepo;
public function __construct(ClientRepository $clientRepo)
{
$this->clientRepo = $clientRepo;
}
public function markAddressAsCurrent()
{
$client = \Shared\Helpers\Helpers::get_session('client');
if (!$client) {
return false;
}
$this->clientRepo->markAddressAsCurrent(
(int)$client['id'],
(int)\Shared\Helpers\Helpers::get('address_id')
);
exit;
}
public function addressDelete()
{
$client = \Shared\Helpers\Helpers::get_session('client');
if (!$client) {
header('Location: /logowanie');
exit;
}
$address = $this->clientRepo->addressDetails((int)\Shared\Helpers\Helpers::get('id'));
if (!$address || $address['client_id'] != $client['id']) {
header('Location: /panel-klienta/adresy');
exit;
}
if ($this->clientRepo->addressDelete((int)\Shared\Helpers\Helpers::get('id'))) {
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang('adres-usuniety-komunikat'));
} else {
\Shared\Helpers\Helpers::error(\Shared\Helpers\Helpers::lang('adres-usuniety-blad'));
}
header('Location: /panel-klienta/adresy');
exit;
}
public function addressEdit()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang('meta-title-edycja-adresu') . ' | ' . $settings['firm_name'];
$client = \Shared\Helpers\Helpers::get_session('client');
if (!$client) {
header('Location: /logowanie');
exit;
}
$addressId = (int)\Shared\Helpers\Helpers::get('id');
$address = $this->clientRepo->addressDetails($addressId);
if ($address && $address['client_id'] != $client['id']) {
$address = null;
}
return \front\Views\ShopClient::addressEdit([
'address' => $address,
]);
}
public function addressSave()
{
$client = \Shared\Helpers\Helpers::get_session('client');
if (!$client) {
header('Location: /logowanie');
exit;
}
$addressId = (int)\Shared\Helpers\Helpers::get('address_id');
$data = [
'name' => \Shared\Helpers\Helpers::get('name', true),
'surname' => \Shared\Helpers\Helpers::get('surname', true),
'street' => \Shared\Helpers\Helpers::get('street'),
'postal_code' => \Shared\Helpers\Helpers::get('postal_code', true),
'city' => \Shared\Helpers\Helpers::get('city', true),
'phone' => \Shared\Helpers\Helpers::get('phone', true),
];
if ($this->clientRepo->addressSave((int)$client['id'], $addressId ?: null, $data)) {
$msg = $addressId
? \Shared\Helpers\Helpers::lang('zmiana-adresu-sukces')
: \Shared\Helpers\Helpers::lang('dodawanie-nowego-adresu-sukces');
\Shared\Helpers\Helpers::alert($msg);
} else {
$msg = $addressId
? \Shared\Helpers\Helpers::lang('zmiana-adresu-blad')
: \Shared\Helpers\Helpers::lang('dodawanie-nowego-adresu-blad');
\Shared\Helpers\Helpers::error($msg);
}
header('Location: /panel-klienta/adresy');
exit;
}
public function clientAddresses()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang('meta-title-lista-adresow') . ' | ' . $settings['firm_name'];
$client = \Shared\Helpers\Helpers::get_session('client');
if (!$client) {
header('Location: /logowanie');
exit;
}
return \front\Views\ShopClient::clientAddresses([
'client' => $client,
'addresses' => $this->clientRepo->clientAddresses((int)$client['id']),
]);
}
public function clientOrders()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang('meta-title-historia-zamowien') . ' | ' . $settings['firm_name'];
$client = \Shared\Helpers\Helpers::get_session('client');
if (!$client) {
header('Location: /logowanie');
exit;
}
return \front\Views\ShopClient::clientOrders([
'client' => $client,
'orders' => $this->clientRepo->clientOrders((int)$client['id']),
'statuses' => ( new \Domain\Order\OrderRepository( $GLOBALS['mdb'] ) )->orderStatuses(),
]);
}
public function newPassword()
{
$result = $this->clientRepo->generateNewPassword(
(string)\Shared\Helpers\Helpers::get('hash')
);
if ($result) {
$text = $this->buildEmailBody('#nowe-haslo', [
'[HASLO]' => $result['password'],
]);
\Shared\Helpers\Helpers::send_email(
$result['email'],
\Shared\Helpers\Helpers::lang('nowe-haslo-w-sklepie'),
$text
);
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang('nowe-haslo-zostalo-wyslane-na-twoj-adres-email'));
}
header('Location: /logowanie');
exit;
}
public function sendEmailPasswordRecovery()
{
$hash = $this->clientRepo->initiatePasswordRecovery(
(string)\Shared\Helpers\Helpers::get('email')
);
if ($hash) {
$text = $this->buildEmailBody('#odzyskiwanie-hasla-link', [
'[LINK]' => '/shopClient/new_password/hash=' . $hash,
]);
\Shared\Helpers\Helpers::send_email(
(string)\Shared\Helpers\Helpers::get('email'),
\Shared\Helpers\Helpers::lang('generowanie-nowego-hasla-w-sklepie'),
$text
);
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang('odzyskiwanie-hasla-link-komunikat'));
} else {
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang('odzyskiwanie-hasla-blad'));
}
header('Location: /logowanie');
exit;
}
public function recoverPassword()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang('meta-title-odzyskiwanie-hasla') . ' | ' . $settings['firm_name'];
return \front\Views\ShopClient::recoverPassword();
}
public function logout()
{
\Shared\Helpers\Helpers::delete_session('client');
header('Location: /');
exit;
}
public function login()
{
$result = $this->clientRepo->authenticate(
(string)\Shared\Helpers\Helpers::get('email'),
(string)\Shared\Helpers\Helpers::get('password')
);
if ($result['status'] === 'inactive') {
$link = '<a href="/ponowna-aktywacja/' . $result['hash'] . '/">'
. ucfirst(\Shared\Helpers\Helpers::lang('wyslij-link-ponownie')) . '</a>';
\Shared\Helpers\Helpers::alert(
str_replace('[LINK]', $link, \Shared\Helpers\Helpers::lang('logowanie-blad-nieaktywne-konto'))
);
header('Location: /logowanie');
exit;
}
if ($result['status'] !== 'ok') {
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang($result['code']));
header('Location: /logowanie');
exit;
}
\Shared\Helpers\Helpers::set_session('client', $result['client']);
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang('logowanie-udane'));
$redirect = \Shared\Helpers\Helpers::get('redirect');
header('Location: ' . ($redirect ? $redirect : '/panel-klienta'));
exit;
}
public function confirm()
{
$email = $this->clientRepo->confirmRegistration(
(string)\Shared\Helpers\Helpers::get('hash')
);
if ($email) {
$text = $this->buildEmailBody('#potwierdzenie-aktywacji-konta');
\Shared\Helpers\Helpers::send_email(
$email,
\Shared\Helpers\Helpers::lang('potwierdzenie-aktywacji-konta-w-sklepie') . ' ' . \Shared\Helpers\Helpers::lang('#nazwa-serwisu'),
$text
);
\Shared\Helpers\Helpers::alert(\Shared\Helpers\Helpers::lang('rejestracja-potwierdzenie'));
}
header('Location: /logowanie');
exit;
}
public function signup()
{
$email = (string)\Shared\Helpers\Helpers::get('email');
$password = (string)\Shared\Helpers\Helpers::get('password');
$created = $this->clientRepo->createClient(
$email,
$password,
(bool)\Shared\Helpers\Helpers::get('agremment_marketing')
);
if (!$created) {
echo json_encode([
'status' => 'bad',
'msg' => \Shared\Helpers\Helpers::lang('rejestracja-email-zajety'),
]);
exit;
}
$text = $this->buildEmailBody('#potwierdzenie-rejestracji', [
'[LINK]' => '/shopClient/confirm/hash=' . $created['hash'],
]);
\Shared\Helpers\Helpers::send_email(
$email,
\Shared\Helpers\Helpers::lang('potwierdzenie-rejestracji-konta-w-sklepie') . ' ' . \Shared\Helpers\Helpers::lang('#nazwa-serwisu'),
$text
);
echo json_encode([
'status' => 'ok',
'msg' => \Shared\Helpers\Helpers::lang('rejestracja-udana'),
]);
exit;
}
public function loginForm()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang('meta-title-logowanie') . ' | ' . $settings['firm_name'];
$page['class'] = 'page-login-form';
$client = \Shared\Helpers\Helpers::get_session('client');
if ($client) {
header('Location: /panel-klienta/zamowienia');
exit;
}
return \front\Views\ShopClient::loginForm();
}
public function registerForm()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang('meta-title-rejestracja') . ' | ' . $settings['firm_name'];
$client = \Shared\Helpers\Helpers::get_session('client');
if ($client) {
header('Location: /panel-klienta/zamowienia');
exit;
}
return \front\Views\ShopClient::registerForm();
}
/**
* Builds email body from newsletter template with URL absolutization.
*
* @param array<string, string> $replacements Placeholders to replace in the template
*/
private function buildEmailBody(string $templateName, array $replacements = []): string
{
$settings = $GLOBALS['settings'];
$text = $settings['newsletter_header'];
$text .= (new \Domain\Newsletter\NewsletterRepository($GLOBALS['mdb']))->templateByName($templateName);
$text .= $settings['newsletter_footer'];
$base = !empty($settings['ssl']) ? 'https' : 'http';
$serverName = $_SERVER['SERVER_NAME'] ?? '';
$regex = "-(<img[^>]+src\s*=\s*['\"])(((?!'|\"|https?://).)*)(['\"][^>]*>)-i";
$text = preg_replace($regex, '$1' . $base . '://' . $serverName . '$2$4', $text);
$regex = "-(<a[^>]+href\s*=\s*['\"])(((?!'|\"|https?://).)*)(['\"][^>]*>)-i";
$text = preg_replace($regex, '$1' . $base . '://' . $serverName . '$2$4', $text);
foreach ($replacements as $placeholder => $value) {
$text = str_replace($placeholder, $value, $text);
}
return $text;
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace front\Controllers;
use Domain\Coupon\CouponRepository;
class ShopCouponController
{
private CouponRepository $repository;
public function __construct( CouponRepository $repository )
{
$this->repository = $repository;
}
public function useCoupon()
{
$coupon = $this->repository->findByName( (string)\Shared\Helpers\Helpers::get( 'coupon' ) );
if ( $coupon && $this->repository->isAvailable( $coupon ) )
\Shared\Helpers\Helpers::set_session( 'coupon', $coupon );
else
\Shared\Helpers\Helpers::alert( 'Podany kod rabatowy jest nieprawidłowy.' );
header( 'Location: /koszyk' );
exit;
}
public function deleteCoupon()
{
\Shared\Helpers\Helpers::delete_session( 'coupon' );
header( 'Location: /koszyk' );
exit;
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace front\Controllers;
use Domain\Order\OrderRepository;
use Domain\Order\OrderAdminService;
class ShopOrderController
{
private $repository;
private $adminService;
public function __construct( OrderRepository $repository, OrderAdminService $adminService )
{
$this->repository = $repository;
$this->adminService = $adminService;
}
public function paymentConfirmation()
{
global $settings;
$order = $this->repository->orderDetailsFrontend( null, \Shared\Helpers\Helpers::get( 'order_hash' ) );
return \Shared\Tpl\Tpl::view( 'shop-order/payment-confirmation', [
'order' => $order,
'settings' => $settings
] );
}
public function paymentStatusTpay()
{
file_put_contents( 'tpay.txt', print_r( $_POST, true ) . print_r( $_GET, true ), FILE_APPEND );
if ( \Shared\Helpers\Helpers::get( 'tr_status' ) == 'TRUE' && \Shared\Helpers\Helpers::get( 'tr_crc' ) )
{
$order = $this->repository->findRawByHash( \Shared\Helpers\Helpers::get( 'tr_crc' ) );
if ( $order && $order['id'] )
{
$this->adminService->setOrderAsPaid( (int)$order['id'], true );
echo 'TRUE';
exit;
}
}
echo 'FALSE';
exit;
}
public function paymentStatusPrzelewy24pl()
{
global $settings;
$post = [
'p24_merchant_id' => \Shared\Helpers\Helpers::get( 'p24_merchant_id' ),
'p24_pos_id' => \Shared\Helpers\Helpers::get( 'p24_pos_id' ),
'p24_session_id' => \Shared\Helpers\Helpers::get( 'p24_session_id' ),
'p24_amount' => \Shared\Helpers\Helpers::get( 'p24_amount' ),
'p24_currency' => \Shared\Helpers\Helpers::get( 'p24_currency' ),
'p24_order_id' => \Shared\Helpers\Helpers::get( 'p24_order_id' ),
'p24_sign' => md5( \Shared\Helpers\Helpers::get( 'p24_session_id' ) . '|' . \Shared\Helpers\Helpers::get( 'p24_order_id' ) . '|' . \Shared\Helpers\Helpers::get( 'p24_amount' ) . '|' . \Shared\Helpers\Helpers::get( 'p24_currency' ) . '|' . $settings['przelewy24_crc_key'] )
];
$ch = curl_init();
if ( $settings['przelewy24_sandbox'] )
curl_setopt( $ch, CURLOPT_URL, 'https://sandbox.przelewy24.pl/trnVerify' );
if ( !$settings['przelewy24_sandbox'] )
curl_setopt( $ch, CURLOPT_URL, 'https://secure.przelewy24.pl/trnVerify' );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $post ) );
$response = curl_exec( $ch );
$order = $this->repository->findRawByPrzelewy24Hash( \Shared\Helpers\Helpers::get( 'p24_session_id' ) );
if ( $order && $order['status'] == 0 && $order['summary'] * 100 == \Shared\Helpers\Helpers::get( 'p24_amount' ) )
{
if ( $order['id'] )
{
$this->adminService->setOrderAsPaid( (int)$order['id'], true );
}
}
exit;
}
public function paymentStatusHotpay()
{
global $lang;
if ( !empty( $_POST["KWOTA"] ) && !empty( $_POST["ID_PLATNOSCI"] ) && !empty( $_POST["ID_ZAMOWIENIA"] ) && !empty( $_POST["STATUS"] ) && !empty( $_POST["SEKRET"] ) && !empty( $_POST["HASH"] ) )
{
$order = $this->repository->orderDetailsFrontend( (int)$_POST['ID_ZAMOWIENIA'] );
if ( $order && $order['id'] )
{
if ( is_array( $order['products'] ) && count( $order['products'] ) ):
$summary_tmp = 0;
foreach ( $order['products'] as $product ):
$product_tmp = ( new \Domain\Product\ProductRepository( $GLOBALS['mdb'] ) )->productDetailsFrontCached( (int)$product['product_id'], $lang['id'] );
$summary_tmp += \Shared\Helpers\Helpers::normalize_decimal( $product['price_netto'] + $product['price_netto'] * $product['vat'] / 100 ) * $product['quantity'];
endforeach;
$summary_tmp += $order['transport_cost'];
endif;
if ( hash( "sha256", "ProjectPro1916;" . round( $summary_tmp, 2 ) . ";" . $_POST["ID_PLATNOSCI"] . ";" . $_POST["ID_ZAMOWIENIA"] . ";" . $_POST["STATUS"] . ";" . $_POST["SEKRET"] ) == $_POST["HASH"] )
{
if ( $_POST["STATUS"] == "SUCCESS" )
{
$this->adminService->setOrderAsPaid( (int)$order['id'], true );
echo \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-oplacone' );
}
else if ( $_POST["STATUS"] == "FAILURE" )
{
$this->adminService->changeStatus( (int)$order['id'], 2, true );
echo \Shared\Helpers\Helpers::lang( 'platnosc-zostala-odrzucona' );
}
}
else
{
$this->adminService->changeStatus( (int)$order['id'], 3, true );
echo \Shared\Helpers\Helpers::lang( 'zamowienie-zostalo-oplacone-reczne' );
}
}
}
exit;
}
public function orderDetails()
{
global $page, $settings;
$page['language']['meta_title'] = \Shared\Helpers\Helpers::lang( 'meta-title-szczegoly-zamowienia' ) . ' | ' . $settings['firm_name'];
$order = $this->repository->orderDetailsFrontend(
$this->repository->findIdByHash( \Shared\Helpers\Helpers::get( 'order_hash' ) )
);
$coupon = (int)$order['coupon_id'] ? ( new \Domain\Coupon\CouponRepository( $GLOBALS['mdb'] ) )->find( (int)$order['coupon_id'] ) : null;
return \Shared\Tpl\Tpl::view( 'shop-order/order-details', [
'order' => $order,
'coupon' => $coupon,
'client' => \Shared\Helpers\Helpers::get_session( 'client' ),
'settings' => $settings
] );
}
}

View File

@@ -0,0 +1,62 @@
<?php
namespace front\Controllers;
use Domain\Producer\ProducerRepository;
class ShopProducerController
{
private ProducerRepository $repository;
public function __construct( ProducerRepository $repository )
{
$this->repository = $repository;
}
public function products()
{
global $page, $lang_id;
$producerId = (int)\Shared\Helpers\Helpers::get( 'producer_id' );
$producer = $this->repository->findForFrontend( $producerId, $lang_id );
if ( !$producer )
return '';
$page['show_title'] = true;
$page['language']['title'] = $producer['name'];
$bs = (int)\Shared\Helpers\Helpers::get( 'bs' );
$results = $this->repository->producerProducts( $producer['id'], 12, $bs ?: 1 );
$pager = '';
if ( $results['ls'] > 1 )
{
$pager = \Shared\Tpl\Tpl::view( 'site/pager', [
'ls' => $results['ls'],
'bs' => $bs ?: 1,
'page' => $page,
'link' => 'producent/' . \Shared\Helpers\Helpers::seo( $producer['name'] )
] );
}
return \Shared\Tpl\Tpl::view( 'shop-producer/products', [
'producer' => $producer,
'products' => $results['products'],
'pager' => $pager
] );
}
public function list()
{
global $page;
$page['show_title'] = true;
$page['language']['title'] = 'Producenci';
$producers = $this->repository->allActiveProducers();
return \Shared\Tpl\Tpl::view( 'shop-producer/list', [
'producers' => $producers
] );
}
}

View File

@@ -0,0 +1,116 @@
<?php
namespace front\Controllers;
class ShopProductController
{
private $categoryRepository;
public function __construct( \Domain\Category\CategoryRepository $categoryRepository )
{
$this->categoryRepository = $categoryRepository;
}
public function lazyLoadingProducts()
{
global $lang_id;
$output = '';
$categoryId = (int)\Shared\Helpers\Helpers::get( 'category_id' );
$products_ids = $this->categoryRepository->productsId(
$categoryId,
$this->categoryRepository->getCategorySort( $categoryId ),
$lang_id,
8,
(int)\Shared\Helpers\Helpers::get( 'offset' )
);
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
if ( is_array( $products_ids ) ): foreach ( $products_ids as $product_id ):
$output .= \Shared\Tpl\Tpl::view( 'shop-product/product-mini', [
'product' => $productRepo->findCached( $product_id, $lang_id )
] );
endforeach;
endif;
echo json_encode( [ 'html' => $output ] );
exit;
}
public function warehouseMessage()
{
global $lang_id;
$values = json_decode( \Shared\Helpers\Helpers::get( 'values' ), true );
$attributes = [];
foreach ( $values as $key => $val )
{
if ( $key != 'product-id' and $key != 'quantity' )
$attributes[] = $val;
}
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
$permutation = self::getPermutation( $attributes );
$quantity = self::getPermutationQuantity( $values['product-id'], $permutation );
global $settings;
$result = [];
if ( $quantity )
{
$msg = $productRepo->getWarehouseMessageNonzero( (int)$values['product-id'], $lang_id );
if ( $msg )
$result = [ 'msg' => $msg, 'quantity' => $quantity ];
else if ( isset( $settings[ 'warehouse_message_nonzero_' . $lang_id ] ) && $settings[ 'warehouse_message_nonzero_' . $lang_id ] )
$result = [ 'msg' => $settings[ 'warehouse_message_nonzero_' . $lang_id ], 'quantity' => $quantity ];
}
else
{
$msg = $productRepo->getWarehouseMessageZero( (int)$values['product-id'], $lang_id );
if ( $msg )
$result = [ 'msg' => $msg, 'quantity' => $quantity ];
else if ( isset( $settings[ 'warehouse_message_zero_' . $lang_id ] ) && $settings[ 'warehouse_message_zero_' . $lang_id ] )
$result = [ 'msg' => $settings[ 'warehouse_message_zero_' . $lang_id ], 'quantity' => $quantity ];
}
echo json_encode( $result );
exit;
}
public function drawProductAttributes()
{
global $lang_id;
$combination = '';
$selected_values = \Shared\Helpers\Helpers::get( 'selected_values' );
foreach ( $selected_values as $value )
{
$combination .= $value;
if ( $value != end( $selected_values ) )
$combination .= '|';
}
$product_id = \Shared\Helpers\Helpers::get( 'product_id' );
$productRepo = new \Domain\Product\ProductRepository( $GLOBALS['mdb'] );
$product = $productRepo->findCached( $product_id, $lang_id );
$product_data = $productRepo->getProductDataBySelectedAttributes( $product, $combination );
echo json_encode( [ 'product_data' => $product_data ] );
exit;
}
private static function getPermutation( $attributes )
{
if ( !is_array( $attributes ) || !count( $attributes ) ) return null;
return implode( '|', $attributes );
}
private static function getPermutationQuantity( $productId, $permutation )
{
global $mdb;
if ( !$permutation ) return $mdb->get( 'pp_shop_products', 'quantity', [ 'id' => $productId ] );
$qty = $mdb->get( 'pp_shop_products', 'quantity', [ 'AND' => [ 'parent_id' => $productId, 'permutation_hash' => $permutation ] ] );
if ( $qty !== null ) return $qty;
return $mdb->get( 'pp_shop_products', 'quantity', [ 'id' => $productId ] );
}
}