Tüm ürünlerde mağaza görünümü için “Varsayılan Değeri Kullan” seçeneğini sıfırlayın


16

Her nasılsa bir dizi ürünümün "Varsayılan Değeri Kullan" seçimi kaldırıldı.

Mağazamın İngilizce ve Fransızca olmak üzere 2 dili var. Fransızca, Varsayılan Mağaza değerini kullanır, bu nedenle ürünleri güncellediğimde, Fransız mağaza görünümünde ürüne manuel olarak girip "Varsayılan Değeri Kullan" ı seçmedikçe ön uçta görünmüyor,

Kitlesel bir eylem için bir öznitelik yok gibi görünüyor, bazı komut dosyaları ve MySQL sorguları ile karşılaştım, ancak bu çözümlerin tüm mağaza görünümlerini varsayılan değeri kullanmak üzere sıfırlayıp sıfırlamadığı açık değildir.

İstenen sonuç, tüm ürünlerde belirli bir mağaza görünümünde (Fransızca) "Varsayılan Değeri Kullan" olarak ayarlanmasıdır.

Çok sayıda ürünü (veya tüm ürünleri) belirli bir mağaza görünümünde "Varsayılan Değeri Kullan" olarak nasıl sıfırlayabilirim?

Yanıtlar:


7

Ne yazık ki, bir ürün özelliğini güncellemenin etkili yollarından hiçbiri bu durumda çalışmaz. nesne $product->getResource()->saveAttribute()üzerinde mağaza kimliğini ayarlasanız bile tüm mağaza görünümlerinin özniteliğini günceller $product. Mage::getSingleton('catalog/product_action')->updateAttributes()yalnızca belirli bir mağazadaki değeri güncelleştirir, ancak özniteliği varsayılan değeri kullanacak şekilde ayarlayamaz ( başvuru için bu Yığın Taşması sorusuna da bakın ). Bu yüzden yavaş, yoğun bellek kullanan bir yol kullanmamız gerekiyor $product->save().

Hangi özellikleri güncellemek istediğinizi bildiğinizi varsayalım. Aşağıdaki örnek için, visibilityözelliği varsayılan değeri kullanacak şekilde ayarladım . Aşağıdaki komut dosyası hile yapmalıdır (ihtiyaçlarınıza göre değiştirdiğinizden emin olun):

<?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'));

Özellik verilerini değiştirmeden "varsayılan değeri kullan" seçeneğini işaretlemenin bir yolu var mı? Çünkü burada, eğer kullanırsam $product->setData('visibility', false);kutuyu işaretleyecek, ama aynı zamanda
görünmesini

1
@ JurģisTomsLiepiņš Kutuyu işaretlerseniz, üst kapsamdaki değer olan varsayılan değeri kullanır. Bu nedenle, kutuyu işaretlerseniz ve "true" değerine geçerse, üst kapsam değeriniz de "true" olur. Sorularınız için lütfen yeni bir soru sorun.
Simon

Yeni bir soru sordum , umarım benim için bazı şeyleri netleştirebilir / silebilirsiniz
Jurģis Toms Liepiņš

SetData başarıyla (cli den çağrıldığında) yanlış kullanın. Ama aynı işlevi bir ön uç denetleyici yolundan çağırdığımda fark ettim, işe yaramıyor! Birisi zaten bu sorunla karşılaştı mı?
DarkCowboy

@DarkCowboy Bu muhtemelen bir izin sorunudur. Bir ürünü bir ön uç denetleyicisine kaydedebileceğinizi düşünmüyorum. Sorularınız için lütfen yeni bir tane açın.
Simon

24

Fransız mağazası için mağaza kimliğinin 2 olduğunu varsayarsak, aşağıdaki mysql sorgularını çalıştırmalısınız:

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;

Bu, temel olarak mağaza kimliğinin 2 olarak ayarlandığı tüm özelliklerin ve ürünlerin özellik değerlerini siler. Magento, bir ürünün belirli mağaza kimliğine karşı özellik değerini bulamadığında, varsayılan değeri seçer.


1
Bu doğru değil. Özellik değerini falsebenim yaptığım gibi ayarlarsa, "varsayılan değeri kullan" seçeneği işaretlenir. Çözümünüz işe yarayabilse de, şahsen doğrudan SQL sorguları kullanmayı sevmiyorum.
Simon

Tamam özür dilerim, cevabınızı yanlış okudum ve OP'den false yerine tüm varsayılan değerleri koymasını istediğinizi düşündüm. Çözümünüz çalışıyor :)
Paras Sood

5
"Bu doğru değil" ifadesinin, Simon'un şu anda kaldırılmış olduğu cevabı hakkında bir yorum anlamına geldiğini lütfen unutmayın. Çözüm işe yarıyor.
Fabian Schmengler

@fschmengler Paras cevapları görüntüleri ön uçta göstermek için işe yarar mı? Yeni mağazamla aynı problemim var tüm ürünler ve resimler var ama varsayılan olarak kullanmak için seçilmiyorlar.
thismethod

@thismethod hayır, bu farklı bir şey. Bunun için bir soru olabilir, aksi takdirde lütfen yeni bir soru sorun
Fabian Schmengler

7

Biraz geç katılıyorum, ama yukarıdaki cevapların hiçbirini gerçekten sevmedim.

  1. Simons'un ürün koleksiyonu üzerinde yürümenin cevabı inanılmaz derecede yavaş ve verimsiz, ancak en azından Magento kullanıyor
  2. ParasSood'un veritabanında doğrudan değişiklikler yapmanın cevabı biraz korkutucu ve bunun biraz otomatik işlevsellik olarak sarılmasını istiyorsanız çok kullanışlı değil.

İşte benim denemem, tam olarak test edilmedi ama yapmak için ihtiyacım olan şeyi yapıyor gibi görünüyor.

/**
 * 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
    );
}

Neden satır 14'e bir sözdizimi hatası veriyoruz? Luke Rodgers
Ek

Hata nedir?
Luke Rodgers

Şimdi düzeltildi, ancak bu asla düzgün bir şekilde çalışmıyor ve geliştiricimde bitiyor. ortamı. Herhangi bir öneri?
Ek

Asıl hata olmadan yardımcı olamaz :)
Luke Rodgers

Bu kodu nasıl kullanmalıyım hakkında herhangi bir kılavuz? bağımsız bir komut dosyası olarak kullanabilir miyim?
Kris Wen

3

Admin toplu güncelleme formundaki her özellik için gerekli onay kutularını eklemek üzere core_block_abstract_to_html_before adminhtml olayını kullanabilirsiniz .

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

Daha sonra belirli bir mağaza görünümü için EAV tablolarındaki değerleri silmek için catalog_product_attribute_update_before olayını, yalnızca daha önce core_block_abstract_to_html_before işaretlenmiş olarak işaretlediğiniz onay kutusuna sahip olan özellikler için kullanmanız gerekir .

Umarım yardımcı olur.

Bu modül tam olarak bunu yapar: http://mageinn.com/product/adminextra/ ' url_key ' özniteliğini bu modülle sıfırlamak da mümkündür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.