DC Product Grid Expand - nowy wymiar UI/UX w prezentacji produktów na sklepie internetowym

DC Product Grid Expand - nowy wymiar UI/UX w prezentacji produktów na sklepie internetowym

DC Product Grid Expand powstał jako odpowiedź na bardzo konkretny problem: listing produktów w OpenCart nie wykorzystuje potencjału UX i nie wspiera procesu zakupowego.


Standardowy grid prezentuje tylko minimalny zestaw danych (zdjęcie, nazwę i cenę). Jeżeli produkt ma opcje, warianty, dłuższy opis lub wymaga podjęcia decyzji — użytkownik musi opuścić listing i przejść na kartę produktu.

To generuje kilka konsekwencji:

  • wysoką liczbę przejść na stronę produktu, nawet wtedy, gdy użytkownik chce wyłącznie sprawdzić jedną opcję;

  • rozbicie procesu zakupowego — klient traci kontekst listingu i musi wracać;

  • brak płynności znanej z nowoczesnych aplikacji, gdzie dane pojawiają się dopiero w momencie interakcji.

Moduł został zaprojektowany jako komponent UI, który eliminuje te bariery poprzez dodanie warstwy interaktywnej bez ingerencji w natywny routing OC.
Rozwiązanie opiera się na koncepcji inline expansion — produkt rozwija się w miejscu, w którym użytkownik go kliknął. Nie jest to slider, carousel ani odmiana klasycznego modułu produktów. To interfejs rozszerzający listing, który:

  • wczytuje opis, cenę, warianty oraz panel koszyka,

  • umożliwia wybór opcji bez przeładowania strony,

  • wykonuje dodanie do koszyka bez opuszczania widoku,

  • korzysta z autorskiego systemu cache i minifikacji modułu.

Efekt: listing przestaje być tylko tabelą miniatur, a staje się użytecznym narzędziem sprzedażowym.

To dokładnie ten moment, w którym projektowanie sklepów internetowych wychodzi poza estetykę i zaczyna realnie wspierać decyzje zakupowe użytkownika.

 

Co potrafi DC Product Grid Expand? (funkcje modułu)

DC Product Grid Expand to moduł zaprojektowany jako warstwa interfejsu nad klasycznym listingiem OC. Jego zadaniem jest skrócenie ścieżki użytkownika i umożliwienie wykonania pełnej interakcji produktowej bez wychodzenia z listingu.

Najważniejsze funkcje modułu:

  • Interaktywna animacja expand — produkt rozwija się w obrębie swojej pozycji w gridzie, bez przesuwania reszty układu. Pod maską działa kontrolowana wysokość panelu + płynna animacja CSS/JS, która nie zaburza layoutu.

  • Pełna obsługa opcji produktowych — warianty select, radio, checkbox oraz pola tekstowe.
    Moduł korzysta z własnego modelu dc_options, który pobiera dane identycznie jak karta produktu i renderuje je w gridzie.

  • Add to cart / wishlist / compare bez przeładowania strony — każde działanie wykonuje AJAX-em, w trybie podobnym do natywnego OC, ale bez redirectów i bez utraty kontekstu listingu.

  • Trzy tryby pracy modułu:

    • latest — sortowanie po dacie dodania,

    • sales — promocje,

    • bestsellers — oparte na danych sprzedażowych.
      Każdy tryb respektuje filtrowanie po kategorii.

  • Konfiguracja wizualna — administrator określa szerokość i wysokość miniatur, tytuł modułu, opis, limit produktów oraz zestaw opcji do wyświetlania.

  • Wsparcie dla wielojęzyczności — moduł automatycznie renderuje nazwy opcji, ich wartości i opis modułu zgodnie z aktualnym językiem sklepu.
    URL-e w przyciskach (koszyk, porównywarka, lista życzeń) generowane są dynamicznie per language-code.

  • System cache i minifikacji — moduł generuje własne pliki .min.css i .min.js w dedykowanym katalogu cache, co ogranicza liczbę requestów i przyspiesza ładowanie komponentu.

  • Architektura kompatybilna z core OC 4 — moduł działa na własnym kontrolerze, nie ingeruje w system events i nie nadpisuje layoutów sklepu.

W praktyce: listing produktów staje się komponentem UI, który zapewnia pełną funkcjonalność karty produktu, ale bez przeładowania strony i bez wybijania użytkownika z procesu przeglądania.

