`copyFieldset` uma propriedade de origem para múltiplas propriedades de destino
-
13-12-2019 - |
Pergunta
Tenho a tarefa de converter cotações em um tipo de dados personalizado e usar Mage_Core_Helper_Data::copyFieldset
estava funcionando muito bem até que eu tivesse duas propriedades de destino que precisavam ser definidas como a mesma propriedade de origem.Eu tentei algumas coisas 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>
Acima está um quote_id
nó, múltiplo to_varien_object
nós.
<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>
Acima é múltiplo quote_id
nós, cada um com um to_varien_object
nó.
Nenhuma dessas abordagens se aplica com sucesso quote_id
para ambos refnum
e txn_uuid
.
Olhando para o código, não tenho certeza se o que estou procurando é possível, mas espero que possa provar que estou errado!
Obrigado
Solução
Outra solução seria usar o evento que é despachado quando o copiarFieldset função é chamada:
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
Como você pode ver o nome do evento é dinâmico, então neste caso se você ligar copyFieldset('other_thing_convert_quote', 'to_varien_object', ...) o nome do evento será core_copy_fieldset_other_thing_convert_quote_to_varien_object e isso é o que você colocaria no config.xml do seu 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>
E finalmente no método observer você faz isso para definir os valores necessários:
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());
}
Outras dicas
Não parece haver um interesse significativamente grande nesta questão, mas caso alguém se depare com esta questão no futuro, aqui está a melhor solução que consegui determinar.Magento obtém dados da fonte e define dados no destino usando getDataUsingMethod
/setDataUsingMethod
que tenta fazer uma chamada de método "camelizado" com base no nome do nó.Por exemplo:
<my_module_convert_thing>
<property_a>
<to_another>*</to_another>
</property_a>
</my_module_convert_thing>
Vou tentar ligar setPropertyA
e getPropertyA
nos dois objetos.Se em vez daquelas chamadas delegando para getData
e setData
através Varien_Object::__call
existe um método definido, quase não há limite para a flexibilidade.Se duas propriedades precisarem ser definidas de uma origem, o seguinte conjunto de campos XML funcionará:
<my_module_convert_thing>
<property_a>
<to_another>properties_ab</to_another>
</property_a>
</my_module_convert_thing>
E se o método setPropertiesAb
é definido no another
classe, esse método pode lidar com a configuração de ambos property_a
e property_b
usando o property_a
valor de thing
.
Seria bom se houvesse uma solução melhor que não exigisse essencialmente a extensão de todas as classes que precisam dessa abordagem personalizada, mas esta é minha melhor tentativa de resolver o problema!