لا يتم تحميل الكتلة المثقوبة داخل الصفحة الكاملة المخزنة مؤقتًا للصفحة
-
13-12-2019 - |
سؤال
في البداية، عندما يتم مسح ذاكرة التخزين المؤقت وأزور إحدى الصفحات، يتم تحميل الكتلة والقالب المقابل بشكل مثالي.وبعد ذلك، عندما أقوم بزيارة هذه الصفحة مرة أخرى، لا يتم تحميل الكتلة على الإطلاق.هل أفتقد شيئًا ما في عملية ثقب الثقب هذه؟
الحاوية النموذجية:
class Myname_Page_Model_Container_Ajaxcart extends Enterprise_PageCache_Model_Container_Abstract
{
protected function _renderBlock()
{
$blockClass = $this->_placeholder->getAttribute('block');
$template = $this->_placeholder->getAttribute('template');
$block = new $blockClass;
$block->setTemplate($template);
return $block->toHtml();
}
}
ذاكرة التخزين المؤقت.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<placeholders>
<ajax_cart>
<block>page/html_ajaxcart</block>
<name>ajaxCart</name>
<placeholder>AJAX_CART</placeholder>
<container>Myname_Page_Model_Container_Ajaxcart</container>
<cache_lifetime></cache_lifetime>
</ajax_cart>
</placeholders>
</config>
تخطيط.xml:
<block type="page/html_ajaxcart" name="ajaxCart" as="ajaxCart" template="page/html/ajaxCart.phtml"/>
قالب.phtml:
<?php echo $this->getChildHtml('ajaxCart');?>
ملف التكوين:
<?xml version="1.0"?>
<config>
<modules>
<Myname_Page>
<version>0.1.0</version>
</Myname_Page>
</modules>
<frontend>
<routers>
<page>
<use>standard</use>
<args>
<module>Myname_Page</module>
<frontName>page</frontName>
</args>
</page>
</routers>
</frontend>
<global>
<blocks>
<page>
<rewrite>
<html_ajaxcart>Myname_Page_Block_Html_Ajaxcart</html_ajaxcart>
</rewrite>
</page>
<myname_page>
<class>Myname_Page_Block</class>
</myname_page>
</blocks>
</global>
</config>
ملف الكتلة:
<?php
class Myname_Page_Block_Html_Ajaxcart extends Mage_Core_Block_Template
{
// sort quote by item date of addition
public function sortByUpdatedAt($quote)
{
// initialize item collection
$items = array();
$collection = $quote->getAllVisibleItems();
// get updated at date for each item
foreach ($collection as $item) {
if (!$item->isDeleted()) {
array_push($items, $item->getData('updated_at'));
}
}
// sort and keep key association
asort($items);
// reverse order and keep key association
$k = array_reverse(array_keys($items));
$reversed = array_reverse(array_values($items));
$items = array_combine($k, $reversed);
// collection is sorted
$collection = $this->finishSort($items, $collection);
return $collection;
}
// sort collection by established ordering
protected function finishSort($items, $collection)
{
$sortedCollection = array();
// collection will reflect sorted item array
foreach ($items as $key => $value) {
// get new order by established key value order
array_push($sortedCollection, $collection[$key]);
}
return $sortedCollection;
}
public function getProductPrice($product)
{
// return formatted special price
if ($product->getSpecialPrice() != null && Mage::app()->getLocale()->isStoreDateInInterval(Mage::app()->getStore(), $product->getSpecialFromdate(), $product->getSpecialToDate())) {
$price = $product->getSpecialPrice();
} else {
$price = $product->getPrice();
}
// return formatted price
return Mage::helper('core')->formatPrice($price, true);
}
}
المحلول
أعتقد أنك في عداد المفقودين تنفيذ _getCacheId
& _saveCache
تم تعريف ذاكرة التخزين المؤقت بالفعل إذا لم يتم توفير أي منها ولكنها ذات اصطلاح تسمية مجهول.حدد معرفًا للكتلة وقم بالإشارة إليه في ملفك _getCacheId
أضف
etc/cache.xml
ملف مع أ<config>
الجذر إلى الوحدة النمطية الخاصة بك.(يرىEnterprise/PageCache/etc/cache.xml
).اختر فريدة من نوعها [عنصر نائب]اسم.ال
placeholders/[placeholder]/block
يجب أن تتطابق قيمة العقدة معclass-id
للكتلة الديناميكية المخصصة الخاصة بك، على سبيل المثال.mymodule/customال
placeholders/[placeholder]/container
قيمة العقدة هي الفئة لإنشاء المحتوى ديناميكيًا ومعالجة التخزين المؤقت لمستوى الكتلةال
placeholders/[placeholder]/placeholder
قيمة العقدة هي سلسلة فريدة من نوعها لتمييز الأجزاء الديناميكية في الصفحة المخزنة مؤقتًا
placeholders/[placeholder]/cache_lifetime
اعتاد أن يتم تجاهله ، ولكن ليس بعد الآن.بالنسبة للمحالات القديمة ، حدد مدى عمر ذاكرة التخزين المؤقت للكتلة في الحاوية_saveCache()
طريقة بدلا من ذلك.تنفيذ فئة الحاوية وتمتد
Enterprise_PageCache_Model_Container_Abstract
.يستخدم_renderBlock()
لإرجاع المحتوى الديناميكي.تنفيذ
_getCacheId()
طريقة لإرجاع سلسلة فريدة.استخدم قيم ملفات تعريف الارتباط بدلاً من معرفات النموذج (التكلفة المنخفضة).ينفذ
_saveCache()
ببساطة للعودة ، أو تمرير قيمة حياة ذاكرة التخزين المؤقت إلى طريقة الأصل.Voila، تم الانتهاء من الكتلة الديناميكية.ملاحظة أخيرة:أنت لا احصل على تطبيق Magento الكامل تحت تصرفك عندما
_renderBlock()
يسمى.كن محافظًا قدر الإمكان.
نصائح أخرى
أعتقد أنك قد غاب عن <template>
علامة في cache.xml
ملف.لكنني لست متأكدا من هذا.
<?xml version="1.0" encoding="UTF-8"?>
<config>
<placeholders>
<ajax_cart>
<block>page/html_ajaxcart</block>
<name>ajaxCart</name>
<placeholder>AJAX_CART</placeholder>
<template>page/html/ajaxCart.phtml</template> <!-- Your template file -->
<container>Myname_Page_Model_Container_Ajaxcart</container>
<cache_lifetime>false</cache_lifetime>
</ajax_cart>
</placeholders>
</config>
جرب الكود أعلاه قد يعمل.