`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.

Глядя на код, я не уверен, что то, что я ищу, вообще возможно, но, надеюсь, я могу оказаться неправым!

Спасибо

Author: mpw, 2015-06-09

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());
}
 3
Author: Richard Klint, 2016-12-12 16:42:23

Похоже, что этот вопрос не вызывает значительного интереса, но на случай, если кто-то столкнется с этой проблемой в будущем, вот лучшее решение, которое я смог определить. 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.

Было бы неплохо, если бы существовало лучшее решение, которое не требовало бы существенного расширения каждого класса, которому нужен этот индивидуальный подход, но это мой лучший способ решить проблему!

 1
Author: mpw, 2015-07-01 21:45:38