2011-01-10 8 views
8

In einem Modul ich schreibe Ich möchte mit mymodule.xml verwenden, um meine eigenen Block nach diesem Block einfügen:Magento-Block Injction über module.xml Dateien

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

, die innerhalb

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

wie in app/design/frontend/base/default/layout/catalog.xml

ich habe viele Varianten zu sehen, wie versucht:

<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> 

und nur

<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> 

und

<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> 

aber ich kann nicht die richtige Kombination zu finden scheinen. der einzige, mein Block macht, ist:

<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> 

aber offensichtlich ist es nicht gegeben, wo ich es wollte platziert werden.

+5

Antwort unten, aber ich wollte auch sagen, das war eine gut gestellte Frage, und besser als die meisten der nicht zu beantwortenden "es funktioniert nicht?!?! ???" Art von Layout-Fragen kommen wir um diese Teile herum. –

+1

Danke @Alan Ihre Antwort ist sehr klar, aber wechselnde 'Katalog/Produkt/view.phtml', während es eine gute Idee wäre, wenn ich nur ein Website-Besitzer wäre, fühlt sich einfach falsch für mich als Erweiterung Entwickler. Was ist, wenn Sie noch eine andere Erweiterung schreiben, die dasselbe tun muss (fügen Sie einen eigenen Block unter dem 'catalog/product_view_media' Block hinzu)? Wird dies nicht dazu führen, dass sich unsere Erweiterungen gegenseitig ausschließen? Gibt es keine Lösung für dieses Problem? vielleicht sollte getChildHtml überschrieben werden, wie es möglich ist, dass zusätzliche Blöcke basierend auf dem Layout oder der Konfiguration an bestehende angehängt oder vorangestellt werden? – epeleg

+0

1. Wenn Sie ein Modul für die Weiterverteilung und breite Verwendung erstellen, dann wäre das Ändern einer vorhandenen Vorlagendatei eine schlechte Form (und würde nicht für alle Versionen von Magento funktionieren). Leider habe ich keine ** gute ** Lösung für neu verteilbare Module gesehen, die ein Layout hinzufügen/verändern. Alles hängt davon ab, wer Ihr Modul verwenden wird. Da das Layout hochgradig anpassbar ist, sind Sie immer der Gnade ausgeliefert, was Ihre Modul-Endbenutzer getan haben oder tun könnten. –

Antwort

18

Wenn Sie sich die Deklaration des Inhalts in page.xml ansehen, sehen Sie Folgendes.

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

Standardmäßig ist der Baustein mit dem Namen Inhalt ist ein core/text_list, was zu einem Mage_Core_Block_Text_List übersetzt.

Der Zweck einerBlöcke ist einfach. Sie automatisch rendern alle Blöcke eingefügt. Deshalb können Sie einen Block erfolgreich in den Inhalt einfügen.

Der Block Sie wollen

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

einfügen in ein catalog/product_view, was zu einem Mage_Catalog_Block_Product_View übersetzt, die letztlich von Mage_Core_Block_Template erbt. Das macht es zu einem Template-Block. Vorlagenblöcke do not rendern automatisch ihre Kinder. Vorlagenblöcke rendern eine phtml Datei. Wenn die phtml einen Anruf enthält zu

$this->getChildHtml('block_name'); 

dann dem Block mit dem bestimmten Namen wird gemacht werden. Wenn die phtml Datei einen Aufruf an

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

enthält dann alle das Kind Blöcke wiedergegeben werden.

Also, wenn Sie sagen,

<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> 

sind Sie mymodule/folder_class in den product.info Block einen Block des Typs eingesetzt wird.Da product.info jedoch ein Vorlagenblock und kein Textlistenblock ist, wird der von Ihnen eingefügte Block nicht gerendert. Sie müssen eine benutzerdefinierte catalog/product/view.phtml Vorlage zu Ihrem Thema hinzuzufügen (durch die Basisvorlage kopieren) und dann am unteren Rand des view.phtml, fügen

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

Anstatt die Basisvorlage zu kopieren, können Sie local.xml [trick] (http://inchoo.net/ecommerce/magento/using-local-xml-for-overriding-or-updating-xml-structure/) verwenden. Überschreiben der Layouts. – yvoyer

+0

@yvoyer, schlagen Sie vor, einen Verweis auf product.info zu erhalten und seine Vorlage zu setzen? Oder etwas anderes? Epeleg erwähnt auch, dies von einem benutzerdefinierten Modul aus tun zu wollen, daher ist die Änderung von local.xml möglicherweise nicht die beste Wahl. –

+0

Ich habe nur darauf hingewiesen, dass er sein Layout in der local.xml überschreiben konnte, nur für den Fall, dass er nichts davon wusste.Aber Sie haben Recht, dass es für jetzt vielleicht nicht die beste Wahl ist. – yvoyer

0

Wenn Sie den Baustein in der catalog/product/view action hinzufügen wollen, glaube ich, Sie sollten es so setzen, sonst ersetzen Sie catalog_product_view durch die gewünschte Aktion oder default für irgendwelche Aktionen.

<layout version="0.1.0"> 
    <catalog_product_view> 
     <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> 
    </catalog_product_view> 
</layout> 
+1

Nicht richtig. Dadurch würde die Layoutänderung nur auf die Seiten ** angewendet, wenn die Ansichtsaktion im Produktcontroller im Katalogmodul aufgerufen wurde (catalog_product_view). Das Problem, das epeleg zu lösen versucht, ist das Hinzufügen eines Layoutblocks zu einem ** spezifischen ** Ort im Layout, der nicht Teil des Inhaltsblocks ist. –

+0

Nun eigentlich habe ich alle meine Änderungen innerhalb '' gemacht. @alan Ich kann aus deinem Kommentar verstehen, dass ich einen Block nach Namen referenzieren kann, ohne ihn in ein solches Handle zu verschachteln (ich hoffe, ich bekomme die ganze Terminologie richtig - catalog_product_view ist ein Handle, oder?) Und es wird angewendet irgendein Block mit dem referenzierten Namen? – epeleg

+0

@epeleg: Wenn Sie den verschiedenen layout.xml-Dateien Code hinzufügen, müssen sie in einem Handle verschachtelt sein (Sie haben diese Bedingungen richtig). In meinem Kommentar wurde nur darauf hingewiesen, dass Sie bereits wussten, wo Sie Ihren Block platzieren sollten, und dass Ihr Problem darin bestand, ihn zu rendern. –