Pregunta

Escenario:

  • Establecido tienda Magento (Una Tienda) con 2 tiendas vistas idiomas, inglés y francés.

  • Gran número de productos (10k +)

  • Nueva tienda (Almacén B) ha sido creado (el mismo de la Instalación de Magento), y lleva todos los mismos productos como Almacenar Un

Problema:

Cuando la asignación de todos los productos existentes de Almacenar Un a La Tienda De B, se le pedirá donde, por defecto, la información vendrá de. Esto sólo cubre una vista de la tienda (en inglés).

Resultado deseado: enter image description here

¿Cómo rellenar todas las descripciones de Almacén De Un (Francés) a Tienda B (Francés)

¿Fue útil?

Solución

Tal vez un observador que va a hacer el trabajo?

E. g:

class My_Awesome_Model_Observer 
{
    public function syncDescriptions($observer)
    {
        $productId = $observer->getProduct()->getId();

        $storeAEnId = 1; //store view Id for English store A 
        $storeBEnId = 2; //as above for store B
        $storeAFrId = 2; //store A French view's id
        $storeBFrId = 4; //French store B
        //of course replace above with real store Ids

        $descAEn = Mage::getModel('catalog/product')->setStore($storeAEnId)->load($productId)->getData('description');

// Now we check if description in store B is up-to-date with store A's, if not, if yes, we leave, if not, it is updated
        if ($descAEn != Mage::getModel('catalog/product')->setStore($storeBEnId)->load($productId)->getData('description'))
            {
                Mage::getModel('catalog/product')->setStore($storeBEnId)
                    ->load($productId)
                    ->getData('description', $descAEn)
                    ->save();
            }

        $shortDescAEn = Mage::getModel('catalog/product')->setStore($storeAEnId)->load($productId)->getData('short_description');

// Same check for short description
        if ($shortDescAEn != Mage::getModel('catalog/product')->setStore($storeBEnId)->load($productId)->getData('short_description'))
            {
                Mage::getModel('catalog/product')->setStore($storeBEnId)
                    ->load($productId)
                    ->getData('short_description', $shortDescAEn)
                    ->save();
            }

        $descAFr = Mage::getModel('catalog/product')->setStore($storeAFrId)->load($productId)->getData('description');


// same for French view
        if ($descAFr != Mage::getModel('catalog/product')->setStore($storeBFrId)->load($productId)->getData('description'))
            {
                Mage::getModel('catalog/product')->setStore($storeBFrId)
                    ->load($productId)
                    ->getData('description', $descAFr)
                    ->save();
            }

        $shortDescAFr = Mage::getModel('catalog/product')->setStore($storeAFrId)->load($productId)->getData('short_description');


// same for French short description
        if ($shortDescAFr != Mage::getModel('catalog/product')->setStore($storeBFrId)->load($productId)->getData('short_description'))
            {
                Mage::getModel('catalog/product')->setStore($storeBFrId)
                    ->load($productId)
                    ->getData('short_description', $shortDescAFr)
                    ->save();
            }
    }
}

Por supuesto, usted debe declarar un observador de catalog_product_save_after evento de la elección de su Observadores de la clase y el método en el módulo del config.xml.E. g:

<global>
    <events>
        <catalog_product_save_after>
            <observers>
                <awesome_observer>
                    <type>singleton</type>
                    <class>My_Awesome_Model_Observer</class>
                    <method>syncDescriptions</method>
                </awesome_observer>
            </observers>
        </catalog_product_save_after>
    </events>
</global>

Es simplemente bastante idea básica para resolver el problema, como no sé de que las descripciones que utiliza (usted puede también quieren poner short_description de allí), pero tengo la esperanza de que le ayudará a crear su propia solución.:)

P. S.:Tenga cuidado de observadores de bucles.

Otros consejos

Me imagino que tendrá que escribir su propio módulo de sincronización, que programe una importación nocturna de información de la tienda a francés para almacenar b francés.

Utilice el campo 'actualizado_at' para los productos para minimizar la cantidad de trabajo que necesita hacer.

pseudo código

  • Programar trabajo Cron para correr por la noche
  • escanear a través de cada producto
  • Para cada producto que se ha actualizado desde la última vez que el trabajo corrió, copie información de la tienda A (francés) para almacenar B (francés)
  • Registre la hora en que el trabajo corrió

    Esto es asumiendo que no necesita sincronización inmediata de productos.

    Un consejo sería asegurarse de que su modelo de indexación no esté configurado en 'Actualizar en Guardar'

La "misa de Actualización de Atributo' funcionalidad no permiten aplicar los valores de un almacén de vista a otro, debido a la lógica de las restricciones.Magento se aplica sólo a los valores por defecto para el recién asignado en la tienda de puntos de vista.

Pruebe a utilizar el puro SQL solución.

INSERT INTO `catalog_product_entity_text` (`entity_type_id`, `attribute_id`, `store_id`, `entity_id`, `value`) 
SELECT `entity_type_id`, `attribute_id`, '<target_store_id>' as `store_id`, `entity_id`, `value` 
FROM `catalog_product_entity_text` as `source`
WHERE `attribute_id` IN (
    SELECT  `attribute_id` 
    FROM  `eav_attribute` 
    WHERE  `entity_type_id` = 10 /* catalog_product */
    AND  `attribute_code` IN ( 'description', 'short_description' )
)  
AND store_id = '<source_store_id>'
ON DUPLICATE KEY UPDATE `value` = `source`.`value`;

La secuencia de comandos de copia de los valores de 'descripción' y 'short_description' atributos '<source_store_id> tienda de ver a '<target_store_id>'vista de la tienda.

Sustituir"<target_store_id>'y '<source_store_id>'constantes y ejecutar esta secuencia de comandos para cada vista de la tienda por separado.

El uso de 'INSERT IGNORE ...'sintaxis en lugar de" INSERTAR ..EN el DUPLICADO de ACTUALIZACIÓN de la CLAVE' si quieres preservar la ya existente de los valores.

Si te gustaría copiar algunos otros valores de atributo puede modificar la secuencia de comandos en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top