You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Magento 1.9.38后产品页getName()返回null问题

解决Magento 1.9.3.8升级后子产品getName()返回null的问题

刚踩过这个坑!升级到Magento 1.9.3.8之后,官方为了优化性能,调整了子产品集合的属性加载规则——默认不再自动加载name属性,这就是你在design/frontend/rwd/default/template/cataloginventory/stockqty/compsite.phtml里调用$childProduct->getName()返回null的原因。

下面给你几个可行的解决方案,按推荐程度排序:

方案1:修改Block集合(最优,性能友好)

不建议直接修改核心文件,最好通过本地代码池覆盖或者自定义模块重写的方式,让getChildProducts()返回的集合提前加载name属性:

  1. 复制核心Block文件到本地代码池:
    把app/code/core/Mage/CatalogInventory/Block/Stockqty/Composite.php复制到app/code/local/Mage/CatalogInventory/Block/Stockqty/Composite.php

  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:16:30