Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/components/minishop3/lexicon/en/default.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@
$_lang['ms3_err_ae'] = 'This field must be unique';
$_lang['ms3_err_json'] = 'This field requires JSON string';
$_lang['ms3_repeater_validation_error'] = 'Repeater field "[[+field]]": [[+error]]';
$_lang['ms3_key_value_validation_error'] = 'Key-value field "[[+field]]": [[+error]]';

$_lang['ms3_err_user_nf'] = 'User not found.';
$_lang['ms3_err_order_nf'] = 'Order with this identifier not found.';
Expand Down
20 changes: 20 additions & 0 deletions core/components/minishop3/lexicon/en/vue.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@
$_lang['ms3_vue_xtype_xcheckbox'] = 'Checkbox';
$_lang['ms3_vue_xtype_combo_select'] = 'Dropdown List';
$_lang['ms3_vue_xtype_repeater'] = 'Repeater (rows grid)';
$_lang['ms3_vue_xtype_key_value'] = 'Key-Value (map)';
$_lang['ms3_vue_xtype_combo_vendor'] = 'Vendor (combo)';
$_lang['ms3_vue_xtype_combo_autocomplete'] = 'Autocomplete (combo)';
$_lang['ms3_vue_xtype_combo_options'] = 'Product Options (chips)';
Expand All @@ -186,6 +187,25 @@
$_lang['ms3_vue_repeater_add_row'] = 'Add row';
$_lang['ms3_vue_repeater_no_columns'] = 'Configure repeater columns in extra field settings.';
$_lang['ms3_vue_repeater_drag_hint'] = 'Drag to reorder';

// Key-Value field
$_lang['ms3_vue_key_value_schema_label'] = 'Key-Value schema';
$_lang['ms3_vue_key_value_schema_help'] = 'Define keys for fixed mode or use free mode for any pairs.';
$_lang['ms3_vue_key_value_mode'] = 'Mode';
$_lang['ms3_vue_key_value_mode_fixed'] = 'Fixed keys';
$_lang['ms3_vue_key_value_mode_free'] = 'Free keys';
$_lang['ms3_vue_key_value_keys'] = 'Keys';
$_lang['ms3_vue_key_value_add_key'] = 'Add key';
$_lang['ms3_vue_key_value_key'] = 'Key';
$_lang['ms3_vue_key_value_label'] = 'Label';
$_lang['ms3_vue_key_value_value'] = 'Value';
$_lang['ms3_vue_key_value_add_pair'] = 'Add pair';
$_lang['ms3_vue_key_value_value_type'] = 'Value type';
$_lang['ms3_vue_key_value_value_type_string'] = 'String';
$_lang['ms3_vue_key_value_value_type_number'] = 'Number';
$_lang['ms3_vue_key_value_required'] = 'Required';
$_lang['ms3_vue_key_value_no_keys'] = 'No keys defined. Add keys in extra field settings for fixed mode.';

$_lang['ms3_vue_order_extra_fields'] = 'Additional order fields';
$_lang['ms3_vue_order_address_extra_fields'] = 'Additional address fields';

Expand Down
1 change: 1 addition & 0 deletions core/components/minishop3/lexicon/ru/default.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@
$_lang['ms3_err_ae'] = 'Это поле должно быть уникально';
$_lang['ms3_err_json'] = 'Это поле требует JSON строку';
$_lang['ms3_repeater_validation_error'] = 'Поле повторителя «[[+field]]»: [[+error]]';
$_lang['ms3_key_value_validation_error'] = 'Поле key-value «[[+field]]»: [[+error]]';

$_lang['ms3_err_user_nf'] = 'Пользователь не найден.';
$_lang['ms3_err_order_nf'] = 'Заказ с таким идентификатором не найден.';
Expand Down
20 changes: 20 additions & 0 deletions core/components/minishop3/lexicon/ru/vue.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@
$_lang['ms3_vue_xtype_xcheckbox'] = 'Флажок';
$_lang['ms3_vue_xtype_combo_select'] = 'Выпадающий список';
$_lang['ms3_vue_xtype_repeater'] = 'Повторитель (таблица строк)';
$_lang['ms3_vue_xtype_key_value'] = 'Ключ-Значение (карта)';
$_lang['ms3_vue_xtype_combo_vendor'] = 'Производитель (combo)';
$_lang['ms3_vue_xtype_combo_autocomplete'] = 'Автодополнение (combo)';
$_lang['ms3_vue_xtype_combo_options'] = 'Опции товара (chips)';
Expand All @@ -186,6 +187,25 @@
$_lang['ms3_vue_repeater_add_row'] = 'Добавить строку';
$_lang['ms3_vue_repeater_no_columns'] = 'Настройте колонки повторителя в параметрах extra field.';
$_lang['ms3_vue_repeater_drag_hint'] = 'Перетащите для изменения порядка';

// Key-Value field
$_lang['ms3_vue_key_value_schema_label'] = 'Схема Ключ-Значение';
$_lang['ms3_vue_key_value_schema_help'] = 'Определите ключи для фиксированного режима или используйте свободный режим для любых пар.';
$_lang['ms3_vue_key_value_mode'] = 'Режим';
$_lang['ms3_vue_key_value_mode_fixed'] = 'Фиксированные ключи';
$_lang['ms3_vue_key_value_mode_free'] = 'Свободные ключи';
$_lang['ms3_vue_key_value_keys'] = 'Ключи';
$_lang['ms3_vue_key_value_add_key'] = 'Добавить ключ';
$_lang['ms3_vue_key_value_key'] = 'Ключ';
$_lang['ms3_vue_key_value_label'] = 'Подпись';
$_lang['ms3_vue_key_value_value'] = 'Значение';
$_lang['ms3_vue_key_value_add_pair'] = 'Добавить пару';
$_lang['ms3_vue_key_value_value_type'] = 'Тип значения';
$_lang['ms3_vue_key_value_value_type_string'] = 'Строка';
$_lang['ms3_vue_key_value_value_type_number'] = 'Число';
$_lang['ms3_vue_key_value_required'] = 'Обязательное';
$_lang['ms3_vue_key_value_no_keys'] = 'Ключи не заданы. Добавьте ключи в параметрах extra field для фиксированного режима.';

