Der gelochte Block wird nicht in die ganzseitige zwischengespeicherte Seite geladen
-
13-12-2019 - |
Frage
Wenn der Cache geleert wird und ich eine Seite besuche, werden der Block und die entsprechende Vorlage zunächst einwandfrei geladen.Wenn ich dann diese Seite erneut besuche, wird der Block überhaupt nicht geladen.Übersehe ich etwas bei diesem Lochstanzvorgang?
Modellcontainer:
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();
}
}
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>
<container>Myname_Page_Model_Container_Ajaxcart</container>
<cache_lifetime></cache_lifetime>
</ajax_cart>
</placeholders>
</config>
layout.xml:
<block type="page/html_ajaxcart" name="ajaxCart" as="ajaxCart" template="page/html/ajaxCart.phtml"/>
template.phtml:
<?php echo $this->getChildHtml('ajaxCart');?>
Konfigurationsdatei:
<?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>
Blockdatei:
<?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);
}
}
Lösung
Ich glaube, Ihnen fehlt eine Implementierung von _getCacheId
& _saveCache
Eine Cache-ID ist bereits definiert, wenn keine angegeben wird, es handelt sich jedoch um eine anonyme Namenskonvention.Definieren Sie eine ID für den Block und verweisen Sie darauf in Ihrem _getCacheId
Füge hinzu ein
etc/cache.xml
Datei mit a<config>
rooten Sie Ihr Modul.(sehenEnterprise/PageCache/etc/cache.xml
).Wählen Sie ein Unikat [Platzhalter]Name.Der
placeholders/[placeholder]/block
Der Knotenwert muss mit dem übereinstimmenclass-id
Ihres benutzerdefinierten dynamischen Blocks, z.B.mymodule/customDer
placeholders/[placeholder]/container
Der Knotenwert ist die Klasse, um den Inhalt dynamisch zu generieren und Blockpegel -Caching zu verarbeitenDer
placeholders/[placeholder]/placeholder
Der Knotenwert ist eine eindeutige Zeichenfolge, die die dynamischen Teile auf der zwischengespeicherten Seite markiert
placeholders/[placeholder]/cache_lifetime
Ich werde ignoriert, aber nicht mehr.Für ältere Fälle geben Sie eine Block -Cache -Lebensdauer im Container an_saveCache()
Methode statt.Implementieren Sie die Containerklasse und erweitern Sie sie
Enterprise_PageCache_Model_Container_Abstract
.Verwenden_renderBlock()
um den dynamischen Inhalt zurückzugeben.Implementieren Sie die
_getCacheId()
Methode, um eine eindeutige Zeichenfolge zurückzugeben.Verwenden Sie Cookie -Werte anstelle von Modell -IDs (niedrigere Kosten).Implementieren
_saveCache()
einfach zurückzugeben oder einen Cache -Lebensdauerwert an die übergeordnete Methode zu übergeben.Voila, dynamischer Block fertig.Eine letzte Anmerkung:Du NICHT Haben Sie die vollständige Magento -App zur Verfügung, wenn
_renderBlock()
wird genannt.Seien Sie so konservativ wie möglich.
Andere Tipps
Ich denke, Sie haben das verpasst <template>
Tag in der cache.xml
Datei.Aber ich bin mir da nicht sicher.
<?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>
Probieren Sie den obigen Code aus, es könnte funktionieren.