feat(mgr): тип Дата для extra fields - #623
Conversation
Expose datefield in ExtraFieldsManager with DATE column defaults and keep YYYY-MM-DD in parent state so saves do not truncate native order datetime.
Conflict resolution: PR 640 supersedes merged modx-pro#621 rework (same author, same intent) — took PR side for 36 files; manually preserved modx-pro#631 useConfirm grids, modx-pro#623 datefield dialog styles, modx-pro#643 gallery bits, modx-pro#605 order entry; ProductData sections rebuilt on groupProductDataSections (keeps modx-pro#611/modx-pro#620 sort_order) under PR 640 Panel layout.
|
Этот PR включён в тестовую интеграционную сборку всех открытых PR MiniShop3: AgelxNash/MiniShop3, ветка Сборка нужна, чтобы проверить совместимость взаимозависимых серий PR до их мержа — при последовательном слиянии они конфликтуют друг с другом. Это не ревью и не конкурирующий PR: авторство сохранено (1 PR = 1 коммит с исходным автором), ветка пересобирается по мере обновления PR. Как вошёл в сборку: Слился чисто. (При последующем #640 вручную сохранены его |
|
Спасибо за PR! Пожелание: скорейшего ревью и мержа 👍 Удачи! |
|
Смёрджил с актуальной После мержа всё зелёное: smoke 92/92, PHPUnit 288 тестов / 719 assertions, ESLint по четырём изменённым файлам чисто, vitest 48/48 (включая твои 5 в Сама реализация со стороны фронта аккуратная — хранение как Но есть блокирующий баг в самом базовом сценарии. Сохранение товара падает, если необязательное поле «Дата» оставлено пустымЦепочка, прослежена по коду:
// Cast numeric/boolean fields (incl. extra fields) so '' does not break MySQL decimals/ints
match ($phptype) {
'float' => $productData->set($key, $isEmpty ? 0.0 : (float)$value),
'integer' => $productData->set($key, $isEmpty ? 0 : (int)$value),
'boolean' => $productData->set($key, $isEmpty ? false : (bool)$value),
default => null,
};Комментарий здесь прямым текстом описывает ровно эту проблему — «чтобы
То есть создать необязательное поле «Дата» и не заполнить его — это ошибка сохранения товара. Для optional-поля это не край, а основной случай. Второй эффект того же корня: уже заполненную дату нельзя очистить. В описании PR ты пометил Где чинить: нормализация нужна до Заодно, раз будешь трогать этот путь
Тестов на Ограничение проверкиЯ разбирал конкретно путь Само API — формат хранения, лексиконы на двух языках, разграничение datefield и остальных xtype в |
Описание
В каталоге extra fields не было типа Дата, хотя в Опциях он уже есть. Добавлен
datefieldв ExtraFieldsManager с дефолтами колонкиDATE, рендер через DatePicker и хранение значения в родителе какYYYY-MM-DD(без UTC-сдвига и без обрезки времени у нативных datetime полей заказа).Тип изменений
Связанные Issues
Closes #612
Как это было протестировано?
Конфигурация тестирования:
feat/issue-612-extra-field-dateЧеклист
ms3_vue_xtype_datefield,ms3_vue_dbtype_date)Дополнительные заметки
Gate A
Review: thermo BLOCK (Date в parent + общий serialize) исправлен: Date только в DynamicField, parent получает
YYYY-MM-DD. Soft:phptype=datetimeприdbtype=date— как дефолт UI; в phptypeOptions нет отдельногоdate.Routing: plan=
cursor-grok-4.6-high-fast, make=composer-2.5-fast, review=gpt-5.6-sol-medium(Opus slug недоступен в Task), thermo=cursor-grok-4.6-high-fast, simplify=composer-2.5-fast