Quero poder passar dados para a chamada getChildHtml (). O motivo é que a saída do bloco depende de um tipo de produto. Então, eu quero passar o produto para o getChildHtml para que ele possa decidir sobre a saída.
Estou fazendo isso por dentro template/checkout/cart/item/default.phtml
.
Idealmente, a chamada teria a seguinte aparência:
echo $this->getChildHtml('child_block_name', $_item);
Então meu bloco pode obter o tipo de produto do item e exibir a saída correta.
Como definitivamente não é possível passar esses dados para getChildHtml
- de que outra forma esse tipo de comportamento pode ser alcançado sem precisar reescrever o bloco principal
As duas soluções que tenho atualmente são as seguintes (nem muito atraentes):
1 - Crie um auxiliar e acesse a saída html através do auxiliar, em vez de deixar um bloco e um modelo renderizá-lo $this->helper('my_module')->getItemHtml($_item);
2 - Acesse o bloco filho e setData nele dentro do modelo:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Penso que, em termos de arquitetura Magento, o número 2 é o menor dos dois males, mas é muito feio olhando dentro de um modelo.
Respostas:
Você pode adicionar um método no bloco pai para buscar o filho, dependendo do tipo de produto (eu já vi esse tipo de lógica algumas vezes no núcleo ou algo semelhante):
Ainda assim, vendo como você modifica o xml do layout para adicionar blocos filhos, você pode estar interessado em saber como o Magento decidiu trabalhar com a marcação de renderização, dependendo dos tipos de produto em
Mage_Sales_Block_Items_Abstract::getItemHtml()
eMage_Checkout_Block_Cart_Abstract::getItemHtml()
.fonte
A solução acima não funcionará se você estiver exibindo um bloqueio filho no
foreach
loop.Para isso, você precisa usar o seguinte código:
Em child.block você pode usar
$this->getMyData()
para obter os dados. Usando essa estratégia, o bloco filho sempre obterá os dados mais recentes dos pais.O segundo parâmetro de
getChildHtml()
é$useCache
. A configuração para false impede que a primeira saída seja armazenada em cache e força a renderização do filho novamente.fonte
Um bloco que pode receber dados é chamado de widget ; embora isso possa ser feito através de várias definições de bloco (com base nas propriedades de
$_item
).O Magento faz algo muito semelhante no núcleo, carregando o bloco da forma de pagamento com base no código curto do método:
Você poderia fazer o mesmo com este pseudocódigo:
Tudo o que exigiria seria ter um tipo de bloco diferente para cada tipo de produto -
bundle
,simple
,configurable
,virtual
,grouped
. Não é tão ruim, realmente.Se você realmente deseja usar um widget - isso seria algo que afetaria sua segunda ideia na sua pergunta editada:
Criar um widget provavelmente fora do escopo desta resposta - mas não é muito difícil e tem a vantagem de poder ser redirecionado para blocos CMS, embora, para o seu caso de uso, eu não considere aplicável.
Para mais informações sobre como criar um widget:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
fonte
Para
Magento 2
, você pode usarPara obter os dados,
$block->getMyData();
fonte