DanieleDev Posted October 8, 2019 Share Posted October 8, 2019 Buona sera, sto avendo dei problemi per configurare il path delle pagine categorie in modo tale che le sottocategorie appaiano nel path non subito dopo la root ma dopo la categoria padre in questo modo: www.miosito.it/categoriaPadre/categoriaFiglia Sapete come fare? Grazie mille in anticipo Link to comment Share on other sites More sharing options...
marsaldev Posted October 8, 2019 Share Posted October 8, 2019 Ciao @DanieleDev, a naso sento che devi fare un'override del dispatcher (/classes/Dispatcher.php), ma forse qualche accortezza anche nel controller delle categorie andrebbe fatto (/controllers/front/listing/CategoryController.php), mi raccomando, override, quindi utilizza la cartella override, non modificare i file che ti ho indicato direttamente 😊 Link to comment Share on other sites More sharing options...
DanieleDev Posted October 9, 2019 Author Share Posted October 9, 2019 14 hours ago, marsaldev said: Ciao @DanieleDev, a naso sento che devi fare un'override del dispatcher (/classes/Dispatcher.php), ma forse qualche accortezza anche nel controller delle categorie andrebbe fatto (/controllers/front/listing/CategoryController.php), mi raccomando, override, quindi utilizza la cartella override, non modificare i file che ti ho indicato direttamente 😊 Grazie, ma c'è qualche guida che indichi cosa cambiare all'interno di quei file? Link to comment Share on other sites More sharing options...
marsaldev Posted October 9, 2019 Share Posted October 9, 2019 Ciao @DanieleDev, non mi ci sono mai imbattuto in questa modifica, non c'è una guida in quanto sono modifiche abbastanza particolari, ad ogni modo non è impossibile da raggiungere, puoi provare a studiarti il dispatcher per capire come PrestaShop costruisce le rotte, le regole le trovi nella variabile $default_routes, e creare il tuo rewrite, altrimenti ho fatto una ricerca rapida su addons e sembra che questo modulo faccia proprio quello che serve a te (è una delle tante funzioni): https://addons.prestashop.com/it/url-redirect/16633-pretty-url-rimuovere-id-e-numeri-dalle-url.html Link to comment Share on other sites More sharing options...
DanieleDev Posted October 9, 2019 Author Share Posted October 9, 2019 3 minutes ago, marsaldev said: Ciao @DanieleDev, non mi ci sono mai imbattuto in questa modifica, non c'è una guida in quanto sono modifiche abbastanza particolari, ad ogni modo non è impossibile da raggiungere, puoi provare a studiarti il dispatcher per capire come PrestaShop costruisce le rotte, le regole le trovi nella variabile $default_routes, e creare il tuo rewrite, altrimenti ho fatto una ricerca rapida su addons e sembra che questo modulo faccia proprio quello che serve a te (è una delle tante funzioni): https://addons.prestashop.com/it/url-redirect/16633-pretty-url-rimuovere-id-e-numeri-dalle-url.html Grazie mille della disponibilità, ho trovato questa guida, ma non mi è stata di aiuto è un po vecchia Sicuramente opterò per un modulo. Grazie ancora Link to comment Share on other sites More sharing options...
marsaldev Posted October 9, 2019 Share Posted October 9, 2019 Però vedo che in fondo hanno postato anche porzioni di codice, è stata modificata anche la classe Link (dovresti trovarla sempre in /classes/), secondo me puoi uscirtene se ti studi un po' quello che hanno scritto 😊 Tempo permettendo posso vedere se riesco a produrre questa modifica, come ti dicevo non è impossibile 😊 Se hai problemi di tempo, con il modulo fai molto prima. Link to comment Share on other sites More sharing options...
DanieleDev Posted October 9, 2019 Author Share Posted October 9, 2019 1 minute ago, marsaldev said: Però vedo che in fondo hanno postato anche porzioni di codice, è stata modificata anche la classe Link (dovresti trovarla sempre in /classes/), secondo me puoi uscirtene se ti studi un po' quello che hanno scritto 😊 Tempo permettendo posso vedere se riesco a produrre questa modifica, come ti dicevo non è impossibile 😊 Se hai problemi di tempo, con il modulo fai molto prima. Si ho fatto delle prove, ma sono stretto con i tempi per studiarmi una soluzione :). Però è qualcosa di interessante da sapere, se dovessi riuscire a trovare una soluzione sarò tutto orecchi A presto e grazie ancora Link to comment Share on other sites More sharing options...
marsaldev Posted October 9, 2019 Share Posted October 9, 2019 Allora, preso spunto dal post in inglese, le operazioni da fare sono: 1. Override della classe Dispatcher (va sovrascritta tutta la variabile $default_routes) /override/classes/Dispatcher.php class Dispatcher extends DispatcherCore { /** * @var array List of default routes */ public $default_routes = array( 'category_rule' => array( 'controller' => 'category', 'rule' => '{parent_categories:/}{id}-{rewrite}', // This is different from original (maybe it's also not necessary to edit, make a test) 'keywords' => array( 'parent_categories' => array('regexp' => '[_a-zA-Z0-9-\/\pL]*'), // This is new 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'supplier_rule' => array( 'controller' => 'supplier', 'rule' => 'supplier/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'manufacturer_rule' => array( 'controller' => 'manufacturer', 'rule' => 'brand/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_rule' => array( 'controller' => 'cms', 'rule' => 'content/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_category_rule' => array( 'controller' => 'cms', 'rule' => 'content/category/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'module' => array( 'controller' => null, 'rule' => 'module/{module}{/:controller}', 'keywords' => array( 'module' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'module'), 'controller' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'controller'), ), 'params' => array( 'fc' => 'module', ), ), 'product_rule' => array( 'controller' => 'product', 'rule' => '{category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_product'), 'id_product_attribute' => array('regexp' => '[0-9]+', 'param' => 'id_product_attribute'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN, 'param' => 'rewrite'), 'ean13' => array('regexp' => '[0-9\pL]*'), 'category' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'), 'reference' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'manufacturer' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'supplier' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'price' => array('regexp' => '[0-9\.,]*'), 'tags' => array('regexp' => '[a-zA-Z0-9-\pL]*'), ), ), /* Must be after the product and category rules in order to avoid conflict */ 'layered_rule' => array( 'controller' => 'category', 'rule' => '{id}-{rewrite}{/:selected_filters}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), /* Selected filters is used by the module blocklayered */ 'selected_filters' => array('regexp' => '.*', 'param' => 'selected_filters'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), ); } 2. Override della classe Link (va fatto l'intero override del metodo): /override/classes/Link.php class Link extends LinkCore { /** * Create a link to a category. * * @param mixed $category Category object (can be an ID category, but deprecated) * @param string $alias * @param int $idLang * @param string $selectedFilters Url parameter to autocheck filters of the module blocklayered * * @return string */ public function getCategoryLink( $category, $alias = null, $idLang = null, $selectedFilters = null, $idShop = null, $relativeProtocol = false ) { $dispatcher = Dispatcher::getInstance(); if (!$idLang) { $idLang = Context::getContext()->language->id; } $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop); // Set available keywords $params = array(); if (!is_object($category)) { $params['id'] = $category; } else { $params['id'] = $category->id; } // Selected filters is used by the module ps_facetedsearch $selectedFilters = null === $selectedFilters ? '' : $selectedFilters; if (empty($selectedFilters)) { $rule = 'category_rule'; } else { $rule = 'layered_rule'; $params['selected_filters'] = $selectedFilters; } if (!$alias) { $category = $this->getCategoryObject($category, $idLang); } $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias; if ($dispatcher->hasKeyword($rule, $idLang, 'meta_keywords', $idShop)) { die('here'); $category = $this->getCategoryObject($category, $idLang); $params['meta_keywords'] = Tools::str2url($category->getFieldByLang('meta_keywords')); } if ($dispatcher->hasKeyword($rule, $idLang, 'meta_title', $idShop)) { $category = $this->getCategoryObject($category, $idLang); $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title')); } // THIS IS THE NEW BLOCK if ($dispatcher->hasKeyword($rule, $idLang, 'parent_categories', $idShop) AND $category) { $category = $this->getCategoryObject($category, $idLang); //RETRIEVING ALL THE PARENT CATEGORIES $cats = array(); foreach ($category->getParentsCategories($idLang) as $cat) { //Check root and home category (ID 1 and 2) if (!in_array($cat['id_category'], array(1, 2, $category->id))) { $cats[] = $cat['link_rewrite']; } } //THE CATEGORIES ARE BEING ASSIGNED IN THE WRONG ORDER (?) $params['parent_categories'] = implode('/', array_reverse($cats)); // ADD THE URL SLASHES TO THE CATEGORIES IN REVERSE ORDER } // END OF NEW BLOCK return $url . Dispatcher::getInstance()->createUrl($rule, $idLang, $params, $this->allow, '', $idShop); } } 3. Andare in Parametri Negozio -> Traffico & SEO e modificare la regola in fondo per quanto riguarda l'url delle categorie: 4. Salvare. Alcune note a margine, prendetela come fix rapida, ci sarebbero delle cose da correggere e migliorare ma il risultato finale è quello di avere anche categorie di terzo livello funzionanti, l'unico "neo" è l'id della categoria nell'url, si potrebbe togliere anche quello, ma lascio a voi l'onere Un caro saluto PS: 5. Cancellare la cache PSS: Testato su PrestaShop 1.7.6.0 Link to comment Share on other sites More sharing options...
DanieleDev Posted October 10, 2019 Author Share Posted October 10, 2019 16 hours ago, marsaldev said: Allora, preso spunto dal post in inglese, le operazioni da fare sono: 1. Override della classe Dispatcher (va sovrascritta tutta la variabile $default_routes) /override/classes/Dispatcher.php class Dispatcher extends DispatcherCore { /** * @var array List of default routes */ public $default_routes = array( 'category_rule' => array( 'controller' => 'category', 'rule' => '{parent_categories:/}{id}-{rewrite}', // This is different from original (maybe it's also not necessary to edit, make a test) 'keywords' => array( 'parent_categories' => array('regexp' => '[_a-zA-Z0-9-\/\pL]*'), // This is new 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'supplier_rule' => array( 'controller' => 'supplier', 'rule' => 'supplier/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'manufacturer_rule' => array( 'controller' => 'manufacturer', 'rule' => 'brand/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_rule' => array( 'controller' => 'cms', 'rule' => 'content/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_category_rule' => array( 'controller' => 'cms', 'rule' => 'content/category/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'module' => array( 'controller' => null, 'rule' => 'module/{module}{/:controller}', 'keywords' => array( 'module' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'module'), 'controller' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'controller'), ), 'params' => array( 'fc' => 'module', ), ), 'product_rule' => array( 'controller' => 'product', 'rule' => '{category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_product'), 'id_product_attribute' => array('regexp' => '[0-9]+', 'param' => 'id_product_attribute'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN, 'param' => 'rewrite'), 'ean13' => array('regexp' => '[0-9\pL]*'), 'category' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'), 'reference' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'manufacturer' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'supplier' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'price' => array('regexp' => '[0-9\.,]*'), 'tags' => array('regexp' => '[a-zA-Z0-9-\pL]*'), ), ), /* Must be after the product and category rules in order to avoid conflict */ 'layered_rule' => array( 'controller' => 'category', 'rule' => '{id}-{rewrite}{/:selected_filters}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), /* Selected filters is used by the module blocklayered */ 'selected_filters' => array('regexp' => '.*', 'param' => 'selected_filters'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), ); } 2. Override della classe Link (va fatto l'intero override del metodo): /override/classes/Link.php class Link extends LinkCore { /** * Create a link to a category. * * @param mixed $category Category object (can be an ID category, but deprecated) * @param string $alias * @param int $idLang * @param string $selectedFilters Url parameter to autocheck filters of the module blocklayered * * @return string */ public function getCategoryLink( $category, $alias = null, $idLang = null, $selectedFilters = null, $idShop = null, $relativeProtocol = false ) { $dispatcher = Dispatcher::getInstance(); if (!$idLang) { $idLang = Context::getContext()->language->id; } $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop); // Set available keywords $params = array(); if (!is_object($category)) { $params['id'] = $category; } else { $params['id'] = $category->id; } // Selected filters is used by the module ps_facetedsearch $selectedFilters = null === $selectedFilters ? '' : $selectedFilters; if (empty($selectedFilters)) { $rule = 'category_rule'; } else { $rule = 'layered_rule'; $params['selected_filters'] = $selectedFilters; } if (!$alias) { $category = $this->getCategoryObject($category, $idLang); } $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias; if ($dispatcher->hasKeyword($rule, $idLang, 'meta_keywords', $idShop)) { die('here'); $category = $this->getCategoryObject($category, $idLang); $params['meta_keywords'] = Tools::str2url($category->getFieldByLang('meta_keywords')); } if ($dispatcher->hasKeyword($rule, $idLang, 'meta_title', $idShop)) { $category = $this->getCategoryObject($category, $idLang); $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title')); } // THIS IS THE NEW BLOCK if ($dispatcher->hasKeyword($rule, $idLang, 'parent_categories', $idShop) AND $category) { $category = $this->getCategoryObject($category, $idLang); //RETRIEVING ALL THE PARENT CATEGORIES $cats = array(); foreach ($category->getParentsCategories($idLang) as $cat) { //Check root and home category (ID 1 and 2) if (!in_array($cat['id_category'], array(1, 2, $category->id))) { $cats[] = $cat['link_rewrite']; } } //THE CATEGORIES ARE BEING ASSIGNED IN THE WRONG ORDER (?) $params['parent_categories'] = implode('/', array_reverse($cats)); // ADD THE URL SLASHES TO THE CATEGORIES IN REVERSE ORDER } // END OF NEW BLOCK return $url . Dispatcher::getInstance()->createUrl($rule, $idLang, $params, $this->allow, '', $idShop); } } 3. Andare in Parametri Negozio -> Traffico & SEO e modificare la regola in fondo per quanto riguarda l'url delle categorie: 4. Salvare. Alcune note a margine, prendetela come fix rapida, ci sarebbero delle cose da correggere e migliorare ma il risultato finale è quello di avere anche categorie di terzo livello funzionanti, l'unico "neo" è l'id della categoria nell'url, si potrebbe togliere anche quello, ma lascio a voi l'onere Un caro saluto PS: 5. Cancellare la cache PSS: Testato su PrestaShop 1.7.6.0 Grazie, ma su prestashop 1.5 non mi sembra funzionare. In ogni caso al momento userò il modulo. Grazie comunque Link to comment Share on other sites More sharing options...
marsaldev Posted October 10, 2019 Share Posted October 10, 2019 8 minutes ago, DanieleDev said: Grazie, ma su prestashop 1.5 non mi sembra funzionare Oh my Scusa, ma non era proprio contemplata la versione 1.5, dovrei scavare molto indietro nella memoria 😊 Ovviamente se ti ci vuoi imbattere non farti problemi, posta qui codice che sarò felice di aiutarti. Un caro saluto PS: Controlla la compatibilità del modulo, stiamo parlando di 2 versioni fa Link to comment Share on other sites More sharing options...
DanieleDev Posted October 10, 2019 Author Share Posted October 10, 2019 52 minutes ago, marsaldev said: Oh my Scusa, ma non era proprio contemplata la versione 1.5, dovrei scavare molto indietro nella memoria 😊 Ovviamente se ti ci vuoi imbattere non farti problemi, posta qui codice che sarò felice di aiutarti. Un caro saluto PS: Controlla la compatibilità del modulo, stiamo parlando di 2 versioni fa Noo scusami, intendevo 1.7.5 Link to comment Share on other sites More sharing options...
marsaldev Posted October 10, 2019 Share Posted October 10, 2019 13 minutes ago, DanieleDev said: Noo scusami, intendevo 1.7.5 Ah ecco, strano, non credo ci siano sostanziali differenze 🤷🏻♂️ Un caro saluto Link to comment Share on other sites More sharing options...
sooly Posted February 24, 2020 Share Posted February 24, 2020 Its awesome, but im getting 404 errors on cms pages and manufacturer pages with same ID as category IDs. Only solution i found is by adding "/" at the end of category urls. Link to comment Share on other sites More sharing options...
artigianidelweb Posted May 29, 2020 Share Posted May 29, 2020 On 10/9/2019 at 6:52 PM, marsaldev said: Allora, preso spunto dal post in inglese, le operazioni da fare sono: 1. Override della classe Dispatcher (va sovrascritta tutta la variabile $default_routes) /override/classes/Dispatcher.php class Dispatcher extends DispatcherCore { /** * @var array List of default routes */ public $default_routes = array( 'category_rule' => array( 'controller' => 'category', 'rule' => '{parent_categories:/}{id}-{rewrite}', // This is different from original (maybe it's also not necessary to edit, make a test) 'keywords' => array( 'parent_categories' => array('regexp' => '[_a-zA-Z0-9-\/\pL]*'), // This is new 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'supplier_rule' => array( 'controller' => 'supplier', 'rule' => 'supplier/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'manufacturer_rule' => array( 'controller' => 'manufacturer', 'rule' => 'brand/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_rule' => array( 'controller' => 'cms', 'rule' => 'content/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_category_rule' => array( 'controller' => 'cms', 'rule' => 'content/category/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'module' => array( 'controller' => null, 'rule' => 'module/{module}{/:controller}', 'keywords' => array( 'module' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'module'), 'controller' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'controller'), ), 'params' => array( 'fc' => 'module', ), ), 'product_rule' => array( 'controller' => 'product', 'rule' => '{category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_product'), 'id_product_attribute' => array('regexp' => '[0-9]+', 'param' => 'id_product_attribute'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN, 'param' => 'rewrite'), 'ean13' => array('regexp' => '[0-9\pL]*'), 'category' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'), 'reference' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'manufacturer' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'supplier' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'price' => array('regexp' => '[0-9\.,]*'), 'tags' => array('regexp' => '[a-zA-Z0-9-\pL]*'), ), ), /* Must be after the product and category rules in order to avoid conflict */ 'layered_rule' => array( 'controller' => 'category', 'rule' => '{id}-{rewrite}{/:selected_filters}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), /* Selected filters is used by the module blocklayered */ 'selected_filters' => array('regexp' => '.*', 'param' => 'selected_filters'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), ); } 2. Override della classe Link (va fatto l'intero override del metodo): /override/classes/Link.php class Link extends LinkCore { /** * Create a link to a category. * * @param mixed $category Category object (can be an ID category, but deprecated) * @param string $alias * @param int $idLang * @param string $selectedFilters Url parameter to autocheck filters of the module blocklayered * * @return string */ public function getCategoryLink( $category, $alias = null, $idLang = null, $selectedFilters = null, $idShop = null, $relativeProtocol = false ) { $dispatcher = Dispatcher::getInstance(); if (!$idLang) { $idLang = Context::getContext()->language->id; } $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop); // Set available keywords $params = array(); if (!is_object($category)) { $params['id'] = $category; } else { $params['id'] = $category->id; } // Selected filters is used by the module ps_facetedsearch $selectedFilters = null === $selectedFilters ? '' : $selectedFilters; if (empty($selectedFilters)) { $rule = 'category_rule'; } else { $rule = 'layered_rule'; $params['selected_filters'] = $selectedFilters; } if (!$alias) { $category = $this->getCategoryObject($category, $idLang); } $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias; if ($dispatcher->hasKeyword($rule, $idLang, 'meta_keywords', $idShop)) { die('here'); $category = $this->getCategoryObject($category, $idLang); $params['meta_keywords'] = Tools::str2url($category->getFieldByLang('meta_keywords')); } if ($dispatcher->hasKeyword($rule, $idLang, 'meta_title', $idShop)) { $category = $this->getCategoryObject($category, $idLang); $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title')); } // THIS IS THE NEW BLOCK if ($dispatcher->hasKeyword($rule, $idLang, 'parent_categories', $idShop) AND $category) { $category = $this->getCategoryObject($category, $idLang); //RETRIEVING ALL THE PARENT CATEGORIES $cats = array(); foreach ($category->getParentsCategories($idLang) as $cat) { //Check root and home category (ID 1 and 2) if (!in_array($cat['id_category'], array(1, 2, $category->id))) { $cats[] = $cat['link_rewrite']; } } //THE CATEGORIES ARE BEING ASSIGNED IN THE WRONG ORDER (?) $params['parent_categories'] = implode('/', array_reverse($cats)); // ADD THE URL SLASHES TO THE CATEGORIES IN REVERSE ORDER } // END OF NEW BLOCK return $url . Dispatcher::getInstance()->createUrl($rule, $idLang, $params, $this->allow, '', $idShop); } } 3. Andare in Parametri Negozio -> Traffico & SEO e modificare la regola in fondo per quanto riguarda l'url delle categorie: 4. Salvare. Alcune note a margine, prendetela come fix rapida, ci sarebbero delle cose da correggere e migliorare ma il risultato finale è quello di avere anche categorie di terzo livello funzionanti, l'unico "neo" è l'id della categoria nell'url, si potrebbe togliere anche quello, ma lascio a voi l'onere Un caro saluto PS: 5. Cancellare la cache PSS: Testato su PrestaShop 1.7.6.0 Ciao, questa soluzione funziona, l'unica cosa è che non funziona più il routing relativo al brand. Ho provato anche a modificare il routong del brand ma senza effetto. Hai qualche dritta da consigliare? Grazie mille! Link to comment Share on other sites More sharing options...
artigianidelweb Posted May 29, 2020 Share Posted May 29, 2020 Come aveva segnalato un altro utente nel forum inglese, e confermo anche qui, applicando la modifica non funzionano nemmeno le pagine. Come si potrebbe risolvere? Grazie mille Link to comment Share on other sites More sharing options...
artigianidelweb Posted June 9, 2020 Share Posted June 9, 2020 Ciao mi autorispondo: per sistemare è sufficiente invertire nel file /override/classes/Dispatcher.php la posizione del routing e metterla in fondo, prima di /* Must be after the product and category rules in order to avoid conflict */ pare funzionare. Ecco il codice corretto: <?php class Dispatcher extends DispatcherCore { /** * @var array List of default routes */ public $default_routes = array( 'supplier_rule' => array( 'controller' => 'supplier', 'rule' => 'supplier/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'manufacturer_rule' => array( 'controller' => 'manufacturer', 'rule' => 'brand/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_rule' => array( 'controller' => 'cms', 'rule' => 'content/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'cms_category_rule' => array( 'controller' => 'cms', 'rule' => 'content/category/{id}-{rewrite}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), 'module' => array( 'controller' => null, 'rule' => 'module/{module}{/:controller}', 'keywords' => array( 'module' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'module'), 'controller' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'controller'), ), 'params' => array( 'fc' => 'module', ), ), 'product_rule' => array( 'controller' => 'product', 'rule' => '{category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_product'), 'id_product_attribute' => array('regexp' => '[0-9]+', 'param' => 'id_product_attribute'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN, 'param' => 'rewrite'), 'ean13' => array('regexp' => '[0-9\pL]*'), 'category' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'), 'reference' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'manufacturer' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'supplier' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'price' => array('regexp' => '[0-9\.,]*'), 'tags' => array('regexp' => '[a-zA-Z0-9-\pL]*'), ), ), 'category_rule' => array( 'controller' => 'category', 'rule' => '{parent_categories:/}{id}-{rewrite}', // This is different from original (maybe it's also not necessary to edit, make a test) 'keywords' => array( 'parent_categories' => array('regexp' => '[_a-zA-Z0-9-\/\pL]*'), // This is new 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), /* Must be after the product and category rules in order to avoid conflict */ 'layered_rule' => array( 'controller' => 'category', 'rule' => '{id}-{rewrite}{/:selected_filters}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'), /* Selected filters is used by the module blocklayered */ 'selected_filters' => array('regexp' => '.*', 'param' => 'selected_filters'), 'rewrite' => array('regexp' => self::REWRITE_PATTERN), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ), ), ); } ?> 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now