feat(slider): add slider feature

This commit is contained in:
2025-11-01 17:32:28 +03:00
parent 0cccc7e3d7
commit 3049bd3101
37 changed files with 685 additions and 256 deletions

View File

@@ -93,6 +93,7 @@ class ControllerExtensionModuleTgshop extends Controller
$hasConfig = $this->config->get('module_tgshop_app_name') !== null;
if ($hasConfig) {
$this->cleanUpConfigs();
$this->updateConfigFromDefaults();
$this->cleanUpOldAssets();
$this->injectVueJs();
@@ -109,9 +110,9 @@ class ControllerExtensionModuleTgshop extends Controller
if (($this->request->server['REQUEST_METHOD'] === 'POST') && $this->validate()) {
$postData = $this->request->post;
$postData['module_tgshop_mainpage_banners'] = [];
if (! empty($_POST['module_tgshop_mainpage_banners'])) {
$postData['module_tgshop_mainpage_banners'] = $_POST['module_tgshop_mainpage_banners'];
$postData['module_tgshop_mainpage_slider'] = [];
if (! empty($_POST['module_tgshop_mainpage_slider'])) {
$postData['module_tgshop_mainpage_slider'] = $_POST['module_tgshop_mainpage_slider'];
}
$this->model_setting_setting->editSetting('module_tgshop', $postData);
@@ -136,11 +137,11 @@ class ControllerExtensionModuleTgshop extends Controller
$data['settings'] = $this->getSettingsConfig();
$data['banners'] = [];
$banners = $this->config->get('module_tgshop_mainpage_banners');
$data['mainpage_slider'] = [];
$banners = $this->config->get('module_tgshop_mainpage_slider');
if ($banners) {
$banners = html_entity_decode($banners);
$data['banners'] = $banners;
$data['mainpage_slider'] = $banners;
}
foreach ($data['settings'] as $configs) {
@@ -364,11 +365,20 @@ TEXT,
'module_tgshop_enable_store' => 1,
'module_tgshop_feature_coupons' => 0,
'module_tgshop_feature_vouchers' => 0,
'module_tgshop_home_banner_id' => null,
'module_tgshop_text_no_more_products' => 'Это всё по текущему запросу. Попробуйте уточнить фильтры или поиск.',
'module_tgshop_text_empty_cart' => 'Ваша корзина пуста',
'module_tgshop_text_order_created_success' => 'Ваш заказ успешно оформлен и будет обработан в ближайшее время.',
'module_tgshop_mainpage_banners' => '[]',
'module_tgshop_mainpage_slider' => json_encode([
'is_enabled' => false,
'effect' => 'slide',
'pagination' => true,
'scrollbar' => false,
'free_mode' => false,
'space_between' => 30,
'autoplay' => false,
'loop' => false,
'slides' => [],
], JSON_THROW_ON_ERROR),
];
}
@@ -384,11 +394,6 @@ TEXT,
'user_token=' . $this->session->data['user_token'],
true
);
$ocBannersLink = $this->url->link(
'design/banner',
'user_token=' . $this->session->data['user_token'],
true
);
return [
'general' => [
@@ -698,28 +703,22 @@ HTML,
}
}
private function getBannersList(): array
{
$this->load->model('design/banner');
$allBanners = $this->model_design_banner->getBanners();
$map = [];
foreach ($allBanners as $item) {
$map[(int) $item['banner_id']] = $item['name'];
}
return [null => 'Не показывать'] + $map;
}
private function injectVueJs(): void
{
$appDir = rtrim(DIR_APPLICATION, '/');
if (file_exists("$appDir/view/javascript/telecart/telecart.js")) {
$this->document->addScript('view/javascript/telecart/telecart.js');
$this->document->addStyle('view/javascript/telecart/telecart.css');
$hash = md5(file_get_contents($appDir . '/view/javascript/telecart/manifest.json'));
$this->document->addScript('view/javascript/telecart/telecart.js?v=' . $hash);
$this->document->addStyle('view/javascript/telecart/telecart.css?v=' . $hash);
} elseif (file_exists("$appDir/view/integration.js")) {
$this->document->addScript('view/integration.js');
} else {
throw new RuntimeException('Unable to load Vuejs frontend.');
}
}
private function cleanUpConfigs(): void
{
//
}
}

View File

@@ -452,7 +452,7 @@
<script>
window.TeleCart = {
user_token: '{{ user_token }}',
banners: '{{ banners }}',
mainpage_slider: '{{ mainpage_slider }}',
};
</script>
<div id="app">App Loading...</div>

View File

@@ -94,7 +94,7 @@ class ControllerExtensionTgshopHandle extends Controller
$this->config->get('module_tgshop_feature_vouchers'),
FILTER_VALIDATE_BOOLEAN
),
'mainpage_banners' => $this->safeJsonDecode($this->config->get('module_tgshop_mainpage_banners'), []),
'mainpage_slider' => $this->safeJsonDecode($this->config->get('module_tgshop_mainpage_slider'), []),
'texts' => [
'no_more_products' => $this->config->get('module_tgshop_text_no_more_products'),
'empty_cart' => $this->config->get('module_tgshop_text_empty_cart'),

View File

@@ -111,7 +111,7 @@ class ImageTool implements ImageToolInterface
$image = $this->manager->make($fullOldPath)
->fit($width, $height, function ($constraint) {
$constraint->upsize();
// $constraint->upsize();
}, $position);
$image->encode($format, 75)->save($fullNewPath, 75, $format);

View File

@@ -24,13 +24,12 @@ class BannerHandler
public function show(): JsonResponse
{
$data = [];
$slides = $this->settings->get('mainpage_banners', []);
$slider = $this->settings->get('mainpage_slider', []);
if ($slides) {
foreach ($slides as $index => $slide) {
if ($slider && ! empty($slider['slides']) && is_array($slider['slides'])) {
foreach ($slider['slides'] as $index => $slide) {
if (is_file(DIR_IMAGE . $slide['image'])) {
$data[] = [
$slider['slides'][$index] = [
'id' => $index,
'title' => $slide['title'],
'link' => $slide['link'],
@@ -41,7 +40,7 @@ class BannerHandler
}
return new JsonResponse([
'data' => $data,
'data' => $slider,
]);
}
}

View File

@@ -58,6 +58,7 @@ class SettingsHandler
'feature_vouchers' => $this->settings->get('feature_vouchers') ?? false,
'currency_code' => $this->settings->get('oc_default_currency', 'RUB'),
'texts' => $this->settings->get('texts'),
'mainpage_slider' => $this->settings->get('mainpage_slider'),
]);
}

View File