` كوبفيلدسيت ' خاصية مصدر واحد لخصائص الهدف متعددة
-
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
.
بالنظر إلى الكود ، لست متأكدا مما إذا كان ما أبحث عنه ممكنا ، ولكن آمل أن أكون مخطئا!
شكرا
المحلول
حل آخر هو استخدام الحدث الذي يتم إرساله عندما كوبفيلدسيت تسمى الوظيفة:
$eventName = sprintf('core_copy_fieldset_%s_%s', $fieldset, $aspect);
Mage::dispatchEvent($eventName, array(
'target' => $target,
'source' => $source,
'root' => $root
));
كما ترى ، يكون اسم الحدث ديناميكيا ، لذا في هذه الحالة إذا اتصلت إذا كنت ترغب في الحصول على معلومات حول هذا الموضوع ، يرجى الاتصال بنا للحصول على معلومات حول هذا الموضوع ...) سيكون اسم الحدث كوري_كوبي_فيلدس_آخرها_تحويل_كوتي_إلى_فارين_كائن وهذا هو ما كنت وضعت في تكوين الوحدة النمطية الخاصة بك.شمل:
<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());
}
نصائح أخرى
لا يبدو أن هناك اهتماما كبيرا بهذه المشكلة ، ولكن في حالة تعثر شخص ما في هذه المشكلة في المستقبل ، فإليك أفضل حل تمكنت من تحديده.الماجنتو يحصل على البيانات من المصدر ويحدد البيانات على الهدف باستخدام 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
هناك طريقة محددة ، لا يوجد حد تقريبا للمرونة.إذا كانت هناك حاجة إلى تعيين خاصيتين من مصدر واحد ، فستعمل مجموعة حقول شمل التالية:
<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
.
سيكون من الجيد إذا كان هناك حل أفضل لا يتطلب بشكل أساسي توسيع كل فئة تحتاج إلى هذا النهج المخصص ، ولكن هذا هو أفضل طعنة في حل المشكلة!