2012-01-31 86 views
2

而不是類別我希望產品出現在與lowes.com類似的下拉導航菜單中。這可能嗎?我不支付任何東西:)Magento:如何在主導航菜單的下拉菜單中添加活動產品

我試圖改變core/Mage/Catalog/Block/Navigation.php並嘗試'假'產品作爲類別,但對象的要求是非常具體的。由於創建菜單的功能是遞歸的,因此它只能用於實際的類別,而沒有其他功能。有任何想法嗎?

我知道另一個選擇是創建第二級類別並將它們命名爲我的產品,然後在.htaccess中進行重寫,但這不是動態且非常混亂。

回答

5

經過一番嘗試,我已經有了這個工作!下面是新的代碼在

app/code/core/Mage/Catalog/Block/Navigation.php

function _renderCategoryMenuItemHtml使用(交換「本地」的「核心」,如果本地化)

protected function _renderCategoryMenuItemHtml($category, $level = 0, $isLast = false, $isFirst = false, $isOutermost = false, $outermostItemClass = '', $childrenWrapClass = '', $noEventAttributes = false) 
{ 
    if (!$category->getIsActive()) { 
     return ''; 
    } 
    $html = array(); 

    // get all children 
    if (Mage::helper('catalog/category_flat')->isEnabled()) { 
     $children = (array)$category->getChildrenNodes(); 
     $childrenCount = count($children); 
    } else { 
     $children = $category->getChildren(); 
     $childrenCount = $children->count(); 
    } 
    $hasChildren = ($children && $childrenCount); 

    // get products listing 
    $cur_category = Mage::getModel('catalog/category')->load($category->getId()); 
    $_productCollection = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($cur_category)->setOrder('position','ASC'); 
    $k = 1; 
    $hasProduct1 = $_productCollection->count(); 
    $phtmlChildren = ''; 
    if ($hasProduct1 >= 1) { 
     $l = $level+1; 
     foreach ($_productCollection as $_product) { 
      $cur_product = Mage::getModel('catalog/product')->load($_product->getId()); 
      if ($cur_product->getStatus()) { 
       $phtmlChildren .= '<li'; 
       $phtmlChildren .= ' class="level'.$l; 
       $phtmlChildren .= ' nav-'.$this->_getItemPosition($l); 
       if ($k == $hasProduct1) { 
        $phtmlChildren .= ' last'; 
       } 
       $phtmlChildren .= '">'."\n"; 
       $phtmlChildren .= ' <a href="'.$cur_product->getProductUrl().'">'.$this->htmlEscape($cur_product->getName()).'</a>'."\n"; 
       $phtmlChildren .= '</li>'; 
       $k++; 
      } 
     } 
    } 

    // select active children 
    $activeChildren = array(); 
    foreach ($children as $child) { 
     if ($child->getIsActive()) { 
      $activeChildren[] = $child; 
     } 
    } 
    $activeChildrenCount = count($activeChildren); 
    $hasActiveChildren = ($activeChildrenCount > 0); 

    // prepare list item html classes 
    $classes = array(); 
    $classes[] = 'level' . $level; 
    $classes[] = 'nav-' . $this->_getItemPosition($level); 
    if ($this->isCategoryActive($category)) { 
     $classes[] = 'active'; 
    } 
    $linkClass = ''; 
    if ($isOutermost && $outermostItemClass) { 
     $classes[] = $outermostItemClass; 
     $linkClass = ' class="'.$outermostItemClass.'"'; 
    } 
    if ($isFirst) { 
     $classes[] = 'first'; 
    } 
    if ($isLast) { 
     $classes[] = 'last'; 
    } 
    if ($hasActiveChildren) { 
     $classes[] = 'parent'; 
    } 

    // prepare list item attributes 
    $attributes = array(); 
    if (count($classes) > 0) { 
     $attributes['class'] = implode(' ', $classes); 
    } 
    if ($hasActiveChildren && !$noEventAttributes) { 
     $attributes['onmouseover'] = 'toggleMenu(this,1)'; 
     $attributes['onmouseout'] = 'toggleMenu(this,0)'; 
    } 

    // assemble list item with attributes 
    $htmlLi = '<li'; 
    foreach ($attributes as $attrName => $attrValue) { 
     $htmlLi .= ' ' . $attrName . '="' . str_replace('"', '\"', $attrValue) . '"'; 
    } 
    $htmlLi .= '>'; 
    $html[] = $htmlLi; 

    $html[] = '<a href="'.$this->getCategoryUrl($category).'"'.$linkClass.'>'; 
    $html[] = '<span>' . $this->escapeHtml($category->getName()) . '</span>'; 
    $html[] = '</a>'; 

    // render 'product' children 
    $htmlChildren = ''; 
    if ($hasChildren) { 
     $j = 0; 
     foreach ($children as $child) { 
      if ($child->getIsActive()) { 
       $htmlChildren .= $this->_renderCategoryMenuItemHtml($child, $level + 1, $j++ >= $k); 
      } 
     } 
    } 
    if ((!empty($htmlChildren)) || (!empty($phtmlChildren))) { 
     $html[] = '<ul class="level'.$level.'">'."\n".$htmlChildren.$phtmlChildren.'</ul>'; 
    } 

    // render children 
    $htmlChildren = ''; 
    $j = 0; 
    foreach ($activeChildren as $child) { 
     $htmlChildren .= $this->_renderCategoryMenuItemHtml(
      $child, 
      ($level + 1), 
      ($j == $activeChildrenCount - 1), 
      ($j == 0), 
      false, 
      $outermostItemClass, 
      $childrenWrapClass, 
      $noEventAttributes 
     ); 
     $j++; 
    } 
    if (!empty($htmlChildren)) { 
     if ($childrenWrapClass) { 
      $html[] = '<div class="' . $childrenWrapClass . '">'; 
     } 
     $html[] = '<ul class="level' . $level . '">'; 
     $html[] = $htmlChildren; 
     $html[] = '</ul>'; 
     if ($childrenWrapClass) { 
      $html[] = '</div>'; 
     } 
    } 

    $html[] = '</li>'; 

    $html = implode("\n", $html);  
    return $html; 
} 

