كتل ذاكرة التخزين المؤقت التي تحتوي على form_key (أيالمحتوى الديناميكي)

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

سؤال

أتساءل عما إذا كانت هناك أفضل الممارسات لاستخدام التخزين المؤقت للكتل للكتل التي تحتوي على نموذج بامتداد form_key الإدخال (رمز CSRF).

أنا لا أتحدث عن ثقب ذاكرة التخزين المؤقت لصفحة كاملة، ولكن عن ذاكرة التخزين المؤقت القياسية للكتلة من Magento CE.

تحدث بشكل عام:كيف يمكنك تخزين كتلة تحتوي على جزء صغير من المحتوى الديناميكي مؤقتًا، أو كتلة فرعية لم يتم تخزينها مؤقتًا؟

هل كانت مفيدة؟

المحلول

هذه هي الطريقة التي قمت بحلها في النهاية، أضف الطرق التالية إلى الكتلة المعنية:

const FORM_KEY_PLACEHOLDER = '{{FORM_KEY}}';

protected function _toHtml()
{
    return $this->_insertFormKeyPlaceholder(parent::_toHtml());
}

protected function _afterToHtml($html)
{
    return $this->_restoreFormKey(parent::_afterToHtml($html));
}

protected function _insertFormKeyPlaceholder($html)
{
    /** @var $session Mage_Core_Model_Session */
    $session = Mage::getSingleton('core/session');
    return str_replace($session->getFormKey(), self::FORM_KEY_PLACEHOLDER, $html);
}

protected function _restoreFormKey($html)
{
    /** @var $session Mage_Core_Model_Session */
    $session = Mage::getSingleton('core/session');
    return str_replace(self::FORM_KEY_PLACEHOLDER, $session->getFormKey(), $html);
}

توضيح:

أقوم باستبدال مفتاح النموذج بعنصر نائب قبل تخزين الكتلة المعروضة مؤقتًا واستبدال العنصر النائب بمفتاح النموذج الحالي مرة أخرى بعد تحميل الكتلة من ذاكرة التخزين المؤقت.

أنا أستعمل _toHtml لإدراج العنصر النائب لأنه تتم كتابة القيمة المرجعة لهذه الطريقة على الفور في ذاكرة التخزين المؤقت.

أنا أستعمل _afterToHtml لاستعادة مفتاح النموذج لأنه يتم استدعاء هذه الطريقة فورًا بعد تحميل المحتوى من ذاكرة التخزين المؤقت (أو بعد حفظه في ذاكرة التخزين المؤقت إذا لم يتم تخزينه مؤقتًا بعد).يتم ضمان استدعاء هذه الطريقة بغض النظر عن ذاكرة التخزين المؤقت للكتلة.


مزيد من الأفكار

لا يبدو أن الحل العام موجود حتى الآن، ولكن الطريقة الموضحة أعلاه تعمل مع أي محتوى ديناميكي وإذا كنت في حاجة إليها في أكثر من كتلة واحدة أو مع محتوى مختلف، فيجب أن يكون من السهل استخراج منطق العنصر النائب إلى نموذج منفصل.

لاستبدال العناصر النائبة، يمكنك أيضًا استخدام core_block_abstract_to_html_after حدث، ولكن لسوء الحظ لا يوجد حدث قبل أن يتم تخزين الكتلة المقدمة في ذاكرة التخزين المؤقت، لذا فإن حل "المراقب فقط" غير ممكن دون إدخال أحداث جديدة في المركز.

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