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

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top