Как скопировать значение атрибутов продукта в другой атрибут в Magento?
-
22-10-2019 - |
Вопрос
Есть ли способ в 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);
А теперь это отлично работает! Надеюсь, это поможет другому нулю, как я, спасибо, ребята!