2011-01-10 9 views
8

w module piszę chcę używać stosując mymodule.xml wstawić mój własny blok po bloku:Magento Blok Injction poprzez module.xml Files

<block type="catalog/product_view_media" name="product.info.media" as="media" template="catalog/product/view/media.phtml"/> 

który jest zagnieżdżony w

<reference name="content"> 
    <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml"> 

jak widać w app/projekt/frontend/base/default/układ/catalog.xml

próbowałem wielu wariantów, takich jak:

<reference name="content"> 
    <reference name="product.info"> 
     <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
    </reference> 
</reference> 

i tylko

<reference name="product.info"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

i

<reference name="product.info"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

ale nie mogę wydawać się znaleźć właściwą kombinację. jedynym, który czyni mój blok jest:

<reference name="content"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

ale oczywiście to nie jest umieszczony gdzie chciałem być umieszczone.

+5

Odpowiedź poniżej, ale chciałem również powiedzieć, że było to dobrze zadane pytanie, i lepsze niż większość odpowiedzi "nie działa?!??! ???" rodzaj pytań na temat Układu, które mamy wokół tych części. –

+1

Dzięki @Alan Twoja odpowiedź jest bardzo wyraźna, ale zmiana 'catalog/product/view.phtml', chociaż może być dobrym pomysłem, jeśli byłbym tylko właścicielem strony, jest dla mnie po prostu błędna jako programista rozszerzeń. Co jeśli piszesz kolejne rozszerzenie, które musi zrobić to samo (dodać własny blok w ramach bloku 'catalog/product_view_media')? Czy to nie wyklucza wzajemnie naszych rozszerzeń? Czy nie ma rozwiązania tego problemu? może getChildHtml powinno zostać przesłonięte, jak zezwolić na dołączanie dodatkowych bloków lub dodawanie ich do istniejących na podstawie układu lub konfiguracji? – epeleg

+0

1. Jeśli tworzysz moduł do redystrybucji i szerokiego wykorzystania, to tak, zmiana istniejącego pliku szablonu byłaby zła (i nie działałaby w wersjach Magento). Niestety, nie widziałem ** dobrego ** rozwiązania dla modułów, które można ponownie dystrybuować, które dodają/zmieniają układ. Wszystko zależy od tego, kto będzie używał twojego modułu. Ponieważ układ jest wysoce konfigurowalny, zawsze będziesz na łasce tego, co zrobili lub zrobili użytkownicy końcowi. –

Odpowiedz

18

Jeśli spojrzysz na deklarację bloku treści w page.xml, zobaczysz następujące.

<block type="core/text_list" name="content" as="content" translate="label"> 

Domyślnie, blok nazwany zawartość jest core/text_list, co przekłada się na Mage_Core_Block_Text_List.

Celem bloków core/text_list jest proste. One automatycznie renderują wstawione do nich bloki. Dlatego możesz z powodzeniem wstawić blok do treści.

Blok chcesz wstawić do

<block type="catalog/product_view" name="product.info" template="mymodule/folder/class.phtml" ... 

jest catalog/product_view, co przekłada się na Mage_Catalog_Block_Product_View, która ostatecznie dziedziczy Mage_Core_Block_Template. To sprawia, że ​​jest to blok szablonu. Bloki szablonów do not automatycznie renderują swoje dzieci. Bloki szablonów renderują plik phtml. Jeśli to phtml zawiera wezwanie do

$this->getChildHtml('block_name'); 

następnie blok z tej konkretnej nazwy będą renderowane. Jeśli plik phtml zawiera wezwanie do

$this->getChildHtml(); //no arguments 

następnie wszystkich bloki dziecko będzie renderowane.

Więc kiedy mówisz

<reference name="product.info"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

jesteś wkładając blok typu mymodule/folder_class w bloku product.info.Ale ponieważ product.info jest blokiem szablonu, a nie blokiem listy tekstowej, nie renderuje wstawianego bloku. trzeba dodać niestandardowe catalog/product/view.phtml szablon motywu (kopiując szablon bazowy), a następnie na dole view.phtml dodać

<?php echo $this->getChildHtml('mymodule.folder.class');?> 
+2

Zamiast kopiować szablon podstawowy, możesz użyć pliku local.xml [trick] (http://inchoo.net/ecommerce/magento/using-local-xml-for-overriding-or-updating-xml-structure/) aby zastąpić układy. – yvoyer

+0

@voyer, sugerujesz, aby uzyskać odniesienie do product.info i ustawić szablon? Albo coś innego? Epeleg wspomniał także, że chce to zrobić z niestandardowego modułu, więc zmiana pliku local.xml może nie być najlepszym wyborem. –

+0

Właśnie wskazywałem, że mógłby przesłonić swój układ w local.xml, na wypadek, gdyby nie wiedział o tym.Ale masz rację, że na razie nie jest to najlepszy wybór. – yvoyer

0

Jeśli chcesz dodać blok w catalog/product/view action, wierzę powinieneś umieścić to w ten sposób, w innym przypadku zastąpić catalog_product_view żądaną akcją lub default dla każdej akcji.

+1

Nie rację. Spowoduje to zmianę układu strony na ** tylko **, gdy wywołana zostanie akcja widoku w kontrolerze produktu w module katalogu (catalog_product_view). Problemem, który usiłuje rozwiązać epeleg, jest dodanie bloku układu do ** określonej ** lokalizacji w układzie, która nie jest częścią bloku treści. –

+0

Cóż, faktycznie zrobiłem wszystkie moje zmiany w ''. Czy mogę zrozumieć z twojego komentarza, że ​​mogę odwoływać się do bloku po nazwie bez zagnieżdżania go wewnątrz takiego uchwytu (mam nadzieję, że otrzymuję poprawną terminologię - katalog_produktów jest uchwytem, ​​prawda?) I zostanie zastosowany do dowolny blok z nazwą odniesienia? – epeleg

+0

@epeleg: podczas dodawania kodu do różnych plików layout.xml muszą być zagnieżdżone wewnątrz klamki (masz te warunki w prawo). Mój komentarz wskazywał, że już wiesz, gdzie umieścić swój blok, i że twój problem powodował, że renderowałeś go. –