`copyFieldset` una propiedad de origen a múltiples propiedades de destino
-
13-12-2019 - |
Pregunta
Tengo la tarea de convertir citas en un tipo de datos personalizado y usar Mage_Core_Helper_Data::copyFieldset
estaba funcionando muy bien hasta que tuve dos propiedades de destino que debían establecerse en la misma propiedad de origen.He probado un par de cosas diferentes
<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>
arriba hay uno quote_id
nodo, múltiple to_varien_object
nodos.
<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>
arriba es multiple quote_id
nodos, cada uno con uno to_varien_object
nodo.
Ninguno de estos enfoques se aplica con éxito quote_id
a ambos refnum
y txn_uuid
.
Mirando el código, no estoy seguro de si lo que estoy buscando es posible, ¡pero espero poder demostrar que estoy equivocado!
Gracias
Solución
Otra solución sería utilizar el evento que se envía cuando el copiarconjunto de campos la función se llama:
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
Como puede ver, el nombre del evento es dinámico, por lo que en este caso si llama copyFieldset('other_thing_convert_quote', 'to_varien_object', ...) el nombre del evento será core_copy_fieldset_other_thing_convert_quote_to_varien_object y esto es lo que pondrías en el config.xml de tu módulo:
<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>
Y finalmente en el método del observador haces esto para establecer los valores que necesitas:
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());
}
Otros consejos
No parece haber un gran interés en este problema, pero en caso de que alguien se tope con este problema en el futuro, esta es la mejor solución que he podido determinar.Magento obtiene datos del origen y establece datos en el destino utilizando getDataUsingMethod
/setDataUsingMethod
que intenta realizar una llamada al método "camelizado" basada en el nombre del nodo.Por ejemplo:
<my_module_convert_thing>
<property_a>
<to_another>*</to_another>
</property_a>
</my_module_convert_thing>
intentará llamar setPropertyA
y getPropertyA
sobre los dos objetos.Si en lugar de esas llamadas delegar en getData
y setData
a través de Varien_Object::__call
hay un método definido, casi no hay límite para la flexibilidad.Si es necesario establecer dos propiedades desde una fuente, funcionará el siguiente conjunto de campos XML:
<my_module_convert_thing>
<property_a>
<to_another>properties_ab</to_another>
</property_a>
</my_module_convert_thing>
Y si el método setPropertiesAb
se define en el another
clase, ese método puede manejar la configuración de ambos property_a
y property_b
utilizando el property_a
valor de thing
.
Sería bueno si hubiera una solución mejor que no requiriera esencialmente extender cada clase que necesita este enfoque personalizado, ¡pero este es mi mejor intento para resolver el problema!