Скиньте "Використовувати значення за замовчуванням" для конкретного перегляду магазину для всіх продуктів


16

Якось для деяких моїх продуктів було вибрано "Використовувати значення за замовчуванням".

У моєму магазині є 2 мови, англійська та французька. Французька використовує значення магазину за замовчуванням, тому зараз, коли я оновлюю продукти, вона не з’являється на передній частині, якщо я вручну не перейду до продукту у французькому вікні магазину та виберіть "Використовувати значення за замовчуванням",

Здається, не існує атрибута масової дії, я натрапив на деякі сценарії та запити MySQL, однак не ясно, чи ці рішення скидають усі представлення магазинів, щоб використовувати значення за замовчуванням.

Бажаним результатом є встановлення "Використовувати значення за замовчуванням" для певного виду магазину (французькою мовою) для всіх продуктів.

Як я можу скинути велику кількість продуктів (або всіх продуктів) на "Використовувати значення за замовчуванням" для певного представлення магазину?

Відповіді:


7

На жаль, жоден з ефективних способів оновити атрибут продукту не працює в цьому випадку. $product->getResource()->saveAttribute()оновлює атрибут для всіх представлень магазину, навіть якщо ви встановите ідентифікатор магазину на $productоб'єкті. Mage::getSingleton('catalog/product_action')->updateAttributes()оновляє значення лише в конкретному магазині, але він не може встановити атрибут для використання значення за замовчуванням (див. також це питання переповнення стека для довідки). Таким чином, ми повинні використовувати повільний, пам'ять, інтенсивний шлях через $product->save().

Я припускаю, що ви знаєте, які атрибути ви хочете оновити. У наступному прикладі я встановлюю visibilityатрибут для використання значення за замовчуванням. Наступний скрипт повинен зробити трюк (переконайтеся, що ви його змінили відповідно до своїх потреб):

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

require_once 'app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
set_time_limit(0);

function useDefaultValueCallback($args)
{
    // change to the ID of your french store view
    $specificStoreViewId = 7;
    $product = Mage::getModel('catalog/product');
    $product->setData($args['row']);
    $product->setStoreId($specificStoreViewId);
    // change according to your needs
    $product->setData('visibility', false);
    $product->save();
}

$products = Mage::getModel('catalog/product')->getCollection();
Mage::getSingleton('core/resource_iterator')->walk($products->getSelect(), array('useDefaultValueCallback'));

Чи є спосіб позначити "використовувати значення за замовчуванням" без зміни даних атрибутів? Тому що тут, якщо я $product->setData('visibility', false);його використовую , позначте цей прапорець, а також встановіть видимість на "справжнє", чого я не хочу
Jurģis Toms Liepiņš

1
@ JurģisTomsLiepiņš Якщо ви поставите галочку, вона використовує значення за замовчуванням, яке є значенням з батьківської області. Отже, якщо ви поставите галочку, і вона переключиться на "true", значення батьківського діапазону також "true". Щоб отримати додаткові запитання, будь ласка, поставте нове запитання.
Симон

Я задав нове запитання , сподіваюся, ви зможете уточнити / очистити деякі речі для мене
Jurģis Toms Liepiņš

Я використовую setData для фальшивого помилки (коли дзвонять із cli). Але я помітив, коли я викликаю ту саму функцію з маршрутизатора фронтального контролера, вона не працює! Хтось уже стикався з цим питанням?
DarkCowboy

@DarkCowboy Це, мабуть, проблема з дозволом. Я не думаю, що ви можете зберегти продукт у контролері інтерфейсу. Для додаткових питань, будь ласка, відкрийте нове.
Симон

24

Припускаючи, що ідентифікатор магазину для французького магазину дорівнює 2, слід запустити нижче запити mysql:

DELETE FROM `catalog_product_entity_text` where store_id = 2;
DELETE FROM `catalog_product_entity_datetime` where store_id = 2;
DELETE FROM `catalog_product_entity_decimal` where store_id = 2;
DELETE FROM `catalog_product_entity_int` where store_id = 2;
DELETE FROM `catalog_product_entity_varchar` where store_id = 2;

Це в основному видаляє значення атрибутів для всіх атрибутів і продуктів, для яких встановлено ідентифікатор магазину 2. Коли Magento не може знайти значення атрибуту для продукту щодо конкретного ідентифікатора магазину, він вибирає значення за замовчуванням.


1
Це не правда. Якщо встановити значення атрибуту так, falseяк я зробив, буде встановлено галочку "використовувати значення за замовчуванням". Хоча ваше рішення може спрацювати, я особисто не люблю використовувати прямі запити SQL.
Саймон

