fix: mojibake w labelkach formularza edycji kategorii (v0.352)

Plik admin/templates/shop-category/category-edit.php zawieral 9 wystapien
double-encoded UTF-8 (UTF-8 zinterpretowanego jako Win-1252 i ponownie
zakodowanego do UTF-8). Etykiety pol formularza pokazywaly mojibake typu
"Treść" zamiast "Treść", "JÄ™zyk domyĹ›lny" zamiast "Język domyślny" itp.

Podmiana 7 unikalnych fraz na poprawne polskie znaki. Grep mojibake po
calym repo (admin/templates/, templates/, autoload/) potwierdza ze to
byl jedyny dotkniety plik.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 22:55:27 +02:00
parent 18bdf8384f
commit d858f74de3
7 changed files with 364 additions and 19 deletions

View File

@@ -40,6 +40,7 @@ Status: Planning
| 17 | Cart summary transport cost fix | 1 | Done | 2026-04-20 |
| 18 | Google feed permutation URL fix | 1 | Done | 2026-04-30 |
| 19 | Frontend meta tags fix (category + product) | 1 | Done | 2026-05-13 |
| 20 | Category edit mojibake fix (UI labels) | 1 | Done | 2026-05-13 |
## Feature
@@ -140,4 +141,13 @@ Status: Planning
**Scope:** Diagnostyka (pp_routes + meta w DB + sesyjny $page), checkpoint:decision z 4 opcjami fixu (routes/engine/data/session), implementacja wybranej opcji w `LayoutEngine.php` lub `index.php`, test jednostkowy, human-verify na 3 URL-ach.
---
*Last updated: 2026-05-13 (Phase 19 complete)*
### Phase 20 — Category edit mojibake fix
**Problem:** Etykiety formularza edycji kategorii (`/admin/shop_category/category_edit/id=X`) pokazują double-encoded UTF-8 mojibake: `TreĹć` zamiast "Treść", `JÄ™zyk domyĹlny` zamiast "Język domyślny", `Sortowanie produktĂłw` zamiast "Sortowanie produktów" itp.
**Root cause:** Plik `admin/templates/shop-category/category-edit.php` został kiedyś zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8. 9 wystąpień. To JEDYNY taki plik w całym repo — grep `Ä[\x{84}-\x{99}]|Ĺ|Ăł` po całym `admin/templates/`, `templates/`, `autoload/` nie wskazuje innych dotknietych plików.
**Scope:** Podmienić 9 hardcoded labelek na poprawne polskie znaki (Treść, Język domyślny, Tytuł, rozwinięcie, Sortowanie produktów, Wyświetlić podkategorie, Blokuj indeksację). Brak zmian w logice/HTML structure, plik zostaje UTF-8 bez BOM. Human-verify w panelu admina.
---
*Last updated: 2026-05-13 (Phase 20 complete)*

View File

