2012-09-13 53 views
6

Ho provato i seguenti due metodi in catalogo/navigazione/vert_nav.phtml per aggiungere o sopprimere contenuti specifici per la home page:Rileva home page in Magento .phtml che funzionerà con la cache BLOCK_HTML abilitato

if($this->getUrl('') == $this->getUrl('*/*/*', array('_current'=>true, '_use_rewrite'=>true))): 

o

if(
Mage::getSingleton('cms/page')->getIdentifier() == 'home' && 
Mage::app()->getFrontController()->getRequest()->getRouteName() == 'cms' 
) : 

Entrambi funzionano bene, però quando la cache BLOCK_HTML è accesa, funziona in un primo momento, poi dopo un contenuto, mentre la home page inizia a mostrare che è destinato solo per le altre pagine (dopo una clausola else che uso più bassa giù). Quando spengo BLOCK_HTML, si comporta come previsto.

È interessante notare che ho utilizzato lo stesso codice (il primo) in page/html/head.phtml (per javascript/css specifico per home page) e in page/html/header.phtml (per un banner di intestazione che dovrebbe apparire solo sulla home page) e funzionano bene anche se BLOCK_HTML è attivo.

(Magento 1.4.1.1)

risposta

4

La risposta sopra è la soluzione migliore.

si può semplicemente copiare app/code/core/Mage/Catalogo/blocchi/Nagivation.php

a:

app/code/local/Mage/Catalogo/blocchi/Nagivation.php

e quindi modificare il metodo getCacheKeyInfo() come descritto sopra.

/** 
* Get Key pieces for caching block content 
* 
* @return array 
*/ 
public function getCacheKeyInfo() 
{ 
    $shortCacheId = array(
     'CATALOG_NAVIGATION', 
     Mage::app()->getStore()->getId(), 
     Mage::getDesign()->getPackageName(), 
     Mage::getDesign()->getTheme('template'), 
     Mage::getSingleton('customer/session')->getCustomerGroupId(), 
     'template' => $this->getTemplate(), 
     'name' => $this->getNameInLayout(), 
     $this->getCurrenCategoryKey(), 
     // Your logic to make home/none home have different cache keys 
     Mage::getSingleton('cms/page')->getIdentifier() == 'home' ? '1' : '0' 
    ); 
    $cacheId = $shortCacheId; 

    $shortCacheId = array_values($shortCacheId); 
    $shortCacheId = implode('|', $shortCacheId); 
    $shortCacheId = md5($shortCacheId); 

    $cacheId['category_path'] = $this->getCurrenCategoryKey(); 
    $cacheId['short_cache_id'] = $shortCacheId; 

    return $cacheId; 
} 

questo renderà la cache chiave diversa per le pagine home page/nessuno-Homepage, che sarà in cache due copie, piuttosto che la memorizzazione nella cache di una singola copia modello per l'uso su tutte le pagine.

+0

grande aggiunta al mio post, c'è solo un piccolo refuso in questa riga: 'Mage :: getSingleton ('cms/page') -> getIdentifier() == 'home'? '1', '0'' - dovrebbe essere 'Mage :: getSingleton (' cms/page ') -> getIdentifier() ==' home '? '1': '0'' per funzionare correttamente –

+0

grazie per quello, è stato digitato direttamente nel browser senza test :) – Andrew

4

Qui ci sono fonti che ci si vuole leggere di cache di blocco HTML:

  1. magento forum
  2. some blog
  3. inchoo blog

E ' sarebbe meglio per le prestazioni non disabilitare completamente il blocco, b piuttosto specificare la chiave di cache in modo intelligente. Quindi ecco cosa dovresti fare:

  1. Prima di tutto, specifica un blocco personalizzato per il tuo file .phtml. Se non sai cosa sia Block, o come assegnare un blocco a un file template, here's il riferimento al blog di Alan Storm.
  2. In secondo luogo - si dovrà aggiungere il codice accanto a un costruttore di blocco:

    $this->addData(array(
        'cache_lifetime' => 3600, 
        'cache_tags'  => array(Mage_Cms_Model_Block::CACHE_TAG), 
        'cache_key'  => $this->getCacheKey(), 
    )); 
    

    Come vedete, ho usato qui il metodo getCacheKey dalla classe astratta Mage_Core_Block_Abstract.

  3. Ora è necessario assicurarsi che cache_key funzioni per la logica. Lo Mage_Core_Block_Abstract::getCacheKey utilizza un altro metodo, che dovrebbe effettivamente specificare i valori univoci per il nostro blocco: getCacheKeyInfo. È necessario ridefinire utilizzando la logica:

    public function getCacheKeyInfo() 
    { 
        $isHomepage = 0; 
        if (Mage::getSingleton('cms/page')->getIdentifier() == 'home') { 
         $isHomepage = 1; 
        } 
        return array(
         $this->getNameInLayout(), 
         $isHomepage, 
        ); 
    } 
    

    Ora si può essere certi che chiave di cache per la pagina sarà diverso da chiave di cache a tutti gli altri le pagine, e la cache tornerà informazioni valide.

+0

Ottima risposta, grazie. Alla fine ho scelto la risposta di Andrew perché questa era una soluzione rapida che funzionava con un modello che non avevo originariamente creato. – rwired

2

Usiamo

<!-- SNH CUSTOM --> 

    $route = Mage::app()->getFrontController()->getRequest()->getRouteName(); 

    $action = Mage::app()->getFrontController()->getRequest()->getActionName(); 

if($route == 'cms' && $action == 'index'): 

    <div class="grid_12"> 

     echo $this->getChildHtml('shopper_footer_partners'); 

    </div> 

endif; 
0

davvero il modo migliore è quello di:

1 Aggiornare il layout di XML (local.xml o tema custom.xml)

<!-- CUSTOM: ADD NEW FOOTER BLOCK AT BOTTOM FOR PARTNERS --> 
<cms_index_index> 
    <reference name="footer"> 
    <block type="cms/block" name="footer_block_extra"> 
     <action method="setBlockId"><block_id>footer_block_extra</block_id></action> 
    </block> 
    </reference> 
</cms_index_index> 

e fase 2 add questo codice dove vuoi il blocco nel tuo template phtml (spesso /page/html/footer.phtml)

<!-- SNH CUSTOM --> 
<div class="grid_12"> 
    <?php echo $this->getBlockHtml('footer_block_extra'); ?> 
</div> 

e il passaggio 3 creano un nuovo blocco CMS nel back-end con l'ID "footer_block_extra" ... e aggiungi i tuoi contenuti.

2

Solo per aggiungere a queste risposte suggerendo di verificare se l'identificatore di pagina corrente è uguale a "casa".

Sarebbe sicuramente più sicuro confrontarlo con Mage::getStoreConfig('web/default/cms_home_page').

Problemi correlati