Toujours avoir la catégorie du produit dans l’url magento
Bonjour,
J’ai rencontré le problème suivant lors d’un projet sous magento : dans les recherches, les urls produits ne gardent pas la catégorie dans l’url. Pour résoudre ce problème, j’ai modifié le coeur de magento (à ne pas faire en temps normal) :
Tout se passe dans la fonction getUrl du Model Product_Url : app/code/core/Mage/Catalog/Model/Product/Url.php
Voici le code la nouvelle fonction :
/**
* Retrieve Product URL using UrlDataObject
*
* @param Mage_Catalog_Model_Product $product
* @param array $params
* @return string
*/
public function getUrl(Mage_Catalog_Model_Product $product, $params = array())
{
$routePath = '';
$routeParams = $params;
$storeId = $product->getStoreId();
if (isset($params['_ignore_category'])) {
unset($params['_ignore_category']);
$categoryId = null;
} else {
$categoryId = $product->getCategoryId() && !$product->getDoNotUseCategoryId()
? $product->getCategoryId() : null;
if (!$categoryId && count($product->getCategoryIds()) > 0) {
$categoryId = end($product->getCategoryIds());
}
error_log(print_r($categoryId,true));
}
if ($product->hasUrlDataObject()) {
$requestPath = $product->getUrlDataObject()->getUrlRewrite();
$routeParams['_store'] = $product->getUrlDataObject()->getStoreId();
} else {
$requestPath = $product->getRequestPath();
if (true) {
$idPath = sprintf('product/%d', $product->getEntityId());
if ($categoryId) {
$idPath = sprintf('%s/%d', $idPath, $categoryId);
}
error_log($idPath);
$rewrite = $this->getUrlRewrite();
$rewrite->setStoreId($storeId)
->loadByIdPath($idPath);
if ($rewrite->getId()) {
$requestPath = $rewrite->getRequestPath();
$product->setRequestPath($requestPath);
} else {
$product->setRequestPath(false);
}
}
}
if (isset($routeParams['_store'])) {
$storeId = Mage::app()->getStore($routeParams['_store'])->getId();
}
if ($storeId != Mage::app()->getStore()->getId()) {
$routeParams['_store_to_url'] = true;
}
if (!empty($requestPath)) {
$routeParams['_direct'] = $requestPath;
} else {
$routePath = 'catalog/product/view';
$routeParams['id'] = $product->getId();
$routeParams['s'] = $product->getUrlKey();
if ($categoryId) {
$routeParams['category'] = $categoryId;
}
}
// reset cached URL instance GET query params
if (!isset($routeParams['_query'])) {
$routeParams['_query'] = array();
}
return $this->getUrlInstance()->setStore($storeId)
->getUrl($routePath, $routeParams);
}
En gros, quand la catégorie n’est pas spécifiée, celui-ci prendra par défaut la catégorie plus bas niveau. Cela fonctionne dans mon cas car un produit n’appartient pas à plusieurs sous catégories direct par rapport à la root catégorie.
Leave a Comment