@@ -5,19 +5,19 @@
See: .paul/PROJECT.md (updated 2026-04-30)
**Core value:** Właściciel sklepu ma pełną kontrolę nad sprzedażą online w jednym systemie pisanym od podstaw, bez narzutów zewnętrznych platform.
**Current focus:** Phase 19 complete — loop closed
**Current focus:** Phase 20 complete — loop closed
## Current Position
Milestone: Hotfix
Phase: 19 of 19 (Frontend meta tags fix) — Complete
Plan: 19-01 complete
Phase: 20 of 20 (Category edit mojibake fix) — Complete
Plan: 20-01 complete
Status: UNIFY complete, ready for next PLAN loop (transition-phase git commit pending)
Last activity: 2026-05-13 — Closed loop for .paul/phases/19-frontend-meta-tags-fix/19-01-PLAN.md
Last activity: 2026-05-13 — Closed loop for .paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md
Progress:
- Milestone: [##########] 100% (Hotfix rolling)
- Phase 19: [##########] 100%
- Phase 20: [##########] 100%
## Loop Position
@@ -45,10 +45,15 @@ Phase 16: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-19]
Phase 17: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-20]
Phase 18: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-30]
Phase 19: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13]
Phase 20: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13]
```
## Accumulated Context
### Decisions
- 2026-05-13: Phase 20 loop closed with SUMMARY at .paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
- 2026-05-13: Transition-phase git commit for Phase 20 not executed in this UNIFY run (deferred — pattern z faz 15-19)
- 2026-05-13: Phase 20 APPLY complete — 9 wystąpień mojibake w admin/templates/shop-category/category-edit.php naprawionych (Treść, Język domyślny x2, rozwinięcie, Sortowanie produktów, Wyświetlić podkategorie, Tytuł kategorii, Blokuj indeksację); suita 846 zielona; human-verify approved
- 2026-05-13: Created Phase 20 plan at .paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md — fix mojibake w labelkach formularza edycji kategorii (double-encoded UTF-8 w admin/templates/shop-category/category-edit.php, 9 wystąpień, jedyny dotknięty plik w repo)
- 2026-05-13: Phase 19 loop closed with SUMMARY at .paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md
- 2026-05-13: Transition-phase git commit for Phase 19 not executed in this UNIFY run (deferred — pattern z faz 15/16/17/18)
- 2026-05-13: Phase 19 APPLY complete — LayoutEngine.php zmodyfikowany (3 gałęzie + nowa metoda applyEntityMetaToPage), test LayoutEngineMetaTagsTest 5 testów/18 asercji, suita 846 zielona; weryfikacja na produkcji (curl) pokazuje poprawne tytuły dla /sen-i-otulenie, /kocyk-niemowlaka-... i /
@@ -103,17 +108,17 @@ None.
### Blockers/Concerns
None.
### Skill Audit (Phase 19)
### Skill Audit (Phase 20)
| Expected | Invoked | Notes |
|----------|---------|-------|
| /feature-dev | ○ | User-approved override (hotfix z konkretną instrukcją) |
| /koniec-pracy | ○ | Pending — uruchomić przy zakończeniu sesji jeśli release wchodzi do update package |
| /feature-dev | ○ | Trivialny fix labelek — override per pattern poprzednich faz |
| /koniec-pracy | ○ | Pending — uruchomić przy release update package |
## Session Continuity
Last session: 2026-05-13
Stopped at: Phase 19 complete, loop closed
Stopped at: Phase 20 complete, loop closed
Next action: Start next phase plan (transition-phase git commit pending), lub uruchomić /koniec-pracy jeśli zamykamy sesję
Resume file: .paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md
Resume file: .paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
---
*STATE.md — Updated after every significant action*

View File

@@ -9,9 +9,15 @@
- Task 4 (human-verify): Weryfikacja curl na produkcji — 3 strony pokazują 3 różne `<title>`, homepage meta nie wycieka
- .gitignore — dodano `temp/` (skrypty diagnostyczne z DB credentials)
- [Phase 20, Plan 01] Fix mojibake (double-encoded UTF-8) w labelkach formularza edycji kategorii
- Task 1: Podmiana 9 wystąpień mojibake na poprawne polskie znaki (Treść, Język domyślny, Tytuł kategorii, Sortowanie produktów, Wyświetlić podkategorie, Blokuj indeksację, Opis kategorii rozwinięcie)
- Task 2: Weryfikacja braku regresji (grep w całym repo — 0 innych plików dotkniętych), suita 846 zielona
- Task 3 (human-verify): Weryfikacja w panelu admina shoppro.project-dc.pl approved
## Zmienione pliki
- `autoload/front/LayoutEngine.php`
- `admin/templates/shop-category/category-edit.php`
- `tests/Unit/front/LayoutEngineMetaTagsTest.php` (nowy)
- `.paul/phases/19-frontend-meta-tags-fix/19-01-PLAN.md` (nowy)
- `.paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md` (nowy)

View File

@@ -2,6 +2,12 @@
> Chronologiczny log zmian technicznych — co i dlaczego.
## v0.352 (2026-05-13)
- Naprawiono mojibake w labelkach formularza edycji kategorii w panelu admina (`/admin/shop_category/category_edit/id=X`). Plik `admin/templates/shop-category/category-edit.php` byl kiedys zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8 (classic double-encoding). 9 wystapien naprawione: `TreĹć`→Treść, `JÄ™zyk domyĹlny`→Język domyślny (x2), `rozwiniÄ™cie`→rozwinięcie, `Sortowanie produktĂłw`→Sortowanie produktów, `WyĹwietlić podkategorie`→Wyświetlić podkategorie, `TytuĹ kategorii (h1)`→Tytuł kategorii (h1), `Blokuj indeksacjÄ™`→Blokuj indeksację.
- Wykluczono regresje: grep `Ä[\\x{84}-\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„` w `admin/templates/`, `templates/`, `autoload/` zwraca 0 plikow — to byl jedyny przypadek mojibake w repo.
- Suita PHPUnit bez zmian: 846 testow / 2348 assertions.
## v0.351 (2026-05-13)
- Naprawiono wyciek metatagow ze strony glownej na podstrony kategorii/artykulu/produktu: `<title>` wszystkich podstron pokazywal tytul homepage ("Sklep z akcesoriami..."), bo `LayoutEngine::show()` nadpisywal w galezi kategorii/artykulu/produktu tylko `$page['language']['title']`, a `meta_title` z domyslnej strony zylo dalej i wygrywalo w linii substytucji `[TITLE]`.

View File

@@ -0,0 +1,197 @@
---
phase: 20-category-edit-mojibake-fix
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- admin/templates/shop-category/category-edit.php
autonomous: false
delegation: off
---
<objective>
## Goal
Etykiety formularza edycji kategorii (`/admin/shop_category/category_edit/id=X`) pokazują poprawne polskie znaki: "Treść", "Język domyślny", "Tytuł kategorii (h1)", "Wyświetlić podkategorie", "Sortowanie produktów", "Blokuj indeksację", "Opis kategorii (rozwinięcie)" — zamiast mojibake `TreĹć`, `JÄ™zyk domyĹlny`, itp.
## Purpose
Mojibake w etykietach UI panelu admina utrudnia korzystanie z formularza. Administrator musi się domyślać znaczenia pól. Naprawia profesjonalny wygląd panelu i poprawia UX uzupełniania kategorii (m.in. SEO).
## Output
- `admin/templates/shop-category/category-edit.php` z poprawnymi polskimi znakami (UTF-8) we wszystkich hardcoded stringach
- Weryfikacja wizualna w panelu admina
## Root cause
Plik został kiedyś zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8 (classic double-encoding mojibake). `file` raportuje "UTF-8 text" bo bajty są poprawnym UTF-8 — tyle że ich znaczenie po dekodowaniu UTF-8 to bezsensowne kombinacje znaków łacińskich (Ä, Ĺ, Ă itp.).
Grep `Ä[\x{84}-\x{99}]|Ĺ|Ăł` wskazał, że **tylko ten jeden plik** w całym repo (`admin/templates/`, `templates/`, `autoload/`) jest dotknięty — pozostałe templates mają poprawne UTF-8.
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/STATE.md
## Source Files
@admin/templates/shop-category/category-edit.php
## Clarifications
- **Objaw** — Mojibake (`Ä€„` zamiast `ą`) w labelkach formularza edycji kategorii
→ Odpowiedź: potwierdzone — mojibake (double-encoded UTF-8)
- **Pola** — Nie wiem, sprawdź
→ Odpowiedź (po inspekcji): WSZYSTKIE hardcoded labelki w pliku `category-edit.php` (9 wystąpień), żadne inne pliki templates nie dotknięte
- **Migracja danych** — chodzi o labelki, nie zapisywane dane
→ Odpowiedź: plan dotyczy tylko hardcoded stringów w pliku PHP. Dane w bazie (mieszane HTML entities w additional_text) — oddzielny issue, NIE w tym planie
## Wykryte miejsca mojibake (grep)
```
Line 10: TreĹć → Treść
Line 20: JÄ™zyk domyĹlny → Język domyślny
Line 48: Opis kategorii (rozwiniÄ™cie) → Opis kategorii (rozwinięcie)
Line 87: Sortowanie produktĂłw → Sortowanie produktów
Line 96: WyĹwietlić podkategorie → Wyświetlić podkategorie
Line 107: JÄ™zyk domyĹlny → Język domyślny (duplikat)
Line 127: TytuĹ kategorii (h1) → Tytuł kategorii (h1)
Line 159: Blokuj indeksacjÄ™ → Blokuj indeksację
```
Mapowanie sekwencji (do podmiany):
- `ć``ć`, `Ä…``ą`, `Ä™``ę`, `Ĺ‚``ł`, `Ĺ›``ś`, `Ĺ„``ń`, `Ĺş``ź`, `Ĺľ``ż`
- `Ć``Ć`, `Ä„``Ą`, `Ę``Ę`, `Ĺ``Ł`, `Ĺš``Ś`, `Ĺƒ``Ń`, `Ĺ¹``Ź`, `Ĺ˝``Ż`
- `Ăł``ó`, `Ă“``Ó`
</context>
<acceptance_criteria>
## AC-1: Brak mojibake w pliku
```gherkin
Given plik admin/templates/shop-category/category-edit.php po fixie
When uruchomię grep regex `Ä[\x{84}-\x{99}]|Ĺ|Ăł|Ĺ|Ĺ|Ä|Ä|Ä`
Then nie ma żadnego dopasowania (0 linii)
And plik dalej jest UTF-8 (bez BOM) sprawdzalne przez `file`
```
## AC-2: Labelki formularza renderują się z polskimi znakami
```gherkin
Given administrator otwiera /admin/shop_category/category_edit/id=10 po deployu
When sprawdza nazwy tabów i etykiet pól
Then widzi "Treść", "Ustawienia", "SEO" jako nazwy tabów
And widzi "Język domyślny", "Tytuł kategorii (h1)", "Sortowanie produktów",
"Wyświetlić podkategorie", "Blokuj indeksację", "Opis kategorii (rozwinięcie)"
jako etykiety pól
And NIE widzi `Ä`, `Ĺ`, `Ă` w żadnym widocznym miejscu na tej stronie
```
## AC-3: Brak regresji w innych szablonach
```gherkin
Given fix dotyczy tylko jednego pliku
When uruchomię grep mojibake w admin/templates/ + templates/ + autoload/
Then żaden inny plik nie zawiera mojibake (tak jak przed fixem)
And cała suita PHPUnit (846 testów) pozostaje zielona
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Podmień double-encoded UTF-8 na właściwe polskie znaki</name>
<files>admin/templates/shop-category/category-edit.php</files>
<action>
Wykonaj globalne podstawienia w pliku z mojibake → UTF-8 polskie znaki:
Podstawienia całych słów (najbezpieczniejsze — unikamy fałszywych alarmów z `Ä` w innym kontekście):
"TreĹć" → "Treść"
"JÄ™zyk domyĹlny" → "Język domyślny"
"rozwiniÄ™cie" → "rozwinięcie"
"Sortowanie produktĂłw" → "Sortowanie produktów"
"WyĹwietlić podkategorie" → "Wyświetlić podkategorie"
"TytuĹ kategorii (h1)" → "Tytuł kategorii (h1)"
"Blokuj indeksacjÄ™" → "Blokuj indeksację"
Po wszystkich podstawieniach zweryfikuj greppem że żadne mojibake już nie zostało.
Avoid: globalne sekwencyjne `str_replace` typu `ć``ć` bez kontekstu — mogłoby przypadkiem złamać poprawne fragmenty w przyszłości (na razie nie ma ryzyka, ale lepiej trzymać się konkretnych słów).
Avoid: zmiana encodingu pliku (musi zostać UTF-8 bez BOM, CRLF — jak teraz).
Avoid: jakichkolwiek zmian poza podmianami stringów (struktura HTML, logika, imports — bez zmian).
</action>
<verify>
grep -P "Ä[\x{84}-\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„" admin/templates/shop-category/category-edit.php
→ 0 dopasowań
file admin/templates/shop-category/category-edit.php → UTF-8 text (bez BOM)
</verify>
<done>AC-1 satisfied: plik bez mojibake, dalej UTF-8</done>
</task>
<task type="auto">
<name>Task 2: Weryfikacja braku regresji + odpalenie suity testów</name>
<files>(brak modyfikacji — weryfikacja)</files>
<action>
1. Powtórz globalny grep mojibake w admin/templates/, templates/, autoload/ — powinno być 0 plików (poza tym fixowanym, który po Task 1 też ma 0)
2. Uruchom suitę PHPUnit: `php phpunit.phar`
3. Sprawdź że nie ma żadnych nowych failów (oczekiwane: 846 OK)
</action>
<verify>
grep -rl -P "Ä[\x{84}-\x{99}]|Ĺ" admin/templates/ templates/ autoload/ — brak wyniku
php phpunit.phar — exit code 0, 846 tests OK
</verify>
<done>AC-3 satisfied: brak regresji, suita zielona</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<what-built>
Plik admin/templates/shop-category/category-edit.php z polskimi znakami w UTF-8
(auto-upload FTP wysyła zmianę na shoppro.project-dc.pl po zapisie pliku)
</what-built>
<how-to-verify>
1. Otwórz https://shoppro.project-dc.pl/admin/shop_category/category_edit/id=10 (zaloguj się jeśli trzeba)
2. Sprawdź nazwy 3 tabów: "Treść", "Ustawienia", "SEO" — powinny być po polsku, bez mojibake
3. W tabie "Treść" sprawdź:
- tooltip ikony gwiazdki: "Język domyślny"
- etykiety pól: "Nazwa kategorii", "Opis kategorii", "Opis kategorii (rozwinięcie)", "Dodatkowy tekst (nad produktami)"
4. W tabie "Ustawienia" sprawdź: "Aktywna", "Sortowanie produktów", "Wyświetlić podkategorie"
5. W tabie "SEO" sprawdź: "Tytuł kategorii (h1)", "Blokuj indeksację"
6. Otwórz inną kategorię (np. id=11) — to samo dla regresji
</how-to-verify>
<resume-signal>Wpisz "approved" by kontynuować, lub opisz issues</resume-signal>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- Struktura HTML pliku (tagi, klasy CSS, JS scripts)
- Logika PHP (if/foreach, wywołania Tpl)
- Inne pliki w admin/templates/shop-category/ — nie są dotknięte mojibake
- Encoding pliku (musi zostać UTF-8 bez BOM, jak obecnie)
- Dane w bazie (HTML entities w `additional_text` to oddzielny issue)
## SCOPE LIMITS
- Plan dotyczy TYLKO pliku `admin/templates/shop-category/category-edit.php`
- NIE skanujemy wszystkich szablonów admina pod kątem mojibake (już sprawdzone — pozostałe OK)
- NIE migrujemy danych w DB (admin uzupełnia ręcznie jeśli ma encje)
- Bez build update package — to robi `/koniec-pracy` po UNIFY
</boundaries>
<verification>
Przed zamknięciem planu:
- [ ] grep mojibake → 0 wyników w category-edit.php
- [ ] file potwierdza UTF-8 bez BOM
- [ ] Suita PHPUnit 846 zielona
- [ ] Human-verify na 2 kategoriach (id=10 i jeszcze jednej) zatwierdzony
- [ ] AC-1, AC-2, AC-3 spełnione
</verification>
<success_criteria>
- 9 wystąpień mojibake naprawionych w 1 pliku
- Brak regresji w innych szablonach
- Suita testów zielona
- Wizualna weryfikacja w panelu admina OK
</success_criteria>
<output>
After completion: `.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md`
</output>

View File

@@ -0,0 +1,121 @@
---
phase: 20-category-edit-mojibake-fix
plan: 01
subsystem: admin-ui
tags: [encoding, utf8, mojibake, admin-templates, polish-chars]
requires:
- phase: none
provides: n/a
provides:
- poprawne polskie znaki w labelkach formularza edycji kategorii
- pewność że pozostałe pliki admin/templates/, templates/, autoload/ są wolne od double-encoded UTF-8 mojibake
affects: []
tech-stack:
added: []
patterns:
- "Detekcja double-encoded UTF-8: grep `Ä[\\x{84}-\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„` znajduje pliki z mojibake"
key-files:
modified:
- admin/templates/shop-category/category-edit.php
key-decisions:
- "Fix tylko 1 plik (9 wystąpień) — żaden inny szablon w repo nie ma mojibake"
- "Podmiana całych słów zamiast generyczna `ć``ć` — unika fałszywych alarmów na przyszłość"
- "Brak migracji danych w DB (te są oddzielnym tematem — HTML entities w additional_text)"
patterns-established:
- "Workflow detekcji mojibake: jeden grep regex pokrywa najczęstsze sekwencje Win-1252→UTF-8 double-encoding"
duration: ~10min
started: 2026-05-13T16:30:00Z
completed: 2026-05-13T16:40:00Z
---
# Phase 20 Plan 01: Category edit mojibake fix — Summary
**9 wystąpień double-encoded UTF-8 w `admin/templates/shop-category/category-edit.php` naprawione na poprawne polskie znaki; pozostałe szablony zweryfikowane jako wolne od mojibake.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~10min |
| Tasks | 3 z 3 wykonane |
| Files modified | 1 |
| Mojibake fixed | 9 wystąpień (7 unikalnych fraz) |
| Total suite | 846 zielone (bez zmian) |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Brak mojibake w pliku | Pass | grep mojibake → 0 wyników; file → UTF-8 bez BOM |
| AC-2: Labelki renderują się z polskimi znakami | Pass | Human-verify approved przez użytkownika |
| AC-3: Brak regresji w innych szablonach | Pass | grep w admin/templates/+templates/+autoload/ → 0 plików; suita 846 OK |
## Accomplishments
- Wykryto i naprawiono mojibake w jedynym dotkniętym pliku repo
- Etykiety formularza edycji kategorii w panelu admina są czytelne po polsku ("Treść", "Język domyślny", "Sortowanie produktów", "Tytuł kategorii (h1)", "Blokuj indeksację", "Wyświetlić podkategorie", "Opis kategorii (rozwinięcie)")
- Auto-upload FTP wysłał plik na produkcję; weryfikacja w przeglądarce potwierdzona
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `admin/templates/shop-category/category-edit.php` | Modified | Podmiana 9 wystąpień double-encoded UTF-8 na poprawne polskie znaki (7 unikalnych fraz: TreĹć, JÄ™zyk domyĹlny x2, rozwiniÄ™cie, Sortowanie produktĂłw, WyĹwietlić podkategorie, TytuĹ kategorii, Blokuj indeksacjÄ™) |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Podmiana całych słów zamiast `ć``ć` itd. | Bezpieczniej — nie zostawia ryzyka uszkodzenia poprawnych fragmentów przy hipotetycznym przyszłym pojawieniu się tych bajtów w innym kontekście | Edits są precyzyjne, łatwe do code-review |
| Fix tylko ten jeden plik | grep pokazał że to jedyny plik z mojibake w całym repo | Scope minimalny, brak ryzyka regresji |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 0 | — |
| Scope additions | 0 | — |
| Deferred | 1 | Git commit transition-phase (pattern z faz 15-19) |
**Total impact:** Plan wykonany dokładnie według planu.
### Deferred Items
- Transition-phase git commit dla Phase 20 — pattern z faz 15-19 (commit zrobi `/koniec-pracy` lub user manualnie). Brak negatywnego impactu — auto-upload FTP już ma plik na produkcji.
## Issues Encountered
None.
## Next Phase Readiness
**Ready:**
- Pattern detekcji mojibake (regex) udokumentowany — przydatny przy przyszłych audytach encoding
- Plik category-edit.php czysty UTF-8
**Concerns:**
- Inne pola w bazie (`additional_text` kategorii) mają mieszane HTML entities z polskimi znakami — oddzielny issue, nie blokuje
- Brak automatycznego sprawdzania encoding w CI — przyszły fix mógłby wprowadzić nowy mojibake bez wykrycia
**Blockers:** None.
## Skill Audit (Phase 20)
| Expected | Invoked | Notes |
|----------|---------|-------|
| /feature-dev | ○ | Triviany fix labelek — override per pattern poprzednich faz |
| /koniec-pracy | ○ | Pending — uruchomić przy release update package |
---
*Phase: 20-category-edit-mojibake-fix, Plan: 01*
*Completed: 2026-05-13*

View File

@@ -7,7 +7,7 @@ ob_start();
?>
<div id="settings-tabs">
<ul class="resp-tabs-list settings-tabs">
<li><i class="fa fa-file"></i>Treść</li>
<li><i class="fa fa-file"></i>Treść</li>
<li><i class="fa fa-wrench"></i>Ustawienia</li>
<li><i class="fa fa-globe"></i>SEO</li>
</ul>
@@ -17,7 +17,7 @@ ob_start();
<ul class="resp-tabs-list languages-main htabs">
<? if ( is_array( $this -> languages ) ): foreach ( $this -> languages as $lg ):?>
<? if ( $lg['status'] ):?>
<li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="Język domyślny"></i> ';?><?= $lg['name'];?></a></li>
<li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="Język domyślny"></i> ';?><?= $lg['name'];?></a></li>
<? endif;?>
<? endforeach; endif;?>
</ul>
@@ -45,7 +45,7 @@ ob_start();
);?>
<?= \Shared\Html\Html::textarea(
array(
'label' => 'Opis kategorii (rozwinięcie)',
'label' => 'Opis kategorii (rozwinięcie)',
'name' => 'text_hidden[' . $lg['id'] . ']',
'id' => 'text_hidden_' . $lg['id'],
'value' => $this -> category['languages'][ $lg['id'] ]['text_hidden'],
@@ -84,7 +84,7 @@ ob_start();
);?>
<?= \Shared\Html\Html::select(
[
'label' => 'Sortowanie produktĂłw',
'label' => 'Sortowanie produktów',
'name' => 'sort_type',
'id' => 'sort_type',
'values' => is_array( $this -> sort_types ) ? $this -> sort_types : [],
@@ -93,7 +93,7 @@ ob_start();
);?>
<?= \Shared\Html\Html::input_switch(
array(
'label' => 'Wyświetlić podkategorie',
'label' => 'Wyświetlić podkategorie',
'name' => 'view_subcategories',
'checked' => $this -> category['view_subcategories'] == 1 ? true : false
)
@@ -104,7 +104,7 @@ ob_start();
<ul class="resp-tabs-list languages-seo htabs">
<? if ( is_array( $this -> languages ) ): foreach ( $this -> languages as $lg ):?>
<? if ( $lg['status'] ):?>
<li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="Język domyślny"></i> ';?><?= $lg['name'];?></a></li>
<li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="Język domyślny"></i> ';?><?= $lg['name'];?></a></li>
<? endif;?>
<? endforeach; endif;?>
</ul>
@@ -124,7 +124,7 @@ ob_start();
);?>
<?= \Shared\Html\Html::input(
array(
'label' => 'Tytuł kategorii (h1)',
'label' => 'Tytuł kategorii (h1)',
'name' => 'category_title[' . $lg['id'] . ']',
'id' => 'category_title_' . $lg['id'],
'value' => $this -> category['languages' ][ $lg['id'] ]['category_title']
@@ -156,7 +156,7 @@ ob_start();
);?>
<?= \Shared\Html\Html::select(
array(
'label' => 'Blokuj indeksacjÄ™',
'label' => 'Blokuj indeksację',
'name' => 'noindex[' . $lg['id'] . ']',
'id' => 'noindex_' . $lg['id'],
'values' => array(