Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KW CMS Custom JS — README.md

# ⚡ KW CMS Custom JS

> **PrestaShop 9.0+ Module** — Wstrzykiwanie niestandardowego JavaScript per strona CMS

[![PrestaShop 9.0+](https://img.shields.io/badge/PrestaShop-9.0+-orange.svg)](https://www.prestashop.com)
[![PHP 8.1+](https://img.shields.io/badge/PHP-8.1+-777BB4.svg)](https://www.php.net)
[![Version 1.0.2](https://img.shields.io/badge/version-1.0.2-blue.svg)](https://github.com/PB-MEDIA-Strony-Sklepy-Marketing/prestashop-module_cmscustomjs/releases)
[![License](https://img.shields.io/badge/License-AFL--3.0-blue.svg)](LICENSE)
[![KEDAR‑WIHA.pl](https://img.shields.io/badge/KEDAR%E2%80%91WIHA.pl-autoryzowany%20dystrybutor-8B0000.svg)](https://kedar-wiha.pl)

---

## 📋 Spis treści

- [Opis](#-opis)
- [Funkcjonalności](#-funkcjonalności)
- [Wymagania](#-wymagania)
- [Instalacja](#-instalacja)
- [Konfiguracja](#-konfiguracja)
- [Użycie](#-użycie)
- [Struktura bazy danych](#-struktura-bazy-danych)
- [Bezpieczeństwo i walidacja JS](#-bezpieczeństwo-i-walidacja-js)
- [Hooki PrestaShop](#-hooki-prestashop)
- [Przykłady użycia](#-przykłady-użycia)
- [Rozwiązywanie problemów](#-rozwiązywanie-problemów)
- [Rozwój i Contributing](#-rozwój-i-contributing)
- [Licencja](#-licencja)
- [Wsparcie](#-wsparcie)

---

## 🔍 Opis

**KW CMS Custom JS** to autorski moduł dla PrestaShop 9.0+, który umożliwia elastyczne dodawanie niestandardowego kodu JavaScript do konkretnych stron CMS sklepu.

Moduł został zaprojektowany z myślą o potrzebach sklepu [KEDAR-WIHA.pl](https://kedar-wiha.pl) — autoryzowanego dystrybutora profesjonalnych narzędzi WIHA Polska — ale może być wykorzystany w każdym projekcie PrestaShop wymagającym dynamicznego wstrzykiwania skryptów bez modyfikacji kodu źródłowego motywu.

### 🎯 Główne zastosowania

-**Skrypty analityczne** — Google Analytics, Facebook Pixel, Hotjar na wybranych stronach CMS
-**Widgety zewnętrzne** — czaty, kalkulatory, formularze kontaktowe per strona
-**Interaktywne elementy** — animacje, walidacje formularzy, dynamiczne treści
-**A/B testing** — wstrzykiwanie skryptów testowych na konkretne landing page'i
-**Integracje API** — dynamiczne ładowanie danych z zewnętrznych serwisów

---

## ✨ Funkcjonalności

### 🧠 Zarządzanie JavaScript per CMS

-**Targetowanie po `id_cms`** — każdy skrypt przypisany do konkretnej strony CMS
-**Wstrzykiwanie przed `</body>`** — hook `displayBeforeBodyClosingTag` gwarantuje ładowanie po wszystkich zasobach motywu
-**Cache zapytań DB** — statyczny `$jsCache` minimalizuje obciążenie bazy danych
-**Guard duplikacji** — flaga `$jsRendered` zapobiega wielokrotnemu renderowaniu tego samego JS w jednym requestcie
-**Auto-cleanup** — przy usuwaniu/aktualizacji strony CMS skrypt jest automatycznie usuwany z bazy

### 🔐 Bezpieczeństwo i walidacja (7-warstwowa)

-**Filtr niebezpiecznych wzorców** — blokowanie `eval()`, `document.write`, `document.cookie`, `<script>` i innych zagrożeń
-**Diagnostyczne logowanie** — każde odrzucenie JS jest rejestrowane w `PrestaShopLogger` z kontekstem i offsetem
-**Walidacja składni** — sprawdzanie balansu nawiasów `{}`, `()` przed zapisem
-**Sanityzacja znaków** — usuwanie null bytes i niedozwolonych znaków kontrolnych
-**Maksymalna długość** — limit 500 000 znaków zapobiega DoS przez oversized payload
-**Escapowanie HTML** — usuwanie tagów HTML z kodu JS przed renderowaniem
-**3-warstwowa ochrona CSRF** — hidden field + GET token + sesja employee

### ⚙️ Panel administracyjny

-**Intuicyjny formularz** — wybór strony CMS z dropdown + textarea na kod JS
-**Podgląd zapisanych skryptów** — lista wszystkich aktywnych wpisów z długością i datą modyfikacji
-**Edycja i usuwanie** — szybkie zarządzanie istniejącymi skryptami
-**Auto-naprawa DB** — przy braku tabeli moduł próbuje ją automatycznie odtworzyć

### 🚀 Performance & Security

-**Try/Catch(\Throwable)** — wszystkie hooki zabezpieczone przed crashem w PHP 8.x
-**Bezpieczna detekcja CMS ID**`getCurrentCmsId()` nie polega na niezainicjalizowanym `$controller->cms`
-**Query z indeksami** — unikalny klucz na `id_cms` zapewnia szybki lookup O(1)
-**IIFE wrapper** — renderowany JS jest opakowany w Immediately Invoked Function Expression + `DOMContentLoaded` guard
-**Brak zewnętrznych zależności** — czysty PHP + SQL, kompatybilny z PS9

---

## 📦 Wymagania

| Komponent | Wymagana wersja | Uwagi |
|-----------|----------------|-------|
| **PrestaShop** | `≥ 9.0.0` | Testowano na 9.0.3 z motywem Optima 3.3.0 |
| **PHP** | `≥ 8.1` | Zalecane 8.2+ dla optymalnej wydajności |
| **MySQL/MariaDB** | `≥ 5.7` / `≥ 10.3` | Engine: InnoDB, charset: `utf8mb4_unicode_ci` |
| **Smarty** | `≥ 4.x` | Domyślny silnik szablonów w PS9 |

---

## 🚀 Instalacja

### Metoda 1: Przez Back Office (rekomendowana)

1. Pobierz archiwum modułu: `kw_cmscustomjs.zip`
2. Zaloguj się do Back Office PrestaShop
3. Przejdź do: **Moduły → Menedżer modułów**
4. Kliknij **"Prześlij moduł"** i wybierz plik `.zip`
5. Po instalacji kliknij **"Konfiguruj"** przy module *KW CMS Custom JS*

### Metoda 2: Manualna (FTP/SFTP)

```bash
# 1. Sklonuj repozytorium lub pobierz pliki
git clone https://github.com/PB-MEDIA-Strony-Sklepy-Marketing/prestashop-module_cmscustomjs.git

# 2. Przenieś folder do katalogu modułów PrestaShop
cp -r prestashop-module_cmscustomjs /path/to/prestashop/modules/kw_cmscustomjs

# 3. Ustaw uprawnienia
chmod -R 755 /path/to/prestashop/modules/kw_cmscustomjs

# 4. Zainstaluj przez Back Office lub CLI
php bin/console prestashop:module:install kw_cmscustomjs

✅ Weryfikacja instalacji

Po instalacji moduł automatycznie:

  • Tworzy tabelę PREFIX_kw_cms_custom_js w bazie danych
  • Rejestruje hook displayBeforeBodyClosingTag
  • Dodaje wpis w tabeli PREFIX_module z statusem active = 1

Sprawdź w Back Office: Moduły → Menedżer modułów → "KW CMS Custom JS" powinien mieć status ✅ Zainstalowany.


⚙️ Konfiguracja

Dostęp do panelu konfiguracji

Back Office → Moduły → Menedżer modułów → KW CMS Custom JS → [Konfiguruj]

Lub bezpośrednio:

/admin/index.php?controller=AdminModules&configure=kw_cmscustomjs&token=XXX

Dodawanie nowego skryptu JS

  1. W formularzu "Dodaj nowy skrypt JS" wypełnij pola:
Pole Opis Wymagane Przykład
Strona CMS Wybierz stronę, na której ma działać skrypt O nas, Kontakt, FAQ
Custom JS Kod JavaScript bez tagów <script> console.log('Strona załadowana');
  1. Kliknij "Zapisz skrypt"
  2. Skrypt pojawi się na liście — możesz go edytować lub usunąć

Zarządzanie istniejącymi skryptami

Akcja Opis
✏️ Edytuj Kliknij przycisk edycji przy wpisie, aby zmodyfikować kod JS
🗑️ Usuń Trwałe usunięcie skryptu z bazy danych (wymaga potwierdzenia)

⚠️ Uwaga: Puste pole JS = usunięcie skryptu dla danej strony CMS.


🛠️ Użycie

Struktura renderowanego outputu

Moduł generuje następującą strukturę HTML dla każdego aktywnego skryptu:

<!-- KW CMS Custom JS :: CMS #8 -->
<script type="text/javascript" data-kw-cms-custom-js="8">
(function() {
  "use strict";
  try {
    // Twój custom JS tutaj
    document.addEventListener('DOMContentLoaded', function() {
      console.log('Skrypt załadowany na stronie CMS #8');
    });
  } catch(e) {
    console.error("[KW CMS Custom JS] Error on CMS #8:", e);
  }
})();
</script>
<!-- /KW CMS Custom JS -->

Kluczowe cechy renderowania:

  1. IIFE wrapper — kod jest opakowany w (function() { ... })(); aby uniknąć zanieczyszczenia globalnego scope'u
  2. "use strict" — wymusza tryb ścisły JavaScript dla lepszej kontroli błędów
  3. Try/Catch — każdy błąd w skrypcie jest łapany i logowany do konsoli, nie crashuje strony
  4. Atrybut data-kw-cms-custom-js — ułatwia debugowanie i targetowanie w DevTools
  5. Komentarze HTML — wyraźne oznaczenie początku i końca wstrzykniętego kodu

Kolejność ładowania

Skrypt jest wstrzykiwany przez hook displayBeforeBodyClosingTag, który w motywie Optima 3.3.0 znajduje się w layout-both-columns.tpl linia ~161:

{block name='hook_before_body_closing_tag'}
  {hook h='displayBeforeBodyClosingTag'}
{/block}

Oznacza to, że Twój custom JS ładuje się PO:

  • ✅ jQuery i Bootstrap
  • ✅ Plikach motywu (optima.js, theme.js)
  • ✅ Innych hookach frontendowych
  • ✅ Ale PRZED zamknięciem </body>

💡 Tip: Dzięki tej kolejności masz pełny dostęp do jQuery ($), PrestaShop JS API i wszystkich załadowanych bibliotek.


🗄️ Struktura bazy danych

Tabela: PREFIX_kw_cms_custom_js

CREATE TABLE IF NOT EXISTS `PREFIX_kw_cms_custom_js` (
  `id_kw_cms_custom_js` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_cms`              INT(11) UNSIGNED NOT NULL,
  `custom_js`           LONGTEXT DEFAULT NULL,
  `date_add`            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `date_upd`            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_kw_cms_custom_js`),
  UNIQUE KEY `idx_id_cms` (`id_cms`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Opis kolumn

Kolumna Typ Opis
id_kw_cms_custom_js INT UNSIGNED Unikalny identyfikator rekordu (PK)
id_cms INT UNSIGNED ID strony CMS — unikalny klucz (1 skrypt na stronę)
custom_js LONGTEXT Zawartość kodu JavaScript po sanityzacji
date_add DATETIME Data utworzenia rekordu
date_upd DATETIME Data ostatniej modyfikacji

Indeksy wydajności

-- Unikalny indeks na id_cms zapewnia szybki lookup O(1)
SHOW INDEX FROM `PREFIX_kw_cms_custom_js`;
-- Wynik:
-- PRIMARY KEY (`id_kw_cms_custom_js`)
-- UNIQUE KEY `idx_id_cms` (`id_cms`) ← kluczowe dla wydajności

🔐 Bezpieczeństwo i walidacja JS

🚫 Blokowane wzorce (DANGEROUS_PATTERNS)

Moduł automatycznie odrzuca kod zawierający następujące wzorce:

Wzorzec Opis zagrożenia Przykład blokowany
COOKIE_THEFT Kradzież ciasteczek sesji document.cookie
DOM_WRITE Nadpisanie DOM, XSS document.write('<script>')
EVAL Wykonanie arbitralnego kodu eval(userInput)
NEW_FUNCTION Dynamiczne tworzenie funkcji new Function('alert(1)')
SETTIMEOUT_STR Eval-like execution setTimeout("code", 1000)
SETINTERVAL_STR Eval-like execution setInterval("code", 1000)
SCRIPT_TAG Zagnieżdżone tagi skryptu </script><script>

📋 Diagnostyczne logowanie

Przy każdym odrzuceniu kodu moduł rejestruje szczegółowy log w PrestaShopLogger:

kw_cmscustomjs REJECTED: pattern=COOKIE_THEFT 
matched="document.cookie" offset=42

Log zawiera:

  • Nazwę wykrytego wzorca
  • Dopasowany fragment kodu (max 60 znaków)
  • Offset pozycji w kodzie źródłowym
  • Kontekst (120 znaków wokół matched text)

Sprawdź logi w: Zaawansowane → Logi w Back Office.

✅ Dozwolone operacje

Moduł pozwala na:

  • ✅ Manipulację DOM przez querySelector, getElementById, addEventListener
  • ✅ AJAX/fetch do własnych endpointów API
  • ✅ Manipulację klasami CSS, stylami inline
  • ✅ Obsługę eventów (click, submit, scroll)
  • ✅ Integracje z zewnętrznymi API (po spełnieniu CSP)

⚠️ Uwaga: Jest to sanityzacja defensywna, nie sandbox. Admin wstrzykujący kod musi mieć świadomość, że dodaje kod wykonywalny po stronie klienta.


🔗 Hooki PrestaShop

Frontend hooks

Hook Opis
displayBeforeBodyClosingTag Wstrzykuje <script> z custom JS przed zamknięciem </body>

Back Office hooks

Hook Opis
displayBackOfficeHeader Ładuje assets CSS/JS panelu konfiguracji modułu

Event hooks (cache invalidation)

Hook Opis
actionObjectCmsUpdateAfter Czyści cache JS przy aktualizacji strony CMS
actionObjectCmsAddAfter Resetuje cały cache przy dodaniu nowej strony CMS
actionObjectCmsDeleteAfter Automatycznie usuwa JS z DB przy usunięciu strony CMS

Rejestracja hooków (kod źródłowy)

public function install(): bool
{
    return parent::install()
        && $this->createDatabaseTable()
        && $this->registerHook('displayBeforeBodyClosingTag')
        && $this->registerHook('displayBackOfficeHeader')
        && $this->registerHook('actionObjectCmsUpdateAfter')
        && $this->registerHook('actionObjectCmsAddAfter')
        && $this->registerHook('actionObjectCmsDeleteAfter');
}

💡 Tip: Jeśli potrzebujesz wstrzykiwać JS w innym miejscu (np. w <head>), dodaj nowy hook i zaimplementuj odpowiednią metodę hookDisplayXXXX().


💡 Przykłady użycia

🎯 Przykład 1: Google Analytics 4 na stronie "O nas"

Konfiguracja:

  • Strona CMS: O nas (id_cms = 2)
  • Custom JS:
// Google Analytics 4 - tylko na stronie "O nas"
document.addEventListener('DOMContentLoaded', function() {
  if (typeof gtag === 'function') {
    gtag('event', 'page_view', {
      page_title: 'O nas - KEDAR-WIHA.pl',
      page_location: window.location.href,
      page_path: '/o-nas'
    });
  }
});

🎯 Przykład 2: Widget czatu Tawk.to na stronie "Kontakt"

Konfiguracja:

  • Strona CMS: Kontakt (id_cms = 8)
  • Custom JS:
// Tawk.to Widget - tylko na stronie Kontakt
(function() {
  var Tawk_API = Tawk_API || {}, Tawk_LoadStart = new Date();
  (function() {
    var s1 = document.createElement("script"), s0 = document.getElementsByTagName("script")[0];
    s1.async = true;
    s1.src = 'https://embed.tawk.to/YOUR_PROPERTY_ID/default';
    s1.charset = 'UTF-8';
    s1.setAttribute('crossorigin', '*');
    s0.parentNode.insertBefore(s1, s0);
  })();
})();

⚠️ Uwaga: Pamiętaj o zgodności z RODO — widgety śledzące wymagają zgody użytkownika.


🎯 Przykład 3: Animacja wejścia sekcji na stronie "Certyfikaty"

Konfiguracja:

  • Strona CMS: Certyfikaty i Jakość (id_cms = 3)
  • Custom JS:
// Prosta animacja fade-in dla kart certyfikatów
document.addEventListener('DOMContentLoaded', function() {
  const cards = document.querySelectorAll('.kw-comp__cert-card');

  if ('IntersectionObserver' in window) {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach((entry, index) => {
        if (entry.isIntersecting) {
          setTimeout(() => {
            entry.target.style.opacity = '1';
            entry.target.style.transform = 'translateY(0)';
          }, index * 100);
          observer.unobserve(entry.target);
        }
      });
    }, { threshold: 0.1 });

    cards.forEach(card => {
      card.style.opacity = '0';
      card.style.transform = 'translateY(20px)';
      card.style.transition = 'opacity 0.4s ease, transform 0.4s ease';
      observer.observe(card);
    });
  }
});

🎯 Przykład 4: Walidacja formularza kontaktowego

Konfiguracja:

  • Strona CMS: Kontakt (id_cms = 8)
  • Custom JS:
// Client-side validation formularza kontaktowego
document.addEventListener('DOMContentLoaded', function() {
  const form = document.querySelector('#contact-form');
  if (!form) return;

  form.addEventListener('submit', function(e) {
    const email = form.querySelector('[name="email"]');
    const phone = form.querySelector('[name="phone"]');
    const message = form.querySelector('[name="message"]');

    let errors = [];

    if (email && !email.value.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
      errors.push('Nieprawidłowy format adresu e-mail');
    }

    if (message && message.value.length < 10) {
      errors.push('Wiadomość musi mieć co najmniej 10 znaków');
    }

    if (errors.length > 0) {
      e.preventDefault();
      alert('Błędy w formularzu:\n\n' + errors.join('\n'));
      return false;
    }
  });
});

🔧 Rozwiązywanie problemów

❌ Skrypt JS nie wykonuje się na stronie CMS

  1. Sprawdź, czy strona CMS ma przypisany skrypt:

    • Przejdź do panelu modułu i upewnij się, że wybrana strona ma zapisany JS
  2. Sprawdź konsolę przeglądarki:

    • Czy nie ma błędów składni w Twoim kodzie JS?
    • Czy skrypt nie zależy na elementach DOM, które jeszcze nie istnieją?
  3. Sprawdź, czy hook jest wywoływany:

    • Otwórz źródło strony i wyszukaj KW CMS Custom JS — czy komentarz się pojawia?
  4. Wyczyść cache PrestaShop:

    • Zaawansowane → Wydajność → Wyczyść cache

❌ Kod JS jest odrzucany z błędem bezpieczeństwa

  1. Sprawdź logi PrestaShop:

    • Przejdź: Zaawansowane → Logi
    • Wyszukaj wpis zaczynający się od kw_cmscustomjs REJECTED
  2. Zidentyfikuj wykryty wzorzec:

    • Log pokaże: pattern=COOKIE_THEFT, matched="document.cookie", offset=42
  3. Zmodyfikuj kod:

    • Jeśli potrzebujesz dostępu do document.cookie, rozważ użycie Data Layer lub server-side tracking zamiast direct access

❌ Błąd przy instalacji / aktualizacji

  1. Sprawdź uprawnienia do bazy danych — użytkownik DB musi mieć uprawnienia CREATE TABLE

  2. Sprawdź logi PrestaShop:

    • /var/logs/prod.log lub w Back Office: Zaawansowane → Logi
  3. Jeśli tabela istnieje z poprzedniej wersji — moduł użyje CREATE TABLE IF NOT EXISTS, więc dane powinny zostać zachowane

❌ Skrypt działa na wszystkich stronach, nie tylko na wybranej

  1. Sprawdź metodę getCurrentCmsId():

    • Moduł używa 4-warstwowej detekcji: Smarty context → controller class → URL param → friendly URL parsing
    • Upewnij się, że strona CMS ma poprawny id_cms w URL lub w kontekście Smarty
  2. Sprawdź, czy strona jest aktywna i przypisana do sklepu:

    • W Back Office: Preferencje → SEO i URL → Strony CMS
    • Upewnij się, że strona ma status ✅ Aktywna i jest przypisana do domyślnego sklepu

🧑‍💻 Rozwój i Contributing

Struktura projektu

kw_cmscustomjs/
├── kw_cmscustomjs.php          # Główny plik modułu (logika + hooki + sanitization)
├── config.xml                  # Metadane modułu dla Back Office
├── logo.png                    # Ikona modułu w Back Office
├── views/
│   ├── css/
│   │   └── admin.css           # Style panelu konfiguracji
│   ├── js/
│   │   └── admin.js            # Skrypty panelu konfiguracji
│   └── templates/
│       └── admin/
│           └── configure.tpl   # Szablon Smarty formularza admin
├── README.md                   # Ten plik
├── LICENSE                     # Licencja AFL-3.0
└── .gitignore                  # Reguły ignorowania plików

Zasady kodowania

  • ✅ Przestrzegaj PrestaShop Coding Standards
  • ✅ Używaj pSQL() do sanitizacji zapytań SQL
  • ✅ Unikaj bezpośrednich zapytań — używaj Db::getInstance()->executeS()
  • ✅ Dokumentuj publiczne metody PHPDoc
  • ✅ Testuj na PrestaShop 9.0.3 przed commitowaniem zmian
  • ✅ Zawsze opakowuj hooki w try/catch(\Throwable)

Dodawanie nowych funkcjonalności

Przykład: Dodanie wsparcia dla inline CSS (analogicznie do JS)

  1. Dodaj nowe pole w formularzu admin (configure.tpl):

    <div class="form-group">
    <label>Custom CSS (bez tagów <style>)</label>
    <textarea name="KW_CMS_CUSTOM_CSS" class="form-control" rows="4">{$kw_current_css|escape:'htmlall':'UTF-8'}</textarea>
    </div>
  2. Dodaj sanitizację CSS w sanitizeCss() (analogicznie do sanitizeJs()):

    private function sanitizeCss(string $rawCss): array
    {
     // Implementacja analogiczna do sanitizeJs()
     // ...
    }
  3. Dodaj renderowanie CSS w hooku:

    public function hookDisplayBeforeBodyClosingTag($params)
    {
     // ... existing JS logic ...
    
     $customCss = $this->getCssFromDb($idCms);
     if (!empty(trim($customCss))) {
         $output .= '<style type="text/css" data-kw-cms-custom-css="' . (int) $idCms . '">'
             . $customCss . '</style>' . PHP_EOL;
     }
    
     return $output;
    }

Testowanie lokalne

# 1. Sklonuj repozytorium
git clone https://github.com/PB-MEDIA-Strony-Sklepy-Marketing/prestashop-module_cmscustomjs.git

# 2. Stwórz symlink do lokalnej instalacji PrestaShop
ln -s /path/to/module kw_cmscustomjs /path/to/prestashop/modules/

# 3. Włącz tryb debugowania w PrestaShop
# Edytuj /config/defines.inc.php:
define('_PS_MODE_DEV_', true);

# 4. Testuj zmiany w Back Office → Moduły
# 5. Sprawdź konsolę przeglądarki i logi PrestaShop

Pull Request workflow

  1. Forkuj repozytorium
  2. Utwórz branch z opisową nazwą: feat/add-css-support-per-cms
  3. Wprowadź zmiany zgodnie z coding standards
  4. Przetestuj na lokalnej instancji PS 9.0.3:
    • Dodaj skrypt do strony CMS
    • Sprawdź, czy wykonuje się tylko na tej stronie
    • Sprawdź, czy niebezpieczne wzorce są blokowane
  5. Commituj z czytelnym message: feat: add inline CSS support per CMS page
  6. Otwórz PR z opisem zmian, screenshotami panelu admin i listą testów

📜 Licencja

Ten moduł jest dystrybuowany na licencji Academic Free License 3.0 (AFL-3.0).

Copyright © 2025 KEDAR-WIHA.pl

Licensed under the Academic Free License version 3.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://opensource.org/licenses/AFL-3.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

ℹ️ W przypadku zainteresowania komercyjnym wykorzystaniem modułu na innych warunkach, prosimy o kontakt: info@kedar-wiha.pl


🆘 Wsparcie

📞 Kontakt techniczny

Kanał Dane
E-mail info@kedar-wiha.pl
Telefon +48 575 838 766
WhatsApp wa.me/48575838766
GitHub Issues Otwórz zgłoszenie

🔗 Przydatne linki

🐛 Zgłaszanie błędów

Przed zgłoszeniem błędu upewnij się, że:

  1. Używasz najnowszej wersji modułu (1.0.2)
  2. Sprawdziłeś sekcję Rozwiązywanie problemów
  3. Przetestowałeś na czystej instalacji PrestaShop 9.0.3 (jeśli możliwe)

W zgłoszeniu podaj:

  • Wersję PrestaShop i PHP
  • ID strony CMS, na której występuje problem
  • Fragment kodu JS, który powoduje błąd (jeśli dotyczy)
  • Zrzuty ekranu konsoli przeglądarki / logów PrestaShop

🔄 Historia wersji

Wersja Data Zmiany
1.0.2 2025-03 🔧 FIX: Diagnostyczne komunikaty błędów — pokazują KTÓRY wzorzec matchuje i NA CZYM
🔧 FIX: Odczyt JS bezpośrednio z $_POST (omija Tools::getValue + stripslashes)
🔧 FIX: Usunięto nadmiarowe wzorce (atob, fromCharCode, hex/unicode escapes)
🔧 FIX: Dodano PrestaShop Logger diagnostykę przy każdym odrzuceniu JS
1.0.1 2025-03 🐛 FIX: Poprawiono detekcję id_cms w hookach frontendowych
🐛 FIX: Dodano guard tableExists() przed wszystkimi zapytaniami DB
♻️ Refactor: Statyczny cache $jsCache zamiast per-instance
1.0.0 2025-03 🎉 Pierwsza wersja produkcyjna
✅ Podstawowa funkcjonalność: JS per CMS page
✅ Hook displayBeforeBodyClosingTag
✅ 7-warstwowa sanityzacja i walidacja JS
✅ 3-warstwowa ochrona CSRF
✅ Panel administracyjny z CRUD
✅ Auto-cleanup przy usuwaniu CMS

🔗 Powiązane moduły KEDAR-WIHA.pl

Moduł Repozytorium Opis
KW CMS Custom CSS prestashop-module_cmscustomcss Wstrzykiwanie inline CSS per strona CMS
KEDAR-WIHA Custom Block prestashop-module_addcustomblocktohooks Dodawanie bloków HTML/CSS/JS na dowolny hook
KEDAR-WIHA Free Shipping prestashop-module_freeshipping Automatyczna darmowa dostawa od 1000 zł netto

About

Moduł Custom JS per strona CMS dla PrestaShop 9.0.3. Dodaje pole textarea „Custom JS" do panelu admina, które pozwala na wstrzykiwanie per-page JavaScript do sekcji przed </body> konkretnych stron CMS. JS jest przechowywany w dedykowanej tabeli DB i wstrzykiwany TYLKO gdy istnieje.

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages