`copyFieldset` одно исходное свойство для нескольких целевых свойств

magento.stackexchange https://magento.stackexchange.com//questions/70556

  •  13-12-2019
  •  | 
  •  

Вопрос

Мне поручено преобразовать кавычки в пользовательский тип данных и использовать 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.

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

Спасибо

Это было полезно?

Решение

Другим решением было бы использовать событие, которое отправляется, когда копироватьFieldset функция называется:

$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
    'target' => $target,
    'source' => $source,
    'root'   => $root
));

Как вы можете видеть, имя события является динамическим, поэтому в этом случае, если вы позвоните copyFieldset('other_thing_convert_quote', 'to_varien_object', ...) название события будет 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top