2013-01-23 7 views
40

Jestem front-end Magento dev, stworzyliśmy sporo moich własnych tematów i chcę zrozumieć pozycjonowanie bloku XML Magento lepiej ...Magento XML przy użyciu przed/po umieszczać bloki prawie nigdy nie działa

normalnie użyć pliku local.xml manipulować wszystko, mogę zdefiniować blok następująco:

<cms_index_index> 
    <reference name="root"> 
     <block type="core/template" name="example_block" as="exampleBlock" template="page/html/example-block.phtml"/> 
    </reference> 
</cms_index_index> 

byłoby to utworzenie bloku na stronie głównej (cms_index_index) a ponieważ blok jest tworzony jeden poziom pod root, ja normalnie wywoła blok, dodając:

<?php echo $this->getChildHtml('exampleBlock') ?> 

... do 1column.phtml (lub 2columns-left/right.phtml, 3columns.phtml etc). Blok można umieścić na dowolnej stronie, zastępując odpowiednią etykietę strony, zastępując cms_index_index.

widzę rzeczy jak poniżej całym podstawowych plików XML, oraz podręcznikach:

<reference name="root"> 
    <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/> 
</reference> 

content jest blok, który jest częścią ogólnej struktury strony Magento i, z tego co rozumiem, before="content" należy go umieścić gdziekolwiek byś się spodziewał, bez potrzeby używania getChildHtml('exampleBlock'), jak dotąd tak dobrze ... jednak, przed/po prawie nigdy nie wydaje się pracować dla mnie, i często znajduję się uciekania się do metody getChildHtml jako kopii zapasowej, co nie zawsze jest idealny i oznacza edytowanie większej liczby plików .phtml niż to konieczne.

Próbowałem: pojawia

<reference name="root"> 
    <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/> 
</reference> 

Nic ...

<reference name="root"> 
    <block type="core/template" name="example_block" after="header" template="page/html/example-block.phtml"/> 
</reference> 

nadal nic .... Mam też świadomość korzystania before="-" lub after="-" umieścić coś zanim wszystko w zasięgu to blok nadrzędny. Czasami mam z tym trochę szczęścia, ale generalnie po prostu czuję się zdezorientowany i sfrustrowany.

Mam google w całym miejscu na "Magento xml przed/po nie działa" i zaczyna się zastanawiać, czy to po prostu mnie to dzieje ... może ktoś wyjaśnić, kiedy mogę i nie mogę używać przed/po układać klocki? Co jest nie tak z powyższymi przykładami?

jestem w Magento 1.7.0.2 (ostatni dostępny w momencie delegowania)

Główną motywacją jest to, aby zmniejszyć liczbę plików rdzenia .phtml muszę zmieniać tylko dodać getChildHtml(), więc jeśli istnieje inny (XML) sposób obejścia tego, chciałbym wiedzieć ...

+0

wszystkie bufory są wyłączone:/ –

Odpowiedz

81

W before i after atrybuty pracować tylko w jednym z dwóch przypadków:

  1. Po włożeniu do core/text_list bloku
  2. Kiedy wzywa twój blok szablon getChildHtml bez żadnych parametrów

kiedy powiedz

<reference name="root"> 
    <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/> 
</reference> 

mówisz Magento

Hej Magento, umieścić example_block wewnątrz bloku root.

Po umieszczeniu szeregu różnych bloków w rodzicu, bloki te mają domyślną kolejność. W przypadku bloków szablonów kolejność ta nie ma znaczenia, ponieważ bloki te są jawnie renderowane.

<?php echo $this->getChildHtml('example_block') ?> 

Istnieją jednak dwa przypadki, w których porządek ma znaczenie. Po pierwsze, jeśli zadzwonisz

<?php echo $this->getChildHtml() ?> 

z szablonu, a następnie Magento odda wszystkie bloki dziecko, w kolejności.

Po drugie, istnieje specjalny rodzaj bloku zwany "listą tekstową" (core/text_list/Mage_Core_Block_Text_List). Bloki te automatycznie renderują wszystkie dzieci, ponownie w kolejności. Blok content jest przykładem tego

<block type="core/text_list" name="content"/> 

Dlatego można wstawić bloki w content i sprawiają one automatycznie.

W powyższym przykładzie wstawiasz bloki do bloku root. Blok root jest blokiem szablonu, którego szablon pht wykorzystuje połączenia getChildHtml z jawnymi parametrami. Dlatego atrybuty before i after nie robią tego, czego ty (i wielu innych, w tym ja), nie chcesz.

+4

dzięki dokonywania że ładne i jasne, rozumiem dużo lepiej :) –

+0

dzięki ... wielki wyjaśnienie –

+0

bardzo ładne wyjaśnienie dzięki –

Powiązane problemy