Zobacz na poniższym wideo DC Product Grid Expand w akcji!

 

Jak działa expander produktu? (UX + techniczna magia w tle)

Expander w DC Product Grid Expand wygląda na prosty element UI, ale w środku to bardzo precyzyjnie zsynchronizowany mechanizm. Jego zadanie jest jedno: otworzyć panel produktu dokładnie w miejscu, gdzie użytkownik kliknął — bez skakania layoutu, bez lagów i bez przeładowania strony.

Poniżej krok po kroku, jak to działa.

 

1. Kliknięcie w miniaturę uruchamia cały mechanizm

Użytkownik klika w <a> z atrybutami:

<a href="/{{ product.href }}" 
   data-largesrc="{{ product.thumb }}"
   data-title="{{ product.name }}"
   data-description="{{ product.description }}">

Ten element nie przeładowuje strony. Grid.js wychwytuje klik, blokuje domyślne zachowanie i uruchamia funkcję otwierającą expander.

 

2. Jak pobierane są dane produktu?

To kluczowa różnica względem codziennych „quick views”.

Expander nie wykonuje AJAX-a po kliknięciu.
Dane dla expandera są już w DOM — moduł generuje cały HTML produktu po stronie PHP i ukrywa go wewnątrz:

<div class="dc-product-grid-expand-content" style="display:none;">
    …cała zawartość panelu…
</div>

Dzięki temu:

  • expander otwiera się natychmiast,

  • nie ma opóźnienia sieciowego,

  • opcje produktu są gotowe od razu (radio/select/checkbox/text),

  • nie trzeba synchronizować AJAX → UI.

Szybkość expandera wynika właśnie z tego podejścia.

 

3. Struktura HTML expandera

Moduł generuje dwa kluczowe bloki:

a) Główna miniatura:

<li>
    <a data-largesrc="…" data-title="…" data-description="…">
        <img src="/{{ product.thumb }}">
    </a>

b) Ukryta treść panelu:

<div class="dc-product-grid-expand-content" style="display:none;">
    <form class="dc-curtain-products-form">
        
        <div class="dc-product-grid-expand-options">
            {{ product.options }}
        </div>

        <div class="dc-product-grid-expand-interface">
            …cena, koszyk, wishlist, porównanie…
        </div>

    </form>
</div>

Kiedy panel się otwiera, grid podmienia placeholder na realną zawartość tego <div>.

 

4. Automatycznie generowane elementy

Moduł przygotowuje dane jeszcze na etapie PHP:

  • titleproduct.name

  • description → czysty opis skrócony

  • image → przeskalowany przez model_tool_image->resize

  • options → renderowane przez własny widok dc_options.twig

  • ceny → specjalna + bazowa, formatowane przez OC

Expander dzięki temu pokazuje wszystko, co karta produktu — tylko szybciej i w kontekście listy.

 

5. Dlaczego animacja expandera jest płynna?

To najważniejszy element UX — i powód, dla którego cały moduł działa „premium”.

 

Co się dzieje w momencie otwarcia:

  • skrypt oblicza wysokość rozwijanego panelu na podstawie jego wewnętrznej treści,

  • wrapper <li> otrzymuje dynamiczną wysokość (na podstawie minHeight + wysokość opcji),

  • transi­cja jest wykonywana czystym CSS (transition: height),

  • zawartość pojawia się dopiero po zakończeniu animacji, aby nic nie „podskakiwało”.

 

Dlaczego animacja nie zacina się przy wielu produktach?

  • Expander jest zawsze jeden — jeśli jeden panel jest otwarty, drugi natychmiast go zamyka.

  • DOM nie jest przepisywany — dane są już w HTML, więc nie ma reflow spowodowanego AJAX-em.

  • Obliczenia wysokości są wykonywane tylko na jednym elemencie, a nie na całym gridzie.

  • Skrypt używa debouncedresize, więc resize okna nie powoduje lawiny obliczeń.

W efekcie nawet 40 produktów na liście nie powoduje żadnego dropu FPS.

 

Obsługa opcji produktów — 100% zgodność z rdzeniem OpenCart

W expanderze musiałem odwzorować zachowanie opcji dokładnie tak, jak robi to standardowa karta produktu w OpenCart. Użytkownik powinien mieć identyczne doświadczenie, a backend musi dostać te same dane, w tej samej strukturze. Dlatego cały system opcji oparty jest o modele OC, natywną serializację formularza i identyczne nazewnictwo pól.

 

