Frage

Gibt es einen Weg in Magento, in dem ich das Wert von Attribut X zuweisen kann, um y programmatisch zuzuordnen?

Bisher habe ich das versucht. Ich habe das Y -Attribut mit den folgenden Einstellungen erstellt:

$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
               ));

In meinem Backend -Modell habe ich Folgendes getan:

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

Ich kann "hahaha" als Attributwert auf der Produktbearbeitungsseite sehen. Ich möchte dies in den Wert eines anderen Attributs ändern. Wie mache ich es ? Wie greife ich aus dieser Klasse auf das Wert eines anderen Attributs desselben Produkts auf?

PS: Was ich eigentlich versuche zu erreichen, ist das. Das Attribut X ist vom Typ Multi -Select mit 100 -jährigen Optionen. Das Attribut y muss also die ausgewählten Optionen verfolgen, und Y zeigt den Wert auf der Produktseite im schreibgeschützten Format an.

War es hilfreich?

Lösung 2

Ich habe das endlich gelöst. Ich habe einen anderen Ansatz verfolgt, ich habe Beobachter verwendet. Das habe ich getan:

Ich habe einen Beobachter mit dem folgenden Code erstellt:

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

Und meine config.xml ging so:

<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>

Grundsätzlich verwende ich das Ereignis catalog_product_save_after, das bei Speichern eines Produkts entlassen wird. In meinem Beobachter fange ich das Ereignis an, holte Attributebs -Wert von Attributea und speichere schließlich mein Produkt.

Das ist es! Ich weiß nicht, ob dies die beste Methode ist, aber es funktioniert!

PS: Vielen Dank an Keyul Shah, dass er mir geholfen hat, dies zu lösen. Er half mir direkt auf Facebook. Die Antwort, die er unten gepostet hat, scheint jedoch nicht zu funktionieren.

Andere Tipps

Es ist einfach

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

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

Weisen Sie nun die Werte einem anderen Attribut dieses Produkts zu

$prod->setAttreibuteCode($val);

$prod->save();

Vergessen Sie nicht, Produkt zu sparen.

Ein paar Verbesserungen an seiner Antwort, auf die ich heute als ich sie benutzte. Ich kann nicht kommentieren, weil ich keinen Ruf also entschuldigen kann, wenn ich antwortete, anstatt zu kommentieren.

$ _Product-> save ();

Dies gab mir einen "SQLState [23000]: Integritätsbeschränkungsverletzung: 1062 Duplicateintrag" beim Erstellen eines neuen Produkts. Dies wurde festgelegt, indem es geändert wurde zu:

$ _Product-> getResource ()-> speichern ($ _ produkt);

Außerdem stellte ich fest, dass das Modul erst funktionierte, wenn das Attributeb bereits einen Wert hatte. Dies war auf die Verwendung von UpdateAttributes zurückzuführen. Da ich nur ein Attribut bearbeitete, habe ich mich geändert:

$ action-> updateattributes (Array ($ _ productId), Array ('AttributB' => $ attra), $ _ Store);

zu:

$ _Product-> setData ('Attributeb', $ attra);

Und jetzt funktioniert es großartig! Hoffe das hilft einem anderen Noob wie mir, danke Jungs!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top