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);
    }
}
War es hilfreich?

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.(sehen Enterprise/PageCache/etc/cache.xml).Wählen Sie ein Unikat [Platzhalter]Name.

Der placeholders/[placeholder]/block Der Knotenwert muss mit dem übereinstimmen class-id Ihres benutzerdefinierten dynamischen Blocks, z.B.mymodule/custom

Der placeholders/[placeholder]/container Der Knotenwert ist die Klasse, um den Inhalt dynamisch zu generieren und Blockpegel -Caching zu verarbeiten

Der 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top