`copyFieldset` une propriété source sur plusieurs propriétés cibles
-
13-12-2019 - |
Question
Je suis chargé de convertir les devis en un type de données personnalisé et d'utiliser Mage_Core_Helper_Data::copyFieldset
fonctionnait très bien jusqu'à ce que j'aie deux propriétés cibles qui devaient être définies sur la même propriété source.J'ai essayé plusieurs choses différentes
<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>
Ci-dessus en est un quote_id
nœud, multiple to_varien_object
nœuds.
<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>
Ci-dessus est multiple quote_id
nœuds, chacun avec un to_varien_object
nœud.
Aucune de ces approches ne s’applique avec succès quote_id
aux deux refnum
et txn_uuid
.
En regardant le code, je ne suis pas sûr que ce que je recherche soit possible, mais j'espère que je pourrai me tromper !
Merci
La solution
Une autre solution serait d'utiliser l'événement qui est distribué lorsque le copierFieldset la fonction s'appelle :
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
Comme vous pouvez le constater, le nom de l'événement est dynamique, donc dans ce cas, si vous appelez copyFieldset('other_thing_convert_quote', 'to_varien_object', ...) le nom de l'événement sera core_copy_fieldset_other_thing_convert_quote_to_varien_object et voici ce que vous mettriez dans le config.xml de votre module :
<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>
Et enfin, dans la méthode observateur, vous faites ceci pour définir les valeurs dont vous avez besoin :
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());
}
Autres conseils
Ce problème ne semble pas susciter un grand intérêt, mais au cas où quelqu'un tomberait sur ce problème à l'avenir, voici la meilleure solution que j'ai pu déterminer.Magento récupère les données de la source et définit les données sur la cible en utilisant getDataUsingMethod
/setDataUsingMethod
qui tente d'effectuer un appel de méthode "camélisé" basé sur le nom du nœud.Par exemple:
<my_module_convert_thing>
<property_a>
<to_another>*</to_another>
</property_a>
</my_module_convert_thing>
Je vais essayer d'appeler setPropertyA
et getPropertyA
sur les deux objets.Si au lieu de ces appels déléguant à getData
et setData
à travers Varien_Object::__call
il existe une méthode définie, il n'y a presque aucune limite à la flexibilité.Si deux propriétés doivent être définies à partir d'une seule source, l'ensemble de champs XML suivant fonctionnera :
<my_module_convert_thing>
<property_a>
<to_another>properties_ab</to_another>
</property_a>
</my_module_convert_thing>
Et si la méthode setPropertiesAb
est défini sur le another
classe, cette méthode peut gérer le réglage des deux property_a
et property_b
en utilisant le property_a
valeur de thing
.
Ce serait bien s'il existait une meilleure solution qui ne nécessiterait pas essentiellement d'étendre chaque classe nécessitant cette approche personnalisée, mais c'est ma meilleure tentative pour résoudre le problème !