Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从已加载的Magento模型中检索其他数据_Magento - Fatal编程技术网

从已加载的Magento模型中检索其他数据

从已加载的Magento模型中检索其他数据,magento,Magento,有时,我会收到一个模型,其中只包含我需要的一些数据,例如目录/产品实例,其中不包含我可能需要使用的某些属性,例如尺寸、小部件编号或腰围测量 为了缓解这种情况,我目前的选择是: 创建一个新块,并使用addAttributeToSelect($name)手动加载所需的属性 使用当前未充分填充的模型的ID加载模板中的整个模型,例如,Mage::getModel('catalog/product')->>getId($product->getId()) 对于我的问题:在调用了->load()之后,是

有时,我会收到一个模型,其中只包含我需要的一些数据,例如
目录/产品
实例,其中不包含我可能需要使用的某些属性,例如尺寸、小部件编号或腰围测量

为了缓解这种情况,我目前的选择是:

  • 创建一个新块,并使用
    addAttributeToSelect($name)
    手动加载所需的属性
  • 使用当前未充分填充的模型的ID加载模板中的整个模型,例如,
    Mage::getModel('catalog/product')->>getId($product->getId())

对于我的问题:在调用了
->load()
之后,是否有一种方法可以选择要在模型集合中加载的其他属性?另外,是否有一种方法可以在单个型号上执行此操作?

本节讨论了正确和最安全的方法(但不是最佳方法,请参见下文),即再次加载产品

由于以下几个原因,在产品加载后,还没有开发出添加更多属性的方法:

1) 在模型的生命周期中,它的很多值都被计算并缓存在模型中。因此,添加更多属性(例如price)将改变模型的状态,但不会影响几个方法的结果,这些方法旨在返回这些属性值(例如getPrice()),但在内部执行一些额外的预处理,并依赖于以前计算的数据

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

3) 支持这种重新加载的代码的复杂性相当大

解决方案

1) 第一个好的解决方案(尽管是最重的解决方案)是在块/模型/辅助对象每次需要扩展属性集时再次加载产品

2) 更好的解决方案是,只要您看到这些属性是必需的,而原始集合中没有这些属性,就用所有具有所有附加属性的产品加载新集合

3) 最好的解决方案是加载具有所有必需属性的原始产品集合。有时,集合确实会加载具有可能属性子集的产品-主要是EAV优化的遗留代码(现在默认情况下,平面表处于“打开”状态,不需要进行此优化),或者可能是当集合由搜索引擎加载时(例如,Magento EE中的Solr),默认情况下,不会将所有属性存储在其记录中

3.1)您可以将所需的属性添加到原始集合的实例化位置-通过问题中提到的
addAttributeToSelect($attributeNames)
方法

3.2)您可以将属性添加到属性列表中,并自动填充到集合中。属性列表因模块而异,并且存储在不同的位置。有些在配置中,有些在数据库中。具体位置(配置或数据库表),为自动填充添加属性的位置,取决于具体情况


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

您是否尝试过Ivan在这个问题中建议的反射技术?或者可能是Varien_Data_集合的setDataToAll方法?当我得到一个缺少数据的产品时,它通常位于一个类别页面上,其中一些属性被故意排除。为了避免这种情况,请从admin编辑属性,并将其“用于产品列表”更改为“是”。@clockworkgeek:这是一种通用解决方案吗?如中所述,属性选项“用于产品列表”是否标记错误,并标记为“是”是否将其添加到集合的默认属性选择列表?确定该选项仅影响类别页面和“产品列表”块。购物车似乎有自己的关于构建属性的规则。这只是部分解决办法。