1. Pobieranie opcji przez dedykowany model dc_options

Moduł nie generuje opcji ręcznie. Wszystko pobieram z własnego modelu:

$this->load->model('extension/dc_product_grid_expand/module/dc_options');
$options = $this->model_extension_dc_product_grid_expand_module_dc_options->getOptions($product_id, $tax_class_id);

Model działa na tych samych tabelach, co core OpenCart:

  • product_option

  • product_option_value

  • option

  • option_value

Efekt?
Expander ma dokładnie te same opcje, jakie widzi klient na karcie produktu.
Bez skrótów, bez uproszczeń, bez modyfikowania struktury.

 

2. Mapowanie typów opcji: radio, checkbox, select, text

Podczas renderowania tworzę HTML zgodny z konwencją rdzenia OC:

  • radio → name="option[ID]"

  • checkbox → name="option[ID][]"

  • select → name="option[ID]"

  • text/textarea → name="option[ID]"

Każda wartość ma prawidłowy value="{{ product_option_value_id }}".

Dlatego serialize() generuje payload 1:1 zgodny z kartą produktu.

Przykład radiobuttona:

<input
    type="radio"
    class="form-check-input dc-option-input"
    name="option[237]"
    value="59">

To jest dokładnie to, czego oczekuje checkout/cart.add.

 

3. System kliknięcia labela → zaznaczenie opcji

To jest funkcja, którą sam dopracowałeś — i która działa lepiej niż standardowe klikanie.

Klik w <label> nie tylko zaznacza input, ale też resetuje pozostałe etykiety w grupie:

function checkedRadio(label){
    var group  = label.parent();
    var groups = group.parent();
    var input  = group.find("input");

    groups.find("label").removeClass("checked");
    label.addClass("checked");
    input.prop("checked", true);
}

Dlaczego to jest kluczowe?

  • expander ma ograniczoną przestrzeń, więc UI musi być jasne,

  • użytkownik od razu widzi, która opcja jest aktywna,

  • nie ma ryzyka kliknięcia w input obok — cały label jest klikalny.

To zachowanie jest zgodne z UX nowoczesnych aplikacji e-commerce.

 

4. Różnica między standardową kartą produktu a expanderem

Karta produktu:

  • przeładowanie strony,

  • pełny HTML renderowany tylko dla jednego produktu,

  • błędy wymaganych opcji → redirect.

Expander:

  • działa w kontekście listingu,

  • pełne opcje bez przeładowania,

  • natychmiastowe reakcje UI,

  • AJAX przechwytuje błędy wymaganych pól,

  • użytkownik zostaje tam, gdzie kliknął.

Najważniejsze:
Expander nie jest „quick view”.
To pełna funkcjonalność karty produktu — tylko podana w sposób szybki i zoptymalizowany pod UX.

 

AJAX Add to Cart — jak moduł przejmuje pełną kontrolę nad koszykiem

W standardowym OpenCart logika dodawania produktu do koszyka kończy się zawsze tak samo: redirect na kartę produktu przy błędzie, a czasem nawet przy sukcesie — zależnie od motywu. To eliminuje jakąkolwiek możliwość tworzenia interaktywnych modułów produktowych na listingach.
W momencie, kiedy chciałem w expanderze obsługiwać opcje, koszyk, wishlistę i porównywarkę bez opuszczania strony, musiałem kompletnie przepiąć logikę OC i przejąć proces dodawania do koszyka na własnych zasadach.

 

Dlaczego musiałem przepisać logikę OC?

OpenCart:

  • nie ma API do „silent Add to Cart” na listingu,

  • nie zwraca błędów opcji w formacie, który można przechwycić bez redirectu,

  • zawsze zakłada przeładowanie strony lub przejście do /product/product,

  • nie ma wbudowanego mechanizmu obsługi Add to Cart w modułach zawierających formularze z opcjami.

Gdyby expander korzystał z natywnego formularza, użytkownik za każdym razem lądowałby na karcie produktu, a cały koncept modułu nie miałby sensu.

Dlatego dopisałem własny interceptor: funkcję dcpge_addToCart(), która przejmuje cały proces zanim OC wykona redirect.

 

Jak działa funkcja dcpge_addToCart()

To centralny punkt modułu — mini kontroler na frontendzie.

