الوصول إلى تكلفة الشحن في عربة Magento و/أو الخروج

StackOverflow https://stackoverflow.com/questions/3848705

  •  27-09-2019
  •  | 
  •  

سؤال

يرجى ملاحظة أن هذا السؤال يتعلق بتكلفة الشحن ، وليس السعر. هناك اختلاف مهم ، أي ما يتقاضى $$ طريقة الشحن لمالك المتجر ، على عكس ما يتم دفع رسوم $$ من قبل العميل.

ال 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');

أنت تتصل بشكل أساسي بنفس الكود كما كان من قبل ، ولكن تخزين النتائج بعيدًا في مكان ما للوصول لاحقًا. حول آمنة مثل التجاوز يمكن الحصول عليها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top