Jump to content

Path url pagina categoria


DanieleDev

Recommended Posts

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

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

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

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

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

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

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

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:

screen.thumb.png.df16b00d475feb551a6b77a6085ee48a.png

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 :D

Un caro saluto ;)

 

PS: 5. Cancellare la cache

PSS: Testato su PrestaShop 1.7.6.0

Link to comment
Share on other sites

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:

screen.thumb.png.df16b00d475feb551a6b77a6085ee48a.png

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 :D

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

8 minutes ago, DanieleDev said:

Grazie, ma su prestashop 1.5 non mi sembra funzionare

Oh my :D

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

52 minutes ago, marsaldev said:

Oh my :D

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

  • 4 months later...
  • 3 months later...
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:

screen.thumb.png.df16b00d475feb551a6b77a6085ee48a.png

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 :D

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

  • 2 weeks later...

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]*'),
            ),
        ),
    );




}



?>

 

 

  • Thanks 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...