Проблема с кэшем верхнего меню
Я добавил миниатюры категорий для подкатегорий в верхней навигации.
На небезопасных страницах изображения извлекаются из небезопасного пути, который является правильным, но когда я перехожу на страницу https, изображения по-прежнему извлекаются со страницы http, что неверно.
Чтобы устранить проблему, я изменил метод getCacheKeyInfo
в классе Mage_Page_Block_Html_Topmenu
из
$shortCacheId = array(
'TOPMENU',
Mage::app()->getStore()->getId(),
Mage::getDesign()->getPackageName(),
Mage::getDesign()->getTheme('template'),
Mage::getSingleton('customer/session')->getCustomerGroupId(),
'template' => $this->getTemplate(),
'name' => $this->getNameInLayout(),
$this->getCurrentEntityKey()
);
$cacheId = $shortCacheId;
$shortCacheId = array_values($shortCacheId);
$shortCacheId = implode('|', $shortCacheId);
$shortCacheId = md5($shortCacheId);
$cacheId['entity_key'] = $this->getCurrentEntityKey();
$cacheId['short_cache_id'] = $shortCacheId;
return $cacheId;
До
$shortCacheId = array(
'TOPMENU',
Mage::app()->getStore()->getId(),
(int)Mage::app()->getStore()->isCurrentlySecure(),
Mage::getDesign()->getPackageName(),
Mage::getDesign()->getTheme('template'),
Mage::getSingleton('customer/session')->getCustomerGroupId(),
'template' => $this->getTemplate(),
'name' => $this->getNameInLayout(),
$this->getCurrentEntityKey()
);
$cacheId = $shortCacheId;
$shortCacheId = array_values($shortCacheId);
$shortCacheId = implode('|', $shortCacheId);
$shortCacheId = md5($shortCacheId);
$cacheId['entity_key'] = $this->getCurrentEntityKey();
$cacheId['short_cache_id'] = $shortCacheId;
return $cacheId;
Но проблема сохраняется, и все еще изображения в верхней навигации вытягиваются с URL-адреса http на странице https.
Пожалуйста, дайте мне знать, как можно устранить эту проблему.
Любая помощь будет оценена по достоинству.
КОД ДЛЯ ДОБАВЛЕНИЯ ИЗОБРАЖЕНИЙ
Я переписал класс Mage_Catalog_Model_Observer
ниже методов
public function addCategoryImages(Varien_Event_Observer $observer) {
$block = $observer->getEvent()->getBlock();
$block->addCacheTag(Mage_Catalog_Model_Category::CACHE_TAG);
$this->_addCategoriesToMenu(
Mage::helper('catalog/category')->getStoreCategories(), $observer->getMenu(), $block, true
);
}
public function _addCategoriesToMenu($categories, $parentCategoryNode, $menuBlock, $addTags = false) {
$categoryModel = Mage::getModel('catalog/category');
foreach ($categories as $category) {
if (!$category->getIsActive()) {
continue;
}
$nodeId = 'category-node-' . $category->getId();
$categoryModel->setId($category->getId());
if ($addTags) {
$menuBlock->addModelTags($categoryModel);
}
$tree = $parentCategoryNode->getTree();
$categoryData = array(
'name' => $category->getName(),
'id' => $nodeId,
'url' => Mage::helper('catalog/category')->getCategoryUrl($category),
'is_active' => $this->_isActiveMenuCategory($category),
'thumbnail' => $categoryModel->load($category->getId())->getThumbnail()
);
$categoryNode = new Varien_Data_Tree_Node($categoryData, 'id', $tree, $parentCategoryNode);
$parentCategoryNode->addChild($categoryNode);
$flatHelper = Mage::helper('catalog/category_flat');
if ($flatHelper->isEnabled() && $flatHelper->isBuilt(true)) {
$subcategories = (array) $category->getChildrenNodes();
} else {
$subcategories = $category->getChildren();
}
$this->_addCategoriesToMenu($subcategories, $categoryNode, $menuBlock, $addTags);
}
}
Я добавил "миниатюру" в массив данных категорий, а затем извлек это в шаблоне app/design/frontend/rwd/bluebath/template/page/html/topmenu/renderer.phtml
Ниже приведен код для renderer.phtml
$html = ";
$children = $menutree->Получить детей(); $Родительский уровень= $menutree->getLevel(); $childlevel = is_null($родителЬский уровень)? 0 : $Родительский уровень +1;
$счетчик =1; $количество детей = $дети->количество();
$Родительский класс позиции = $menutree->getpositionclass(); $itempositionclassprefix = $Родительский класс? $Класс родительского положения . '-': 'нав-';
Если(Маг::приложение()->getStore()->iscurrentlysecure()){$mediaurl= Маг::getbaseurl(mage_core_model_store::URL_TYPE_MEDIA,true);}остальное{
$медиаурл= Маг::getbaseurl(mage_core_model_store::URL_TYPE_MEDIA);}Для каждого ($дети как $ребенок) { $дочерний ->Установленный уровень ($дочерний уровень); $ребенок->Первый набор ($счетчик == 1); $ребенок->setislast ($счетчик = = $количество детей); $дочерний->setpositionclass($itempOsitioncLassпРефикс. $счетчик);
$outermostClassCode = 'level' . $childLevel; $_hasChildren = ($child->hasChildren()) ? 'has-children' : ''; if ($childLevel != 0) { $urls = $mediaurl . 'catalog/category/' . $child->getData('thumbnail'); $img = '<img src="' . $urls . '" alt="' . $child->getName() . '" />'; } $html .= '<li ' . $this->_getRenderedMenuItemAttributes($child) . '>'; if ($childLevel != 0) { $html .= '<a href="' . $child->getUrl() . '" class="' . $outermostClassCode . ' ' . $_hasChildren . '">' . $img .
$это->escapeHTML($это->($дочерний->getName()))."; } еще { $html.= 'getURL().' "класс="' . $Самый внешний код класса. ''. $_детей.'">' . $this->escapeHTML($this->($дочерний->getName()))."; }
if (!empty($childrenWrapClass)) { $html .= '<div class="' . $childrenWrapClass . '">'; } $nextChildLevel = $childLevel + 1; if (!empty($_hasChildren)) { $html .= '<ul class="level' . $childLevel . '">'; $html .= '<li class="level' . $nextChildLevel . '">'; $html .= '<a class="level' . $nextChildLevel . '" href="' . $child->getUrl() . '">'; $html .= $this->__('View All ') . $this->escapeHtml($this->__($child->getName())); $html .= '</a>'; $html .= '</li>'; $html .= $this->render($child, $childrenWrapClass); $html .= '</ul>'; } if (!empty($childrenWrapClass)) { $html .= '</div>'; } $html .= '</li>'; $counter++; }
Возвращает $html;
2 answers
Модифицированный метод getCacheKeyInfo
в классе Mage_Page_Block_Html_Topmenu
, как показано ниже
public function getCacheKeyInfo()
{
$shortCacheId = array(
'TOPMENU',
Mage::app()->getStore()->getId(),
(int)Mage::app()->getStore()->isCurrentlySecure(), // newly added line to check if secure or non secure
Mage::getDesign()->getPackageName(),
Mage::getDesign()->getTheme('template'),
Mage::getSingleton('customer/session')->getCustomerGroupId(),
'template' => $this->getTemplate(),
'name' => $this->getNameInLayout(),
$this->getCurrentEntityKey()
);
$cacheId = $shortCacheId;
$shortCacheId = array_values($shortCacheId);
$shortCacheId = implode('|', $shortCacheId);
$shortCacheId = md5($shortCacheId);
$cacheId['entity_key'] = $this->getCurrentEntityKey();
$cacheId['short_cache_id'] = $shortCacheId;
return $cacheId;
}
Самым простым решением может быть не беспокоиться о том, какой протокол использует пользователь, заставляя src на изображении быть относительно протокола. Это дает преимущество в том, что кэш не разбавляется.
$url = preg_replace('~^https?:~i', '', Mage::helper('catalog/category')->getCategoryUrl($category));
Примечание: Единственное предостережение к этому заключается в том, что это будет работать только в том случае, если ваш медиа-домен/путь одинаковы (за исключением протокола) для обоих протоколов (настройки web/unsecure/base_media_url
и web/unsecure/base_media_url
). Хотя я обнаружил, что они, как правило,