Magento:如何使用类别获取完整的产品URL

时间:2012-06-01 07:29:58

标签: magento

我正在尝试找到一个解决方案,以确保Magento始终显示每个产品的完整网址,包括类别路径。 我希望完整的网址也会出现在搜索结果中。 为此,我将每种产品都只放在一个类别中。

可以通过mallo通过Url重写自定义来完成吗? 是301使用.htaccess重定向,/ product.html是category / subcategory / product.html的好主意吗?

由于 穆迪

1 个答案:

答案 0 :(得分:4)

我们如何在产品中获取完整类别url正在使用帮助程序,它将尝试为您提供类别的产品网址。您也可以重写产品方法,但只要另一个模块重写某些产品,这就是一种痛苦,这就是我们使用帮助方法的原因。

这是我们的方法:

public static function getFullUrl (Mage_Catalog_Model_Product $product , 
        Mage_Catalog_Model_Category $category = null , 
        $mustBeIncludedInNavigation = true ){

    // Try to find url matching provided category
    if( $category != null){
        // Category is no match then we'll try to find some other category later
        if( !in_array($product->getId() , $category->getProductCollection()->getAllIds() ) 
                ||  !self::isCategoryAcceptable($category , $mustBeIncludedInNavigation )){
            $category = null;
        }
    }
    if ($category == null) {
        if( is_null($product->getCategoryIds() )){
            return $product->getProductUrl();
        }
        $catCount = 0;
        $productCategories = $product->getCategoryIds();
        // Go through all product's categories
        while( $catCount < count($productCategories) && $category == null ) {
            $tmpCategory = Mage::getModel('catalog/category')->load($productCategories[$catCount]);
            // See if category fits (active, url key, included in menu)
            if ( !self::isCategoryAcceptable($tmpCategory , $mustBeIncludedInNavigation ) ) {
                $catCount++;
            }else{
                $category = Mage::getModel('catalog/category')->load($productCategories[$catCount]);
            }
        }
    }
    $url = (!is_null( $product->getUrlPath($category))) ?  Mage::getBaseUrl() . $product->getUrlPath($category) : $product->getProductUrl();
    return $url;
}

/**
 * Checks if a category matches criteria: active && url_key not null && included in menu if it has to
 */
protected static function isCategoryAcceptable(Mage_Catalog_Model_Category $category = null, $mustBeIncludedInNavigation = true){
    if( !$category->getIsActive() || is_null( $category->getUrlKey() )
        || ( $mustBeIncludedInNavigation && !$category->getIncludeInMenu()) ){
        return false;
    }
    return true;
}

如果指定了某个类别,则会尝试获取相对于此类别的网址。

如果未指定类别或找不到提供的类别的网址,则该方法会尝试获取相对于产品所附加的第一个类别的产品网址,并检查其是否可接受(有效,带网址)密钥和匹配导航标准)。

最后,如果它回归原始的$product->getProductUrl() Magento方法。

您必须通过以下调用在模板(类别,购物车产品,最近查看过的......等)中使用它:

echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product);

修改

我考虑了Zachary的言论,并通过添加一些检查和选项稍微调整了一下。希望现在很酷。 示例:

echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product, $aCategory);

将尝试在$ aCategory中找到产品网址然后回退到其他类别的网址,最后是产品基本网址

echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product, someCategory, false);

还会考虑未包含在导航中的类别。