升级至Magento 1.9.38后产品页getName()返回null问题
getName()返回null的问题 刚踩过这个坑!升级到Magento 1.9.3.8之后,官方为了优化性能,调整了子产品集合的属性加载规则——默认不再自动加载name属性,这就是你在design/frontend/rwd/default/template/cataloginventory/stockqty/compsite.phtml里调用$childProduct->getName()返回null的原因。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:修改Block集合(最优,性能友好)
不建议直接修改核心文件,最好通过本地代码池覆盖或者自定义模块重写的方式,让getChildProducts()返回的集合提前加载name属性:
复制核心Block文件到本地代码池:
把app/code/core/Mage/CatalogInventory/Block/Stockqty/Composite.php复制到app/code/local/Mage/CatalogInventory/Block/Stockqty/Composite.php修改
getChildProducts()方法,添加属性加载:public function getChildProducts() { // 保留原有的集合获取逻辑 if (!$this->_childProducts) { $this->_childProducts = $this->getProduct()->getTypeInstance()->getUsedProducts(null, $this->getProduct()); // 添加这一行,强制加载name属性 $this->_childProducts->addAttributeToSelect('name'); } return $this->_childProducts; }这样集合在初始化时就会把
name属性一起加载,循环里直接调用getName()就正常了。
方案2:在模板中手动加载属性(快速临时解决)
如果不想动Block代码,可以在模板循环里手动检查并加载name属性:
<?php foreach ($this->getChildProducts() as $childProduct) : ?> <?php // 若name未加载,手动加载该属性 if (is_null($childProduct->getName())) { $childProduct->load('name'); } $childProductStockQty = $this->getProductStockQty($childProduct); ?> <?php if ($childProductStockQty > 0) : ?> <tr> <td><?php echo $childProduct->getName() ?></td> <td class="a-center...
⚠️ 注意:如果子产品数量较多,循环里多次调用load()会有性能损耗,不推荐在产品多的页面使用。
方案3:直接获取原始数据(最快捷但不规范)
可以跳过模型的getName()方法,直接从产品数据数组中取name值:
<td><?php echo $childProduct->getData('name') ?></td>
这种方式不需要加载属性,但不符合Magento的模型调用规范,只适合临时应急。
内容的提问来源于stack exchange,提问作者mindsoul

