Files
shopPRO/.paul/docs/TECH_CHANGELOG.md
Jacek Pyziak 073069c303 fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (v0.353)
Zdalny changelog z shoppro.project-dc.pl/updates/changelog.php zwracal
niezbalansowany HTML (niezamkniety <script>/<style>/<textarea>/<!--),
ktory "polykal" reszte dokumentu - inline-script z handlerami
#confirm/#confirmUpdateAll i footer-script z main-layout.php
(#clear-cache-btn) nigdy nie parsowaly sie jako JS. Klienci nie mogli
aktualizowac shopPRO.

Fix w admin/templates/update/main-view.php:
1. Blok <script> z handlerami przeniesiony PRZED sekcje Changelog -
   handlery podpinaja sie niezaleznie od zdalnego HTML.
2. Sanityzacja zdalnego changeloga: preg_replace usuwa komentarze HTML,
   strip_tags z whitelista (<p><br><b><strong><i><em><u><ul><ol><li>
   <h1>-<h6><span><div><a><pre><code><hr>) wycina tagi strukturalne i
   wykonywalne (<script>, <style>, <iframe>, <textarea>).

Skutek uboczny: footer-script z main-layout.php (Wyczysc cache + globalne
wyszukiwanie + sprawdzanie aktualizacji) dziala teraz na podstronie update.

Po wgraniu na instancje: hard-reload (Ctrl+F5) + restart PHP-FPM /
wyczyszczenie OPcache.

Suita PHPUnit: 846 testow / 2348 assertions OK.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 23:10:08 +02:00

7.1 KiB
Raw Blame History

TECH_CHANGELOG

Chronologiczny log zmian technicznych — co i dlaczego.

v0.353 (2026-05-13)

  • Naprawiono niedzialajace przyciski aktualizacji systemu (#confirm, #confirmUpdateAll) i globalny "Wyczysc cache" (#clear-cache-btn) na /admin/update/main_view/. Klienci nie mogli aktualizowac shopPRO na instancjach.
  • Root cause: admin/templates/update/main-view.php pobieral zdalny changelog przez file_get_contents z shoppro.project-dc.pl/updates/changelog.php. Odpowiedz zawierala niezbalansowany HTML (niezamkniety <script>, <!--, <style> lub <textarea>), ktory "polykal" reszte dokumentu — inline-script z handlerami przyciskow i footer-script z main-layout.php (Wyczysc cache) nigdy sie nie parsowal jako JS. Brak bledu w konsoli — to nie byl blad JS, to byl HTML, ktory nigdy nie zostal wykonany jako skrypt.
  • Fix 1: blok <script> z handlerami przeniesiony PRZED sekcje Changelog (wczesniej kolejnosc: wersje -> log -> changelog -> script; teraz: wersje -> log -> script -> changelog). Handlery podpinaja sie niezaleznie od tego, co zwroci zdalny serwer.
  • Fix 2: sanityzacja zdalnego changeloga przed wyrenderowaniem: preg_replace('/<!--.*?-->/s', '', $html) + strip_tags($html, '<p><br><b><strong><i><em><u><ul><ol><li><h1>-<h6><span><div><a><pre><code><hr>'). Tagi strukturalne i "polykajace" (<script>, <style>, <textarea>, <iframe>, <body>, </html>) sa usuwane.
  • Skutek uboczny: footer-script z main-layout.php (przycisk Wyczysc cache + globalne wyszukiwanie produktow/zamowien + sprawdzanie aktualizacji w menu) dziala teraz na podstronie update.
  • Zysk bezpieczenstwa: zdalny serwis nie moze juz wstrzyknac JS w panel admina.
  • Wymagane akcje na produkcji po wgraniu update package: hard-reload przegladarki (Ctrl+F5) + restart PHP-FPM / wyczyszczenie OPcache (inaczej stary skompilowany szablon dalej bedzie serwowany).
  • Suita PHPUnit bez zmian: 846 testow / 2348 assertions.

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].
  • Wyodrebniono nowa metode publiczna \front\LayoutEngine::applyEntityMetaToPage($page, $entityLanguage, $fallbackTitle): zawsze nadpisuje meta_title, meta_keywords, meta_description w $page['language'] wartosciami encji (nawet pustym/null), eliminujac wyciek.
  • LayoutEngine.php: 3 galezie (category, article, product) wywoluja helper zamiast inline'ow z nadpisywaniem czesci pol.
  • Dodano 5 testow jednostkowych (tests/Unit/front/LayoutEngineMetaTagsTest.php) na pure-function helper: meta_title encji wygrywa, NULL czysci homepage, all-null product, null entity safe, empty page struct. Suita: 846 testow / 2348 assertions.
  • Diagnostyka root cause na produkcyjnej DB: pp_routes mapuje poprawnie (category=10, product=522); literalne 'description'/'keywords' w pp_shop_categories_langs.id=331 to dane klienta (admin uzupelnia w panelu), nie bug shopPRO.
  • .gitignore rozszerzony o temp/ (skrypty diagnostyczne z DB credentials).
  • Wymagane akcje na produkcji po deployu: poczekac na TTL cache Redis (24h) lub wyczyscic klucze pp_routes:all, front_category_details:*, shop\\product:* — opcjonalne (fix jest w warstwie poza cache).

v0.350 (2026-04-30)

  • Naprawiono linki produktow z permutacja atrybutow w feedzie Google: separator par attr-val w URL zmieniony z / na _. Stary format /slug/20-170/21-175 nie matchowal sie w pp_routes (regex [0-9-]+ nie obejmuje /), wiec klienci z GMC ladowali na strone glowna zamiast na produkt.
  • ProductRepository::appendCombinationToXml: str_replace('|', '/', ...) -> str_replace('|', '_', ...) w obu galeziach (z seo_link i fallback p-id-name).
  • Helpers::htacces: regex routingu produktow z permutacja rozszerzony do /([0-9_-]+)$ w obu wariantach.
  • LayoutEngine.php (// PRODUKT): konwersja _ -> | przed wywolaniem ProductRepository::findCached — format DB pozostaje bez zmian (attr-val|attr-val).
  • templates/shop-product/_partial/product-attribute.php: preselekcja wartosci atrybutu na podstawie permutation_hash z URL ($forced_value_id); wartosc is_default uzywana tylko gdy URL nie wymusza wyboru. Dotyczy checked na inpucie i emisji bloku fradio_label_click(...).
  • Dodano 7 testow jednostkowych: HelpersRoutingTest (4 testy regex + assercje na zawartosci pliku) i ProductFeedLinkTest (3 testy appendCombinationToXml via ReflectionMethod z mockiem TransportRepository). Suita: 841 testow / 2330 assertions.
  • Wymagane akcje na produkcji po deployu: regeneracja pp_routes (Helpers::htacces()), wyczyszczenie klucza pp_routes:all w Redis, regeneracja google-feed.xml, resubmit feedu w GMC.

v0.349 (2026-04-20)

  • Naprawiono wyswietlanie kosztu transportu na /koszyk-podsumowanie: transporty z delivery_free=1 pokazuja teraz rzeczywisty koszt ponizej progu settings.free_delivery, a 0,00 zl dopiero po osiagnieciu progu (spojnie z lista na /koszyk).
  • Dodano chroniona metode ShopBasketController::calculateTransportCostForSummary() wyliczajaca transport_cost_effective + free_delivery_applies — logika widokowa przeniesiona z szablonu do kontrolera.
  • Szablon templates/shop-basket/summary-view.php uzywa nowych kluczy zamiast sprawdzania surowej flagi delivery_free.
  • Dodano 6 testow jednostkowych (ShopBasketControllerSummaryViewTest) pokrywajacych AC + edge cases (prog rowny, prog 0, transport null). Suita: 834 testy / 2318 assertions.

v0.348 (2026-04-19)

  • Dodano przełącznik widoczności etykiet niestandardowych na liście produktów w panelu admina, z zapisem stanu w sesji.
  • Po włączeniu opcji renderowane jest 5 pól custom_label_0..4 bezpośrednio pod sekcją zdjęcie/nazwa produktu.
  • Dodano zapisywanie wartości etykiet niestandardowych do bazy oraz walidację dozwolonych typów etykiet po stronie kontrolera.
  • Wprowadzono podpowiedzi istniejących wartości jako wybieralne sugestie z możliwością wpisania własnej wartości.
  • Rozszerzono testy jednostkowe dla ShopProductController i ProductRepository pod nową funkcjonalność.