2011-07-07 18 views
17

Lo siento si esta pregunta es trivial, pero he estado luchando para encontrar lo que estoy haciendo mal aquí. Estoy tratando de cambiar el valor de un atributo en un nivel de vista de tienda, pero el valor predeterminado también se cambia, mientras que no debería ser. Por supuesto, este atributo está configurado para ser "store-view-scoped". Para hacerlo simple, lo he intentado con el nombre del producto. Sin éxito.Programmatic change product attribute at store view level

A continuación se presentan las pruebas que he probado sin éxito ...

¿Ves lo que estoy haciendo mal aquí?

Muchas gracias.


Mis intentos de eventos:

$product = Mage::getModel('catalog/product')->load(PRODUCT_ID); 
$product->setStoreId(STORE_ID)->setName('new_name')->save(); 

$product = Mage::getModel('catalog/product')->load(PRODUCT_ID); 
$product->setStoreId(STORE_ID)->setStore(STORE_CODE)->setName('new_name')->save(); 

$product = Mage::getModel('catalog/product')->load(PRODUCT_ID); 
$product->setStoreId(STORE_CODE)->setName('new_name')->save(); 

$product = Mage::getModel('catalog/product')->setStoreId(STORE_ID)->load(PRODUCT_ID); 
$product->setName('new_name')->save(); 

$product = Mage::getModel('catalog/product')->setStoreId(STORE_ID)->load(PRODUCT_ID); 
$product->setStoreId(STORE_ID)->setName('new_name')->save(); 

Traté añadiendo la siguiente línea antes de la carga del modelo del producto ...

Mage::app()->setCurrentStore(STORE_ID); 
+1

¿Funciona si agrega -> setWebsiteId ($ websiteId) allí también? –

+0

No ... No funciona. Gracias de cualquier manera. –

+0

¿Cómo puedo eliminar todos los productos de un sitio web seleccionado en varios almacenes? – Rathinam

Respuesta

44

Así que aquí está el fragmento completo para cambiar el valor de atributo para un atributo de producto específico en una vista de tienda específica. Ejemplo, con el nombre del producto:

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID); 
$product->setStoreId(STORE_ID)->setName('my_new_product_name')->save(); 

Y como una respuesta adicional, uno podría estar interesado en cambiar el valor del atributo a la predeterminada. En este caso, el argumento 'falso' se debe pasar a la setAttribute:

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID); 
$product->setStoreId(STORE_ID)->setName(false)->save(); 
+4

Gracias por compartir información falsa: es un consejo útil. –

+0

muchas gracias por esto. – Nikitas

+0

Hola @ I, estoy actualizando el precio del producto en el nivel de vista por tienda y finalicé sin éxito. ¿Esta respuesta también funciona por el precio? – Charlie

12

Es necesario que ajuste la tienda actual para Admin en la parte superior de su bloque de código:

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
+0

Consulte a continuación mi propia respuesta para obtener el fragmento completo + información adicional interesante. Gracias ʍǝɥʇɐɯ por tu ayuda. –

3

nota al cargar producto con los datos de algunos de la tienda, también valores por defecto se cargan. ahorro de dicho producto ahorrará valores por defecto como almacenar valores (tanto unset "valor de uso por defecto" para los campos) que terminó con la función de limpiar los datos de los productos de los valores por defecto siguientes

public static function _removeDefaults($item) { 
    static $attributeCodes = null; 
    if($attributeCodes == null) { 
     $attributes = Mage::getSingleton('eav/config') 
      ->getEntityType(Mage_Catalog_Model_Product::ENTITY)->getAttributeCollection(); 
     $attributeCodes = array(); 
     foreach($attributes as $attribute) { 
      $ac = $attribute->getAttributeCode(); 
      if(in_array($ac, array('sku','has_options','required_options','created_at','updated_at','category_ids'))) { 
       continue; 
      } 
      $attributeCodes[] = $ac; 
     } 
    } 
    foreach($attributeCodes as $ac) { 
     if(false == $item->getExistsStoreValueFlag($ac)) { 
      $item->unsetData($ac); 
     } 
    } 
} 

recuerde enviar solamente producto cargado para ver algunas tiendas