2011-07-16 10 views
8

Me gustaría poder guardar el valor de un atributo sin guardarlo. Creé un nuevo atributo de cliente a través del archivo sql/setup de mi módulo (ref), y ahora deseo completar ese atributo para cada uno de los clientes existentes. Creé un modelo Backend para el atributo que detecta valores nulos durante la carga de la entidad (afterLoad) y genera el contenido, pero dudo en guardar la entidad en ese punto del proceso.guarda un valor de atributo sin guardar su entidad padre en Magento

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; 
} 
} 

Idealmente, me gustaría llamar algo así como $this->getAttribute()->setValue('blah')->save() en que afterLoad método para que no se basa en el usuario haga clic en Guardar.

podría escribir un script que carga una colección de todos los clientes y los paseos para establecer el valor, pero hay más de 50.000 clientes y estoy preocupado por el impacto en el rendimiento de ejecución que en un servidor de producción ...

Cualquier pensamiento apreciado.
JD

Respuesta

2

Una opción que lo hace escribir directamente en la base de datos. Esto no es particularmente elegante, pero es bastante efectivo para lograr el enfoque de "carga lenta" para poblar un nuevo atributo para clientes existentes (u otras entidades). Aquí está el código adicional en el Attribute_Backend_Referralcode a lo que he publicado en la pregunta:

$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); 

Se requiere la exposición de un método público para obtener el adaptador de escritura en el modelo MySQL4, pero no es gran cosa allí.

Aún interesado en saber si hay un enfoque que utiliza la capa del modelo EAV mejor ...

19

El modelo de recursos EAV ofrece la posibilidad de guardar los atributos individuales sin guardar la entidad.

$value = Mage::helper('referral')->generateRafCode($oCustomer); 
$oCustomer->setData($vAttrCode, $value)->getResource()->saveAttribute($oCustomer, $vAttrCode); 
+0

perfectamente elegante y performant. gracias @vinai –

+0

nice !! Me encanta, poniéndolo en mis notas ahora. –

+0

@ dan.codes ¿conserva notas? Pensé que ese era el objetivo de StackOverflow ... notarás que la razón por la que volví a esta pregunta es porque necesito usarla de nuevo y ¡no tengo notas! :) –

Cuestiones relacionadas