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

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top