Je veux pouvoir passer des données à l'appel getChildHtml (). La raison en est que la sortie du bloc dépend d'un type de produit. Je veux donc passer le produit au getChildHtml afin qu'il puisse décider de la sortie.
Je fais ça à l'intérieur template/checkout/cart/item/default.phtml
.
Idéalement, l'appel devrait ressembler à:
echo $this->getChildHtml('child_block_name', $_item);
Ensuite, mon bloc peut obtenir le type de produit de l'article et afficher la sortie correcte.
Puisqu'il n'est certainement pas possible de transmettre ces données à getChildHtml
- comment autrement ce type de comportement peut-il être obtenu sans avoir à réécrire le bloc de base
Les deux solutions que j'ai actuellement sont les suivantes (ni très attractives):
1 - Créez un assistant et accédez à la sortie html via l'aide au lieu de laisser un bloc et un modèle le rendre ala $this->helper('my_module')->getItemHtml($_item);
2 - Accédez au bloc enfant et définissez-y les données à l'intérieur du modèle:
$this->getChild('child_name')->setData('item', $_item);
echo $this->getChildHtml('child_name')
Je pense qu'en termes d'architecture Magento, le numéro 2 est le moindre de deux maux, mais il est sacrément laid à l'intérieur d'un modèle.
Réponses:
Vous pouvez ajouter une méthode sur le bloc parent pour récupérer l'enfant en fonction du type de produit (j'ai vu ce type de logique plusieurs fois dans le noyau ou quelque chose de similaire):
Cependant, en voyant comment vous modifiez la mise en page XML pour ajouter des blocs enfants, vous pouvez être intéressé par la façon dont Magento a décidé de travailler avec le balisage de rendu en fonction des types de produits dans
Mage_Sales_Block_Items_Abstract::getItemHtml()
etMage_Checkout_Block_Cart_Abstract::getItemHtml()
.la source
La solution ci-dessus ne fonctionnera pas si vous affichez un bloc enfant en
foreach
boucle.Pour cela, vous devez utiliser le code suivant:
Dans child.block, vous pouvez utiliser
$this->getMyData()
pour obtenir les données. En utilisant cette stratégie, le bloc enfant obtiendra toujours les dernières données du parent.Le deuxième paramètre de
getChildHtml()
est$useCache
. La définition de false empêche la première sortie d'être mise en cache et force le rendu de l'enfant.la source
Un bloc qui peut recevoir des données est appelé un widget ; bien que cela puisse être fait via plusieurs définitions de blocs (en fonction des propriétés de
$_item
).Magento fait quelque chose de très similaire dans le noyau en chargeant le bloc de méthode de paiement basé sur le code court de la méthode:
Vous pouvez faire de même avec ce pseudo-code:
Tout ce qui nécessiterait serait d'avoir un type de bloc différent pour chaque type de produit -
bundle
,simple
,configurable
,virtual
,grouped
. Pas si mal, vraiment.Si vous voulez vraiment utiliser un widget - ce serait quelque chose à l'effet de votre deuxième idée dans votre question modifiée:
Créer un widget probablement hors du champ de cette réponse - mais ce n'est pas très difficile, et a l'avantage de pouvoir être réutilisé pour les blocs CMS, bien que pour votre cas d'utilisation, je ne pense pas que cela soit applicable.
Pour plus d'informations sur la création d'un widget:
http://www.magentocommerce.com/knowledge-base/entry/tutorial-creating-a-magento-widget-part-1
la source
Pour
Magento 2
, vous pouvez utiliserPour obtenir les données,
$block->getMyData();
la source