$_lang['ms3_vue_order_extra_fields'] = 'Дополнительные поля заказа';
$_lang['ms3_vue_order_address_extra_fields'] = 'Дополнительные поля адреса';

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

/**
* Adds key_value_config column to ms3_extra_fields for ms3-key-value field schema
*/
final class AddKeyValueConfigToExtraFields extends AbstractMigration
{
public function up(): void
{
$table = $this->table('ms3_extra_fields');

if (!$table->hasColumn('key_value_config')) {
$table->addColumn('key_value_config', 'text', [
'null' => true,
'after' => 'repeater_config',
'comment' => 'JSON schema for ms3-key-value field type (mode, keys, value types, required flags)',
]);
$table->update();
}
}

public function down(): void
{
$table = $this->table('ms3_extra_fields');

if ($table->hasColumn('key_value_config')) {
$table->removeColumn('key_value_config');
$table->update();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,7 @@
<field key="index_type" dbtype="varchar" precision="50" phptype="string" null="true" default="NONE"/>
<field key="select_options" dbtype="text" phptype="string" null="true"/>
<field key="repeater_config" dbtype="text" phptype="string" null="true"/>
<field key="key_value_config" dbtype="text" phptype="string" null="true"/>

<field key="active" dbtype="tinyint" precision="1" phptype="boolean" null="true" default="0"/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use MiniShop3\Model\msPayment;
use MiniShop3\Router\HttpStatus;
use MiniShop3\Router\Response;
use MiniShop3\Services\ExtraFields\KeyValueFieldService;
use MiniShop3\Services\ExtraFields\RepeaterFieldService;
use MiniShop3\Services\CustomerDuplicateChecker;
use MiniShop3\Services\CustomerFactory;
Expand Down Expand Up @@ -1793,27 +1794,51 @@ protected function normalizeExtraFieldValue(string $modelClass, string $fieldKey
'active' => true,
]);

if (!$definition || $definition->get('xtype') !== RepeaterFieldService::XTYPE) {
if (!$definition) {
return ['ok' => true, 'value' => $value];
}

/** @var RepeaterFieldService $repeaterService */
$repeaterService = $this->modx->services->get('ms3_repeater_field');
$config = $repeaterService->parseConfig($definition->get('repeater_config'));
if ($definition->get('xtype') === RepeaterFieldService::XTYPE) {
/** @var RepeaterFieldService $repeaterService */
$repeaterService = $this->modx->services->get('ms3_repeater_field');
$config = $repeaterService->parseConfig($definition->get('repeater_config'));

try {
return ['ok' => true, 'value' => $repeaterService->processValue($value, $config)];
} catch (\InvalidArgumentException $e) {
$this->modx->lexicon->load('minishop3:default');
try {
return ['ok' => true, 'value' => $repeaterService->processValue($value, $config)];
} catch (\InvalidArgumentException $e) {
$this->modx->lexicon->load('minishop3:default');

return [
'ok' => false,
'message' => $this->modx->lexicon('ms3_repeater_validation_error', [
'field' => $fieldKey,
'error' => $e->getMessage(),
]),
];
}
}

if ($definition->get('xtype') === KeyValueFieldService::XTYPE) {
/** @var KeyValueFieldService $keyValueService */
$keyValueService = $this->modx->services->get('ms3_key_value_field');
$config = $keyValueService->parseConfig($definition->get('key_value_config'));

return [
'ok' => false,
'message' => $this->modx->lexicon('ms3_repeater_validation_error', [
'field' => $fieldKey,
'error' => $e->getMessage(),
]),
];
try {
return ['ok' => true, 'value' => $keyValueService->processValue($value, $config)];
} catch (\InvalidArgumentException $e) {
$this->modx->lexicon->load('minishop3:default');

return [
'ok' => false,
'message' => $this->modx->lexicon('ms3_key_value_validation_error', [
'field' => $fieldKey,
'error' => $e->getMessage(),
]),
];
}
}

return ['ok' => true, 'value' => $value];
}

/**
Expand Down
6 changes: 6 additions & 0 deletions core/components/minishop3/src/Model/mysql/msExtraField.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class msExtraField extends \MiniShop3\Model\msExtraField
'active' => 0,
'select_options' => null,
'repeater_config' => null,
'key_value_config' => null,
],
'fieldMeta' => [
'class' => [
Expand Down Expand Up @@ -129,6 +130,11 @@ class msExtraField extends \MiniShop3\Model\msExtraField
'phptype' => 'string',
'null' => true,
],
'key_value_config' => [
'dbtype' => 'text',
'phptype' => 'string',
'null' => true,
],
],
'indexes' => [],
'composites' => [],
Expand Down
4 changes: 4 additions & 0 deletions core/components/minishop3/src/ServiceRegistry.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ class ServiceRegistry
'class' => \MiniShop3\Services\ExtraFields\RepeaterFieldService::class,
'interface' => null,
],
'ms3_key_value_field' => [
'class' => \MiniShop3\Services\ExtraFields\KeyValueFieldService::class,
'interface' => null,
],
'ms3_product_image' => [
'class' => \MiniShop3\Services\Product\ProductImageService::class,
'interface' => null,
Expand Down
Loading