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

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top