Ich möchte Daten an den Aufruf getChildHtml () übergeben können. Der Grund dafür ist, dass die Ausgabe des Blocks von einem Produkttyp abhängt. Also möchte ich das Produkt an getChildHtml übergeben, damit es über die Ausgabe entscheiden kann.
Ich mache das drinnen template/checkout/cart/item/default.phtml
.
Im Idealfall würde der Aufruf folgendermaßen aussehen:
echo $this->getChildHtml('child_block_name', $_item);
Dann kann mein Block den Produkttyp aus dem Artikel abrufen und die richtige Ausgabe anzeigen.
Da es definitiv nicht möglich ist, diese Daten weiterzugeben getChildHtml
- wie sonst kann diese Art von Verhalten erreicht werden, ohne dass der Kernblock neu geschrieben werden muss
Die beiden Lösungen, die ich derzeit habe, sind wie folgt (beide nicht sehr attraktiv):
1 - Erstellen Sie einen Helfer und greifen Sie über den Helfer auf die HTML-Ausgabe zu, anstatt einen Block und eine Vorlage als Ganzes rendern zu lassen $this->helper('my_module')->getItemHtml($_item);
2 - Greifen Sie auf den untergeordneten Block zu und setzen Sie die Daten in der Vorlage:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Ich denke, in Bezug auf die Magento-Architektur ist Nummer 2 das kleinere von zwei Übeln, aber es ist verdammt hässlich, wenn man in eine Vorlage schaut.
Antworten:
Sie können dem übergeordneten Block eine Methode hinzufügen , um das untergeordnete Element abhängig vom Produkttyp abzurufen (ich habe diese Art von Logik einige Male im Kern oder in ähnlicher Form gesehen):
In Anbetracht dessen, wie Sie die Layout-XML ändern, um untergeordnete Blöcke hinzuzufügen, könnte es Sie interessieren, wie Magento je nach Produkttyp in
Mage_Sales_Block_Items_Abstract::getItemHtml()
und entschieden hat, mit Rendering-Markups zu arbeitenMage_Checkout_Block_Cart_Abstract::getItemHtml()
.quelle
Die obige Lösung funktioniert nicht, wenn Sie einen untergeordneten Block in einer
foreach
Schleife anzeigen .Dazu müssen Sie folgenden Code verwenden:
In child.block können Sie
$this->getMyData()
die Daten abrufen . Mit dieser Strategie erhält der untergeordnete Block immer die neuesten Daten vom übergeordneten Block.Der zweite Parameter von
getChildHtml()
ist$useCache
. Wenn Sie false festlegen, wird verhindert, dass die erste Ausgabe zwischengespeichert wird, und das untergeordnete Element wird erneut gerendert.quelle
Ein Block, der Daten empfangen kann, wird als Widget bezeichnet . Dies kann jedoch über mehrere Blockdefinitionen (basierend auf den Eigenschaften von
$_item
) erfolgen.Magento macht im Kern etwas sehr Ähnliches, indem es den Zahlungsmethodenblock basierend auf dem Funktionscode der Methode lädt:
Sie könnten dasselbe mit diesem Pseudocode machen:
Alles , was einen anderen Blocktyp für jeden Produkttyp zu haben , wäre erfordern würde -
bundle
,simple
,configurable
,virtual
,grouped
. Gar nicht so schlecht.Wenn Sie wirklich ein Widget verwenden möchten, hat dies Auswirkungen auf Ihre zweite Idee in der bearbeiteten Frage:
Das Erstellen eines Widgets fällt wahrscheinlich nicht in den Geltungsbereich dieser Antwort - ist jedoch nicht besonders schwierig und hat den Vorteil , dass es für CMS-Blöcke wiederverwendet werden kann, obwohl dies für Ihren Anwendungsfall meiner Meinung nach nicht zutreffend ist.
Weitere Informationen zum Erstellen eines Widgets:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
quelle
Für
Magento 2
können Sie verwendenUm die Daten zu erhalten,
$block->getMyData();
quelle