1) Zatrzymuję natywne wysłanie formularza:

e.preventDefault();

 

2) Wyszukuję formularz powiązany z klikniętym przyciskiem:

var form = button.parent().parent(); 

 

3) Serializuję pełne dane, łącznie z opcjami:

form.serialize(); 

 

4) Wysyłam dokładnie ten sam request, jaki wysłałby rdzeń OC:

$.ajax({ url: 'index.php?route=checkout/cart.add&language={{ language }}', type: 'post', data: form.serialize(), dataType: 'json' }); 

 

5) Przechwytuję błędy i renderuję je bez redirectu:

if (json['error']) { // wyświetlenie błędu przy opcji } 

 

6) W przypadku sukcesu aktualizuję koszyk:

$('#cart').load('index.php?route=common/cart.info&language={{ language }}'); 

 

OC w żadnym miejscu nie jest w stanie zrobić tego samego samodzielnie.

 

Co dokładnie wysyłamy w request POST?

Przykładowy payload:

product_id=74 &quantity=1 &option[237]=59

Dokładnie taki sam format, jaki wysyła standardowa karta produktu.

Bez kombinowania, bez JSON-ów, bez customowych struktur.
Dzięki temu backend traktuje moduł jak natywne „Add to Cart”.

 

Obsługa błędów — brak wymaganej opcji ≠ redirect

Natywne OC:

  • brak opcji? → redirect na stronę produktu + komunikat w session->data['error']

My:

  • backend zwraca błąd JSON,

  • frontend przechwytuje go,

  • expander pokazuje informację użytkownikowi w tym samym miejscu,

  • nie opuszczamy listingu,

  • nie tracimy rozwinietego panelu.

To kluczowy element UX — użytkownik widzi błąd tam, gdzie klikał.

 

Dynamiczna aktualizacja koszyka — bez przeładowania strony

Po udanym dodaniu:

$('#cart').load('index.php?route=common/cart.info&language={{ language }}'); 

 

Co się dzieje?

  • mini-koszyk pobiera świeże dane,

  • ilości i wartości odświeżają się natychmiast,

  • użytkownik nie traci kontekstu.

To jest zachowanie oczekiwane w nowoczesnym e-commerce — OC4 nadal tego nie daje „out of the box”.

 

Dlaczego OC4 nie oferuje tego natywnie?

OpenCart trzyma się starego paradygmatu:

  • każdy formularz ma działać jak klasyczny POST,

  • moduły wyświetlają produkty, ale nie mają pełnej logiki zakupowej,

  • interakcje AJAX są minimalne (prawie wyłącznie w koszyku),

  • nie ma API do obsługi dynamicznych opcji poza kartą produktu.

Dlatego moduły takie jak DC Product Grid Expand muszą brać proces w swoje ręce.

I właśnie dlatego nasz Add to Cart w expanderze działa lepiej niż jakikolwiek natywny mechanizm w OpenCart.

 

 

System cache i minifikacja — serce wydajności modułu

W DC Product Grid Expand nie chodzi tylko o efekt wizualny. Cała konstrukcja modułu została zaprojektowana tak, żeby działać szybko — naprawdę szybko — nawet wtedy, gdy na stronie wyrzucamy kilkadziesiąt produktów, każdy z opcjami, animacją expand i logiką AJAX.
Żeby to osiągnąć, napisałem własny, autorski system cache i minifikacji, stosowany również w naszych szablonach i innych modułach Design Cart. To fundament wydajności całego rozwiązania.

 

Dlaczego w ogóle dodałem własny system cache?

OpenCart nie oferuje niczego, co umożliwiłoby:

  • łączenie wielu plików CSS/JS modułu w jeden zestaw,

  • minifikowanie ich automatycznie,

  • monitorowanie zmian, aby przebudować pliki tylko wtedy, gdy trzeba,

  • redukowanie liczby requestów podczas ładowania modułu.

Bez tego grid — składający się z animacji, logiki expandera, obsługi AJAX, przetwarzania opcji i stylów — wymagałby kilkunastu osobnych plików.
To strzał w Core Web Vitals, TTFB, LCP i ogólną percepcję szybkości.

Dlatego stworzyłem własną warstwę cache.

 

Jak działają modele dc_css_minify i dc_js_minify

