Jon*_*Day 8 php attributes magento entity-attribute-value
我希望能够保存属性的值而不保存它的父实体.我已经通过我的模块的sql/setup文件(ref)创建了一个新的customer属性,现在我想为每个现有客户填充该属性.我为该属性创建了一个后端模型,该模型在实体加载(afterLoad)期间检测空值并生成内容,但我对在此过程中保存实体犹豫不决.
class Aligent_Referral_Model_Customer_Attribute_Backend_Referralcode extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract
{
public function afterLoad($oCustomer)
{
$vAttrCode = $this->getAttribute()->getAttributeCode();
$vValue = $oCustomer->getData($vAttrCode);
if (empty($vValue)){
$oCustomer->setData($vAttrCode, Mage::helper('referral')->generateRafCode($oCustomer));
}
return $this;
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想调用类似于$this->getAttribute()->setValue('blah')->save()该afterLoad方法的内容,以便它不依赖于用户单击"保存".
我可以编写一个脚本来加载所有客户的集合并引导它们设置值,但是有超过50,000个客户,我担心在生产服务器上运行它会对性能产生影响......
任何想法都赞赏.
JD
Vin*_*nai 19
EAV资源模型提供了保存单个属性而无需保存实体的功能.
$value = Mage::helper('referral')->generateRafCode($oCustomer);
$oCustomer->setData($vAttrCode, $value)->getResource()->saveAttribute($oCustomer, $vAttrCode);
Run Code Online (Sandbox Code Playgroud)
因此,一种选择是直接写入数据库。这不是特别优雅,但在实现为现有客户(或其他实体)填充新属性的“延迟加载”方法方面非常有效。以下是 Attribute_Backend_Referralcode 中我在问题中发布的附加代码:
$vAttrValue = 'some string';
$oCustomer->setData($vAttrCode, $vAttrValue);
$iAttrId = $this->getAttribute()->getAttributeId();
$data = array(
'entity_type_id' => $oCustomer->getEntityTypeId(),
'attribute_id' => $iAttrId,
'entity_id' => $oCustomer->getId(),
'value' => $vAttrValue,
);
$vTableName = $this->getAttribute()->getBackend()->getTable();
Mage::getResourceModel('table/alias')->getWriteAdapter()->insert($vTableName, $data);
Run Code Online (Sandbox Code Playgroud)
它需要公开一个公共方法来获取 Mysql4 模型上的 Write Adapter,但这没什么大不了的。
仍然有兴趣知道是否有一种方法可以更好地使用 EAV 模型层......
| 归档时间: |
|
| 查看次数: |
6029 次 |
| 最近记录: |