Como você atribua descrições entre 2 lojas diferentes e 2 idiomas?
-
12-12-2019 - |
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:
Como você preencher todas as descrições de Loja A (Em Francês) para Loja B (Francês)
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 , mas eu espero que ele vai ajudar você a criar sua própria solução.:)short_description
de lá)
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.