Zastępowanie bloku w Magento, czyli Reference + Block + Template

W Magento istnieje bardzo dobry mechanizm zastępowania jednego Bloku innym bez konieczności modyfikowania jakichkolwiek plików XML lub PHTML. Mechanizm ten jest opisany w internecie na ‘oficjalnym’ tutorialu, lecz w sposób trochę niejasny. A jako, że wiekszość ludzi, która pisze na ten temat, beszczelnie przepisuje ten tutorial wprowadzając tylko drobne zmiany, to ta niejasność jest powtarzana i powtarzana.

Dokładnie rzecz biorąc, chodzi o znacznik reference w pliku xml opisującym layout. We wspomnianym tutorialu autor robi tak:

1. Tworzy plik simple_page.phtml w folderze: .\app\design\frontend\base\default\template\
2. Wewnątrz wpisuje jakiś kod html, np.

<div>zzz</div>

3. Tworzy plik local.xml w folderze: .\app\design\frontend\base\default\layout\
4. Wewnątrz wpisuje opis layoutu

<layout version="0.1.0">
    <default>
        <reference name="root">
			<block type="page/html" name="root" template="simple_page.phtml" />
		</reference>
    </default>
</layout>

No i tym sposobem gdy wejdziemy do frontendu Magento to zamiast normalnej strony mamy wypisane na ekranie „zzz”. Jest tak dlatego, że oryginalny blok o nazwie root (który jest początkowym blokiem, od którego wszystko się zaczyna) został zastąpiony naszym blokiem, który ładuje zawartość z pliku podanego w template.

I tu jest ta nieścisłość. Chodzi o to, że nie jest wprost napisane, że jak chcemy zastąpić blok o nazwie root, to w name przy reference nie zapisujemy nazwy tego bloku, tylko rodzica, w którym się znajduje. Dlatego jak chcemy zastąpić lewą kolumnę na przykład to robimy coś takiego:

<layout version="0.1.0">
    <default>
        <reference name="root">
			<block type="page/html" name="left" template="simple_page.phtml" />
		</reference>
    </default>
</layout>

A wszyscy plagiaciarze przepisują na ciemniaka ten tutorial i później ludzie zamiast rodzica wpisują tam nazwę bloku, który chcą zastąpić.