Добре вибачте, я неправильно прочитав вашу відповідь і подумав, що ви просите ОП ввести всі значення за замовчуванням замість хибних. Ваше рішення працює :)
Paras Sood

5
Зауважте, що "Це неправда" стосується коментаря до відповіді Саймона, який зараз було видалено. Рішення працює.
Фабіан Шменглер

@fschmengler Чи відповів би Paras для показу зображень на передній частині? У мене однакова проблема з моїм новим магазином, усі продукти та зображення є, але вони не вибрані для використання за замовчуванням.
цеметод

@thismethod ні, це щось інше. Можливо, до цього вже
виникне

7

Приєднався трохи пізно, але мені не дуже сподобався жоден із наведених відповідей.

  1. Відповідь Саймона, коли йдеш над колекцією продуктів, шалено повільна і неефективна, проте, принаймні, це використовувати Magento
  2. Відповідь ParasSood про прямі зміни в базі даних є трохи страшною, і не дуже корисною, якщо ви хочете, щоб це було трохи автоматизованим функціоналом.

Ось моя спроба, не повністю перевірена, але, здається, я роблю те, що мені потрібно для цього.

/**
 * If given store code will reset only that store, otherwise will set all stores to "use default"
 *
 * If given product ids will reset only those products, otherwise all products will be set to "use default"
 *
 * @param $attributeCode
 * @param null $storeCode
 * @param null $productIds
 *
 */
public function forceProductsToUseDefault($attributeCode, $storeCode = null, $productIds = null)
{
    $conditions = array();

    if (is_null($storeCode)) {
        $conditions['store_id != ?'] = Mage_Core_Model_App::ADMIN_STORE_ID;
    } else {
        $store = Mage::app()->getStore($storeCode);
        if (!$store instanceof Mage_Core_Model_Store || !$store->getId()) {
            Mage::throwException("Store with code not found: $storeCode");
        }
        $conditions['store_id = ?' ] = $store->getId();
    }

    if (!is_null($productIds)) {
        $conditions['entity_id in(?)'] = $productIds;
    }

    $attribute = Mage::getModel('eav/entity_attribute')
        ->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode);
    if (!$attribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract || !$attribute->getId()) {
        Mage::throwException("Attribute with code not found: $attributeCode");
    }
    $conditions['attribute_id = ?'] = $attribute->getId();

    $coreResource = Mage::getSingleton('core/resource');

    $coreResource->getConnection('core_write')->delete(
        $coreResource->getTableName(array('catalog/product', $attribute->getData('backend_type'))),
        $conditions
    );
}

Чому ми викидаємо синтаксичну помилку на рядок 14? @Luke Rodgers
доповнення

У чому помилка?
Люк Роджерс

Це зараз виправлено, але це ніколи не працює належним чином і закінчується на моїй розробці. середовище. Будь-які пропозиції?
Додаток

Не можу допомогти без фактичної помилки :)
Люк Роджерс

будь-яке керівництво про те, як я повинен використовувати цей код? чи можу я використовувати його як окремий сценарій?
Кріс Вень

3

Ви можете використовувати core_block_ab абстракт_to_html_before adminhtml подію, щоб додати необхідні прапорці для кожного атрибуту у формі оновлення адміністратора.

protected $_controllers = array(
    'attribute', 
    'catalog_product_action_attribute'
    );


public function htmlBefore(Varien_Event_Observer $observer)
{
        $block = $observer->getBlock();

        if (!isset($block)) {
            return $this;
        }

        $request = Mage::app()->getRequest();
        $storeId = $request->getParam('store');

        if ($storeId != 0) {
            if(in_array($request->getControllerName(), $this->_controllers) 
                    && $request->getActionName() == 'edit') {
                // Add use_default checkboxes
                if ($block instanceof Mage_Adminhtml_Block_Catalog_Form_Renderer_Fieldset_Element) {
                    $block->getDataObject()->setId('empty');
                    $block->getDataObject()->setStoreId($storeId);
                    $block->getDataObject()->setExistsStoreValueFlag($block->getAttribute()->getAttributeCode());
                }
            }
        }
}

Тоді вам потрібно буде скористатися каталог_product_attribute_update_before event для видалення значень із таблиць EAV для конкретного перегляду магазину, лише для тих атрибутів, у яких встановлено прапорець, який ви ін'єктували раніше за допомогою core_block_ab абстракт_to_html_before , як встановлено прапорець.

Сподіваюся, що це допомагає.

Цей модуль робить саме це: http://mageinn.com/product/adminextra/ Також можливо скинути атрибут ' url_key ' за допомогою цього модуля.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.