1. dc_css_minify

  • pobiera listę wszystkich plików CSS przypisanych do modułu,

  • sprawdza timestampy plików,

  • łączy je w jeden bufor,

  • usuwa zbędne białe znaki, komentarze, nowe linie,

  • zapisuje wynik jako:
    extension/dc_product_grid_expand/cache/dc-product-grid-expand.min.css

 

2. dc_js_minify

  • działa analogicznie jak CSS, ale dla JS,

  • usuwa komentarze, whitespace, zbędne średniki,

  • optymalizuje kolejność ładowania,

  • wynik trafia do:
    extension/dc_product_grid_expand/cache/dc-product-grid-expand.min.js

Oba modele mają mechanizm blokady przebudowy — minifikacja uruchamia się tylko wtedy, gdy coś faktycznie się zmieniło.

 

Gdzie powstają minifikowane pliki?

Wszystkie finalne pliki są generowane do katalogu:

extension/dc_product_grid_expand/cache/

Tam znajdują się:

  • dc-product-grid-expand.min.css

  • dc-product-grid-expand.min.js

To jest ta sama lokalizacja, z której moduł ładuje zasoby do frontendu.

 

Jak moduł wykrywa, że musi odbudować minifikację?

System sprawdza:

  1. datę modyfikacji źródłowych plików CSS/JS

  2. zmiany w konfiguracji modułu

  3. cache_control flagę, którą moduł może ustawiać np. po zapisie ustawień w panelu admina

Jeżeli którakolwiek z tych rzeczy się zmieni:

  • cache jest czyszczony,

  • pliki są ostatecznie przebudowywane,

  • moduł ponownie generuje minifikowane zestawy.

Nie przebudowuje ich przy każdym wywołaniu — dlatego działa szybko, ale reaguje na zmiany.

 

Dlaczego grid ładuje się błyskawicznie? (1 request zamiast wielu)

Standardowy moduł złożony z:

  • Modernizr

  • grid.js

  • logiki AJAX

  • stylów animacji

  • CSS layoutu

wymagałby 5–8 requestów.

DC Product Grid Expand ładuje:

  • 1 request CSS

  • 1 request JS

  • kod HTML modułu

Koniec.

W praktyce przekłada się to na:

  • mniejsze opóźnienia inicjalizacji,

  • mniejsze „blocking time” w przeglądarce,

  • lepszy CLS, LCP i FID.

To kluczowa przewaga w Core Web Vitals.

 

Dlaczego to jest kluczowy element pod Core Web Vitals

Dzięki minifikacji i cache moduł:

  • skraca czas ładowania pierwszych elementów widocznych,

  • obniża wielkość plików JS/CSS nawet o kilkadziesiąt procent,

  • minimalizuje liczbę requestów,

  • zmniejsza obciążenie CPU przeglądarki (mniej plików → mniej parsingów).

W skrócie:

ulepszamy LCP, FID i CLS za jednym zamachem — bez kompromisów.

To ten sam mechanizm, którego używamy we wszystkich naszych modułach oraz szablonach Design Cart. Jest to element naszej własnej technologii optymalizacji, a nie kolejna nakładka na OC.

 

Pobieranie i instalacja modułu ⚙️

DC Product Grid Expand udostępniam w dwóch źródłach — zależnie od tego, czy potrzebujesz wersji w pełni stabilnej, czy chcesz pracować bezpośrednio na kodzie.

Skąd pobrać moduł?

Design Cart — stabilne wydanie, gotowe do wdrożenia produkcyjnego. 📦

Pobierz z Design Cart1

 

GitHub — kod źródłowy, pełna transparentność, możliwość śledzenia zmian. 🔍

Pobierz z GitHub

 

Obie paczki są w formacie ZIP, zgodne ze standardowym instalatorem OpenCart.

 

Instalacja — w pełni standardowa 🚀

Moduł instaluje się dokładnie tak samo jak każde rozszerzenie w OC:

  1. Przechodzisz do Extensions → Installer.

  2. Wskazujesz pobrany ZIP.

  3. Instalator sam rozpakowuje pliki oraz rejestruje OCMOD.

  4. Wchodzisz w Extensions → Modules i aktywujesz DC Product Grid Expand.

  5. Dodajesz moduł do wybranego layoutu: Home, Category, Information, landing pages itd.

Nie trzeba:

  • kopiować plików ręcznie,

  • modyfikować core OpenCart,

  • instalować dodatkowych bibliotek.

