Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f94daeb76 | |||
| 72159062f5 | |||
| 2461087d9b | |||
| 6434933dfb | |||
| 28f53b7998 | |||
| 98029b1720 |
File diff suppressed because one or more lines are too long
47
.serena/memories/code_style_and_conventions.md
Normal file
47
.serena/memories/code_style_and_conventions.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# Code Style and Conventions
|
||||
|
||||
## PHP Version
|
||||
PHP 7.4 — no PHP 8.0+ features allowed.
|
||||
|
||||
## File Naming
|
||||
- New classes: `ClassName.php` (no prefix)
|
||||
- Legacy classes: `class.ClassName.php` (leave until migrated)
|
||||
|
||||
## DI Pattern (all new code)
|
||||
```php
|
||||
class ExampleRepository {
|
||||
private $db;
|
||||
public function __construct($db) {
|
||||
$this->db = $db;
|
||||
}
|
||||
public function find(int $id): ?array {
|
||||
return $this->db->get('pp_table', '*', ['id' => $id]);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Controller Wiring
|
||||
- Admin: `admin\App::getControllerFactories()`
|
||||
- Frontend: `front\App::getControllerFactories()`
|
||||
- API: `api\ApiRouter::getControllerFactories()`
|
||||
|
||||
## Medoo ORM Pitfalls
|
||||
- `$mdb->delete($table, $where)` takes 2 arguments, NOT 3
|
||||
- `$mdb->get()` returns `null` when no record, NOT `false`
|
||||
- After `$mdb->insert()`, check `$mdb->id()` to confirm success
|
||||
|
||||
## Test Conventions
|
||||
- Extend `PHPUnit\Framework\TestCase`
|
||||
- Mock Medoo: `$this->createMock(\medoo::class)`
|
||||
- AAA pattern: Arrange, Act, Assert
|
||||
- Mirror source structure: `tests/Unit/Domain/{Module}/{Class}Test.php`
|
||||
|
||||
## Caching
|
||||
- Redis via `\Shared\Cache\CacheHandler`
|
||||
- Key pattern: `shop\product:{id}:{lang}:{permutation_hash}`
|
||||
- Default TTL: 86400 (24h)
|
||||
- Data serialized — use `unserialize()` after `get()`
|
||||
|
||||
## Database
|
||||
- Table prefix: `pp_`
|
||||
- Key tables: `pp_shop_products`, `pp_shop_orders`, `pp_shop_categories`, `pp_shop_clients`
|
||||
65
.serena/memories/project_overview.md
Normal file
65
.serena/memories/project_overview.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# shopPRO — Project Overview
|
||||
|
||||
## Purpose
|
||||
shopPRO is a PHP e-commerce platform with an admin panel, customer-facing storefront, and REST API.
|
||||
|
||||
## Tech Stack
|
||||
- **Language**: PHP 7.4 (production runs PHP < 8.0 — do NOT use PHP 8.0+ syntax!)
|
||||
- **ORM**: Medoo (`$mdb` global, injected via DI in new code)
|
||||
- **Caching**: Redis via `\Shared\Cache\CacheHandler`
|
||||
- **Testing**: PHPUnit 9.6 via `phpunit.phar`
|
||||
- **Frontend**: Custom template engine (`\Shared\Tpl\Tpl`)
|
||||
- **Database**: MySQL with `pp_` table prefix
|
||||
- **Platform**: Windows (development), Linux (production)
|
||||
|
||||
## PHP 7.4 Constraint — CRITICAL
|
||||
Do NOT use any PHP 8.0+ features:
|
||||
- No `match` expressions (use ternary/if-else)
|
||||
- No named arguments
|
||||
- No union types (`int|string`)
|
||||
- No `str_contains()`, `str_starts_with()`, `str_ends_with()`
|
||||
|
||||
## Architecture
|
||||
Domain-Driven Design with Dependency Injection.
|
||||
|
||||
### Layers
|
||||
1. **Domain** (`autoload/Domain/`) — Business logic repositories, 27 modules
|
||||
2. **Admin** (`autoload/admin/`) — Admin panel controllers, support, validation, view models
|
||||
3. **Frontend** (`autoload/front/`) — Customer-facing controllers and views
|
||||
4. **API** (`autoload/api/`) — REST API controllers
|
||||
5. **Shared** (`autoload/Shared/`) — Cache, Email, Helpers, Html, Image, Tpl
|
||||
|
||||
### Domain Modules
|
||||
Article, Attribute, Banner, Basket, Cache, Category, Client, Coupon, Dashboard, Dictionaries, Integrations, Languages, Layouts, Newsletter, Order, Pages, PaymentMethod, Producer, Product, ProductSet, Promotion, Scontainers, Settings, ShopStatus, Transport, Update, User
|
||||
|
||||
### Entry Points
|
||||
- `index.php` — Frontend
|
||||
- `admin/index.php` — Admin panel
|
||||
- `api.php` — REST API
|
||||
- `ajax.php` — Frontend AJAX
|
||||
- `admin/ajax.php` — Admin AJAX
|
||||
- `cron.php` — CRON jobs
|
||||
|
||||
### Namespace Conventions (case-sensitive on Linux!)
|
||||
- `\Domain\` → `autoload/Domain/` (uppercase D)
|
||||
- `\admin\Controllers\` → `autoload/admin/Controllers/` (lowercase a)
|
||||
- `\Shared\` → `autoload/Shared/`
|
||||
- `\front\` → `autoload/front/`
|
||||
- `\api\` → `autoload/api/`
|
||||
|
||||
### Autoloader
|
||||
Custom autoloader (not Composer at runtime). Tries:
|
||||
1. `autoload/{namespace}/class.{ClassName}.php` (legacy)
|
||||
2. `autoload/{namespace}/{ClassName}.php` (PSR-4 style)
|
||||
|
||||
### Key Classes
|
||||
- `\admin\App` — Admin router
|
||||
- `\front\App` — Frontend router
|
||||
- `\front\LayoutEngine` — Frontend layout engine
|
||||
- `\Shared\Helpers\Helpers` — Utility methods
|
||||
- `\Shared\Tpl\Tpl` — Template engine
|
||||
- `\Shared\Cache\CacheHandler` — Redis cache
|
||||
- `\api\ApiRouter` — REST API router
|
||||
|
||||
## Test Suite
|
||||
765 tests, 2153 assertions. Tests mirror source structure in `tests/Unit/`.
|
||||
41
.serena/memories/suggested_commands.md
Normal file
41
.serena/memories/suggested_commands.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Suggested Commands
|
||||
|
||||
## Testing
|
||||
```bash
|
||||
# Full test suite (recommended, PowerShell)
|
||||
./test.ps1
|
||||
|
||||
# Specific test file
|
||||
./test.ps1 tests/Unit/Domain/Product/ProductRepositoryTest.php
|
||||
|
||||
# Specific test method
|
||||
./test.ps1 --filter testGetQuantityReturnsCorrectValue
|
||||
|
||||
# Via composer
|
||||
composer test
|
||||
```
|
||||
|
||||
## System Utilities (Windows with Git Bash)
|
||||
```bash
|
||||
# Use Unix-style commands (Git Bash shell)
|
||||
ls # list directory
|
||||
grep -r # search content (prefer Serena tools instead)
|
||||
git status # git operations
|
||||
git log --oneline -10
|
||||
git diff
|
||||
git add <file>
|
||||
git commit -m "message"
|
||||
git push
|
||||
```
|
||||
|
||||
## Development
|
||||
```bash
|
||||
# No build step — PHP is interpreted
|
||||
# No linting/formatting tool configured
|
||||
# Entry points are served via web server (XAMPP)
|
||||
```
|
||||
|
||||
## PHP binary
|
||||
```
|
||||
C:\xampp\php\php.exe
|
||||
```
|
||||
25
.serena/memories/task_completion_checklist.md
Normal file
25
.serena/memories/task_completion_checklist.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Task Completion Checklist
|
||||
|
||||
When user says "KONIEC PRACY", execute in order:
|
||||
|
||||
1. **Run tests** — `./test.ps1`
|
||||
2. **Update documentation if needed**:
|
||||
- `docs/DATABASE_STRUCTURE.md`
|
||||
- `docs/PROJECT_STRUCTURE.md`
|
||||
- `docs/FORM_EDIT_SYSTEM.md`
|
||||
- `docs/CHANGELOG.md`
|
||||
- `docs/TESTING.md`
|
||||
3. **SQL migrations** (if DB changes): place in `migrations/{version}.sql`
|
||||
- NOT in `updates/` — build script reads from `migrations/` automatically
|
||||
4. **Commit** changes
|
||||
5. **Push** to remote
|
||||
|
||||
## Key Documentation Files
|
||||
- `docs/MEMORY.md` — project memory, known issues
|
||||
- `docs/PROJECT_STRUCTURE.md` — architecture
|
||||
- `docs/DATABASE_STRUCTURE.md` — full DB schema
|
||||
- `docs/TESTING.md` — test suite guide
|
||||
- `docs/FORM_EDIT_SYSTEM.md` — form system
|
||||
- `docs/CHANGELOG.md` — version history
|
||||
- `docs/API.md` — REST API docs
|
||||
- `docs/UPDATE_INSTRUCTIONS.md` — update packages
|
||||
BIN
autoload/.DS_Store
vendored
Normal file
BIN
autoload/.DS_Store
vendored
Normal file
Binary file not shown.
@@ -172,13 +172,19 @@ class UpdateRepository
|
||||
|
||||
foreach ( $manifest['sql'] as $query ) {
|
||||
$query = trim( $query );
|
||||
if ( $query !== '' ) {
|
||||
if ( $query === '' || strpos( $query, '--' ) === 0 ) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
if ( $this->db->query( $query ) ) {
|
||||
$success++;
|
||||
} else {
|
||||
$errors++;
|
||||
$log[] = '[WARNING] Błąd SQL: ' . $query;
|
||||
}
|
||||
} catch ( \Exception $e ) {
|
||||
$errors++;
|
||||
$log[] = '[WARNING] Wyjątek SQL: ' . $e->getMessage() . ' | Query: ' . substr( $query, 0, 200 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -104,6 +104,9 @@ class ApiRouter
|
||||
$producerRepo = new \Domain\Producer\ProducerRepository($db);
|
||||
return new Controllers\DictionariesApiController($statusRepo, $transportRepo, $paymentRepo, $attrRepo, $producerRepo);
|
||||
},
|
||||
'categories' => function () use ($db) {
|
||||
return new Controllers\CategoriesApiController();
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
104
autoload/api/Controllers/CategoriesApiController.php
Normal file
104
autoload/api/Controllers/CategoriesApiController.php
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
namespace api\Controllers;
|
||||
|
||||
use api\ApiRouter;
|
||||
|
||||
class CategoriesApiController
|
||||
{
|
||||
public function list(): void
|
||||
{
|
||||
if (!ApiRouter::requireMethod('GET')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$db = $GLOBALS['mdb'] ?? null;
|
||||
if (!$db) {
|
||||
ApiRouter::sendError('INTERNAL_ERROR', 'Database not available', 500);
|
||||
return;
|
||||
}
|
||||
|
||||
// Default shop language
|
||||
$defaultLang = $db->get('pp_langs', 'id', ['start' => 1]);
|
||||
if (!$defaultLang) {
|
||||
$defaultLang = 'pl';
|
||||
}
|
||||
$defaultLang = (string)$defaultLang;
|
||||
|
||||
// All active categories, ordered by display order
|
||||
$rows = $db->select(
|
||||
'pp_shop_categories',
|
||||
['id', 'parent_id'],
|
||||
[
|
||||
'status' => 1,
|
||||
'ORDER' => ['o' => 'ASC'],
|
||||
]
|
||||
);
|
||||
|
||||
if (!is_array($rows) || empty($rows)) {
|
||||
ApiRouter::sendSuccess(['categories' => []]);
|
||||
return;
|
||||
}
|
||||
|
||||
$categoryIds = array_values(array_filter(
|
||||
array_map(fn($row) => (int)($row['id'] ?? 0), $rows),
|
||||
fn($id) => $id > 0
|
||||
));
|
||||
|
||||
// Bulk fetch titles for default language
|
||||
$titlesByCategory = [];
|
||||
$titleRows = $db->select('pp_shop_categories_langs', ['category_id', 'title'], [
|
||||
'AND' => [
|
||||
'category_id' => $categoryIds,
|
||||
'lang_id' => $defaultLang,
|
||||
'title[!]' => '',
|
||||
],
|
||||
]);
|
||||
if (is_array($titleRows)) {
|
||||
foreach ($titleRows as $tr) {
|
||||
$tid = (int)($tr['category_id'] ?? 0);
|
||||
if ($tid > 0 && !isset($titlesByCategory[$tid])) {
|
||||
$titlesByCategory[$tid] = (string)($tr['title'] ?? '');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Bulk fetch fallback titles for categories without a title in default language
|
||||
$missingIds = array_values(array_filter($categoryIds, fn($id) => !isset($titlesByCategory[$id])));
|
||||
if (!empty($missingIds)) {
|
||||
$fallbackRows = $db->select('pp_shop_categories_langs', ['category_id', 'title'], [
|
||||
'AND' => [
|
||||
'category_id' => $missingIds,
|
||||
'title[!]' => '',
|
||||
],
|
||||
]);
|
||||
if (is_array($fallbackRows)) {
|
||||
foreach ($fallbackRows as $fr) {
|
||||
$fid = (int)($fr['category_id'] ?? 0);
|
||||
if ($fid > 0 && !isset($titlesByCategory[$fid])) {
|
||||
$titlesByCategory[$fid] = (string)($fr['title'] ?? '');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build flat category list
|
||||
$categories = [];
|
||||
foreach ($rows as $row) {
|
||||
$categoryId = (int)($row['id'] ?? 0);
|
||||
if ($categoryId <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$parentId = $row['parent_id'] !== null ? (int)$row['parent_id'] : null;
|
||||
$title = $titlesByCategory[$categoryId] ?? ('Kategoria #' . $categoryId);
|
||||
|
||||
$categories[] = [
|
||||
'id' => $categoryId,
|
||||
'parent_id' => $parentId,
|
||||
'title' => $title,
|
||||
];
|
||||
}
|
||||
|
||||
ApiRouter::sendSuccess(['categories' => $categories]);
|
||||
}
|
||||
}
|
||||
BIN
autoload/front/.DS_Store
vendored
Normal file
BIN
autoload/front/.DS_Store
vendored
Normal file
Binary file not shown.
@@ -215,7 +215,10 @@ $sqlQueries = @()
|
||||
$migrationFile = "migrations/$versionNumber.sql"
|
||||
|
||||
if (Test-Path $migrationFile) {
|
||||
$sqlQueries = @(Get-Content $migrationFile | Where-Object { $_.Trim() -ne '' } | ForEach-Object { $_.ToString() })
|
||||
# Read entire file, strip comment lines, split by semicolons to get complete SQL statements
|
||||
$rawLines = Get-Content $migrationFile | Where-Object { $_.Trim() -ne '' -and $_.Trim() -notmatch '^\s*--' }
|
||||
$rawSql = ($rawLines -join "`n").Trim()
|
||||
$sqlQueries = @($rawSql -split ';' | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' } | ForEach-Object { $_.ToString() })
|
||||
Write-Step "Znaleziono migracje SQL: $migrationFile ($($sqlQueries.Count) zapytan)"
|
||||
} else {
|
||||
Write-Step "Brak migracji SQL ($migrationFile nie istnieje)"
|
||||
|
||||
@@ -17,4 +17,6 @@ $config['debug']['apilo'] = true;
|
||||
|
||||
$config['trustmate']['enabled'] = true;
|
||||
$config['trustmate']['uid'] = '34eb36ba-c715-4cdc-8707-22376c9f14c7';
|
||||
|
||||
$config['cron_key'] = 'Gi7FzWtkry19hZ1BqT1LKEWfwokQpigh';
|
||||
?>
|
||||
|
||||
33
docs/API.md
33
docs/API.md
@@ -440,6 +440,38 @@ Odpowiedz:
|
||||
}
|
||||
```
|
||||
|
||||
### Kategorie
|
||||
|
||||
#### Lista kategorii
|
||||
```
|
||||
GET api.php?endpoint=categories&action=list
|
||||
```
|
||||
|
||||
Zwraca plaska liste wszystkich aktywnych kategorii w domyslnym jezyku sklepu.
|
||||
|
||||
Odpowiedz:
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"data": {
|
||||
"categories": [
|
||||
{"id": 1, "parent_id": null, "title": "Kategoria glowna"},
|
||||
{"id": 3, "parent_id": 1, "title": "Podkategoria A"},
|
||||
{"id": 5, "parent_id": 1, "title": "Podkategoria B"}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Pola odpowiedzi:
|
||||
| Pole | Typ | Opis |
|
||||
|------|-----|------|
|
||||
| `id` | int | ID kategorii |
|
||||
| `parent_id` | int\|null | ID kategorii nadrzednej (null = kategoria glowna) |
|
||||
| `title` | string | Nazwa w domyslnym jezyku; fallback na inny jezyk jesli brak tlumaczenia |
|
||||
|
||||
---
|
||||
|
||||
### Slowniki
|
||||
|
||||
#### Lista statusow zamowien
|
||||
@@ -549,3 +581,4 @@ UPDATE pp_settings SET value = 'twoj-klucz-api' WHERE param = 'api_key';
|
||||
- `OrdersApiController` — zamowienia (5 akcji)
|
||||
- `ProductsApiController` — produkty (8 akcji: list, get, create, update, variants, create_variant, update_variant, delete_variant)
|
||||
- `DictionariesApiController` — slowniki (5 akcji: statuses, transports, payment_methods, attributes, ensure_producer)
|
||||
- `CategoriesApiController` — kategorie (1 akcja: list)
|
||||
|
||||
@@ -4,6 +4,14 @@ Logi zmian z migracji na Domain-Driven Architecture. Najnowsze na gorze.
|
||||
|
||||
---
|
||||
|
||||
## ver. 0.326 (2026-02-27) - API: endpoint categories/list
|
||||
|
||||
- **NEW**: `api\Controllers\CategoriesApiController` — nowy kontroler API z akcją `list`
|
||||
- **NEW**: Endpoint `GET api.php?endpoint=categories&action=list` — zwraca płaską listę aktywnych kategorii (id, parent_id, title) w domyślnym języku sklepu
|
||||
- **FIX**: Usunięto zbędny parametr w `CategoryRepository`, eliminacja N+1 queries w categories/list przez bulk-fetch tytułów
|
||||
|
||||
---
|
||||
|
||||
## ver. 0.325 (2026-02-27) - Fix changelog encoding + limit wyświetlania
|
||||
|
||||
- **FIX**: `updates/changelog.php` — naprawione krzaczki (mojibake) w polskich znakach; dane odbudowane z plików manifest
|
||||
|
||||
@@ -85,6 +85,7 @@ REST API dla ordersPRO. Entry point: `api.php`. Stateless (bez sesji), autentyka
|
||||
- `OrdersApiController` — lista, szczegoly, zmiana statusu, platnosc (5 akcji)
|
||||
- `ProductsApiController` — lista, szczegoly, tworzenie, aktualizacja produktow (4 akcje)
|
||||
- `DictionariesApiController` — statusy, transporty, metody platnosci (3 akcje)
|
||||
- `CategoriesApiController` — lista aktywnych kategorii (1 akcja)
|
||||
|
||||
Dokumentacja: `docs/API.md`
|
||||
|
||||
|
||||
@@ -26,51 +26,9 @@
|
||||
},
|
||||
"checksum_zip": "sha256:63237e6bdb2ed2c2632cebb45431b26ecd5717b129aa2180540ebce0c3bff77f",
|
||||
"sql": [
|
||||
"-- System kolejki zadań cron",
|
||||
"-- Wersja: 0.324",
|
||||
"CREATE TABLE IF NOT EXISTS pp_cron_jobs (",
|
||||
" id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,",
|
||||
" job_type VARCHAR(50) NOT NULL,",
|
||||
" status ENUM(\u0027pending\u0027,\u0027processing\u0027,\u0027completed\u0027,\u0027failed\u0027,\u0027cancelled\u0027) NOT NULL DEFAULT \u0027pending\u0027,",
|
||||
" priority TINYINT UNSIGNED NOT NULL DEFAULT 100,",
|
||||
" payload TEXT NULL,",
|
||||
" result TEXT NULL,",
|
||||
" attempts SMALLINT UNSIGNED NOT NULL DEFAULT 0,",
|
||||
" max_attempts SMALLINT UNSIGNED NOT NULL DEFAULT 10,",
|
||||
" last_error VARCHAR(500) NULL,",
|
||||
" scheduled_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,",
|
||||
" started_at DATETIME NULL,",
|
||||
" completed_at DATETIME NULL,",
|
||||
" created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,",
|
||||
" updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,",
|
||||
" INDEX idx_status_priority_scheduled (status, priority, scheduled_at),",
|
||||
" INDEX idx_job_type (job_type),",
|
||||
" INDEX idx_status (status)",
|
||||
") ENGINE=InnoDB DEFAULT CHARSET=utf8;",
|
||||
"CREATE TABLE IF NOT EXISTS pp_cron_schedules (",
|
||||
" id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,",
|
||||
" job_type VARCHAR(50) NOT NULL UNIQUE,",
|
||||
" interval_seconds INT UNSIGNED NOT NULL,",
|
||||
" priority TINYINT UNSIGNED NOT NULL DEFAULT 100,",
|
||||
" max_attempts SMALLINT UNSIGNED NOT NULL DEFAULT 3,",
|
||||
" payload TEXT NULL,",
|
||||
" enabled TINYINT(1) NOT NULL DEFAULT 1,",
|
||||
" last_run_at DATETIME NULL,",
|
||||
" next_run_at DATETIME NULL,",
|
||||
" created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,",
|
||||
" INDEX idx_enabled_next_run (enabled, next_run_at)",
|
||||
") ENGINE=InnoDB DEFAULT CHARSET=utf8;",
|
||||
"-- Harmonogramy zadań",
|
||||
"INSERT INTO pp_cron_schedules (job_type, interval_seconds, priority, max_attempts) VALUES",
|
||||
"(\u0027apilo_token_keepalive\u0027, 240, 10, 3),",
|
||||
"(\u0027apilo_send_order\u0027, 60, 40, 10),",
|
||||
"(\u0027apilo_product_sync\u0027, 600, 100, 3),",
|
||||
"(\u0027apilo_pricelist_sync\u0027, 3600, 100, 3),",
|
||||
"(\u0027apilo_status_poll\u0027, 600, 100, 3),",
|
||||
"(\u0027price_history\u0027, 86400, 100, 3),",
|
||||
"(\u0027order_analysis\u0027, 600, 100, 3),",
|
||||
"(\u0027trustmate_invitation\u0027, 600, 200, 3),",
|
||||
"(\u0027google_xml_feed\u0027, 3600, 200, 3);"
|
||||
"CREATE TABLE IF NOT EXISTS pp_cron_jobs ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, job_type VARCHAR(50) NOT NULL, status ENUM('pending','processing','completed','failed','cancelled') NOT NULL DEFAULT 'pending', priority TINYINT UNSIGNED NOT NULL DEFAULT 100, payload TEXT NULL, result TEXT NULL, attempts SMALLINT UNSIGNED NOT NULL DEFAULT 0, max_attempts SMALLINT UNSIGNED NOT NULL DEFAULT 10, last_error VARCHAR(500) NULL, scheduled_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, started_at DATETIME NULL, completed_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_status_priority_scheduled (status, priority, scheduled_at), INDEX idx_job_type (job_type), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8",
|
||||
"CREATE TABLE IF NOT EXISTS pp_cron_schedules ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, job_type VARCHAR(50) NOT NULL UNIQUE, interval_seconds INT UNSIGNED NOT NULL, priority TINYINT UNSIGNED NOT NULL DEFAULT 100, max_attempts SMALLINT UNSIGNED NOT NULL DEFAULT 3, payload TEXT NULL, enabled TINYINT(1) NOT NULL DEFAULT 1, last_run_at DATETIME NULL, next_run_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_enabled_next_run (enabled, next_run_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8",
|
||||
"INSERT INTO pp_cron_schedules (job_type, interval_seconds, priority, max_attempts) VALUES ('apilo_token_keepalive', 240, 10, 3), ('apilo_send_order', 60, 40, 10), ('apilo_product_sync', 600, 100, 3), ('apilo_pricelist_sync', 3600, 100, 3), ('apilo_status_poll', 600, 100, 3), ('price_history', 86400, 100, 3), ('order_analysis', 600, 100, 3), ('trustmate_invitation', 600, 200, 3), ('google_xml_feed', 3600, 200, 3)"
|
||||
],
|
||||
"date": "2026-02-27",
|
||||
"directories_deleted": [
|
||||
|
||||
BIN
updates/0.30/ver_0.325.zip
Normal file
BIN
updates/0.30/ver_0.325.zip
Normal file
Binary file not shown.
23
updates/0.30/ver_0.325_manifest.json
Normal file
23
updates/0.30/ver_0.325_manifest.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"changelog": "FIX - naprawione krzaczki (mojibake) w changelog, limit wyswietlania do 5 wersji wstecz od wersji instancji",
|
||||
"version": "0.325",
|
||||
"files": {
|
||||
"added": [
|
||||
|
||||
],
|
||||
"deleted": [
|
||||
|
||||
],
|
||||
"modified": [
|
||||
"admin/templates/update/main-view.php"
|
||||
]
|
||||
},
|
||||
"checksum_zip": "sha256:2fbafb77747d60e90d511f76d1c974bd866519a3ebb4d2a7a1dda062c00572f2",
|
||||
"sql": [
|
||||
|
||||
],
|
||||
"date": "2026-02-27",
|
||||
"directories_deleted": [
|
||||
|
||||
]
|
||||
}
|
||||
@@ -1,26 +1,29 @@
|
||||
<b>ver. 0.325 - 27.02.2026</b><br />
|
||||
FIX - naprawione krzaczki (mojibake) w changelog, limit wyswietlania do 5 wersji wstecz od wersji instancji
|
||||
<hr>
|
||||
<b>ver. 0.324 - 27.02.2026</b><br />
|
||||
NEW - system kolejki zadań cron (DB), priorytetowe przetwarzanie, retry/backoff, ochrona endpointu cron
|
||||
NEW - system kolejki zadań cron (DB), priorytetowe przetwarzanie, retry/backoff, ochrona endpointu cron
|
||||
<hr>
|
||||
<b>ver. 0.323 - 24.02.2026</b><br />
|
||||
FIX - refactor importu zdjec w shopPRO import (walidacja HTTP, curl timeouty, logi), FIX - saveCustomFields tylko przy jawnym podaniu, FIX - delete() czysci custom_fields, FIX - sciezka upload w API, NEW - trwale usuwanie produktow z archiwum
|
||||
<hr>
|
||||
<b>ver. 0.322 - 24.02.2026</b><br />
|
||||
FIX - custom_fields: jawne mapowanie kluczy w ProductRepository, spójne !empty w ProductsApiController
|
||||
FIX - custom_fields: jawne mapowanie kluczy w ProductRepository, spĂłjne !empty w ProductsApiController
|
||||
<hr>
|
||||
<b>ver. 0.321 - 24.02.2026</b><br />
|
||||
NEW - API: obsługa custom_fields w create/update produktu
|
||||
NEW - API: obsługa custom_fields w create/update produktu
|
||||
<hr>
|
||||
<b>ver. 0.320 - 24.02.2026</b><br />
|
||||
NEW - API: endpoint ensure_producer (znajdź lub utwórz producenta); GET product zwraca producer_name
|
||||
NEW - API: endpoint ensure_producer (znajdĹş lub utwĂłrz producenta); GET product zwraca producer_name
|
||||
<hr>
|
||||
<b>ver. 0.319 - 24.02.2026</b><br />
|
||||
FIX - usunięcie shopPRO eksportu produktów; API produktu: dodano custom_fields i security_information
|
||||
FIX - usunięcie shopPRO eksportu produktów; API produktu: dodano custom_fields i security_information
|
||||
<hr>
|
||||
<b>ver. 0.318 - 24.02.2026</b><br />
|
||||
NEW - shopPRO export produktów + API endpoints (ensure_attribute, ensure_attribute_value, upload_image)
|
||||
NEW - shopPRO export produktĂłw + API endpoints (ensure_attribute, ensure_attribute_value, upload_image)
|
||||
<hr>
|
||||
<b>ver. 0.317 - 23.02.2026</b><br />
|
||||
FIX - klucz API: fix zapisu (brakowalo w whiteliście), przycisk Generuj losowy klucz, ulepszony routing API
|
||||
FIX - klucz API: fix zapisu (brakowalo w whiteliście), przycisk Generuj losowy klucz, ulepszony routing API
|
||||
<hr>
|
||||
<b>ver. 0.316 - 23.02.2026</b><br />
|
||||
FIX - migracja brakujacej kolumny type w pp_shop_products_custom_fields
|
||||
@@ -29,16 +32,16 @@ FIX - migracja brakujacej kolumny type w pp_shop_products_custom_fields
|
||||
FIX - PDOException w listowaniu atrybutow admin (SQLSTATE HY093)
|
||||
<hr>
|
||||
<b>ver. 0.314 - 23.02.2026</b><br />
|
||||
FIX - naprawa globalnej wyszukiwarki admin (Content-Type, Cache-Control, POST, try/catch), NEW - title strony z numerem zamówienia
|
||||
FIX - naprawa globalnej wyszukiwarki admin (Content-Type, Cache-Control, POST, try/catch), NEW - title strony z numerem zamĂłwienia
|
||||
<hr>
|
||||
<b>ver. 0.313 - 23.02.2026</b><br />
|
||||
FIX - sync płatności Apilo (int cast na apilo_order_id PPxxxxxx dawał 0) + logowanie decyzji sync do pp_log
|
||||
FIX - sync płatności Apilo (int cast na apilo_order_id PPxxxxxx dawał 0) + logowanie decyzji sync do pp_log
|
||||
<hr>
|
||||
<b>ver. 0.312 - 23.02.2026</b><br />
|
||||
FIX - krytyczne bugi integracji Apilo: curl_getinfo po curl_close, nieskończona pętla wysyłki, ceny 0.00 PLN, walidacja cen
|
||||
FIX - krytyczne bugi integracji Apilo: curl_getinfo po curl_close, nieskończona pętla wysyłki, ceny 0.00 PLN, walidacja cen
|
||||
<hr>
|
||||
<b>ver. 0.311 - 23.02.2026</b><br />
|
||||
FIX - race condition callback płatności Apilo, persistence filtrów tabel admin, poprawki cen zamówień
|
||||
FIX - race condition callback płatności Apilo, persistence filtrów tabel admin, poprawki cen zamówień
|
||||
<hr>
|
||||
<b>ver. 0.310 - 23.02.2026</b><br />
|
||||
NEW - Zakladka Logi w sekcji Integracje (podglad pp_log z paginacja, sortowaniem, filtrami)
|
||||
@@ -68,10 +71,10 @@ FIX - naprawiono wyswietlanie atrybutow produktu na froncie (kolizja kolejnosci)
|
||||
NEW - REST API wariantow produktow (CRUD), slownik atrybutow, filtrowanie po atrybutach, wzbogacone atrybuty z tlumaczeniami
|
||||
<hr>
|
||||
<b>ver. 0.301 - 22.02.2026</b><br />
|
||||
NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
<hr>
|
||||
<b>ver. 0.300 - 21.02.2026</b><br />
|
||||
- NEW - System aktualizacji oparty na manifestach JSON (checksum SHA256, backup plików, automatyczny build)
|
||||
- NEW - System aktualizacji oparty na manifestach JSON (checksum SHA256, backup plikĂłw, automatyczny build)
|
||||
- NEW - Panel logu aktualizacji w panelu admina
|
||||
<hr>
|
||||
<b>ver. 0.299 - 21.02.2026</b><br />
|
||||
@@ -81,31 +84,31 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- FIX - kilka poprawek po aktualizacji
|
||||
<hr>
|
||||
<b>ver. 0.297 - 19.02.2026</b><br />
|
||||
- NEW - REST API produktów (lista, szczegóły, tworzenie, aktualizacja)
|
||||
- NEW - Endpoint products z filtrowaniem, sortowaniem i paginacją
|
||||
- NEW - Partial update produktów (tylko zmienione pola)
|
||||
- NEW - REST API produktów (lista, szczegóły, tworzenie, aktualizacja)
|
||||
- NEW - Endpoint products z filtrowaniem, sortowaniem i paginacjÄ…
|
||||
- NEW - Partial update produktĂłw (tylko zmienione pola)
|
||||
<hr>
|
||||
<b>ver. 0.296 - 19.02.2026</b><br />
|
||||
- NEW - REST API zamówień dla ordersPRO (lista, szczegóły, zmiana statusu, płatności)
|
||||
- NEW - Endpointy słownikowe (statusy, transporty, metody płatności)
|
||||
- NEW - REST API zamówień dla ordersPRO (lista, szczegóły, zmiana statusu, płatności)
|
||||
- NEW - Endpointy słownikowe (statusy, transporty, metody płatności)
|
||||
- NEW - Autentykacja API przez X-Api-Key header
|
||||
- NEW - Kolumna updated_at w pp_shop_orders (polling zmian)
|
||||
<hr>
|
||||
<b>ver. 0.295 - 19.02.2026</b><br />
|
||||
- NEW - Edycja produktów w zamówieniu z panelu admina (dodawanie, usuwanie, zmiana ilości/cen)
|
||||
- NEW - Wyszukiwarka produktów AJAX w formularzu edycji zamówienia
|
||||
- NEW - Automatyczna korekta stanów magazynowych i przeliczanie kosztu dostawy
|
||||
- FIX - Cena promo w zamówieniu = 0 gdy identyczna z ceną bazową
|
||||
- NEW - Edycja produktów w zamówieniu z panelu admina (dodawanie, usuwanie, zmiana ilości/cen)
|
||||
- NEW - Wyszukiwarka produktĂłw AJAX w formularzu edycji zamĂłwienia
|
||||
- NEW - Automatyczna korekta stanĂłw magazynowych i przeliczanie kosztu dostawy
|
||||
- FIX - Cena promo w zamĂłwieniu = 0 gdy identyczna z cenÄ… bazowÄ…
|
||||
<hr>
|
||||
<b>ver. 0.294 - 19.02.2026</b><br />
|
||||
- FIX - Code review zakończony (96/96 klas, ~1144 metod): 27 fixów across all layers
|
||||
- FIX - Code review zakończony (96/96 klas, ~1144 metod): 27 fixów across all layers
|
||||
- FIX - Domain: null guard na query()->fetchAll() w 8 repozytoriach, redundancja DI w PromotionRepository
|
||||
- FIX - Admin: null safety find() ?: [] w 10 kontrolerach, null guard w App logowaniu/2FA
|
||||
- FIX - Front: LayoutEngine undefined $level + $_GET null check, ShopBasketController missing global $lang_id
|
||||
- FIX - Shared: Helpers $_GET null check + bug 'png' → 'image/png' (Imagick lossless WebP nigdy nie działał)
|
||||
- FIX - Shared: Helpers $_GET null check + bug 'png' → 'image/png' (Imagick lossless WebP nigdy nie działał)
|
||||
<hr>
|
||||
<b>ver. 0.293 - 19.02.2026</b><br />
|
||||
- FIX - ArticleRepository: SQL injection fix (addslashes→parameterized), uproszczenie articleDetailsFrontend
|
||||
- FIX - ArticleRepository: SQL injection fix (addslashes→parameterized), uproszczenie articleDetailsFrontend
|
||||
- FIX - AttributeRepository: martwy class_exists('\S') blokowal czyszczenie cache/temp
|
||||
- FIX - CategoryRepository: martwy class_exists('\S') blokowal generowanie linkow SEO kategorii
|
||||
- FIX - BannerRepository: parametryzacja dat w SQL + null guard na query()
|
||||
@@ -124,12 +127,12 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- UPDATE - front\controls\Site przemianowany na front\App (router, camelCase: checkUrlParams, pageTitle)
|
||||
- UPDATE - front\view\Site przemianowany na front\LayoutEngine (layout engine, camelCase: cookieInformation)
|
||||
- CLEANUP - usuniete autoload/front/controls/ i autoload/front/view/ (puste foldery + pliki legacy)
|
||||
- UPDATE - usuniecie 12 legacy klas z autoload/shop/ (~2363 linii) — pelna migracja na Domain-Driven Architecture
|
||||
- UPDATE - usuniecie 12 legacy klas z autoload/shop/ (~2363 linii) — pelna migracja na Domain-Driven Architecture
|
||||
- UPDATE - class.Order.php: logika Apilo sync i email statusu przeniesiona do OrderAdminService
|
||||
- UPDATE - class.Product.php: ~20 metod przeniesionych do ProductRepository, calculate_basket_product_price do BasketCalculator
|
||||
- FIX - findCached(): stale Redis cache z obiektami \shop\Product powodowal ceny 0,00 zl
|
||||
- FIX - szablony: konwersja object access na array access po migracji Product
|
||||
- UPDATE - AttributeRepository::getAttributeValueById() — dodano Redis cache
|
||||
- UPDATE - AttributeRepository::getAttributeValueById() — dodano Redis cache
|
||||
- CLEANUP - katalog autoload/shop/ pusty, zero referencji \shop\ w aktywnym kodzie
|
||||
<hr>
|
||||
<b>ver. 0.291 - 17.02.2026</b><br />
|
||||
@@ -173,17 +176,17 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- FIX - Tpl::render() branch 3: sprawdzal templates_user ale ladowal templates
|
||||
<hr>
|
||||
<b>ver. 0.284 - 16.02.2026</b><br />
|
||||
- CLEANUP - usunieta klasa DbModel (base ORM) — logika wbudowana bezposrednio w shop\Promotion
|
||||
- CLEANUP - usunieta klasa DbModel (base ORM) — logika wbudowana bezposrednio w shop\Promotion
|
||||
<hr>
|
||||
<b>ver. 0.283 - 16.02.2026</b><br />
|
||||
- UPDATE - migracja class.S.php do Shared\Helpers\Helpers (~140 plikow przepietych)
|
||||
- UPDATE - migracja class.Html.php do Shared\Html\Html
|
||||
- UPDATE - migracja class.Email.php do Shared\Email\Email
|
||||
- UPDATE - migracja class.Image.php do Shared\Image\ImageManipulator
|
||||
- UPDATE - migracja class.Log.php do Shared\Log\Log (usunieta — logika przeniesiona)
|
||||
- UPDATE - migracja class.Log.php do Shared\Log\Log (usunieta — logika przeniesiona)
|
||||
- CLEANUP - usunieta class.Mobile_Detect.php (przestarzala detekcja UA)
|
||||
- CLEANUP - usunieto 12 nieuzywanych metod z klasy S
|
||||
- FIX - array_cartesian_product() — blad iteracji po niezdefiniowanej zmiennej
|
||||
- FIX - array_cartesian_product() — blad iteracji po niezdefiniowanej zmiennej
|
||||
<hr>
|
||||
<b>ver. 0.282 - 16.02.2026</b><br />
|
||||
- UPDATE - Cache cleanup: eliminacja legacy class.Cache.php, migracja CacheHandler i RedisConnection do Shared\Cache namespace
|
||||
@@ -195,7 +198,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
<hr>
|
||||
<b>ver. 0.281 - 16.02.2026</b><br />
|
||||
- UPDATE - migracja Banners frontend: factory + view do Domain/Views (DI)
|
||||
- NEW - `front\Views\Banners` — czysty VIEW (banners, mainBanner)
|
||||
- NEW - `front\Views\Banners` — czysty VIEW (banners, mainBanner)
|
||||
- UPDATE - `BannerRepository` rozszerzony o 2 metody frontendowe (banners, mainBanner) z Redis cache
|
||||
- UPDATE - `front\view\Site::show()` przepiety na repo + Views
|
||||
- CLEANUP - usuniete: front\factory\Banners, front\view\Banners
|
||||
@@ -203,10 +206,10 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
<hr>
|
||||
<b>ver. 0.280 - 16.02.2026</b><br />
|
||||
- UPDATE - migracja Articles frontend: factory + view + encja do Domain/Views (DI)
|
||||
- NEW - `front\Views\Articles` — czysty VIEW + utility (renderowanie, generateTableOfContents, generateHeadersIds, getImage)
|
||||
- NEW - `front\Views\Articles` — czysty VIEW + utility (renderowanie, generateTableOfContents, generateHeadersIds, getImage)
|
||||
- UPDATE - `ArticleRepository` rozszerzony o 8 metod frontendowych (z Redis cache)
|
||||
- UPDATE - `front\view\Site::show()` — 5 sekcji przepietych na repo + Views
|
||||
- UPDATE - `front\controls\Site::route()` — single article + page_type switch przepiete na repo + Views
|
||||
- UPDATE - `front\view\Site::show()` — 5 sekcji przepietych na repo + Views
|
||||
- UPDATE - `front\controls\Site::route()` — single article + page_type switch przepiete na repo + Views
|
||||
- UPDATE - 5 szablonow `templates/articles/*` przepietych na `\front\Views\Articles::`
|
||||
- CLEANUP - usuniete: `class.Article` (encja + metody statyczne), `front\factory\Settings` (fasada)
|
||||
- FIX - eliminacja `global $lang` z `articleNoindex()`, eliminacja zaleznosci od `front\factory\Pages::page_sort()`
|
||||
@@ -217,22 +220,22 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- UPDATE - nowy namespace `front\Controllers` z `NewsletterController` (DI via factory closures)
|
||||
- UPDATE - nowy namespace `front\Views` z `Languages` i `Newsletter` (czyste VIEW, statyczne metody)
|
||||
- UPDATE - routing frontend: `Site::getControllerFactories()` z fallback na stare kontrolery
|
||||
- FIX - `newsletter_unsubscribe()` — poprawiona skladnia medoo `delete()` (2 argumenty zamiast 3)
|
||||
- UPDATE - eliminacja fasady `front\factory\Languages` — 26 zaleznosci przepietych na `LanguagesRepository`
|
||||
- FIX - `newsletter_unsubscribe()` — poprawiona skladnia medoo `delete()` (2 argumenty zamiast 3)
|
||||
- UPDATE - eliminacja fasady `front\factory\Languages` — 26 zaleznosci przepietych na `LanguagesRepository`
|
||||
- CLEANUP - usuniete: `front\factory\Languages`, `front\factory\Newsletter`, `front\view\Languages`, `front\view\Newsletter`, `front\controls\Newsletter`
|
||||
- UPDATE - testy: `OK (437 tests, 1398 assertions)`
|
||||
<hr>
|
||||
<b>ver. 0.278 - 16.02.2026</b><br />
|
||||
- UPDATE - migracja Settings + Languages do wspolnych klas Domain (z cache Redis)
|
||||
- FIX - `get_single_settings_value()` — parametr `$param` poprawnie uzywany (wczesniej hardcoded `firm_name`)
|
||||
- FIX - `get_single_settings_value()` — parametr `$param` poprawnie uzywany (wczesniej hardcoded `firm_name`)
|
||||
<hr>
|
||||
<b>ver. 0.277 - 16.02.2026</b><br />
|
||||
- NEW - migracja modulu `ShopProduct` (factory) — pelna migracja ~40 metod do `ProductRepository` + ~30 akcji w `ShopProductController`
|
||||
- NEW - migracja modulu `ShopProduct` (factory) — pelna migracja ~40 metod do `ProductRepository` + ~30 akcji w `ShopProductController`
|
||||
- NEW - migracja modulu `Dashboard` do Domain + DI (`DashboardRepository`, `DashboardController`)
|
||||
- NEW - migracja modulu `Update` do Domain + DI (`UpdateRepository`, `UpdateController`)
|
||||
- UPDATE - klasa `admin\Site` przemianowana na `admin\App` (plik `App.php`)
|
||||
- UPDATE - refaktoring routingu — usunieto fallback na stare kontrolery, uproszczony routing
|
||||
- UPDATE - template `update/main-view.php` — panele zamiast `gridEdit`, `$.confirm()` zamiast `$.prompt()`
|
||||
- UPDATE - refaktoring routingu — usunieto fallback na stare kontrolery, uproszczony routing
|
||||
- UPDATE - template `update/main-view.php` — panele zamiast `gridEdit`, `$.confirm()` zamiast `$.prompt()`
|
||||
- CLEANUP - usuniete stare foldery: `autoload/admin/controls/`, `autoload/admin/factory/`, `autoload/admin/view/`
|
||||
- CLEANUP - usuniete legacy: `class.Dashboard.php` (controls/shop), `class.Update.php` (controls/factory/view), `class.Articles.php` (factory), `class.Page.php` (view), `class.ShopProduct.php` (controls/factory/view)
|
||||
- UPDATE - `front\factory\Newsletter` przepieta na `ArticleRepository::articlesByDateAdd()`
|
||||
@@ -321,12 +324,12 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.268.zip`, `ver_0.268_files.txt`
|
||||
<hr>
|
||||
<b>ver. 0.267 - 13.02.2026</b><br />
|
||||
- FIX - front: poprawione dobieranie layoutu dla kategorii/produktu/koszyka i innych stron modułowych (fallback do layoutu domyślnego)
|
||||
- FIX - produkt/koszyk: poprawiona obsługa ilości dla kombinacji (stan 0 po dodaniu do koszyka, limit max, odczyt `stock_0_buy`)
|
||||
- FIX - produkt: usunięty błąd JS `TypeError: $(...).visible is not a function` (zamiana na `:visible`)
|
||||
- FIX - SEO redirecty produktów: blokada konfliktów po kopiowaniu URL oraz utwardzone wykrywanie pętli redirectów (`lang_id` + graf przejść)
|
||||
- UPDATE - admin: `input-switch` zapisuje wartość `on` (spójnie z obsługą pól checkbox w formularzach)
|
||||
- CLEANUP - usunięte pliki: `apilo-bck`, `geocode-cache.php`
|
||||
- FIX - front: poprawione dobieranie layoutu dla kategorii/produktu/koszyka i innych stron modułowych (fallback do layoutu domyślnego)
|
||||
- FIX - produkt/koszyk: poprawiona obsługa ilości dla kombinacji (stan 0 po dodaniu do koszyka, limit max, odczyt `stock_0_buy`)
|
||||
- FIX - produkt: usunięty błąd JS `TypeError: $(...).visible is not a function` (zamiana na `:visible`)
|
||||
- FIX - SEO redirecty produktów: blokada konfliktów po kopiowaniu URL oraz utwardzone wykrywanie pętli redirectów (`lang_id` + graf przejść)
|
||||
- UPDATE - admin: `input-switch` zapisuje wartość `on` (spójnie z obsługą pól checkbox w formularzach)
|
||||
- CLEANUP - usunięte pliki: `apilo-bck`, `geocode-cache.php`
|
||||
- UPDATE - testy: `OK (235 tests, 682 assertions)`
|
||||
- UPDATE - pliki aktualizacji: `updates/0.20/ver_0.267.zip`, `ver_0.267_files.txt`, `ver_0.267_sql.txt`
|
||||
<hr>
|
||||
@@ -408,7 +411,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
<b>ver. 0.257 - 12.02.2026</b><br />
|
||||
- NEW - migracja modulu `Newsletter` do architektury Domain + DI (`Domain\Newsletter\NewsletterRepository`, `Domain\Newsletter\NewsletterPreviewRenderer`, `admin\Controllers\NewsletterController`)
|
||||
- UPDATE - widoki `/admin/newsletter/*` przepiete z legacy `grid/gridEdit` na nowe komponenty (`components/table-list`, `components/form-edit`) + nowy endpoint `/admin/newsletter/preview/`
|
||||
- UPDATE - routing DI (`admin\Site`) rozszerzony o moduł `Newsletter`
|
||||
- UPDATE - routing DI (`admin\Site`) rozszerzony o moduł `Newsletter`
|
||||
- UPDATE - `admin\factory\Newsletter` dziala jako fasada do nowego repozytorium (backward compatibility)
|
||||
- UPDATE - `front\factory\Newsletter` nie korzysta juz z `admin\view\Newsletter`
|
||||
- CLEANUP - usuniete legacy klasy `autoload/admin/controls/class.Newsletter.php`, `autoload/admin/view/class.Newsletter.php`
|
||||
@@ -432,7 +435,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- UPDATE - migracja widokow languages (`languages-list`, `language-edit`, `translations-list`, `translation-edit`) na `components/table-list` i `components/form-edit`
|
||||
- UPDATE - routing DI dla `Languages` w `admin\Site` oraz kompatybilna fasada `admin\factory\Languages` delegujaca do repozytorium
|
||||
- UPDATE - naprawiono zapis edycji jezyka (ID jezyka pobierane z URL przy edycji)
|
||||
- UPDATE - globalne poprawki UX filtrów w `components/table-list` (kompaktowe kolumny `Aktywny`/`Domyslny`, spacing i pelna szerokosc selecta)
|
||||
- UPDATE - globalne poprawki UX filtrĂłw w `components/table-list` (kompaktowe kolumny `Aktywny`/`Domyslny`, spacing i pelna szerokosc selecta)
|
||||
- CLEANUP - usuniete legacy klasy: `autoload/admin/controls/class.Languages.php`, `autoload/admin/view/class.Languages.php`
|
||||
<hr>
|
||||
<b>ver. 0.253 - 12.02.2026</b><br />
|
||||
@@ -501,78 +504,78 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- UPDATE - refaktoryzacja: article_save przeniesiony do Domain\Article\ArticleRepository::save() z prywatnymi helperami
|
||||
- UPDATE - refaktoryzacja: article_delete przeniesiony do Domain\Article\ArticleRepository::archive()
|
||||
- UPDATE - ArticlesController: nowe akcje save() i delete() z DI
|
||||
- UPDATE - admin\factory\Articles::article_save() i articles_set_archive() delegują do repozytorium (kompatybilność)
|
||||
- UPDATE - admin\factory\Articles::article_save() i articles_set_archive() delegują do repozytorium (kompatybilność)
|
||||
<hr>
|
||||
<b>ver. 0.243</b><br />
|
||||
- UPDATE - refaktoryzacja: cleanup nieprzypisanych plików/zdjęć artykułów przeniesiony do Domain\Article\ArticleRepository
|
||||
- UPDATE - ArticlesController::edit() używa repozytorium do cleanupu, a admin\factory\Articles zachowuje delegowanie (kompatybilność)
|
||||
- UPDATE - refaktoryzacja: cleanup nieprzypisanych plików/zdjęć artykułów przeniesiony do Domain\Article\ArticleRepository
|
||||
- UPDATE - ArticlesController::edit() używa repozytorium do cleanupu, a admin\factory\Articles zachowuje delegowanie (kompatybilność)
|
||||
<hr>
|
||||
<b>ver. 0.242</b><br />
|
||||
- NEW - refaktoryzacja: Domain\Article\ArticleRepository + migracja article_edit do admin\Controllers\ArticlesController (DI)
|
||||
- UPDATE - admin\factory\Articles::article_details() deleguje do nowego repozytorium (kompatybilność zachowana)
|
||||
- UPDATE - metody przejęte przez nowe kontrolery oznaczone jako @deprecated w legacy kontrolerach admin\controls
|
||||
- UPDATE - admin\factory\Articles::article_details() deleguje do nowego repozytorium (kompatybilność zachowana)
|
||||
- UPDATE - metody przejęte przez nowe kontrolery oznaczone jako @deprecated w legacy kontrolerach admin\controls
|
||||
<hr>
|
||||
<b>ver. 0.241</b><br />
|
||||
- NEW - refaktoryzacja: admin\Controllers\ProductArchiveController - archiwum produktów z DI
|
||||
- NEW - refaktoryzacja: admin\Controllers\ProductArchiveController - archiwum produktĂłw z DI
|
||||
- NEW - ProductRepository::archive(), unarchive() - operacje archiwizacji w repozytorium
|
||||
- FIX - naprawiono SQL w liście archiwum (puste wyszukiwanie filtrowało wszystkie wyniki)
|
||||
- FIX - naprawiono brakujący filtr archive = 1 w zapytaniu bez wyszukiwania
|
||||
- UPDATE - wyczyszczono szablony archiwum (usunięto zbędne funkcje: apilo, baselinker, duplikowanie)
|
||||
- FIX - naprawiono SQL w liście archiwum (puste wyszukiwanie filtrowało wszystkie wyniki)
|
||||
- FIX - naprawiono brakujÄ…cy filtr archive = 1 w zapytaniu bez wyszukiwania
|
||||
- UPDATE - wyczyszczono szablony archiwum (usunięto zbędne funkcje: apilo, baselinker, duplikowanie)
|
||||
<hr>
|
||||
<b>ver. 0.240</b><br />
|
||||
- NEW - refaktoryzacja: Domain\Settings\SettingsRepository + admin\Controllers\SettingsController (architektura Domain-Driven)
|
||||
- NEW - refaktoryzacja: Domain\Cache\CacheRepository - czyszczenie cache z obsługą Redis
|
||||
- FIX - komunikat potwierdzenia zapisu ustawień w panelu administratora
|
||||
- NEW - refaktoryzacja: Domain\Cache\CacheRepository - czyszczenie cache z obsługą Redis
|
||||
- FIX - komunikat potwierdzenia zapisu ustawień w panelu administratora
|
||||
- FIX - naprawiono element #content w layoucie admina (powiadomienia grid.js)
|
||||
<hr>
|
||||
<b>ver. 0.239</b><br />
|
||||
- NEW - refaktoryzacja: Domain\Banner\BannerRepository + admin\Controllers\BannerController (pełna migracja kontrolera)
|
||||
- NEW - refaktoryzacja: Domain\Banner\BannerRepository + admin\Controllers\BannerController (pełna migracja kontrolera)
|
||||
- NEW - refaktoryzacja: Domain\Product\ProductRepository::getPrice(), getName() - migracja kolejnych metod
|
||||
- NEW - router admin z obsługą nowych kontrolerów (fallback na stare)
|
||||
- UPDATE - shop\Product::get_product_price(), get_product_name() używają nowego repozytorium (kompatybilność zachowana)
|
||||
- NEW - router admin z obsługą nowych kontrolerów (fallback na stare)
|
||||
- UPDATE - shop\Product::get_product_price(), get_product_name() używają nowego repozytorium (kompatybilność zachowana)
|
||||
<hr>
|
||||
<b>ver. 0.238</b><br />
|
||||
- NEW - refaktoryzacja: Domain\Product\ProductRepository - pierwsza klasa w nowej architekturze Domain-Driven
|
||||
- NEW - Dependency Injection zamiast global variables
|
||||
- UPDATE - shop\Product::get_product_quantity() używa teraz nowego repozytorium (kompatybilność zachowana)
|
||||
- UPDATE - shop\Product::get_product_quantity() używa teraz nowego repozytorium (kompatybilność zachowana)
|
||||
<hr>
|
||||
<b>ver. 0.237</b><br />
|
||||
- NEW - automatyczne czyszczenie cache produktu po aktualizacji przez CRON (Sellasist, Apilo, Baselinker)
|
||||
- UPDATE - przycisk "Wyczyść cache" w panelu administratora z obsługą AJAX i komunikatami o postępie
|
||||
- UPDATE - przycisk "Wyczyść cache" w panelu administratora z obsługą AJAX i komunikatami o postępie
|
||||
<hr>
|
||||
<b>ver. 0.236</b><br />
|
||||
- FIX - zabezpieczenie przed duplikatami zamówień w Apilo - automatyczne pobieranie ID zamówienia przy błędzie "idExternal już wykorzystywany"
|
||||
- FIX - zabezpieczenie przed duplikatami zamówień w Apilo - automatyczne pobieranie ID zamówienia przy błędzie "idExternal już wykorzystywany"
|
||||
<hr>
|
||||
<b>ver. 0.235</b><br />
|
||||
- FIX - poprawka funkcji aktualizacji
|
||||
<hr>
|
||||
<b>ver. 0.234</b><br />
|
||||
- NEW - przycisk zaznaczania zamówienia jako wysłane do trustmate.io
|
||||
- NEW - przycisk zaznaczania zamówienia jako wysłane do trustmate.io
|
||||
<hr>
|
||||
<b>ver. 0.232</b><br />
|
||||
- NEW - opcje GPSR
|
||||
<hr>
|
||||
<b>ver. 0.231</b><br />
|
||||
- FIX - poprawki bezpieczeństwa + dwuetapowa weryfikacja logowania
|
||||
- FIX - poprawki bezpieczeństwa + dwuetapowa weryfikacja logowania
|
||||
<hr>
|
||||
<b>ver. 0.230</b><br />
|
||||
- FIX - poprawki bezpieczeństwa
|
||||
- FIX - poprawki bezpieczeństwa
|
||||
<hr>
|
||||
<b>ver. 0.229</b><br />
|
||||
- NEW - pola dodatkowe z opcją wymagane/niewymagane
|
||||
- NEW - pola dodatkowe z opcjÄ… wymagane/niewymagane
|
||||
<hr>
|
||||
<b>ver. 0.228</b><br />
|
||||
- NEW - cron do wysyłania zamówień do trustmate.io
|
||||
- NEW - cron do wysyłania zamówień do trustmate.io
|
||||
<hr>
|
||||
<b>ver. 0.227</b><br />
|
||||
- NEW - historia kodów rabatowych
|
||||
- NEW - historia kodĂłw rabatowych
|
||||
<hr>
|
||||
<b>ver. 0.226</b><br />
|
||||
- NEW - dodanie opcji faktury do zamówienia
|
||||
- NEW - dodanie opcji faktury do zamĂłwienia
|
||||
<hr>
|
||||
<b>ver. 0.225</b><br />
|
||||
- NEW - przycisk czyszczenia cache
|
||||
- NEW - ponowne wysyłanie zamówienia do apilo
|
||||
- NEW - ponowne wysyłanie zamówienia do apilo
|
||||
<hr>
|
||||
<b>ver. 0.224</b><br />
|
||||
- NEW - sortowanie form dostawy
|
||||
@@ -584,20 +587,20 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- NEW - integracja z Orlen Paczka
|
||||
<hr>
|
||||
<b>ver. 0.221</b><br />
|
||||
- NEW - Automatyczne przekierowania adresów URL produktów, zmiany w pliku htaccess
|
||||
- NEW - Automatyczne przekierowania adresĂłw URL produktĂłw, zmiany w pliku htaccess
|
||||
<hr>
|
||||
<b>ver. 0.220</b><br />
|
||||
- NEW - Dodanie możliwości wyświetlenia na strone ostatnio dodane produkty [PRODUKTY_NEW] lub [PRODUKTY_NEW:10].
|
||||
- NEW - Dodanie możliwości wyświetlenia na strone popularnych produktów [PRODUKTY_TOP] lub [PRODUKTY_TOP:10].
|
||||
- NEW - Dodanie możliwości wyświetlenia na strone ostatnio dodane produkty [PRODUKTY_NEW] lub [PRODUKTY_NEW:10].
|
||||
- NEW - Dodanie możliwości wyświetlenia na strone popularnych produktów [PRODUKTY_TOP] lub [PRODUKTY_TOP:10].
|
||||
<hr>
|
||||
<b>ver. 0.219</b><br />
|
||||
- NEW - Dodanie możliwości zmiany daty w artykułach
|
||||
- NEW - Dodanie możliwości zmiany daty w artykułach
|
||||
<hr>
|
||||
<b>ver. 0.218</b><br />
|
||||
- NEW - indywidualny kod GTM
|
||||
<hr>
|
||||
<b>ver. 0.217</b><br />
|
||||
- NEW - zwiększenie obsługi REDIS
|
||||
- NEW - zwiększenie obsługi REDIS
|
||||
<hr>
|
||||
<b>ver. 0.216</b><br />
|
||||
- NEW - aktualizacja api i cron (apilo)
|
||||
@@ -612,43 +615,43 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- FIX - wyliczenie darmowej dostawy
|
||||
<hr>
|
||||
<b>ver. 0.212</b><br />
|
||||
- NEW - zmiany w zapisywaniu zamówienia do apilo
|
||||
- NEW - zmiany w zapisywaniu zamĂłwienia do apilo
|
||||
<hr>
|
||||
<b>ver. 0.211</b><br />
|
||||
- NEW - Debugowanie apilo + wyświetlanie podkategorii
|
||||
- NEW - Debugowanie apilo + wyświetlanie podkategorii
|
||||
<hr>
|
||||
<b>ver. 0.210</b><br />
|
||||
- NEW - dodatkowe pola w widoku produktów
|
||||
- NEW - dodatkowe pola w widoku produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.209</b><br />
|
||||
- NEW - zmiany w widoku produktów (panel administratora)
|
||||
- NEW - zmiany w widoku produktĂłw (panel administratora)
|
||||
<hr>
|
||||
<b>ver. 0.208</b><br />
|
||||
- NEW - zmiany w wyszukiwarce produktów
|
||||
- NEW - zmiany w wyszukiwarce produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.204-0.207</b><br />
|
||||
- NEW - htaccess update
|
||||
<hr>
|
||||
<b>ver. 0.204-0.206</b><br />
|
||||
- NEW - wysyłanie produktów do apilo
|
||||
- NEW - wysyłanie produktów do apilo
|
||||
<hr>
|
||||
<b>ver. 0.203</b><br />
|
||||
- NEW - zmiana sposobu wyliczania cen produkty z dodatkami
|
||||
<hr>
|
||||
<b>ver. 0.202</b><br />
|
||||
- NEW - dodano "główne zdjęcie" w edycji artykułu
|
||||
- NEW - dodano "główne zdjęcie" w edycji artykułu
|
||||
<hr>
|
||||
<b>ver. 0.201</b><br />
|
||||
- FIX - aktualizacja statusów na podstawie baselinkera
|
||||
- FIX - aktualizacja statusĂłw na podstawie baselinkera
|
||||
<hr>
|
||||
<b>ver. 0.200</b><br />
|
||||
- NEW - wysyłanie produktów do baselinker
|
||||
- NEW - wysyłanie produktów do baselinker
|
||||
<hr>
|
||||
<b>ver. 0.199</b><br />
|
||||
- NEW - usprawnienie edycji danych do XML
|
||||
<hr>
|
||||
<b>ver. 0.198</b><br />
|
||||
- NEW - automatyczne generowanie kodów SKU
|
||||
- NEW - automatyczne generowanie kodĂłw SKU
|
||||
<hr>
|
||||
<b>ver. 0.197</b><br />
|
||||
- FIX - poprawki w Dashboard
|
||||
@@ -657,7 +660,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- FIX - integracja z apilo.com
|
||||
<hr>
|
||||
<b>ver. 0.195</b><br />
|
||||
- FIX - aktualizacja statusów
|
||||
- FIX - aktualizacja statusĂłw
|
||||
<hr>
|
||||
<b>ver. 0.194</b><br />
|
||||
- UPDATE - integracja apilo
|
||||
@@ -666,46 +669,46 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- UPDATE - aktualizacja synchronizacji z baselinker
|
||||
<hr>
|
||||
<b>ver. 0.192</b><br />
|
||||
- NEW - pobieranie statusów z sellasist
|
||||
- NEW - pobieranie statusĂłw z sellasist
|
||||
<hr>
|
||||
<b>ver. 0.191</b><br />
|
||||
- NEW - integracja z selasist
|
||||
<hr>
|
||||
<b>ver. 0.190</b><br />
|
||||
- FIX - produkty powiązane
|
||||
- FIX - produkty powiÄ…zane
|
||||
<hr>
|
||||
<b>ver. 0.189</b><br />
|
||||
- FIX - ceny promocyjne produktów z dodatkiem
|
||||
- FIX - ceny promocyjne produktĂłw z dodatkiem
|
||||
<hr>
|
||||
<b>ver. 0.188</b><br />
|
||||
- NEW - widok listy produktów
|
||||
- NEW - widok listy produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.187</b><br />
|
||||
- FIX - pobieranie cen z APILO
|
||||
<hr>
|
||||
<b>ver. 0.186</b><br />
|
||||
- FIX - dodawanie do koszyka tych samych produktów ale z różną personalizacją
|
||||
- FIX - dodawanie do koszyka tych samych produktów ale z różną personalizacją
|
||||
<hr>
|
||||
<b>ver. 0.185</b><br />
|
||||
- FIX - masowa edycja produktów
|
||||
- FIX - masowa edycja produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.184</b><br />
|
||||
- NEW - druga część integracji z apilo, masowa edycja produktów
|
||||
- NEW - druga część integracji z apilo, masowa edycja produktów
|
||||
<hr>
|
||||
<b>ver. 0.183</b><br />
|
||||
- NEW - pierwsza część integracji z apilo
|
||||
- NEW - pierwsza część integracji z apilo
|
||||
<hr>
|
||||
<b>ver. 0.182</b><br />
|
||||
- FIX - layout
|
||||
<hr>
|
||||
<b>ver. 0.181</b><br />
|
||||
- NEW - infinitescroll - opcja włączy/wyłącz
|
||||
- NEW - infinitescroll - opcja włączy/wyłącz
|
||||
<hr>
|
||||
<b>ver. 0.180</b><br />
|
||||
- NEW - aktualizacja dashboard
|
||||
<hr>
|
||||
<b>ver. 0.179</b><br />
|
||||
- NEW - obsługa EAN
|
||||
- NEW - obsługa EAN
|
||||
<hr>
|
||||
<b>ver. 0.177, 0.178</b><br />
|
||||
- FIX - custom_label
|
||||
@@ -721,7 +724,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
<hr>
|
||||
<b>ver. 0.173</b><br />
|
||||
- NEW - duplikowanie produktu wraz z kombinacjami
|
||||
- NEW - dodanie przechodzenia pomiędzy zamówienia (poprzednie/następne zamówienie)
|
||||
- NEW - dodanie przechodzenia pomiędzy zamówienia (poprzednie/następne zamówienie)
|
||||
<hr>
|
||||
<b>ver. 0.172</b><br />
|
||||
- FIX - poprawki w Cache
|
||||
@@ -733,22 +736,22 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- NEW - usuwanie cache produktu przy zapisie
|
||||
<hr>
|
||||
<b>ver. 0.169</b><br />
|
||||
- FIX - poprawki w liście produktów
|
||||
- FIX - poprawki w liście produktów
|
||||
<hr>
|
||||
<b>ver. 0.168</b><br />
|
||||
- NEW - archiwum produktów
|
||||
- NEW - archiwum produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.167</b><br />
|
||||
- NEW - dodanie obsługi cen i stanów magazynowych kombinacji produktów
|
||||
- NEW - dodanie obsługi cen i stanów magazynowych kombinacji produktów
|
||||
<hr>
|
||||
<b>ver. 0.166</b><br />
|
||||
- NEW - współpraca z GTM
|
||||
- NEW - współpraca z GTM
|
||||
<hr>
|
||||
<b>ver. 0.164/5</b><br />
|
||||
- FIX - ukrywanie produktów nieaktywnych
|
||||
- FIX - ukrywanie produktĂłw nieaktywnych
|
||||
<hr>
|
||||
<b>ver. 0.163</b><br />
|
||||
- NEW - automatyczne podpowiadanie produktów do zestawu na podstawie wcześniejszych zakupów klientów
|
||||
- NEW - automatyczne podpowiadanie produktów do zestawu na podstawie wcześniejszych zakupów klientów
|
||||
<hr>
|
||||
<b>ver. 0.162</b><br />
|
||||
- NEW - GA4
|
||||
@@ -764,7 +767,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- FIX - cron Baselinker
|
||||
<hr>
|
||||
<b>ver. 0.158</b><br />
|
||||
- UPDATE - poprawa kolorystyki przycisków
|
||||
- UPDATE - poprawa kolorystyki przyciskĂłw
|
||||
<hr>
|
||||
<b>ver. 0.157</b><br />
|
||||
- NEW - szybka zmiana statusu produktu
|
||||
@@ -776,10 +779,10 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- NEW - infinite scroll w widoku kategorii
|
||||
<hr>
|
||||
<b>ver. 0.154</b><br />
|
||||
- FIX - atrybuty produktów
|
||||
- FIX - atrybuty produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.153</b><br />
|
||||
- FIX - atrybuty produktów
|
||||
- FIX - atrybuty produktĂłw
|
||||
<hr>
|
||||
<b>ver. 0.152</b><br />
|
||||
- FIX - tematy maili
|
||||
@@ -788,7 +791,7 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- FIX - tematy maili
|
||||
<hr>
|
||||
<b>ver. 0.150</b><br />
|
||||
- NEW - domyślna forma transportu
|
||||
- NEW - domyślna forma transportu
|
||||
<hr>
|
||||
<b>ver. 0.149</b><br />
|
||||
- NEW - tematy maili
|
||||
@@ -806,11 +809,11 @@ NEW - Ukrywalne filtry tabel, mobilna wersja szczegółów zamówienia
|
||||
- NEW - omnibus ready
|
||||
<hr>
|
||||
<b>ver. 0.144</b><br />
|
||||
- FIX - usunięcie adresu marianek.pl z kodu
|
||||
- FIX - usunięcie adresu marianek.pl z kodu
|
||||
<hr>
|
||||
<b>ver. 0.143</b><br />
|
||||
- FIX - poprawa generowania plików WEBP
|
||||
- FIX - poprawa generowania plikĂłw WEBP
|
||||
<hr>
|
||||
<b>ver. 0.142</b><br />
|
||||
- FIX - poprawa adresu strony głównej
|
||||
- FIX - poprawa adresu strony głównej
|
||||
<hr>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?
|
||||
$current_ver = 324;
|
||||
$current_ver = 325;
|
||||
|
||||
for ($i = 1; $i <= $current_ver; $i++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user