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:
197
.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md
Normal file
197
.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md
Normal 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>
|
||||
121
.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
Normal file
121
.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md
Normal 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*
|
||||
Reference in New Issue
Block a user