基本上有兩種新增加的部分。第一部分構建產品收集以獲取相關信息(名稱,網址等)。第二部分在現有根類別列表項目內追加新的無序列表。希望這可以幫助某人。現在你不需要支付$ 99的擴展,就在那裏:)

測試在v.1.6.1

+0

非常有幫助謝謝。不利的一面是,如果該文件是核心的一部分,則會更新文件。 – EasyCo 2012-02-28 01:48:18

+0

不,它不會,只是把它放在本地文件夾。爲了清楚起見,我只列出了特定的代碼。 – 2012-02-28 02:29:29

+0

小心請擴大一點嗎? – EasyCo 2012-02-28 02:51:02

-1

也許一個通用類別調用「所有產品」,並將所有產品鏈接到它?

然後只讓該類別可見。

這是至少一個解決方案,無需制動系統。

1

賈裏德Eitnier的方法的工作除了在日誌中,購物車,並結帳頁面 - 例如/客戶/帳號/密碼產品URL打破它變成/客戶/帳號/登錄/產品搜索引擎優化的URL

奇怪的產品網址上的CMS網頁工作...

我我正在使用Magento 1.6.2

我已經改變了這一行 -

$phtmlChildren .= ' <a href="'.$cur_product->getUrlPath().'">'.$this->htmlEscape($cur_product->getName()).'</a>'."\n"; 

有了這個 -

$phtmlChildren .= ' <a href="'.$cur_product->getProductUrl().'">'.$this->htmlEscape($cur_product->getName()).'</a>'."\n"; 

而現在它的作品每一頁上!希望這可以幫助別人。

+1

很好,謝謝。我將使用此修復程序更新我的代碼。 – 2012-09-29 13:39:53