كيف يمكنك تعيين الأوصاف بين متجرين مختلفين ولغتين؟

magento.stackexchange https://magento.stackexchange.com//questions/49016

  •  12-12-2019
  •  | 
  •  

سؤال

سيناريو:

  • تأسيس متجر ماجنتو (المتجر أ) مع لغتين للمتجر، الإنجليزية والفرنسية.

  • عدد كبير من المنتجات (10 آلاف +)

  • متجر جديد (المتجر ب) تم إنشاؤه (نفس تثبيت Magento)، ويحمل نفس المنتجات مثل المتجر أ

مشكلة:

عند تعيين جميع المنتجات الموجودة من المتجر أ ل المتجر ب, ، تتم مطالبتك بتحديد مصدر المعلومات الافتراضية. يغطي هذا عرض متجر واحد فقط (باللغة الإنجليزية).

نتيجة مرغوبة: enter image description here

كيف يمكنك ملء جميع الأوصاف من المتجر أ (فرنسي) ل المتجر ب (فرنسي)

هل كانت مفيدة؟

المحلول

ربما مراقب سوف يقوم بهذه المهمة؟

على سبيل المثال:

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

وبطبيعة الحال، يجب عليك بعد ذلك إعلان مراقب ل catalog_product_save_after حدث اختيار فئة وطريقة المراقبين في الوحدة النمطية الخاصة بك config.xml.على سبيل المثال:

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

إنها مجرد فكرة أساسية لحل المشكلة, ، لأنني لا أعرف الأوصاف التي تستخدمها (قد ترغب أيضًا في وضعها short_description هناك), ، لكنني آمل أن يساعدك ذلك في إنشاء الحل الخاص بك.:)

ملاحظة.:احذر من حلقات المراقبين.

نصائح أخرى

أتصور أنه سيتعين عليك كتابة وحدة المزامنة الخاصة بك، والتي تقوم بجدولة استيراد المعلومات ليلاً من المتجر "أ" الفرنسي إلى المتجر "ب" الفرنسي.

استخدم الحقل "Updated_At" للمنتجات لتقليل حجم العمل الذي يتعين عليك القيام به.

كود مزيف

  • جدولة مهمة كرون لتشغيلها ليلا
  • مسح من خلال كل منتج
  • بالنسبة لكل منتج تم تحديثه منذ آخر مرة تم فيها تشغيل المهمة، انسخ المعلومات من المتجر أ (الفرنسية) إلى المتجر ب (الفرنسية)
  • سجل وقت تشغيل المهمة

هذا على افتراض أنك لا تحتاج إلى مزامنة فورية للمنتجات.

قد تكون النصيحة هي التأكد من عدم تعيين نموذج الفهرسة الخاص بك على "التحديث عند الحفظ"

لا تسمح وظيفة "تحديث السمات الشاملة" بتطبيق القيم من طريقة عرض متجر إلى أخرى بسبب القيود المنطقية.يطبق Magento القيم الافتراضية فقط على عروض المتجر المعينة حديثًا.

حاول استخدام الحل البديل SQL النقي.

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

يقوم البرنامج النصي بنسخ قيم سمات "الوصف" و"الوصف_القصير" من "<source_store_id>'عرض المتجر ل'<target_store_id>"عرض المتجر.

يستبدل '<target_store_id>' و '<source_store_id>الثوابت وقم بتشغيل هذا البرنامج النصي لكل طريقة عرض للمتجر بشكل منفصل.

استخدم "إدراج تجاهل ..."بناء الجملة "بدلاً من" INSERT ..ON DUPLICATE KEY UPDATE' إذا كنت ترغب في الحفاظ على القيم الموجودة بالفعل.

إذا كنت ترغب في نسخ بعض قيم السمات الأخرى، فما عليك سوى تعديل البرنامج النصي وفقًا لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top