Question

Scénario:

  • Boutique Magento établie (Magasin A) avec 2 langues de visualisation du magasin, anglais et français.

  • Grand nombre de produits (10k +)

  • Nouveau magasin (Magasin B) a été créé (même installation Magento) et propose tous les mêmes produits que Magasin A

Problème:

Lors de l'attribution de tous les produits existants de Magasin A à Magasin B, vous êtes invité à indiquer d'où proviendront les informations par défaut. Cela ne couvre qu’une seule vue du magasin (en anglais).

Résultat désiré: enter image description here

Comment remplir toutes les descriptions de Magasin A (français) à Magasin B (français)

Était-ce utile?

La solution

Peut-être qu'un observateur fera l'affaire ?

Par exemple:

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

Bien entendu, vous devrez alors déclarer un observateur pour catalog_product_save_after événement en choisissant votre classe et votre méthode Observers dans le fichier de votre module config.xml.Par exemple:

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

C'est juste une idée assez basique pour résoudre le problème, comme je ne sais pas quelles descriptions vous utilisez (vous voudrez peut-être aussi mettre short_description là), mais j'espère que cela vous aidera à créer votre propre solution.:)

P.S. :Méfiez-vous des boucles des observateurs.

Autres conseils

J'imagine que vous devrez écrire votre propre module de synchronisation, ciblé une importation nocturne d'informations de stocker un français pour stocker B français.

Utilisez le champ "mis à jour" pour les produits pour minimiser la quantité de travail que vous devez faire.

pseudo code

  • Planifiez un emploi cron pour exécuter la nuit
  • Scannez à travers chaque produit
  • Pour chaque produit mis à jour depuis la dernière fois que le travail a couru, copiez des informations de stocker A (français) pour stocker B (français)
  • LOG DU TEMPS DU JOINT RAN

    Cela suppose que vous n'avez pas besoin de synchronisation immédiate des produits.

    Un conseil serait de vous assurer que votre modèle d'indexation n'est pas défini sur "Mettre à jour sur Enregistrer"

La fonctionnalité « Mise à jour en masse des attributs » ne permet pas d'appliquer les valeurs d'une vue de magasin à une autre en raison des restrictions logiques.Magento applique uniquement les valeurs par défaut aux vues de magasin nouvellement attribuées.

Essayez d'utiliser la solution de contournement SQL pure.

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

Le script copie les valeurs des attributs 'description' et 'short_description' de '<source_store_id>' stocker la vue dans '<target_store_id>' vue du magasin.

Remplacer '<target_store_id>' et '<source_store_id>' constantes et exécutez ce script pour chaque vue de magasin séparément.

Utilisez 'INSÉRER Ignorer...' au lieu de 'INSERT ..ON DUPLICATE KEY UPDATE' si vous souhaitez conserver les valeurs déjà existantes.

Si vous souhaitez copier d'autres valeurs d'attribut, il vous suffit de modifier le script en conséquence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top