System cache i minifikacji wystartuje automatycznie po pierwszym uruchomieniu modułu. ⚡

 

Ustawienia modułu — pełna kontrola bez kodowania

Paneł administracyjny DC Product Grid Expand daje pełną kontrolę nad zachowaniem i wyglądem modułu — bez potrzeby dotykania kodu. Każda instancja modułu może działać inaczej, mieć inne źródła danych, inne opcje, inny layout i inny zestaw produktów.
Poniżej opisuję wszystkie dostępne ustawienia wraz z praktycznymi przykładami.

 

Limit produktów

To najprostsze, ale też jedno z najważniejszych ustawień.
Definiuje, ile produktów moduł ma pobrać z wybranego źródła (latest/sales/bestsellers).

Przykład użycia:
Chcesz wyświetlić 4 ostatnie produkty w formie interaktywnego grida w homepage → ustaw limit = 4.

Cechy:

  • działa w połączeniu z filtrami kategorii,

  • pozwala uniknąć zbyt długich listingów,

  • wpływa na szybkość ładowania modułu.

 

Kategorie filtrujące

Możesz wskazać jedną kategorię, z której moduł pobiera produkty.
Gdy wybierzesz „Wszystkie”, moduł sięga po pełną listę zgodnie z trybem (latest, sales, bestsellers).

Przykład użycia:

  • masz kategorię „Perfumy” → ustaw ją, aby wyświetlić tylko perfumy, nawet jeśli cały sklep ma wiele segmentów.

  • chcesz pokazać „Bestsellery z pielęgnacji twarzy” → wybierasz tryb bestsellers + kategorię pielęgnacja twarzy.

Zaleta:
Przy wielu instancjach modułu możesz stworzyć osobne gridy dla różnych segmentów sklepu.

 

Tryb modułu (latest / sales / bestsellers)

Moduł oferuje trzy tryby pobierania produktów:

1. latest

Pobiera najnowsze produkty wg daty dodania.

2. sales

Wyświetla produkty z ceną promocyjną (special).

3. bestsellers

Ładuje najchętniej kupowane produkty (na podstawie product.sales).

Przykład użycia:
— W dziale „Nowości” ustawiasz tryb latest
— Na homepage sekcja „Najczęściej kupowane” to bestsellers
— W kampanii promocyjnej stosujesz sales

 

Rozmiary obrazków

Możesz określić:

  • image_width

  • image_height

Moduł automatycznie używa modelu tool/image, aby przeskalować miniatury.

Przykład użycia:

  • jeśli grid ma być bardziej „wysoki”, używasz np. 500 × 720 px,

  • jeśli chcesz layout bardziej kompaktowy — np. 400 × 400 px.

Dzięki temu każda instancja modułu może wyglądać inaczej.

 

Tytuł i opis modułu (języki wielojęzyczne)

Pole module_description pozwala ustawić:

  • tytuł sekcji,

  • opis,

  • wszystko osobno dla każdego języka (PL/DE/EN itd.).

Przykład użycia:

  • Na PL stronie: „Nowe produkty – zobacz więcej”

  • Na EN stronie: „New arrivals – quick preview”

Wszystko w ramach jednego modułu — automatyczna obsługa i18n.

 

option_group_id — zaawansowana filtracja opcji

Jeżeli chcesz wyświetlać tylko wybrane grupy opcji, możesz wskazać ich ID.

Co to daje?

  • modul nie musi renderować wszystkich opcji produktu,

  • możesz stworzyć grid prezentujący tylko najważniejsze warianty,

  • możemy wdrożyć np. wyłącznie opcję „Pojemność”, pomijając inne warianty.

Przykład użycia:
Masz kosmetyki, które mają 8 opcji, ale w gridzie chcesz pokazać tylko „Pojemność”:
→ wstawiasz ID grupy opcji „Pojemność”.

To idealne rozwiązanie, gdy dbasz o estetykę i porządek.

 

Atrybut ID modułu — tworzenie wielu instancji

Pole attr_ID pozwala nadać modułowi unikalny atrybut HTML, np.:

id="dc-grid-1"

Co to daje?

  • możesz stylować każdą instancję osobno (CSS),

  • JS może działać w kontekście konkretnego modułu,

  • możesz wstawić kilka gridów na jednej stronie bez konfliktów,

  • możesz tworzyć osobne sekcje tematyczne: „Perfumy”, „Pielęgnacja”, „Make-up”.

