├── .gitignore ├── Block └── Buttons.php ├── Console └── Command │ ├── AllCommand.php │ ├── CommandAbstract.php │ ├── MediaCommand.php │ └── StaticCommand.php ├── Controller └── Adminhtml │ ├── Action │ ├── AllAction.php │ ├── MediaAction.php │ └── StaticAction.php │ └── ActionAbstract.php ├── LICENSE.txt ├── Model ├── CacheBust.php ├── Config.php └── Source │ ├── SourceAbstract.php │ └── YesNo.php ├── Plugin └── Signature.php ├── README.md ├── Update ├── UpdateBlock.php ├── UpdateFeed.php └── UpdateObserver.php ├── composer.json ├── etc ├── acl.xml ├── adminhtml │ ├── events.xml │ ├── routes.xml │ └── system.xml ├── config.xml ├── di.xml └── module.xml ├── registration.php └── view └── adminhtml ├── layout └── adminhtml_cache_index.xml └── templates └── buttons.phtml /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /Block/Buttons.php: -------------------------------------------------------------------------------- 1 | getUrl('Absolute_CacheBust/action/allAction'); 18 | } 19 | 20 | /** 21 | * @return string 22 | */ 23 | public function getCacheBustStaticUrl() 24 | { 25 | return $this->getUrl('Absolute_CacheBust/action/staticAction'); 26 | } 27 | 28 | /** 29 | * @return string 30 | */ 31 | public function getCacheBustMediaUrl() 32 | { 33 | return $this->getUrl('Absolute_CacheBust/action/mediaAction'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Console/Command/AllCommand.php: -------------------------------------------------------------------------------- 1 | setName(self::COMMAND_NAMESPACE . 'all') 22 | ->setDescription('Bust All URLs.'); 23 | } 24 | 25 | /** 26 | * @param InputInterface $input 27 | * @param OutputInterface $output 28 | * @return null 29 | */ 30 | protected function execute(InputInterface $input, OutputInterface $output) 31 | { 32 | $this->cacheBust->bustAll(); 33 | $output->writeln('All URLs cache busted successfully.'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Console/Command/CommandAbstract.php: -------------------------------------------------------------------------------- 1 | cacheBust = $cacheBust; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Console/Command/MediaCommand.php: -------------------------------------------------------------------------------- 1 | setName(self::COMMAND_NAMESPACE . 'media') 22 | ->setDescription('Bust Media URLs.'); 23 | } 24 | 25 | /** 26 | * @param InputInterface $input 27 | * @param OutputInterface $output 28 | * @return null 29 | */ 30 | protected function execute(InputInterface $input, OutputInterface $output) 31 | { 32 | $this->cacheBust->bustMedia(); 33 | $output->writeln('Media URLs cache busted successfully.'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Console/Command/StaticCommand.php: -------------------------------------------------------------------------------- 1 | setName(self::COMMAND_NAMESPACE . 'static') 22 | ->setDescription('Bust Static URLs.'); 23 | } 24 | 25 | /** 26 | * @param InputInterface $input 27 | * @param OutputInterface $output 28 | * @return null 29 | */ 30 | protected function execute(InputInterface $input, OutputInterface $output) 31 | { 32 | $this->cacheBust->bustStatic(); 33 | $output->writeln('Static URLs cache busted successfully.'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Controller/Adminhtml/Action/AllAction.php: -------------------------------------------------------------------------------- 1 | cacheBust->bustAll(); 20 | $this->messageManager->addSuccessMessage( 21 | __('All URLs have been Cache Busted.') 22 | ); 23 | } catch (\Exception $e) { 24 | $this->messageManager->addErrorMessage($e->getMessage()); 25 | } 26 | 27 | return $this->_redirect('adminhtml/cache/index'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Controller/Adminhtml/Action/MediaAction.php: -------------------------------------------------------------------------------- 1 | cacheBust->bustMedia(); 20 | $this->messageManager->addSuccessMessage( 21 | __('Media URLs have been Cache Busted.') 22 | ); 23 | } catch (\Exception $e) { 24 | $this->messageManager->addErrorMessage($e->getMessage()); 25 | } 26 | 27 | return $this->_redirect('adminhtml/cache/index'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Controller/Adminhtml/Action/StaticAction.php: -------------------------------------------------------------------------------- 1 | cacheBust->bustStatic(); 20 | $this->messageManager->addSuccessMessage( 21 | __('Static URLs have been Cache Busted.') 22 | ); 23 | } catch (\Exception $e) { 24 | $this->messageManager->addErrorMessage($e->getMessage()); 25 | } 26 | 27 | return $this->_redirect('adminhtml/cache/index'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Controller/Adminhtml/ActionAbstract.php: -------------------------------------------------------------------------------- 1 | cacheBust = $cacheBust; 27 | 28 | parent::__construct($context); 29 | } 30 | 31 | /** 32 | * @return boolean 33 | */ 34 | protected function _isAllowed() 35 | { 36 | return $this->_authorization->isAllowed('Absolute_CacheBust::action'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Find license information at https://abscom.co/terms 2 | -------------------------------------------------------------------------------- /Model/CacheBust.php: -------------------------------------------------------------------------------- 1 | config = $config; 39 | $this->cacheTypeList = $cacheTypeList; 40 | } 41 | 42 | /** 43 | * 44 | */ 45 | public function bustAll() 46 | { 47 | $this->bustStatic(false); 48 | $this->bustMedia(false); 49 | 50 | $this->clearCache(); 51 | } 52 | 53 | /** 54 | * @param bool $clearCache 55 | */ 56 | public function bustStatic($clearCache = true) 57 | { 58 | $this->updateValue(CacheBustConfig::XML_PATH_STATIC_VALUE); 59 | 60 | if ($clearCache) { 61 | $this->clearCache(); 62 | } 63 | } 64 | 65 | /** 66 | * @param bool $clearCache 67 | */ 68 | public function bustMedia($clearCache = true) 69 | { 70 | $this->updateValue(CacheBustConfig::XML_PATH_MEDIA_VALUE); 71 | 72 | if ($clearCache) { 73 | $this->clearCache(); 74 | } 75 | } 76 | 77 | /** 78 | * 79 | */ 80 | public function clearCache() 81 | { 82 | foreach ($this->cacheTypes as $_type) { 83 | $this->cacheTypeList->cleanType($_type); 84 | } 85 | } 86 | 87 | /** 88 | * @param string $valuePath 89 | */ 90 | private function updateValue($valuePath) 91 | { 92 | $this->config->saveConfig( 93 | $valuePath, 94 | date('YmdHis'), 95 | 'default', 96 | 0 97 | ); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /Model/Config.php: -------------------------------------------------------------------------------- 1 | scopeConfig = $scopeConfig; 33 | } 34 | 35 | /** 36 | * @return bool 37 | */ 38 | public function isStaticEnabled() 39 | { 40 | return $this->scopeConfig->getValue(self::XML_PATH_STATIC_ENABLED) == 1; 41 | } 42 | 43 | /** 44 | * @return string 45 | */ 46 | public function getStaticTemplate() 47 | { 48 | $template = trim($this->scopeConfig->getValue(self::XML_PATH_STATIC_TEMPLATE)); 49 | 50 | if (empty($template)) { 51 | $template = self::DEFAULT_TEMPLATE; 52 | } 53 | 54 | return $template; 55 | } 56 | 57 | /** 58 | * @return string 59 | */ 60 | public function getStaticValue() 61 | { 62 | $value = trim($this->scopeConfig->getValue(self::XML_PATH_STATIC_VALUE)); 63 | 64 | if (empty($value)) { 65 | $value = self::DEFAULT_VALUE; 66 | } 67 | 68 | return $value; 69 | } 70 | 71 | /** 72 | * @return bool 73 | */ 74 | public function isMediaEnabled() 75 | { 76 | return $this->scopeConfig->getValue(self::XML_PATH_MEDIA_ENABLED) == 1; 77 | } 78 | 79 | /** 80 | * @return string 81 | */ 82 | public function getMediaTemplate() 83 | { 84 | $template = trim($this->scopeConfig->getValue(self::XML_PATH_MEDIA_TEMPLATE)); 85 | 86 | if (empty($template)) { 87 | $template = self::DEFAULT_TEMPLATE; 88 | } 89 | 90 | return $template; 91 | } 92 | 93 | /** 94 | * @return string 95 | */ 96 | public function getMediaValue() 97 | { 98 | $value = trim($this->scopeConfig->getValue(self::XML_PATH_MEDIA_VALUE)); 99 | 100 | if (empty($value)) { 101 | $value = self::DEFAULT_VALUE; 102 | } 103 | 104 | return $value; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /Model/Source/SourceAbstract.php: -------------------------------------------------------------------------------- 1 | toArray($withEmpty) as $_value => $_label) { 24 | $optionArray[] = [ 25 | 'value' => $_value, 26 | 'label' => $_label, 27 | ]; 28 | } 29 | 30 | return $optionArray; 31 | } 32 | 33 | /** 34 | * @param bool $withEmpty 35 | * @return array 36 | */ 37 | public function toArray($withEmpty = false) 38 | { 39 | $data = []; 40 | 41 | if ($withEmpty) { 42 | $data[''] = __('All'); 43 | } 44 | 45 | foreach ($this->options as $_value => $_label) { 46 | $data[$_value] = __($_label); 47 | } 48 | 49 | return $data; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Model/Source/YesNo.php: -------------------------------------------------------------------------------- 1 | 'Yes', 16 | self::OPTION_NO => 'No', 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /Plugin/Signature.php: -------------------------------------------------------------------------------- 1 | config = $config; 24 | } 25 | 26 | /** 27 | * @param ScopeInterface $subject 28 | * @param string $baseUrl 29 | * @param string $type 30 | * @param null $secure 31 | * @return string 32 | */ 33 | public function afterGetBaseUrl( 34 | ScopeInterface $subject, 35 | $baseUrl, 36 | $type = UrlInterface::URL_TYPE_LINK, 37 | $secure = null 38 | ) { 39 | switch ($type) { 40 | case UrlInterface::URL_TYPE_STATIC: 41 | if ($this->config->isStaticEnabled()) { 42 | $value = $this->config->getStaticValue(); 43 | $template = $this->config->getStaticTemplate(); 44 | $baseUrl .= $this->renderSignature($template, $value); 45 | } 46 | break; 47 | 48 | case UrlInterface::URL_TYPE_MEDIA: 49 | if ($this->config->isMediaEnabled()) { 50 | $value = $this->config->getMediaValue(); 51 | $template = $this->config->getMediaTemplate(); 52 | $baseUrl .= $this->renderSignature($template, $value); 53 | } 54 | break; 55 | 56 | default: 57 | break; 58 | } 59 | 60 | return $baseUrl; 61 | } 62 | 63 | /** 64 | * @param string $template 65 | * @param string $value 66 | * @return string 67 | */ 68 | private function renderSignature($template, $value) 69 | { 70 | $signature = sprintf($template, $value); 71 | $signature = trim($signature, '/') . '/'; 72 | 73 | return $signature; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Absolute Cache Bust 2 | With Absolute Cache Bust for Magento 2 you can ensure your customers are viewing the latest version of your images, CSS and JavaScript files. 3 | This extension can be used with or without a CDN, and will also bust local versions of assets in your customers web browser cache. 4 | Find more information at https://abscom.co/cachebust. 5 | 6 | # Version Compatibility 7 | 8 | - For Magento 2.2.x and later please use version 3.x.x of this extension. 9 | - For earlier Magento versions, please use version 2.x.x of this extension. 10 | 11 | # Installation 12 | The best way to add the extension is via composer. 13 | 14 | ``` 15 | composer require absolute/magento2-cache-bust 16 | ``` 17 | 18 | Once the extension has been added, update Magento 2 in the normal fashion. 19 | 20 | ``` 21 | php bin/magento setup:upgrade 22 | ``` 23 | 24 | # Web Server Configuration 25 | Some web server configuration is required in order for requests to `yoursite.com/static/version12345/some/asset.js` to resolve correctly. 26 | The intention is for the web server to ignore the segment `/version12345/` and process the request as if it were not there. 27 | 28 | Add the following to the appropriate location in your web server configuration. 29 | 30 | ## Nginx 31 | For the static cache busting, Magento already has the following in the recommended nginx configuration: 32 | 33 | ``` 34 | location /static/ { 35 | ... 36 | 37 | location ~ ^/static/version { 38 | rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last; 39 | } 40 | 41 | ... 42 | ``` 43 | 44 | For the media cache busting, add the following to your nginx configuration: 45 | 46 | ``` 47 | location /media/ { 48 | ... 49 | 50 | location ~ ^/media/version { 51 | rewrite ^/media/(version\d*/)?(.*)$ /media/$2 last; 52 | } 53 | 54 | ... 55 | } 56 | ``` 57 | 58 | ## Apache 59 | For the static cache busting, Magento already has the following configuration in `pub/static/.htaccess`: 60 | 61 | ``` 62 | 63 | RewriteEngine On 64 | 65 | # Remove signature of the static files that is used to overcome the browser cache 66 | RewriteRule ^version.+?/(.+)$ $1 [L] 67 | 68 | RewriteCond %{REQUEST_FILENAME} !-f 69 | RewriteCond %{REQUEST_FILENAME} !-l 70 | 71 | RewriteRule .* ../static.php?resource=$0 [L] 72 | 73 | ``` 74 | 75 | For the media cache busting, update `pub/media/.htaccess` with the following: 76 | 77 | ``` 78 | 79 | 80 | ############################################ 81 | ## enable rewrites 82 | 83 | Options +FollowSymLinks 84 | RewriteEngine on 85 | 86 | ############################################ 87 | ## Absolute Cache Bust 88 | RewriteRule ^version.+?/(.+)$ $1 [L] 89 | 90 | ############################################ 91 | ## never rewrite for existing files 92 | RewriteCond %{REQUEST_FILENAME} !-f 93 | 94 | ############################################ 95 | ## rewrite everything else to index.php 96 | 97 | RewriteRule .* ../get.php [L] 98 | 99 | 100 | ``` 101 | 102 | # CORS 103 | Since Magento 2.2.x you will also need to configure your web server to allow CORS requests through, otherwise you may see errors like: 104 | 105 | - ... OPTIONS ... 405 () 106 | - Uncaught SyntaxError: Unexpected end of JSON input 107 | - Response for preflight has invalid HTTP status code 405 108 | - Request header field x-requested-with is not allowed 109 | - No 'Access-Control-Allow-Origin' header is present 110 | - Access has been blocked by CORS policy 111 | 112 | You can find out more about the required configuration here: 113 | https://absolutecommerce.co.uk/cors-in-magento-2 114 | 115 | # Usage 116 | Once installed and configured, there are various ways to bust your Magento 2 websites cached assets. 117 | 118 | ## Admin Panel Buttons 119 | In the Magento Admin Panel go to `System > Cache Management` and you will see a new section at the bottom called `Cache Busting`. 120 | Clicking these buttons will update the dynamic element `/version12345/` with a new value and then flush the appropriate Magento caches, so on their next visit your customers will download the assets afresh. 121 | 122 | ## Command Line Interface (CLI) 123 | In the Magento CLI tool you will see some new commands available, which can be used to automatically bust your cache during a deployment for example. 124 | 125 | ``` 126 | ./bin/magento absolute:cache-bust:all 127 | ./bin/magento absolute:cache-bust:static 128 | ./bin/magento absolute:cache-bust:media 129 | ``` 130 | 131 | # Help / Support 132 | Need help or custom development? Find us at https://absolutecommerce.co.uk. 133 | For terms and conditions and license information, please visit https://abscom.co/terms. 134 | -------------------------------------------------------------------------------- /Update/UpdateBlock.php: -------------------------------------------------------------------------------- 1 | loader = $loader; 36 | } 37 | 38 | /** 39 | * @param AbstractElement $element 40 | * @return string 41 | * @throws LocalizedException 42 | */ 43 | public function render(AbstractElement $element) 44 | { 45 | $name = $this->getName(); 46 | $version = $this->getVersion(); 47 | $extension = $this->getExtension(); 48 | $logoImageData = $this->getLogoImageData(); 49 | $supportLink = 'https://absolutecommerce.co.uk' 50 | . '?utm_source=' . self::UTM_SOURCE 51 | . '&utm_medium=' . self::UTM_MEDIUM 52 | . '&utm_campaign=' . $extension; 53 | 54 | $html = << 56 |

57 |

{$name} v{$version} from Absolute Commerce

58 |

Need help or custom development? Find us at https://absolutecommerce.co.uk

59 | 60 | EOF; 61 | 62 | return $html; 63 | } 64 | 65 | /** 66 | * @return string 67 | */ 68 | private function getName() 69 | { 70 | return str_replace('_', ' ', $this->getExtension()); 71 | } 72 | 73 | /** 74 | * @return string 75 | */ 76 | private function getExtension() 77 | { 78 | $namespaceParts = explode('\\', __NAMESPACE__); 79 | return $namespaceParts[0] . '_' . $namespaceParts[1]; 80 | } 81 | 82 | /** 83 | * @return string 84 | * @throws LocalizedException 85 | */ 86 | private function getVersion() 87 | { 88 | $modules = $this->loader->load(); 89 | $extension = $this->getExtension(); 90 | $version = isset($modules[$extension]['setup_version']) 91 | ? $modules[$extension]['setup_version'] 92 | : 'Unknown'; 93 | 94 | return $version; 95 | } 96 | 97 | /** 98 | * Base64 string version of the Absolute Commerce logo 99 | * 100 | * @return string 101 | */ 102 | private function getLogoImageData() 103 | { 104 | return 'data:image/png;base64,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'; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /Update/UpdateFeed.php: -------------------------------------------------------------------------------- 1 | _backendConfig->getValue(self::XML_FEED_ENABLED) != '1') { 24 | return $this; 25 | } 26 | 27 | return parent::checkUpdate(); 28 | } 29 | 30 | /** 31 | * @return bool|\SimpleXMLElement 32 | */ 33 | public function getFeedData() 34 | { 35 | $curl = $this->curlFactory->create(); 36 | $curl->setConfig( 37 | [ 38 | 'timeout' => self::FEED_TIMEOUT, 39 | 'referer' => $this->urlBuilder->getUrl(), 40 | 'useragent' => $this->productMetadata->getName() 41 | . '/' . $this->productMetadata->getVersion() 42 | . ' (' . $this->productMetadata->getEdition() . ')', 43 | ] 44 | ); 45 | $curl->addOption(CURLOPT_FOLLOWLOCATION, true); 46 | 47 | $curl->write(\Zend_Http_Client::GET, $this->getFeedUrl(), '1.0'); 48 | $data = $curl->read(); 49 | $curl->close(); 50 | 51 | if ($data === false) { 52 | return false; 53 | } 54 | 55 | $xmlStart = stripos($data, '_feedUrl === null) { 77 | $this->_feedUrl = $this->_backendConfig->getValue(self::XML_FEED_URL_PATH); 78 | } 79 | 80 | return $this->_feedUrl; 81 | } 82 | 83 | /** 84 | * @return int 85 | */ 86 | public function getLastUpdate() 87 | { 88 | return $this->_cacheManager->load(self::CACHE_KEY_LAST_CHECK); 89 | } 90 | 91 | /** 92 | * @return $this 93 | */ 94 | public function setLastUpdate() 95 | { 96 | $this->_cacheManager->save(time(), self::CACHE_KEY_LAST_CHECK); 97 | return $this; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /Update/UpdateObserver.php: -------------------------------------------------------------------------------- 1 | updateFeedFactory = $updateFeedFactory; 33 | $this->backendAuthSession = $backendAuthSession; 34 | } 35 | 36 | /** 37 | * @param Observer $observer 38 | */ 39 | public function execute(Observer $observer) 40 | { 41 | if ($this->backendAuthSession->isLoggedIn()) { 42 | /** @var UpdateFeed $feedModel */ 43 | $feedModel = $this->updateFeedFactory->create(); 44 | $feedModel->checkUpdate(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "absolute/magento2-cache-bust", 3 | "description": "Absolute Commerce Cache Bust extension for Magento 2", 4 | "type": "magento2-module", 5 | "version": "3.1.2", 6 | "license": "proprietary", 7 | "autoload": { 8 | "files": [ 9 | "registration.php" 10 | ], 11 | "psr-4": { 12 | "Absolute\\CacheBust\\": "" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /etc/acl.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /etc/adminhtml/events.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /etc/adminhtml/routes.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /etc/adminhtml/system.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 |
12 | 13 | 14 | Notice: this setting is not in use. See Absolute Commerce Cache Bust. 16 | ]]> 17 | 18 | 19 |
20 | 21 | 22 | 23 |
24 | 25 | absolute_commerce 26 | Absolute_CacheBust::config 27 | 28 | Absolute\CacheBust\Update\UpdateBlock 29 | 30 | 31 | 32 | 33 | 34 | Absolute\CacheBust\Model\Source\YesNo 35 | Enable / Disable appending Cache Busting segment to Static URLs. 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | Absolute\CacheBust\Model\Source\YesNo 47 | Enable / Disable appending Cache Busting segment to Media URLs. 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Magento\Config\Model\Config\Source\Yesno 59 | https://abscom.co/terms.]]> 60 | 61 | 62 |
63 |
64 |
65 | -------------------------------------------------------------------------------- /etc/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | 13 | 1 14 | https://absolutecommerce.co.uk/absolute/update?extension=absolute_cachebust_m2 15 | 16 | 17 | 0 18 | 19 | 19700101010000 20 | 21 | 22 | 0 23 | 24 | 19700101010000 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /etc/di.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | 13 | Absolute\CacheBust\Console\Command\AllCommand 14 | Absolute\CacheBust\Console\Command\StaticCommand 15 | Absolute\CacheBust\Console\Command\MediaCommand 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /etc/module.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /registration.php: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /view/adminhtml/templates/buttons.phtml: -------------------------------------------------------------------------------- 1 | 9 | 10 |
11 |

12 | escapeHtml(__('Cache Busting')) ?> 13 |

14 | 15 |

16 | 19 | escapeHtml(__('The same as clicking each of the below buttons individually.')) ?> 20 |

21 | 22 |

23 | 26 | escapeHtml(__('Invalidate cache of JavaScript, CSS and image files.')) ?> 27 |

28 | 29 |

30 | 33 | escapeHtml(__('Invalidate cache of product images, category images, etc.')) ?> 34 |

35 | 36 |
37 |
38 | --------------------------------------------------------------------------------