GetChildHtml () öğesine veri aktarın veya alt blokta çağrı yöntemi


12

GetChildHtml () çağrısına veri iletmek istiyorum. Bunun nedeni, bloğun çıktısının bir ürün tipine bağlı olmasıdır. Bu yüzden çıkış karar verebilir böylece getChildHtml ürün geçmek istiyorum.

Bunu içeride yapıyorum template/checkout/cart/item/default.phtml.

İdeal olarak, çağrı şöyle görünecektir:

echo $this->getChildHtml('child_block_name', $_item);

Sonra bloğum ürün türünü öğeden alabilir ve doğru çıktıyı görüntüleyebilir.

Bu verileri aktarmak kesinlikle mümkün olmadığından getChildHtml- bu tür davranışlar çekirdek bloğu yeniden yazmak zorunda kalmadan nasıl elde edilebilir?

Şu anda sahip olduğum iki çözüm aşağıdaki gibidir (ikisi de çok çekici değildir):

1 - Bir yardımcı oluşturmak ve bir blok ve şablonun ala olmasını sağlamak yerine yardımcı aracılığıyla html çıktısına erişmek $this->helper('my_module')->getItemHtml($_item);

2 - Alt bloğa erişin ve şablon içindeki setData'yı seçin:

 $this->getChild('child_name')->setData('item', $_item);
 echo $this->getChildHtml('child_name')

Magento mimarisi açısından, 2 sayısı iki kötülükten daha azdır, ancak bir şablonun içine çirkin bakmaktır.


Bunun yerine, alt bloğun kullandığı kayıt defterinde veya oturumda 'veri' sağlayabilir misiniz? Bunu bir yineleyicide mi kullanıyorsunuz? Kullanım durumu nedir?
philwinkle

İstenen çıktı bir sepeti ürün ürün türüne bağlı olarak kayıt burada yardımcı olacağını sanmıyorum. Bu nedenle, doğru verinin çıktısı alınabilmesi için bu bir şekilde bloğa iletilmelidir. Kullanım durumu, alışveriş sepeti öğesinde bazı ekstra bilgiler görüntüler, ancak ürün türüne bağlıdır
Marty Wallace

Ürün türü öznitelikleri oluşturabilirsiniz - belki ürün türlerine göre farklı öznitelikler mi oluşturuyorsunuz? Kendi bloğunuzu oluşturmayı tercih ederseniz, kesinlikle bu yönde tavsiyelerde bulunabiliriz, ancak burada koklamaya çalıştığım başka bir yerleşik kazanç olabilir ...
philwinkle

Bu, erişmekte olduğum bir ürün seviyesi özelliğidir, ancak görüntülenme şekli ürün türüne bağlıdır. Gruplandırılmış bir ürün, aynı özelliği basit bir ürüne göre biraz farklı kılacaktır. Çıktının her farklı lezzeti için bir blok ve şablon kullanıyorum
Marty Wallace

Sorumu düşündüğüm ancak% 100 rahat olmadığım bazı fikirler ile güncelledim
Marty Wallace

Yanıtlar:


3

Ürün türüne bağlı olarak çocuğu getirmek için ebeveyn bloğuna bir yöntem ekleyebilirsiniz (bu tür bir mantığı çekirdekte veya birkaç kez benzer bir şey gördüm):

class ParentBlock 
{
    public function getIntuitiveNameChild($item)
    {
        return $this->getChild("intuitive_child")
                    ->setProductType($item->getProductType()) 
                    // You can also decide the product type in this setter, in the Child block.
                    ->setItem($item);
    }

    public function getIntuitiveNameChildDinamically($item)
    {
        return $this->getChild("intuitive_child_" . $item->getProductType())
                    ->setItem($item); 
    }    
}

// parent tpl
// i suggest you avoid getChildHtml(), unless you're certain that methods won't need to be called from the tpl
echo $this->getIntuitiveNameChild($_item)
          // ->someOtherMethod()
          ->toHtml();

Yine de, çocuk blokları eklemek için düzen xml'sini nasıl değiştirdiğinizi görünce, Magento'nun Mage_Sales_Block_Items_Abstract::getItemHtml()ve içindeki ürün türlerine bağlı olarak oluşturma biçimlendirmesiyle nasıl çalışmaya karar vermiş olabilirsiniz Mage_Checkout_Block_Cart_Abstract::getItemHtml().


Bu yöntem, düzen yapısını atlar ve sıkıca bağlı bloklar üretir (Magento'daki her şey gibi ...)
Victor Schröder

12

foreachDöngü alt bloğunu görüntülüyorsanız yukarıdaki çözüm çalışmaz .

Bunun için aşağıdaki kodu kullanmanız gerekir:

<?php
foreach ($blocks as $block) {
    $this->getChild("child.block")->setData("my_data", $any_data);
    echo $this->getChildHtml('child.block', false);
}
?>

Child.block $this->getMyData()içinde verileri almak için kullanabilirsiniz . Bu stratejiyi kullanarak çocuk bloğu her zaman ebeveynlerden en son verileri alır.

İkinci parametre getChildHtml()olan $useCache. Bunu false olarak ayarlamak, ilk çıktının önbelleğe alınmasını önler ve çocuğu yeniden oluşturmaya zorlar.


4

Veri alabilen bir bloğa widget adı verilir ; ancak bu çoklu blok tanımları ile yapılabilir (özelliklerine göre $_item).

Magento, yöntemin kısa koduna göre ödeme yöntemi bloğunu yükleyerek çekirdeğe çok benzer bir şey yapar:

<dd>
    <?php echo $this->getChildHtml('payment.method.'.$_code) ?>
</dd>

Aynısını şu sahte kodla da yapabilirsiniz:

if($type = $_item->getTypeId()){
    $this->getChildHtml('my.block.' . $type);
}

Her ürün türü için farklı bir blok türüne sahip olacaktır gerektirecektir Hepsi - bundle, simple, configurable, virtual, grouped. O kadar da kötü değil, gerçekten.

Eğer varsa gerçekten bir widget kullanmak istiyorum - bu, düzenlenen söz konusu ikinci fikrin yönde bir şey olacaktır:

<?php
echo $this->getLayout()->createBlock('yourcompany/widget_class')->setType($_item->getTypeId())->toHtml();

Muhtemelen bu cevabın kapsamı dışında bir widget oluşturmak - ama çok zor değil ve CMS blokları için yeniden kullanılabilir olma avantajına sahip olsa da, kullanım durumunuz için geçerli olduğunu düşünmüyorum.

Widget oluşturma hakkında daha fazla bilgi için:

http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1


% 100 bunun cevabı kabul etmediğim iyi bir yaklaşım olduğuna ikna olmadım.
Marty Wallace

1
Yalnızca bir widget bloğu veri alabilir mi? Ne demek istiyorsun? Tüm bloklar veri alabilir. bir widget Magento açısından farklı bir şeydir.
nevvermind

Asla yapamayacaklarını söylemedim; Diyorum ki, tanım gereği, bir widget koşullu bir şey görüntülemek için veri girişi gerektirir.
philwinkle

0

İçin Magento 2kullanabilirsiniz

<?php
foreach ($blocks as $block) {
    $block->getChildBlock("child.block")->setData("my_data", $any_data);
    echo $block->getChildHtml('child.block', false);
}
?>

Verileri almak için,

$block->getMyData();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.