Przykład użycia:
W landing page tworzysz trzy moduły pod rząd — każdy dostaje własne ID i wygląda inaczej.

 

 

Kiedy DC Product Grid Expand daje największy efekt? ⭐🔥

Ten moduł nie jest „kolejnym listingiem produktów”. On zmienia sposób, w jaki użytkownik odczuwa ofertę — dlatego są konkretne miejsca, gdzie jego użycie daje maksymalny zwrot UX/UI.

Poniżej przedstawiam realne scenariusze, w których expander robi robotę zdecydowanie lepiej niż standardowe moduły OpenCart.

 

Landing page promocji 🎯

Na stronach typu „Top 10 ofert”, „Promocja tygodnia”, „Black Friday” użytkownik chce szybko zobaczyć:

  • opis,

  • cenę,

  • warianty,

  • możliwość kupna — bez przeładowania strony.

Expander pozwala sprzedać produkt bez odciągania użytkownika do karty produktu, co przekłada się na więcej kliknięć „Dodaj do koszyka”.

 

Strony producentów 🏭

Jeżeli masz dedykowaną podstronę jednego brandu (np. kosmetyki, elektronika, moda), to klasyczna siatka produktów jest po prostu za płaska.
Expand robi różnicę, bo:

  • użytkownik widzi produkt i od razu rozwija szczegóły,

  • elementy premium (parametry, warianty, zdjęcia) są w jednym miejscu,

  • UX przypomina interaktywne katalogi producentów.

 

Strony kolekcji (moda, kosmetyki, biżuteria) 👗💄💍

To jedno z najlepszych zastosowań modułu.
W kolekcjach użytkownik skanuje wizualnie, a potem chce „dotknąć” produktu. Expander spełnia oba te warunki:

  • piękna siatka,

  • szybkie rozwinięcie,

  • natychmiastowe dodanie do koszyka.

Nie musimy rozpraszać go przejściem na osobną stronę.

 

Blog produktowy / lookbook

Jeśli publikujesz artykuły typu:

  • „Jak dobrać serum do skóry?”,

  • „5 sukienek na lato”,

  • „Najlepsze zapachy dla niej”,

to grid expand jest perfekcyjnym widgetem na końcu tekstu.
Czytelnik już jest w trybie zakupowym — umożliwiasz mu kupno z poziomu artykułu.

 

Prezentacja zestawów lub wariantów 🧩

Zestawy, warianty, różne pojemności, różne modele – idealne środowisko dla expandera.
Użytkownik w jednym miejscu:

  • wybierze wariant,

  • sprawdzi cenę,

  • doda produkt.

Nie musi przeskakiwać między kartami.

 

Produkty premium, które wymagają „prezentacji”, a nie zwykłej listy 💎

Jeśli masz produkty:

  • ekskluzywne,

  • tworzone ręcznie,

  • z dużą ilością detali,

  • storytellingowe,

to zwykły grid po prostu nie wystarcza.
Expander daje mikro-prezentację, mały showroom produktu bez zmiany strony.

 

Podsumowanie — gdzie DC Product Grid Expand robi największą różnicę? 🚀

DC Product Grid Expand powstał po to, żeby zwykłe listingi produktów zamienić w narzędzie sprzedażowe, a nie tylko wizualny katalog. I właśnie w opisanych wcześniej miejscach moduł pokazuje pełnię możliwości.

W landingach promocyjnych daje szybkość i brak tarcia.
Na stronach producentów — prezentacyjny charakter i lepsze UX.
W kolekcjach — płynność i natychmiastową interakcję.
W blogach produktowych — konwersję z treści.
W zestawach — wygodę wyboru wariantu.
W produktach premium — doświadczenie, którego nie da zwykły listing.

W tych scenariuszach expander nie jest „dodatkiem”. Jest elementem, który zmienia zachowanie użytkownika, skraca ścieżkę zakupu i po prostu… sprzedaje.

Jeśli moduł ma być wdrożony tam, gdzie liczy się wrażenie, tempo i płynność — DC Product Grid Expand trafia w punkt.

Chcesz przejść dalej do sekcji końcowej, FAQ albo mocnego marketingowego podsumowania modułu?

Szukasz wykonawcy sklepu internetowego? Sprawdź nasza ofertę: Cennik tworzenia sklepów internetowych.