@@ -31,6 +42,8 @@
import {useSettingsStore} from "@/stores/settings.js";
import ItemBool from "@/components/Settings/ItemBool.vue";
import ItemSelect from "@/components/Settings/ItemSelect.vue";
+import ItemInput from "@/components/Settings/ItemInput.vue";
+import ItemToggleButton from "@/components/Settings/ItemToggleButton.vue";
import ItemProductsSelect from "@/components/Settings/ItemProductsSelect.vue";
import ItemCategoriesSelect from "@/components/Settings/ItemCategoriesSelect.vue";
@@ -42,5 +55,11 @@ const mainpage_categories_options = {
featured: 'Избранные категории (задать в поле ниже)',
};
+const productInteractionOptions = {
+ order: 'Создание заявки / заказа',
+ manager: 'Кнопка связи с менеджером',
+ browser: 'Открытие товара на сайте',
+};
+
const userToken = window.TeleCart.user_token;
diff --git a/frontend/spa/src/components/Dock.vue b/frontend/spa/src/components/Dock.vue
index 180bbc3..782091b 100644
--- a/frontend/spa/src/components/Dock.vue
+++ b/frontend/spa/src/components/Dock.vue
@@ -45,7 +45,7 @@
({
app_enabled: true,
app_debug: false,
- store_enabled: true,
+ product_interaction_mode: 'browser',
+ manager_username: null,
app_name: 'OpenCart Telegram магазин',
app_icon: '',
night_auto: true,
@@ -41,7 +42,8 @@ export const useSettingsStore = defineStore('settings', {
this.ya_metrika_enabled = settings.ya_metrika_enabled;
this.app_enabled = settings.app_enabled;
this.app_debug = settings.app_debug;
- this.store_enabled = settings.store_enabled;
+ this.product_interaction_mode = settings.product_interaction_mode ?? 'browser';
+ this.manager_username = settings.manager_username;
this.feature_coupons = settings.feature_coupons;
this.feature_vouchers = settings.feature_vouchers;
this.show_category_products_button = settings.show_category_products_button ?? true;
diff --git a/frontend/spa/src/views/Product.vue b/frontend/spa/src/views/Product.vue
index a6dba74..e4c63d4 100644
--- a/frontend/spa/src/views/Product.vue
+++ b/frontend/spa/src/views/Product.vue
@@ -123,7 +123,8 @@
-
+
+
@@ -175,7 +176,27 @@
-
+
+
+
+
+
+
+
+ Связаться с менеджером
+
+ Менеджер недоступен
+
+
+
+
+
[
- 'enable_store' => true,
'feature_coupons' => true,
'feature_vouchers' => true,
'show_category_products_button' => true,
+ 'product_interaction_mode' => 'browser',
+ 'manager_username' => null,
],
'texts' => [
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/database/migrations/20260101000011_migrate_store_enabled_to_product_interaction_mode.php b/module/oc_telegram_shop/upload/oc_telegram_shop/database/migrations/20260101000011_migrate_store_enabled_to_product_interaction_mode.php
new file mode 100644
index 0000000..e030391
--- /dev/null
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/database/migrations/20260101000011_migrate_store_enabled_to_product_interaction_mode.php
@@ -0,0 +1,54 @@
+app->get(OcRegistryDecorator::class);
+ $opencart->load->model('setting/setting');
+
+ $currentSettings = $opencart->model_setting_setting->getSetting('module_telecart');
+
+ if (! $currentSettings || ! isset($currentSettings['module_telecart_settings'])) {
+ $this->logger->info("Settings not found in database, migration skipped");
+ return;
+ }
+
+ $allSettings = $currentSettings['module_telecart_settings'];
+
+ // Проверяем наличие store.enable_store
+ $enableStore = Arr::get($allSettings, 'store.enable_store');
+
+ if ($enableStore !== null) {
+ // Определяем значение product_interaction_mode на основе store.enable_store
+ $productInteractionMode = filter_var($enableStore, FILTER_VALIDATE_BOOLEAN)
+ ? 'order'
+ : 'browser';
+
+ // Устанавливаем product_interaction_mode, если его еще нет
+ if (!isset($allSettings['store']['product_interaction_mode'])) {
+ Arr::set($allSettings, 'store.product_interaction_mode', $productInteractionMode);
+ $this->logger->info("Migrated store.enable_store to product_interaction_mode: {$enableStore} -> {$productInteractionMode}");
+ } else {
+ $this->logger->info("product_interaction_mode already exists, skipping migration but removing store.enable_store");
+ }
+
+ // Удаляем store.enable_store из настроек
+ Arr::unset($allSettings, 'store.enable_store');
+ $this->logger->info("Removed store.enable_store from settings");
+
+ // Сохраняем обновленные настройки через OpenCart модель
+ $opencart->model_setting_setting->editSetting('module_telecart', [
+ 'module_telecart_settings' => $allSettings,
+ ]);
+
+ $this->logger->info("Successfully migrated store.enable_store to product_interaction_mode and removed store.enable_store from settings");
+ } else {
+ $this->logger->info("store.enable_store not found in settings, migration skipped");
+ }
+ }
+};
+
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/DTO/Settings/StoreDTO.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/DTO/Settings/StoreDTO.php
index 31f8cb9..ac4cec0 100755
--- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/DTO/Settings/StoreDTO.php
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/DTO/Settings/StoreDTO.php
@@ -4,37 +4,35 @@ namespace App\DTO\Settings;
final class StoreDTO
{
- private bool $enableStore;
private bool $featureCoupons;
private bool $featureVouchers;
private bool $showCategoryProductsButton;
+ private string $productInteractionMode;
+ private ?string $managerUsername;
private string $ocDefaultCurrency;
private bool $ocConfigTax;
private int $ocStoreId;
public function __construct(
- bool $enableStore,
bool $featureCoupons,
bool $featureVouchers,
bool $showCategoryProductsButton,
+ string $productInteractionMode,
+ ?string $managerUsername,
string $ocDefaultCurrency,
bool $ocConfigTax,
int $ocStoreId
) {
- $this->enableStore = $enableStore;
$this->featureCoupons = $featureCoupons;
$this->featureVouchers = $featureVouchers;
$this->showCategoryProductsButton = $showCategoryProductsButton;
+ $this->productInteractionMode = $productInteractionMode;
+ $this->managerUsername = $managerUsername;
$this->ocDefaultCurrency = $ocDefaultCurrency;
$this->ocConfigTax = $ocConfigTax;
$this->ocStoreId = $ocStoreId;
}
- public function isEnableStore(): bool
- {
- return $this->enableStore;
- }
-
public function isFeatureCoupons(): bool
{
return $this->featureCoupons;
@@ -50,6 +48,16 @@ final class StoreDTO
return $this->showCategoryProductsButton;
}
+ public function getProductInteractionMode(): string
+ {
+ return $this->productInteractionMode;
+ }
+
+ public function getManagerUsername(): ?string
+ {
+ return $this->managerUsername;
+ }
+
public function getOcDefaultCurrency(): string
{
return $this->ocDefaultCurrency;
@@ -68,10 +76,12 @@ final class StoreDTO
public function toArray(): array
{
return [
- 'enable_store' => $this->enableStore,
+ // enable_store больше не сериализуется, так как заменен на product_interaction_mode
'feature_coupons' => $this->featureCoupons,
'feature_vouchers' => $this->featureVouchers,
'show_category_products_button' => $this->showCategoryProductsButton,
+ 'product_interaction_mode' => $this->productInteractionMode,
+ 'manager_username' => $this->managerUsername,
'oc_default_currency' => $this->ocDefaultCurrency,
'oc_config_tax' => $this->ocConfigTax,
'oc_store_id' => $this->ocStoreId,
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php
index 1648acc..c514282 100755
--- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php
@@ -45,7 +45,8 @@ class SettingsHandler
'theme_dark' => $appConfig->getThemeDark(),
'ya_metrika_enabled' => $this->settings->config()->getMetrics()->isYandexMetrikaEnabled(),
'app_enabled' => $appConfig->isAppEnabled(),
- 'store_enabled' => $this->settings->config()->getStore()->isEnableStore(),
+ 'product_interaction_mode' => $this->settings->config()->getStore()->getProductInteractionMode(),
+ 'manager_username' => $this->settings->config()->getStore()->getManagerUsername(),
'feature_coupons' => $this->settings->config()->getStore()->isFeatureCoupons(),
'feature_vouchers' => $this->settings->config()->getStore()->isFeatureVouchers(),
'show_category_products_button' => $this->settings->config()->getStore()->isShowCategoryProductsButton(),
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/SettingsSerializerService.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/SettingsSerializerService.php
index d1cd459..a4ff3f7 100755
--- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/SettingsSerializerService.php
+++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/SettingsSerializerService.php
@@ -138,10 +138,11 @@ class SettingsSerializerService
}
return new StoreDTO(
- $data['enable_store'] ?? true,
$data['feature_coupons'] ?? true,
$data['feature_vouchers'] ?? true,
$data['show_category_products_button'] ?? true,
+ $data['product_interaction_mode'] ?? 'browser',
+ $data['manager_username'] ?? null,
$data['oc_default_currency'],
$data['oc_config_tax'],
$data['oc_store_id']
@@ -270,9 +271,7 @@ class SettingsSerializerService
private function validateStore(array $data): void
{
- if (isset($data['enable_store']) && ! is_bool($data['enable_store'])) {
- throw new InvalidArgumentException('store.enable_store must be a boolean');
- }
+ // enable_store больше не валидируется, так как заменен на product_interaction_mode
if (isset($data['feature_coupons']) && ! is_bool($data['feature_coupons'])) {
throw new InvalidArgumentException('store.feature_coupons must be a boolean');
@@ -286,6 +285,25 @@ class SettingsSerializerService
throw new InvalidArgumentException('store.show_category_products_button must be a boolean');
}
+ if (isset($data['product_interaction_mode']) && ! is_string($data['product_interaction_mode'])) {
+ throw new InvalidArgumentException('store.product_interaction_mode must be a string');
+ }
+
+ if (isset($data['product_interaction_mode']) && ! in_array($data['product_interaction_mode'], ['order', 'manager', 'browser'], true)) {
+ throw new InvalidArgumentException('store.product_interaction_mode must be one of: order, manager, browser');
+ }
+
+ if (isset($data['manager_username']) && $data['manager_username'] !== null) {
+ if (! is_string($data['manager_username'])) {
+ throw new InvalidArgumentException('store.manager_username must be a string or null');
+ }
+ // Проверяем, что это username (не числовой ID)
+ $managerUsername = trim($data['manager_username']);
+ if ($managerUsername !== '' && preg_match('/^-?\d+$/', $managerUsername)) {
+ throw new InvalidArgumentException('store.manager_username must be a username (e.g., @username), not a numeric ID');
+ }
+ }
+
if (! isset($data['oc_default_currency'])) {
throw new InvalidArgumentException('store.oc_default_currency is required');
}
diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/stubs/phpstan-bootstrap.php b/module/oc_telegram_shop/upload/oc_telegram_shop/stubs/phpstan-bootstrap.php
old mode 100644
new mode 100755