Chcę móc przekazywać dane do wywołania getChildHtml (). Powodem jest to, że wyjście bloku zależy od typu produktu. Więc chcę przekazać produkt do getChildHtml, aby mógł zdecydować o wyniku.
Robię to w środku template/checkout/cart/item/default.phtml
.
Idealnie połączenie wyglądałoby tak:
echo $this->getChildHtml('child_block_name', $_item);
Następnie mój blok może uzyskać typ produktu z elementu i wyświetlić prawidłowy wynik.
Ponieważ zdecydowanie nie jest możliwe przekazanie tych danych getChildHtml
- w jaki sposób można osiągnąć tego rodzaju zachowanie bez konieczności przepisywania bloku podstawowego
Dwa obecnie dostępne rozwiązania są następujące (żadne bardzo atrakcyjne):
1 - Utwórz pomocnika i uzyskaj dostęp do wyjścia HTML za pomocą pomocnika, zamiast pozwolić blokowi i szablonowi renderować go jako ala $this->helper('my_module')->getItemHtml($_item);
2 - Uzyskaj dostęp do bloku potomnego i ustaw na nim dane w szablonie:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Myślę, że jeśli chodzi o architekturę Magento, numer 2 jest mniejszym z dwóch zła, ale cholernie brzydko wygląda w szablonie.
Odpowiedzi:
Możesz dodać metodę do bloku nadrzędnego , aby pobrać dziecko w zależności od typu produktu (kilka razy widziałem taką logikę w rdzeniu lub coś podobnego):
Mimo to, widząc, jak modyfikujesz układ xml w celu dodania bloków potomnych, możesz być zainteresowany tym, jak Magento zdecydował się pracować z renderowaniem znaczników w zależności od typów produktów w
Mage_Sales_Block_Items_Abstract::getItemHtml()
iMage_Checkout_Block_Cart_Abstract::getItemHtml()
.źródło
Powyższe rozwiązanie nie będzie działać, jeśli wyświetlasz blok potomny w
foreach
pętli.W tym celu musisz użyć następującego kodu:
W child.block możesz użyć
$this->getMyData()
do uzyskania danych. Korzystając z tej strategii, blok potomny zawsze otrzyma najnowsze dane od rodzica.Drugi parametr
getChildHtml()
to$useCache
. Ustawienie wartości false uniemożliwia buforowanie pierwszego wyjścia i wymusza ponowne renderowanie dziecka.źródło
Blok, który może odbierać dane, nazywa się widżetem ; chociaż można to zrobić za pomocą wielu definicji bloków (w oparciu o właściwości
$_item
).Magento robi coś bardzo podobnego w rdzeniu, ładując blok metody płatności na podstawie krótkiego kodu metody:
Możesz zrobić to samo z tym pseudo-kodem:
Wszystko, co wymagałoby byłoby mieć inny typ bloku dla każdego rodzaju produktu -
bundle
,simple
,configurable
,virtual
,grouped
. Naprawdę nie tak źle.Jeśli naprawdę chcesz użyć widżetu - byłby to efekt twojego drugiego pomysłu w edytowanym pytaniu:
Utworzenie widżetu prawdopodobnie poza zakresem tej odpowiedzi - ale nie jest to strasznie trudne i ma tę zaletę, że można go zmienić na bloki CMS, chociaż w twoim przypadku użycia nie sądzę, aby miało to zastosowanie.
Aby uzyskać więcej informacji na temat tworzenia widżetu:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
źródło
Dla
Magento 2
, można użyćAby uzyskać dane,
$block->getMyData();
źródło