`Copyfieldset` одно исходное свойство для нескольких целевых свойств
Мне поручено преобразовать кавычки в пользовательский тип данных, и использование Mage_Core_Helper_Data::copyFieldset
работало очень хорошо, пока у меня не было двух целевых свойств, для которых нужно было установить одно и то же исходное свойство. Я пробовал несколько разных вещей
<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>
Выше приведен один quote_id
узел, несколько to_varien_object
узлов.
<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>
Выше приведено несколько quote_id
узлов, каждый с одним to_varien_object
узлом.
Ни один из этих подходов не применяется успешно quote_id
как к refnum
, так и txn_uuid
.
Глядя на код, я не уверен, что то, что я ищу, вообще возможно, но, надеюсь, я могу оказаться неправым!
Спасибо
2 answers
Другим решением было бы использовать событие, которое отправляется, когда Набор полей копирования функция называется:
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
Как вы можете видеть, название события является динамическим, поэтому в этом случае, если вы вызовете Набор полей копирования('other_thing_convert_quote', 'to_varien_объект', ...) имя события будет core_copy_fieldset_other_thing_convert_quote_to_varien_object, и это то, что вы бы поместили в свой модуль config.xml :
<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>
И, наконец, в методе наблюдателя вы делаете это, чтобы установить необходимые значения:
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());
}
Похоже, что этот вопрос не вызывает значительного интереса, но на случай, если кто-то столкнется с этой проблемой в будущем, вот лучшее решение, которое я смог определить. Magento получает данные из источника и устанавливает данные для целевого объекта с помощью getDataUsingMethod
/setDataUsingMethod
который пытается выполнить вызов "верблюжьего" метода на основе имени узла. Например:
<my_module_convert_thing>
<property_a>
<to_another>*</to_another>
</property_a>
</my_module_convert_thing>
Попытается вызвать setPropertyA
и getPropertyA
для двух объектов. Если вместо этих вызовов делегировать getData
и setData
через Varien_Object::__call
существует определенный метод, его гибкости почти нет предела. Если необходимо задать два свойства из одного источника, будет работать следующий набор полей XML:
<my_module_convert_thing>
<property_a>
<to_another>properties_ab</to_another>
</property_a>
</my_module_convert_thing>
И если метод setPropertiesAb
определен в классе another
, этот метод может обрабатывать настройку как property_a
, так и property_b
, используя значение property_a
из thing
.
Было бы неплохо, если бы существовало лучшее решение, которое не требовало бы существенного расширения каждого класса, которому нужен этот индивидуальный подход, но это мой лучший способ решить проблему!