Domanda

Supponiamo che abbiamo cambiato un sacco di funzionalità per il modulo (modelli, layout, CSS) e ci accingiamo a spostare questi cambiamenti al sito di produzione, ma un sacco di clienti hanno cache CSS nei loro browser. Così qui è una domanda. Come forzare il colore di client della cache CSS e rinominare file evitano (styles.css -> styles-v2.css). C'è un modo logico, ma non funziona in Magento, perché controlla file esistente (dal modo in cui questo metodo funziona per i file JS), vedere di seguito:

<action method="addCss">
    <stylesheet>css/styles.css?1</stylesheet>
</action>  

Tutte le idee?

È stato utile?

Soluzione

Un modo per affrontare questo sta permettendo la fusione di CSS. Poi si può solo cancellare la cache e un nuovo file risultante dalla concentrazione sarebbe creata con un nuovo nome di file.

System -> Configuration -> Developer -> CSS settings -> Merge CSS Files

Per quanto ne so, il codice hash dei soggiorni di file CSS unite lo stesso anche se i file sottostanti modificati - solo se i nuovi file vengono aggiunti alla l'insieme di file uniti, l'hash cambia. - @alex

Un altro modo di affrontare questo è invece di utilizzare il layout.xml,

basta metterli nel vostro page/html/head.phtml

O creare un blocco che contiene un tag <style> con numero di versione e metterlo nel XML nella tua testa in modo da poter avere caricare solo su pagine specifiche e ancora attaccata ad utilizzare i layout XML.

Altri suggerimenti

V'è un'estensione gratuita su GitHub 'Magento cachebuster' che fa esattamente questo. Si ri

https://github.com/gknoppe-guidance/magento-cachebuster

Il modulo fornisce busting della cache modificando automaticamente l'URI creato da Magento per> file statici aggiungendo il timestamp del file al nome del file:

Prima: http://www.example.com/js/varien/js.js Dopo: http://www.example.com/js/varien/js.1324429472.js

Io uso il mio proprio interno Speedster avanzato per questo. Ma il principio di base è che il nome del file CSS e JS unite include il timestamp dell'ultimo file modificato - vedi Mage_Core_Model_Design_Package::getMergedCssUrl(). Ogni volta che si modifica una delle css file un nuovo nome di file viene creato causando browser per richiedere il nuovo file invece di riutilizzare la versione in cache. Dal momento che il blocco di testa potrebbe essere memorizzato nella cache è necessario un aggiornamento della cache di Magento.

Inoltre ho implementato un fenomeno cache per file CSS. Il modo migliore credo sia di estendere Mage_Page_Block_Html_Head e sopra cavalcare la funzione qui sotto e update $ skinItems array con le modifiche desiderate.

protected function &_prepareStaticAndSkinElements($format, array $staticItems, array $skinItems, $mergeCallback = null)
{
    $designPackage = Mage::getDesign();
    //$skinItems: contains all css
    foreach ($skinItems as $params => $rows) {
        foreach ($rows as $key=>$name) {
            $file = $designPackage->getFilename($name, array('_type' => 'skin'));
            $skinItems[$params][$key] = $name . "?fmt=" . filemtime($file);
        }
    }
    return parent::_prepareStaticAndSkinElements($format, $staticItems, $skinItems, $mergeCallback);

}

Si è l'ispirazione da qui. Fonte

V'è un semplice ma ingombrante soluzione che non richiede alcun plugin e utilizza solo costruito in capacità di Magento -. Utile se si ha solo a che fare in fretta su un sito esistente senza voler rischiare di installare ulteriori codice

L'idea è che si può utilizzare il sistema CSS fusione per generare un nome di file di cache busting.

Come il nome del file CSS fusione è un hash di tutti i file che vengono uniti insieme è sufficiente aggiungere un extra file vuoto css nel tema con un indicatore di data per un nome.

  1. Attiva file Merge CSS in Configurazione> Avanzate> Developer
  2. Nel tuo layout a tema trovare dove si aggiungono file CSS per la testa (in genere page.xml) e aggiungere un foglio di stile in più, lo chiamano tutto quello che vuoi fino a quando il nome è univoco per esempio <action method="addCss"><stylesheet>css/cachebust_091014.css</stylesheet></action>
  3. Nella tua pelle CSS cartella di creare un nuovo file css con quel nome, per il contenuto del file ho appena messo un commento che dice ciò che il file è per

Ora spinta che dal vivo e svuotare la cache di Magento, il file css unito ora avrà un nome diverso e il vostro cache verrà sballato!

