refactor(store): extract write-side into command classes
Move inline INSERT/UPDATE/DELETE from store.php into
StoreProductCommand and StoreGroupCommand. Logging goes
through LogStore/Dto. editServer save left as-is.
fix(updater): stream archive files instead of loading into memory
ArchiveHandler::addFile and extractFile used file_get_contents and
getFromName, loading whole files into RAM. A 185 MB entry blew the
256 MB limit. Switched to ZipArchive::addFile and getStream with
stream_copy_to_stream 14 memory is now O(1) regardless of file size.
feat(updater): user-configurable ignore list
Adds an admin modal to edit update_ignored_paths. IgnoredPathsConfig
merges the parsed patterns (comments and blanks skipped, regex escaped)
into both build and site lists, so configured files are neither
overwritten nor deleted on update.
refactor(store): hydrate helper, DECIMAL money, footer unification
- BundleItems::hydrate() 14 single helper for item enrichment from base products
- store.php: use hydrate in package/add/itemID, drop duplicated loops
- store.php: fix double-fetch (single while on cursor, no silent skip)
- store.php: hydrate now works for set, switch, roulette uniformly
- modal_bundle.tpl: badge visibility depends only on amount (uses_count drives multiply, not visibility)
- modal_footer_price.tpl: unified recalc for product/set, hide count when no %count% item
- shop.js: guard responseCheckedData against empty formID (roulette crash)
- migration 19168: ALTER money/realmoney to DECIMAL(11,2) 14 fix float drift