Как скопировать значение атрибутов продукта в другой атрибут в Magento?

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

Вопрос

Есть ли способ в Magento, где я могу назначить значение атрибута x для атрибута Y программно?

Пока я пробовал это. Я создал атрибут Y с следующими настройками:

$setup->addAttribute('catalog_product','myAttribute',array(
                   'group'=>'General',
                   'input'=>'label',
                   'type'=>'varchar',
                   'label'=>'Value of Attribute X',
                   'visible'=>1,
                   'backend'=>'beta/entity_attribute_backend_myattribute',
                   'global'=>Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE
               ));

В моей модели бэкэнд я сделал это:

class Namespace_Module_Model_Entity_Attribute_Backend_Myattribute extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract
{
    public function beforeSave($object){
        $attrCode = $this->getAttribute()->getAttributeCode();
        $object->setData($attrCode,'HAHAHA');
        parent::beforeSave($object);
        return $this;
    }
}

Я могу видеть «хахаха» как значение атрибута на странице редактирования продукта. Я хочу изменить это на ценность другого атрибута. Как это сделать ? Как получить доступ к значению другого атрибута того же продукта из этого класса?

PS: Я на самом деле пытаюсь достичь. Атрибут X имеет тип Multi Select со 100 -х с параметров. Таким образом, атрибут y должен отслеживать параметры, выбранные из x, а Y показывает значение на странице продукта в формате только для чтения.

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

Решение 2

Я наконец решил это. Я пошел по другому подходу, я использовал наблюдатель. Это то, что я сделал:

Я создал наблюдателя с следующим кодом:

class Namespace_Module_Model_Observer
{

private $_processFlag; //to prevent infinite loop of event-catch situation
public function  copyAttribute($observer){

    if(!$this->_processFlag):

    $this->_processFlag=true;
    $_store = $observer->getStoreId();
    $_product = $observer->getProduct();
    $_productid = $_product->getId();

    $attrA = $_product->getAttributeText('attributeA'); //get attribute A's value

    $action = Mage::getModel('catalog/resource_product_action');
    $action->updateAttributes(array($_productid), array('attributeB'=>$attrA),$_store); //assign attrA's value to attrB
    $_product->save();
    endif;
}

И мой config.xml сделал так:

<events>
            <catalog_product_save_after>
                <observers>
                    <namespace_module>
                        <type>singleton</type>
                        <class>Namespace_Module_Model_Observer</class>
                        <method>copyAttribute</method>
                    </namespace_module>
                </observers>
            </catalog_product_save_after>
        </events>

Таким образом, в основном я использую Catalog_product_Save_AFTER, который запускается при сохранении продукта. В моем наблюдателе я поймаю событие, получаю значение Attributea и назначает AttributeB и, наконец, сохраняю свой продукт.

Вот и все! Я не знаю, является ли это лучшим методом, но он работает!

PS: Спасибо Keyul Shah за помощь мне в решении. Он помог мне прямо в Facebook. Однако ответ, который он опубликовал ниже, не работает.

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

Это просто

$prod=Mage::getModel('catalog/product')->load($id);

$val=$prod->getData('attribute_code');

Теперь назначьте значения другому атрибуту этого продукта

$prod->setAttreibuteCode($val);

$prod->save();

Не забыл сохранить продукт.

Пара улучшений в его ответе, с которым я столкнулся, используя его сегодня. Я не могу комментировать из -за отсутствия репутации, так что извините, отвечу, вместо того, чтобы комментировать.

$ _product-> save ();

Это дало мне «SQLState [23000]: нарушение ограничений целостности: 1062 дубликата в записи» при создании нового продукта. Это было исправлено путем перехода на:

$ _product-> getResource ()-> Save ($ _ Product);

Кроме того, я обнаружил, что модуль работает только тогда, когда у атрибута уже было значение. Это было связано с использованием UpdateatTributes. Поскольку я редактировал только один атрибут, я изменился:

$ action-> updateattributes (Array ($ _ ProductId), Array ('attributeB' => $ attra), $ _ Store);

к:

$ _product-> setData ('attributeB', $ attra);

А теперь это отлично работает! Надеюсь, это поможет другому нулю, как я, спасибо, ребята!

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