Quiero poder pasar datos a la llamada getChildHtml (). La razón es que la salida del bloque depende de un tipo de producto. Así que quiero pasar el producto al getChildHtml para que pueda decidir sobre la salida.
Estoy haciendo esto por dentro template/checkout/cart/item/default.phtml
.
Idealmente, la llamada se vería así:
echo $this->getChildHtml('child_block_name', $_item);
Entonces mi bloque puede obtener el tipo de producto del artículo y mostrar la salida correcta.
Como definitivamente no es posible pasar estos datos getChildHtml
, ¿de qué otra manera se puede lograr este tipo de comportamiento sin tener que reescribir el bloque central?
Las dos soluciones que tengo actualmente son las siguientes (ninguna muy atractiva):
1 - Cree un ayudante y acceda a la salida html a través del ayudante en lugar de dejar que un bloque y una plantilla lo procesen $this->helper('my_module')->getItemHtml($_item);
2 - Acceda al bloque secundario y establezca Datos dentro de la plantilla:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Creo que, en términos de la arquitectura de Magento, el número 2 es el menor de dos males, pero es muy feo dentro de una plantilla.
Respuestas:
Puede agregar un método en el bloque padre para buscar el hijo dependiendo del tipo de producto (he visto este tipo de lógica un par de veces en el núcleo o algo similar):
Aún así, al ver cómo modifica el diseño xml para agregar bloques secundarios, puede interesarle cómo Magento decidió trabajar con el marcado de representación dependiendo de los tipos de productos en
Mage_Sales_Block_Items_Abstract::getItemHtml()
yMage_Checkout_Block_Cart_Abstract::getItemHtml()
.fuente
La solución anterior no funcionará si está mostrando un bloque secundario en
foreach
bucle.Para eso necesitas usar el siguiente código:
En child.block puedes usar
$this->getMyData()
para obtener los datos. Usando esta estrategia, el bloque hijo siempre obtendrá los datos más recientes de los padres.El segundo parámetro de
getChildHtml()
es$useCache
. Establecerlo en falso evita que la primera salida se almacene en caché y obliga a volver a generar el elemento secundario.fuente
Un bloque que puede recibir datos se llama un widget ; aunque esto se puede hacer a través de múltiples definiciones de bloque (basadas en las propiedades de
$_item
).Magento hace algo muy similar en el núcleo al cargar el bloque de método de pago basado en el código corto del método:
Podrías hacer lo mismo con este pseudocódigo:
Todo lo que se requiere sería tener un tipo de bloque diferente para cada tipo de producto -
bundle
,simple
,configurable
,virtual
,grouped
. No tan mal, de verdad.Si realmente desea usar un widget , sería algo como el efecto de su segunda idea en su pregunta editada:
Crear un widget probablemente fuera del alcance de esta respuesta, pero no es terriblemente difícil y tiene la ventaja de poder reutilizarse para bloques CMS, aunque para su caso de uso no creo que sea aplicable.
Para obtener más información sobre cómo crear un widget:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
fuente
Para
Magento 2
, puedes usarPara obtener los datos,
$block->getMyData();
fuente