`copyfields. Una proprietà di origine a più proprietà di destinazione
-
13-12-2019 - |
Domanda
Sono incaricato di convertire le quotazioni in un tipo di dati personalizzato e l'utilizzo di Mage_Core_Helper_Data::copyFieldset
funzionava davvero bene fino a quando avevo due proprietà di destinazione che dovevano essere impostate sulla stessa proprietà sorgente.Ho provato un paio di cose diverse
<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>
.
sopra è un nodo quote_id
, più nodi to_varien_object
.
<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>
.
sopra è più nodi quote_id
, ciascuno con un nodo to_varien_object
.
Nessuno di questi approcci applica correttamente quote_id
ad entrambi refnum
e txn_uuid
.
Guardando il codice, non sono sicuro se quello che sto cercando è anche possibile, ma spero di poter essere dimostrato sbagliato!
Grazie
Soluzione
Un'altra soluzione sarebbe quella di utilizzare l'evento che viene inviato quando viene chiamato copyfield :
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
.
Come puoi vedere il nome dell'evento è Dynamic in questo caso in questo caso se si chiama copyfield ('altro_thing_convert_quote', 'to_varien_object', ...) il nome dell'eventosarà core_copy_fieldset_other_thing_convert_quote_to_varien_object e questo è ciò che inserirti nel modulo del modulo Config.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>
.
E infine nel metodo Observer si esegue questo per impostare i valori necessari:
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());
}
. Altri suggerimenti
Non sembra essere significativamente grande interesse per questo problema, ma nel caso qualcuno inciampa su questo problema in futuro, ecco la soluzione migliore che sono stato in grado di determinare. Magento ottiene dati dall'origine e imposta i dati sul target utilizzando getDataUsingMethod
/ setDataUsingMethod
che tenta di effettuare una chiamata metodo "camelita" in base al nodulename. Ad esempio:
<my_module_convert_thing>
<property_a>
<to_another>*</to_another>
</property_a>
</my_module_convert_thing>
.
Proverà a chiamare setPropertyA
e getPropertyA
sui due oggetti. Se invece di quelle chiamate delegate a getData
e setData
attraverso Varien_Object::__call
c'è un metodo definito, non è quasi nessun limite alla flessibilità. Se devono essere impostate due proprietà da una fonte, il seguente funzionamento XML Fieldset funzionerà:
<my_module_convert_thing>
<property_a>
<to_another>properties_ab</to_another>
</property_a>
</my_module_convert_thing>
.
E se il metodo setPropertiesAb
è definito sulla classe another
, tale metodo può gestire l'impostazione di property_a
e property_b
utilizzando il valore property_a
da thing
.
Sarebbe bello se ci fosse una soluzione migliore che non avesse bisogno di estendere essenzialmente ogni classe che ha bisogno di questo approccio personalizzato, ma questa è la mia migliore pugnalata per risolvere il problema!