W Magento 1, jako programista modułów, można zmienić szablon bloku za pomocą kodu XML układu podobnego do tego
<reference name="block_to_change">
<action method="setTemplate">
<param>/path/to/template.phtml</param>
</action>
</reference>
a następnie dodając szablon do motywu podstawowego.
app/design/frontend/base/default/template/path/to/template.phtml
Czy jako programista modułów można zrobić coś podobnego w Magento 2? Czy też muszę użyć kodu XML układu lub PHP, aby usunąć interesujący mnie blok i wstawić nowy blok z innym szablonem (którego klasa rozszerza klasę oryginalnego bloku)
Wiem, że mogę utworzyć niestandardową kompozycję, która zastępuje szablon, ale jestem zainteresowany stworzeniem modułu, który zmienia domyślny szablon, ale nadal pozwala niestandardowej kompozycji na zastąpienie tego szablonu.
Węzeł akcji jest przestarzały, ale można użyć argumentów blokowych
źródło
addtocart.phtml
pliku zgodnie z konfiguracją systemu, a także chcę to zaktualizować za pomocą niestandardowego modułu<action method='setTemplate'>
) działa bez problemów.Aby zrozumieć różnicę między
<arguments>
i<action>
musisz zrozumieć, jak konstruktorzy Magento 2 obiektów działać. Jeśli przesłonisz konstruktor w Magento, zawsze otrzymasz$data-parameter
tablicę, która jest tablicą. Są to dane przewidziane w plikach XML i tłumaczona na wewnętrzny$_data-array
z\Magento\Framework\DataObject
:Jednak w przypadku szablonu, jeśli
setTemplate()
jest używany w pseudo-konstruktorze (_construct()
pojedynczy podkreślnik), oznacza to, że$data
jest on zastępowany, bez względu na to, czy jest ustawiony w XML.W tym scenariuszu
<action>
jest preferowany, ponieważ jest on wykonywany po konstruktorze i pseudo-konstruktorze.źródło
Poniższe działało dla mnie w Magento EE 2.2.3
Uwaga: jeśli używasz niestandardowego modułu do zmiany szablonu rdzenia i oszalejesz, ponieważ poprzedni wycinek kodu nie działa, upewnij się, że moduł jest ładowany po module rdzenia, który próbujesz zmienić (module.xml), a ty wykonane
bin/magento setup:upgrade
:)źródło
Nie wiem dlaczego, ale uważam, że ten sposób jest najlepszy:
źródło
Działa to tylko wtedy, gdy twój blok nie został nadpisany przed użyciem
setTemplate
metody. Magento 2.2.xi wyższe.źródło