الوصول إلى تكلفة الشحن في عربة Magento و/أو الخروج
سؤال
يرجى ملاحظة أن هذا السؤال يتعلق بتكلفة الشحن ، وليس السعر. هناك اختلاف مهم ، أي ما يتقاضى $$ طريقة الشحن لمالك المتجر ، على عكس ما يتم دفع رسوم $$ من قبل العميل.
ال shipping_tablerate
يتضمن جدول قاعدة البيانات أ cost
الحقل ، الذي يملأ في Mage_Shipping_Model_Carrier_Tablerate
كائن خلال collectRates
طريقة. ومع ذلك ، لا يمكن الوصول إلى هذا الحقل في أي مكان آخر في المكدس ، على سبيل المثال من عنوان الاقتباس.
أحتاج إلى الوصول إلى هذه القيمة على صفحة العربة ، ولا يمكنني العثور على أي حال لتحقيقها ، بخلاف إنشاء مثيل Mage_Shipping_Model_Rate_Request
اعترض على الانتقال إلى collectRates()
. يبدو ذلك غير فعال بشكل غير ضروري نظرًا لأن البيانات تم تحميلها بالفعل من الجدول ويجب الوصول إليها.
لقد حاولت مراقبة <shipping_carrier_tablerate_load/>
الحدث ، ولكن يبدو أن _load
لم يتم إلقاء الحدث لهذا النموذج.
لقد حاولت أيضًا الوصول إلى المعدل من الاقتباس:
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$address = $quote->getShippingAddress();
$rate = $address->getShippingRateByCode($code ='tablerate_bestway');
أستطيع أن أرى المحسوبة price
, ، ومع ذلك cost
غير موجود في هذا النموذج.
في هذه المرحلة ، نفاد الأفكار. أي اقتراحات تلقيت بامتنان!
شكرا ، جوناثان
المحلول
أولاً ، حاول ألا تقلق كثيرًا بشأن الأداء حتى ترى عنق الزجاجة الفعلي في مكان ما. إيمان في العديد من أنظمة التخزين المؤقت. بعبارة أكثر بسخرية ، فإن Magento بالفعل قليلاً من وحش SQL ، لذلك إذا كان لديك متجر تم ضبطه جيدًا ، فلن يضر بعض الاستعلامات الإضافية.
ثانياً ، قد لا تكون ضربات قاعدة البيانات مشكلة. ال shipping/rate_request
لا يبدو أن النموذج مدعوم بقاعدة بيانات. إذا نظرت إلى المرتين المستخدمة في الكود الأساسي
Mage_Shipping_Model_Shipping::collectRatesByAddress
Mage_Sales_Model_Quote_Address::requestShippingRates
يمكنك ان ترا ال shipping/rate_request
يتم إنشاء إنشاء نموذج ، ثم ملء من الحقول المحملة بالفعل. بالإضافة إلى ذلك ، جميع النماذج المستخدمة في Mage_Shipping_Model_Carrier_Tablerate::collectRates
لا تقم بتحميل أي شيء من قاعدة بيانات ، بل تقوم فقط بحسابات.
إنه لأمر مثير للإعجاب أنك ترغب في بناء شيء ما هو أداء قدر الإمكان في أول رحلة ، ولكن هناك الكثير من التفاعلات المعقدة في نظام OO الحديث لمعرفة أكثر الطرق أداءً بطريقة سحرية للقيام بشيء ما. افعل ما تحتاجه للحصول على المعلومات التي تحتاجها ، والتعامل مع ضبط الأداء (إذا لزم الأمر) أثناء إصدار الصيانة (أو إذا لم تكن محظوظًا بما يكفي لإصدار الصيانة ، عندما يتذمر شخص لديه الطاقة في مؤسستك حول السرعة في مكان ما )
ثالثًا ، عندما لا يوفر النظام إمكانية الوصول إلى شيء ما تحتاجه ، فهذا هو نظام تجاوز الفصل. شيء مثل
class Package_Module_Model_Carriertablerate extends
Mage_Shipping_Model_Carrier_Tablerate
{
public function getRate(Mage_Shipping_Model_Rate_Request $request)
{
$rate = parent::getRate($request);
Mage::register('package_module_carriertablerates', $rate);
return $rate;
}
}
...
//later, retrieve the rate
$rates = Mage::registry('package_module_carriertablerates');
أنت تتصل بشكل أساسي بنفس الكود كما كان من قبل ، ولكن تخزين النتائج بعيدًا في مكان ما للوصول لاحقًا. حول آمنة مثل التجاوز يمكن الحصول عليها.