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>
7.1 KiB
7.1 KiB
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.phppobieral zdalny changelog przezfile_get_contentszshoppro.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 zmain-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). Plikadmin/templates/shop-category/category-edit.phpbyl 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}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„wadmin/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..."), boLayoutEngine::show()nadpisywal w galezi kategorii/artykulu/produktu tylko$page['language']['title'], ameta_titlez domyslnej strony zylo dalej i wygrywalo w linii substytucji[TITLE]. - Wyodrebniono nowa metode publiczna
\front\LayoutEngine::applyEntityMetaToPage($page, $entityLanguage, $fallbackTitle): zawsze nadpisujemeta_title,meta_keywords,meta_descriptionw$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' wpp_shop_categories_langs.id=331to dane klienta (admin uzupelnia w panelu), nie bug shopPRO. .gitignorerozszerzony otemp/(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-valw URL zmieniony z/na_. Stary format/slug/20-170/21-175nie matchowal sie wpp_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 (zseo_linki fallbackp-id-name).Helpers::htacces: regex routingu produktow z permutacja rozszerzony do/([0-9_-]+)$w obu wariantach.LayoutEngine.php(// PRODUKT): konwersja_->|przed wywolaniemProductRepository::findCached— format DB pozostaje bez zmian (attr-val|attr-val).templates/shop-product/_partial/product-attribute.php: preselekcja wartosci atrybutu na podstawiepermutation_hashz URL ($forced_value_id); wartoscis_defaultuzywana tylko gdy URL nie wymusza wyboru. Dotyczycheckedna inpucie i emisji blokufradio_label_click(...).- Dodano 7 testow jednostkowych:
HelpersRoutingTest(4 testy regex + assercje na zawartosci pliku) iProductFeedLinkTest(3 testyappendCombinationToXmlviaReflectionMethodz mockiemTransportRepository). Suita: 841 testow / 2330 assertions. - Wymagane akcje na produkcji po deployu: regeneracja
pp_routes(Helpers::htacces()), wyczyszczenie kluczapp_routes:allw Redis, regeneracjagoogle-feed.xml, resubmit feedu w GMC.
v0.349 (2026-04-20)
- Naprawiono wyswietlanie kosztu transportu na /koszyk-podsumowanie: transporty z
delivery_free=1pokazuja teraz rzeczywisty koszt ponizej progusettings.free_delivery, a 0,00 zl dopiero po osiagnieciu progu (spojnie z lista na /koszyk). - Dodano chroniona metode
ShopBasketController::calculateTransportCostForSummary()wyliczajacatransport_cost_effective+free_delivery_applies— logika widokowa przeniesiona z szablonu do kontrolera. - Szablon
templates/shop-basket/summary-view.phpuzywa nowych kluczy zamiast sprawdzania surowej flagidelivery_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ść.