'copyFieldset' eine Quelleneigenschaft zu mehreren Zieleigenschaften
-
13-12-2019 - |
Frage
Ich habe die Aufgabe, Anführungszeichen in einen benutzerdefinierten Datentyp zu konvertieren und zu verwenden Mage_Core_Helper_Data::copyFieldset
funktionierte wirklich gut, bis ich zwei Zieleigenschaften hatte, die auf dieselbe Quelleigenschaft gesetzt werden mussten.Ich habe ein paar verschiedene Dinge ausprobiert
<other_thing_convert_quote>
<grand_total>
<to_varien_object>total</to_varien_object>
</grand_total>
<quote_currency_code>
<to_varien_object>currency</to_varien_object>
</quote_currency_code>
<quote_id>
<to_varien_object>refnum</to_varien_object>
<to_varien_object>txn_uuid</to_varien_object>
</quote_id>
</other_thing_convert_quote>
Oben ist einer quote_id
knoten, mehrfach to_varien_object
Knoten.
<other_thing_convert_quote>
<grand_total>
<to_varien_object>total</to_varien_object>
</grand_total>
<quote_currency_code>
<to_varien_object>currency</to_varien_object>
</quote_currency_code>
<quote_id>
<to_varien_object>refnum</to_varien_object>
</quote_id>
<quote_id>
<to_varien_object>uuid</to_varien_object>
</quote_id>
</other_thing_convert_quote>
Oben ist mehrfach quote_id
knoten mit jeweils einem to_varien_object
Knoten.
Keiner dieser Ansätze wird erfolgreich angewendet quote_id
zu beiden refnum
und txn_uuid
.
Wenn ich mir den Code anschaue, bin ich mir nicht sicher, ob das, wonach ich suche, überhaupt möglich ist, aber hoffentlich kann mir das Gegenteil bewiesen werden!
Danke
Lösung
Eine andere Lösung wäre, das Ereignis zu verwenden, das ausgelöst wird, wenn das Kopierfeldsatz funktion wird aufgerufen:
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
Wie Sie sehen können, ist der Ereignisname dynamisch, also in diesem Fall, wenn Sie anrufen copyFieldset('other_thing_convert_quote', 'zu_varien_objekt', ...) der Name der Veranstaltung wird sein core_copy_fieldset_anderes_ding_quote_umwandeln_zu_varien_objekt und das würden Sie in die Konfiguration Ihres Moduls einfügen.XML:
<events>
<core_copy_fieldset_other_thing_convert_quote_to_varien_object>
<observers>
<modulename>
<type>singleton</type>
<class>modulename/observer</class>
<method>coreCopyFieldsetOtherThingConvertQuoteToVarienObject</method>
</modulename>
</observers>
</core_copy_fieldset_other_thing_convert_quote_to_varien_object>
</events>
Und schließlich tun Sie dies in der Beobachtermethode, um die benötigten Werte festzulegen:
public function coreCopyFieldsetOtherThingConvertQuoteToVarienObject($observer) {
// your 'other_thing'
$src = $observer->getSource();
// your 'varien_object'
$target = $observer->getTarget();
$target->setData('refnum', $src->getQuoteId());
$target->setData('txn_uuid', $src->getQuoteId());
}
Andere Tipps
Es scheint kein nennenswertes Interesse an diesem Thema zu geben, aber falls in Zukunft jemand auf dieses Thema stößt, ist hier die beste Lösung, die ich ermitteln konnte.Magento ruft Daten von der Quelle ab und legt Daten auf dem Ziel fest mit getDataUsingMethod
/setDataUsingMethod
welches versucht, einen "kamelisierten" Methodenaufruf basierend auf dem Knotennamen durchzuführen.Beispielsweise:
<my_module_convert_thing>
<property_a>
<to_another>*</to_another>
</property_a>
</my_module_convert_thing>
Werde versuchen anzurufen setPropertyA
und getPropertyA
auf die beiden Objekte.Wenn anstelle dieser Anrufe delegiert wird an getData
und setData
durch Varien_Object::__call
es gibt eine definierte Methode, der Flexibilität sind fast keine Grenzen gesetzt.Wenn zwei Eigenschaften aus einer Quelle festgelegt werden müssen, funktioniert das folgende XML-Feldset:
<my_module_convert_thing>
<property_a>
<to_another>properties_ab</to_another>
</property_a>
</my_module_convert_thing>
Und wenn die Methode setPropertiesAb
ist definiert auf der another
klasse, diese Methode kann die Einstellung von beiden behandeln property_a
und property_b
mit dem property_a
wert von thing
.
Es wäre schön, wenn es eine bessere Lösung gäbe, bei der nicht im Wesentlichen jede Klasse erweitert werden müsste, die diesen benutzerdefinierten Ansatz benötigt, aber dies ist mein bester Versuch, das Problem zu lösen!