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:
@@ -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)*
|
||||
|
||||
@@ -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*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]`.
|
||||
|
||||
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*
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user