从已经加载的Magento模型中检索附加数据

在某些情况下,我只交给一个只包含我需要的部分数据的模型,例如一个catalog/product实例不包含某些我可能需要使用的属性,如大小,小部件编号或腰围测量。

为了减轻这一点,我目前的选择是:

  • 创建一个新块,并使用addAttributeToSelect($name)手动加载所需的属性。
  • 例如,使用Mage::getModel('catalog/product')->getId($product->getId())的当前填充不足的模型的ID,在模板中加载整个模型。
  • 对我的问题:是否有一种方法可以在调用->load()之后选择我希望加载到模型集合中的其他属性? 另外,有没有一种方法可以在个人模型上做到这一点?


    正确和最安全的方法(但不是最好的 - 见下文)是有问题的 - 它是再次加载产品。

    在产品加载之后,还没有开发出添加更多属性的方法,原因如下:

    1)在模型生命周期中,它的值在模型中被计算和缓存。 因此,添加更多属性(例如价格)将改变模型的状态,但不会影响若干方法的结果,这些方法旨在返回这些属性值(例如getPrice()),但在内部做一些额外的预处理并取决于之前的计算数据。

    2)模型的状态将不一致,因为有些方法会返回缓存的和当前无效的值,这些值是根据先前的空属性计算的,而其他一些方法将返回非缓存值。 因此,使用这种模型将是不安全的,其属性将是不可预知的。

    3)支持这种重新加载的代码的复杂性非常大。

    解决方案

    1)第一个好的解决方案(虽然是最重要的一个)是再次加载产品,每次你的block / model / helper需要扩展一组属性时。

    2)更好的解决方案 - 无论何时你看到所有具有所有附加属性的产品加载新的集合,这些属性将是必需的,并且原始集合不具有它们。

    3)最好的解决方案 - 是加载具有所有必需属性的原始产品集合。 有时候集合实际上会加载带有可能属性子集的产品 - 主要是用于EAV优化的遗留代码(现在默认情况下平面表已打开并且不需要此优化),或者可能在搜索引擎加载集合时(例如Solr在Magento EE中),默认情况下,它不会在其记录中存储所有属性。

    3.1)你可以在实例化的地方向原始集合添加必要的属性 - 通过提及的addAttributeToSelect($attributeNames)方法

    3.2)您可以将您的属性添加到属性列表中,并自动填充到集合中。 属性列表因模块而异,它们存储在不同的地方。 一些在配置中,另一些在数据库中。 具体位置(config或db表),在哪里添加自动填充属性取决于具体的情况。

    4)有时,只需要属性值时,编写资源模型可能会更容易,更快速,它将直接通过productIds和当前storeId范围从数据库加载它们。 然后,您可以冒险将它们设置为集合中产品的属性,或者将它们安全地设置为Products作为myAdditionalAttribuesValuesArray属性,或者将其作为独立数组映射到产品ID。


    还有另一种方法,可能不是最好的解决方案,通过在“code / core / Mage / Catalog / Block / Product / View.php”编辑magento核心文件。 但通过这种方式,您将可以访问产品“查看”页面中的其他属性。

    添加以下代码:

     public function getAdditionalData(array $excludeAttr = array())
    {
        $data = array();
        $product = $this->getProduct();
        $attributes = $product->getAttributes();
        foreach ($attributes as $attribute) {
    
            if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) {
                $value = $attribute->getFrontend()->getValue($product);
    
                if (!$product->hasData($attribute->getAttributeCode())) {
                    $value = Mage::helper('catalog')->__('N/A');
                } elseif ((string)$value == '') {
                    $value = Mage::helper('catalog')->__('No');
                } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
                    $value = Mage::app()->getStore()->convertPrice($value, true);
                }
    
                if (is_string($value) && strlen($value)) {
                    $data[$attribute->getAttributeCode()] = array(
                        'label' => $attribute->getStoreLabel(),
                        'value' => $value,
                        'code'  => $attribute->getAttributeCode()
                    );
                }
            }
        }
        return $data;
    }
    

    然后在您的模板Catalog / Product / View.phtml中:

    <?php if($_additional = $this->getAdditionalData()): ?>
       <?php foreach ($_additional as $_data): ?>
            <tr>
                <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
                <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
            </tr>
        <?php endforeach; ?>
    <?php endif; ?>
    
    链接地址: http://www.djcxy.com/p/53333.html

    上一篇: Retrieving additional data from already loaded Magento models

    下一篇: .net: Version numbers for DLL vs EXE?