E 'ingombrante, come ogni volta che si desidera busto la cache è necessario modificare che il nome del file, ma richiede altro che costruito nel funzionalità di Magento quindi è utile se ci si trova bloccati e hanno bisogno di una soluzione rapida!

=> Invece di usare questo codice:

<action method="addCss">
    <stylesheet>css/styles.css?1</stylesheet>
</action>

=> Prova ad usare questo codice:

<reference name="head">
    <block type="core/text" name="foocss">
        <action method="setText">
            <css><![CDATA[<link rel="stylesheet" type="text/css" href="foo.css?1" media="all" />]]></css>
        </action>
    </block>
</reference>

Ma non è molto bello ...

ho trovato un modulo che aggiungere una stringa di query per la fine di tutti i CSS e JS nei layout xml. La stringa di query è configurabile da admin.

https://github.com/mklooss/Loewenstark_Head

L'idea di base è quella di ignorare _prepareStaticAndSkinElements per includere una stringa di query, come fatto nel modulo, illustrato di seguito.

protected function &_prepareStaticAndSkinElements($format, array $staticItems, array $skinItems, $mergeCallback = null)
{
    $version = Mage::getStoreConfig("design/head/meta_version_tag");
    $format = sprintf($format, "%s?v{$version}", "%s");
    return parent::_prepareStaticAndSkinElements($format, $staticItems, $skinItems, $mergeCallback);
}

Se ho capito la soluzione proposta nella sua interrogazione, è possibile farlo con un leggero mod per un file core ( in realtà non modifica il file core ):

Mage / Pagina / blocchi / Html / head.php

?

aggiungere qualcosa di simile v = 1 alla linea 198 in modo che tutti i file css hanno questo aggiunto:

$html .= $this->_prepareStaticAndSkinElements('<link rel="stylesheet" type="text/css" href="%s?v=1"%s />' . "\n",

Credo Fooman Speedster avanzata ( http: //www.magentocommerce. com / magento-connect / Fooman-speedsteradvanced-4030.html ) potrebbe essere una soluzione:

"Completamente automatizzato una volta installato, con versioning automatico quando Javascript / file CSS vengono aggiornati"

Ho costruito un modulo gratuito per questa:

http://www.magentocommerce.com/magento-connect/ frontend-flush-2048.html

Per favore fatemi sapere se non funziona come previsto, ma ho costruito in modo che i js combinati ei file css avranno un hash diverso se il contenuto di uno dei file concatenati è cambiato. Per impostazione predefinita Magento cambia solo l'hash del file combinato, se il nome del file di uno dei file inclusi è cambiata.

UPDATE

Ho anche fatto un modulo minify gratuito e semplice per quelli di voi che credono in esso.

http://www.magentocommerce.com/magento-connect/minify- 7771.html

C'è davvero un bel modulo creato da Fabrizio Branca che fa esattamente la cosa che ti interessa. Si chiama AOE_JsCSSTStamp . Cosa fa? Si aggiunge un timestamp sia CSS e JS risorse. Quando si filo CSS / cache JS poi i timestamp vengono ricreati.

Il browser vedrà nome diverso - è per questo che sarà riscaricare di nuovo le risorse ed essere servita con i più freschi uno invece di cache nel browser.

Basta modificare il metodo di getCssJsHtml in Mage_Page_Block_Html_Head , aggiungere una stringa come questo per un paio di giorni dopo il css modifica e questo è tutto ... funziona semplicemente

// static and skin css
        $html .= $this->_prepareStaticAndSkinElements('<link rel="stylesheet" type="text/css" href="%s?foo=WHAT_YOU_WANT_HERE"%s />' . "\n",
            empty($items['js_css']) ? [] : $items['js_css'],
            empty($items['skin_css']) ? [] : $items['skin_css'],
            $shouldMergeCss ? [Mage::getDesign(), 'getMergedCssUrl'] : null
        );

Alcuni anni più tardi, e non trovando alcuna estensione utile che non unire i file ed è semplice, ho creato la mia. L'idea principale è che dopo il lavaggio cache, aggiornerà il timestamp. Quindi, in altre parole -. Quando si cambia un po 'css/js, solo la cache a livello e timestamp saranno aggiornati

Il codice sorgente è qui -> https://github.com/archonkulis/ANSolutions_CssJsTimestamp

Opere su 1.9 + di versione. Non sei sicuro di anziani versioni, però, ma molto probabilmente dovrebbe funzionare così.

Fare una copia del vostro tema con un nuovo nome (themev2) -. La pelle e app / disegno, ecc Poi scegliere il nuovo tema in admin

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top