商品のURLで完全なカテゴリを取得するために行うことは、カテゴリを含む商品の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;
}
カテゴリが指定されている場合、このカテゴリに関連するURLを取得しようとします。
カテゴリが指定されていないか、提供されたURLでURLが見つからなかった場合、このメソッドは、商品が関連付けられている最初のカテゴリに関連する商品のURLを取得しようとし、それが受け入れ可能かどうかを確認します(アクティブ、URLキーを使用し、一致するナビゲーション基準)。
$product->getProductUrl()
最後に、元のMagentoメソッドにフォールバックする場合。
この呼び出しでは、テンプレート(カテゴリ、カート製品、最近表示されたものなど)で使用する必要があります。
echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product);
編集:
Zacharyの発言を考慮に入れ、いくつかのチェックとオプションを追加して少し調整しました。今はかっこいいと思います。例:
echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product, $aCategory);
$ aCategoryで商品のURLを検索し、他のカテゴリのURLにフォールバックし、最後に商品のベースURLを検索します。
echo $this->helper('yourcompany/yourmodule')::getFullProductUrl($_product, someCategory, false);
ナビゲーションに含まれていないカテゴリも考慮されます。