Kategoria: Magento 2

  • Magento 2 – jak wyświetlić blok CMS w pliku PHTML

    W Magento 2 bloki CMS najczęściej używane są bezpośrednio w layoutach XML, jednak czasami zachodzi potrzeba wyświetlenia bloku CMS bezpośrednio w pliku PHTML np. przy warunkowej logice. W tym wpisie przybliżymy jak poprawnie wywołać blok CMS w plikach .phtml.

    Wyświetlanie bloku CMS w .phtml

    <?php
    echo $this->getLayout()
    ->createBlock('Magento\Cms\Block\Block')
    ->setBlockId('id_bloku_cms')
    ->toHtml();
    ?>

    W miejscu „id_bloku_cms” podajemy ID bloku statycznego CMS. Ważne – wprowadzamy identyfikator ustalony po stronie panelu, nie ID z bazy danych.

    Wywołanie bloku CMS na stronie CMS

    Jeśli blok CMS ma być użyty wewnątrz treści strony CMS, należy skorzystać z dyrektywy:

    {{block class="Magento\\Cms\\Block\\Block" block_id="id_bloku_cms"}}

    Wywołanie statycznego bloku CMS za pomocą pliku xml

    <referenceContainer name="product.info.main"> 
        <block class="Magento\Cms\Block\Block" name="block_identifier"> 
            <arguments> 
                <argument name="block_id" xsi:type="string">id_bloku</argument> 
            </arguments> 
        </block> 
    </referenceContainer>
    Czy można wywołać blok CMS warunkowo?

    Tak. W pliku .phtml możesz dodać dowolną logikę PHP np. sprawdzenie: typu produktu, danej cechy produktu, atrybutu klienta itd.).

    Czy to rozwiązanie działa w Magento 2.4.x?

    Tak. Wszystkie opisane metody są zgodne z każdą wersją Magento 2.

    Dlaczego zamiast statycznego HTMLa warto użyć bloku CMS?

    Ponieważ treść umieszczona w bloku CMS nie wymaga deployu kodu po zmianie i może być dowolnie modyfikowana przez administratora (bezpośrednio z poziomu panelu).

  • Zmiana limitu produktów crosssell w koszyku – Magento 2

    W Magento 2 domyślnie w koszyku w sekcji crosssell wyświetlane są maksymalnie 4 produkty. W wielu sklepach to ograniczenie jest uciążliwe – szczególnie przy rozbudowanej ofercie.

    Domyślny limit cross-sell w Magento 2

    W standardowej instalacji Magento 2 limit produktów cross-sell w koszyku wynosi 4. Wartość ta jest na stałe zdefiniowana w module Magento_Checkout i nie może być zmieniona z poziomu panelu administracyjnego.

    Gdzie zdefiniowany jest limit cross-sell

    Limit zdefiniowany jest w module Magento_Checkout – w klasie Crosssell. Ścieżka do pliku: vendor/magento/module-checkout/Block/Cart/Crosssell.php.

    Tak jak wspominaliśmy wyżej – Magento nie udostępnia do tego konfiguracji, dlatego jedynym poprawnym rozwiązaniem jest nadpisanie klasy poprzez własny moduł.

    Zmiana limitu cross-sell poprzez własny moduł Magento 2

    Potrzebne będą:

    – plik rejestrujący preference (di.xml)

    – plik nadpisujący limit

    LionBrothers/CrosssellLimit/etc/frontend/di.xml:

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <preference for="Magento\Checkout\Block\Cart\Crosssell" type="LionBrothers\CrosssellLimit\Block\Cart\Crosssell"/>
    </config>

    LionBrothers/CrosssellLimit/Block/Cart/Crosssell.php

    <?php
    
    namespace LionBrothers\CrosssellLimit\Block\Cart;
    
    class Crosssell extends \Magento\Checkout\Block\Cart\Crosssell
    {
        /**
         * Items quantity will be capped to this value
         *
         * @var int
         */
        protected $_maxItemCount = 8;
    }
    

    Trzeba pamiętać również o standardowych plikach każdego modułu – registration.php oraz module.xml.

    Dlaczego używamy preference, a nie pluginu?

    W tym przypadku limit produktów cross-sell jest ustawiony jako protected property, a nie metoda. Oznacza to, że nie możemy zmienić go za pomocą pluginu (before/after/around). Najprostszym rozwiązaniem (i zarazem dobrą praktyką) jest użycie preference i rozszerzenie oryginalnej klasy.

    Masz pytania? Napisz komentarz!

    Czy można zmienić limit wyświetlanych produktów crosssell z poziomu panelu administracyjnego?

    Nie, Magento 2 nie udostępnia takiej konfiguracji w panelu administracyjnym.

    Czy to działa w Magento 2.4.x?

    Tak, rozwiązanie działa we wszystkich wersjach Magento 2.