Как распределить описания между двумя разными магазинами и на двух языках?

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

  •  12-12-2019
  •  | 
  •  

Вопрос

Сценарий:

  • Открыт магазин Magento. (Магазин А) с двумя языками просмотра магазина: английским и французским.

  • Большое количество товаров (10к+)

  • Новый магазин (Магазин Б) был создан (та же установка Magento) и содержит все те же продукты, что и Магазин А

Проблема:

При назначении всех существующих продуктов из Магазин А к Магазин Б, вам будет предложено указать, откуда будет взята информация по умолчанию. Это касается только одного просмотра магазина (на английском языке).

Желаемый результат: enter image description here

Как заполнить все описания из Магазин А (французский) к Магазин B (французский)

Это было полезно?

Решение

Может быть, наблюдатель выполнит эту работу?

Например:

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 событие выбора класса и метода Observers в вашем модуле 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 там), но я надеюсь, что это поможет вам создать собственное решение.:)

P.S.:Остерегайтесь петель наблюдателей.

Другие советы

Я предполагаю, что вам придется написать свой собственный модуль синхронизации, который планирует ночной импорт информации из магазина A French в магазин B French.

Используйте поле «Updated_At» для продуктов, чтобы минимизировать объем работы, которую вам нужно выполнить.

псевдокод

  • Запланировать запуск задания cron на ночь
  • Сканируйте каждый продукт
  • Для каждого продукта, который был обновлен с момента последнего запуска задания, скопируйте информацию из магазина A (на французском языке) в магазин B (на французском языке).
  • Запишите время выполнения задания

Это предполагает, что вам не нужна немедленная синхронизация продуктов.

Совет: убедитесь, что ваша модель индексирования не настроена на «обновление при сохранении».

Функциональность «Массовое обновление атрибутов» не позволяет применять значения из одного представления магазина в другое из-за логических ограничений.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`;

Скрипт копирует значения атрибутов «description» и «short_description» из файла «<source_store_id>'сохранить вид'<target_store_id>'Вид магазина.

Заменять '<target_store_id>' и '<source_store_id>' константы и запускаем этот скрипт для каждого представления магазина отдельно.

Используйте «ВСТАВИТЬ ИГНОРИРОВАТЬ...»' синтаксис вместо 'INSERT ..ON DUPLICATE KEY UPDATE», если вы хотите сохранить уже существующие значения.

Если вы хотите скопировать некоторые другие значения атрибутов, вам просто нужно соответствующим образом изменить скрипт.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top