لا يتم تحميل الكتلة المثقوبة داخل الصفحة الكاملة المخزنة مؤقتًا للصفحة

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

سؤال

في البداية، عندما يتم مسح ذاكرة التخزين المؤقت وأزور إحدى الصفحات، يتم تحميل الكتلة والقالب المقابل بشكل مثالي.وبعد ذلك، عندما أقوم بزيارة هذه الصفحة مرة أخرى، لا يتم تحميل الكتلة على الإطلاق.هل أفتقد شيئًا ما في عملية ثقب الثقب هذه؟

الحاوية النموذجية:

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>

جرب الكود أعلاه قد يعمل.

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