Pergunta

Cenário:

  • Estabelecido loja Magento (Uma Loja) com 2 vistas de arquivo idiomas, inglês e francês.

  • Grande número de produtos (10k +)

  • Nova loja (Loja B) foi criado (mesmo Magento Instalação), e carrega todos os mesmos produtos que Armazenar Uma

Problema:

Quando a atribuição de todos os produtos existentes de Armazenar Uma para Loja B, você será solicitado para onde a informação padrão vêm. Este abrange apenas uma visão de loja (em inglês).

Resultado desejado: enter image description here

Como você preencher todas as descrições de Loja A (Em Francês) para Loja B (Francês)

Foi útil?

Solução

Talvez um observador vai fazer o trabalho?

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

É claro que, em seguida, você deve declarar um observador para catalog_product_save_after evento de escolher o seu Observadores de classe e método em seu módulo 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>

Ele é apenas muito idéia básica para resolver o problema, como eu não sei o que descrições que você usar (você também pode querer colocar short_description de lá), mas eu espero que ele vai ajudar você a criar sua própria solução.:)

P. S.:Cuidado com os observadores' loops.

Outras dicas

Eu imagino que você precisará escrever seu próprio módulo de sincronização, que agenda uma importação noturna de informações da loja um francês para armazenar B Francês.

Use o campo 'updated_at' para produtos para minimizar a quantidade de trabalho que você precisa fazer.

código pseudo

  • agenda cron trabalho para correr todas as noites
  • digitalizar através de cada produto
  • Para cada produto que tenha sido atualizado desde a última vez que o trabalho correu, copie informações da loja A (Francês) para armazenar B (Francês)
  • logar tempo que o trabalho correu

    Isso é assumindo que você não precisa de sincronia imediata de produtos.

    Uma dica seria para garantir que seu modelo de indexação não esteja definido como 'Atualizar em Salvar'

A " massa Atributo Atualização de funcionalidade não permite aplicar valores a partir de uma visão de loja para outra, devido à lógica de restrições.Magento aplica-se apenas os valores padrão para o recém-atribuído armazenamento de pontos de vista.

Tentar usar o SQL puro solução.

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

O script copia os valores de "descrição" e "short_description' atributos '<source_store_id> loja ' vista '<target_store_id>'visão de loja.

Substitua '<target_store_id>'e '<source_store_id>'constantes e executar este script para cada vista de arquivo separadamente.

Use 'INSERIR IGNORAR ...'sintaxe em vez de 'INSERT ..NA CHAVE DUPLICADA de ATUALIZAÇÃO se você gostaria de preservar a já existente valores.

Se você gostaria de copiar alguns outros valores de atributo você apenas tem que modificar o script de acordo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top