diff --git a/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php b/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php index e5bab9c..931525e 100755 --- a/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php +++ b/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php @@ -30,6 +30,7 @@ if (is_readable($sysLibPath . '/oc_telegram_shop.phar')) { * @property User $user * @property ModelCustomerCustomerGroup $model_customer_customer_group * @property ModelLocalisationOrderStatus $model_localisation_order_status + * @property ModelDesignBanner $model_design_banner * @property DB $db * @property Log $log */ @@ -350,6 +351,7 @@ TEXT, 'module_tgshop_enable_store' => 1, 'module_tgshop_feature_coupons' => 0, 'module_tgshop_feature_vouchers' => 0, + 'module_tgshop_home_banner_id' => null, ]; } @@ -365,6 +367,11 @@ 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' => [ @@ -517,6 +524,14 @@ HTML, ], 'help' => <<подарочные сертификаты OpenCart при оформлении заказа. +HTML, + ], + + 'module_tgshop_home_banner_id' => [ + 'type' => 'select', + 'options' => $this->getBannersList(), + 'help' => <<Стандартный OpenCart баннер отображаемый на главной странице магазина. Рекомендуемая максимальная высота изображения для баннера - 200 пикселей. HTML, ], ], @@ -645,4 +660,16 @@ HTML, $this->log->write('[TELECART] Ошибка удаления старых assets: ' . $e->getMessage()); } } + + 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; + } } diff --git a/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php b/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php index 8fdb66b..799c701 100755 --- a/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php +++ b/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php @@ -32,6 +32,7 @@ $_['lbl_module_tgshop_featured_categories'] = 'Избранные категор $_['lbl_module_tgshop_enable_store'] = 'Разрешить покупки'; $_['lbl_module_tgshop_feature_coupons'] = 'Промокоды'; $_['lbl_module_tgshop_feature_vouchers'] = 'Подарочные сертификаты'; +$_['lbl_module_tgshop_home_banner_id'] = 'Баннер на главной'; // Entry $_['entry_status'] = 'Статус'; diff --git a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php index fce4b93..a0be385 100755 --- a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php +++ b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php @@ -91,6 +91,7 @@ class ControllerExtensionTgshopHandle extends Controller $this->config->get('module_tgshop_feature_vouchers'), FILTER_VALIDATE_BOOLEAN ), + 'home_banner_id' => $this->config->get('module_tgshop_home_banner_id'), ]); $app->bind(OcModelCatalogProductAdapter::class, function () { diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php index 57320c2..bc592f1 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageTool.php @@ -3,6 +3,7 @@ namespace Openguru\OpenCartFramework\ImageTool; use Intervention\Image\ImageManager; +use InvalidArgumentException; class ImageTool implements ImageToolInterface { @@ -19,10 +20,14 @@ class ImageTool implements ImageToolInterface $this->manager = new ImageManager(['driver' => $driver]); } - public function resize(string $path, int $width, int $height, ?string $default = null, string $format = 'webp'): ?string + public function resize(string $path, ?int $width = null, ?int $height = null, ?string $default = null, string $format = 'webp'): ?string { $filename = is_file($this->imageDir . $path) ? $path : $default; + if (! $width && ! $height) { + throw new InvalidArgumentException('Width or height must be set'); + } + if (! $filename || ! is_file($this->imageDir . $filename)) { return null; } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageToolInterface.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageToolInterface.php index 0e41ac0..6bd6b72 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageToolInterface.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/ImageTool/ImageToolInterface.php @@ -9,8 +9,8 @@ interface ImageToolInterface public function resize( string $path, - int $width, - int $height, + ?int $width = null, + ?int $height = null, ?string $default = null, string $format = 'webp' ): ?string; diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/OpenCart/Decorators/OcRegistryDecorator.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/OpenCart/Decorators/OcRegistryDecorator.php index 16ab8c4..5f089aa 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/OpenCart/Decorators/OcRegistryDecorator.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/OpenCart/Decorators/OcRegistryDecorator.php @@ -8,6 +8,7 @@ use Config; use Language; use Loader; use ModelCatalogProduct; +use ModelDesignBanner; use ModelSettingSetting; use ModelToolImage; use Registry; @@ -25,6 +26,7 @@ use Url; * @property ModelToolImage $model_tool_image * @property ModelCatalogProduct $model_catalog_product * @property ModelSettingSetting $model_setting_setting + * @property ModelDesignBanner $model_design_banner */ class OcRegistryDecorator { diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php new file mode 100644 index 0000000..3a733c5 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/BannerHandler.php @@ -0,0 +1,48 @@ +registry = $registry; + $this->imageTool = $imageTool; + $this->settings = $settings; + + $this->registry->load->model('design/banner'); + } + + public function show(): JsonResponse + { + $data = []; + $bannerId = $this->settings->get('home_banner_id'); + + if ($bannerId) { + $banner = $this->registry->model_design_banner->getBanner($bannerId); + foreach ($banner as $index => $result) { + if (is_file(DIR_IMAGE . $result['image'])) { + $data[] = [ + 'id' => $index, + 'title' => $result['title'], + 'link' => rtrim($this->settings->get('base_url'), '/') . '/' . $result['link'], + 'image' => $this->imageTool->resize($result['image'], null, 200), + ]; + } + } + } + + return new JsonResponse([ + 'data' => $data, + ]); + } +} diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php index a043814..48c8246 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php @@ -1,5 +1,6 @@ [SettingsHandler::class, 'manifest'], 'testTgMessage' => [SettingsHandler::class, 'testTgMessage'], + 'banner' => [BannerHandler::class, 'show'], + 'webhook' => [TelegramHandler::class, 'webhook'], ]; diff --git a/spa/src/components/Banner.vue b/spa/src/components/Banner.vue new file mode 100644 index 0000000..e97804c --- /dev/null +++ b/spa/src/components/Banner.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/spa/src/utils/ftch.js b/spa/src/utils/ftch.js index c114376..1a83258 100644 --- a/spa/src/utils/ftch.js +++ b/spa/src/utils/ftch.js @@ -92,4 +92,8 @@ export async function setVoucher(voucher) { }); } +export async function fetchBanner() { + return await ftch('banner'); +} + export default ftch; diff --git a/spa/src/views/Home.vue b/spa/src/views/Home.vue index ad2d984..d5d0a16 100644 --- a/spa/src/views/Home.vue +++ b/spa/src/views/Home.vue @@ -2,6 +2,7 @@
+
@@ -35,6 +36,7 @@ import IconFunnel from "@/components/Icons/IconFunnel.vue"; import {useRouter} from "vue-router"; import ftch from "@/utils/ftch.js"; import {useProductFiltersStore} from "@/stores/ProductFiltersStore.js"; +import Banner from "@/components/Banner.vue"; defineOptions({ name: 'Home'